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: 30 Juni 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. apple123

    Beiträge von apple123

    • Fahrzeughandel (Autos an Spieler weiterverkaufen)

      • apple123
      • 16. April 2020 um 21:31
      Zitat von moeck

      Moin,

      so da sich Alice Kingsleigh dafür interessiert hier mal der Fix mit dem Update Befehl ^^ .

      1. Änderung fn_receivedVeh.sqf

      Code
      [_plate,(getPlayerUID player)] remoteExecCall ["DB_fnc_changeVehKey",2];

      ersetzen durch

      Code
      [_plate,(getPlayerUID player),(getPlayerUID _ownerLast),(typeof _vehicle)] remoteExecCall ["DB_fnc_changeVehKey",2];

      2. Ersetzen der fn_changeVehKey.sqf durch das

      Code
      /*
          File: fn_changeVehKey.sqf
          Author: Joaquine
          Description:
          Update les clefs définitivement
      */
      params [
          ["_plate","",[""]],
          ["_uidnew","",[""]],
          ["_uidold","",[""]],
          ["_type","",[""]]
      ];
      _query = format ["UPDATE vehicles SET pid='%2' WHERE plate='%1' and pid ='%3' and type = '%4'", _plate,_uidnew,_uidold,_type];
      [_query,1] call DB_fnc_asyncCall;
      Alles anzeigen

      so fertig 8o

      Alles anzeigen

      i think

      Code
      _query = format ["UPDATE vehicles SET pid='%2' WHERE plate='%1' and pid ='%3' and type = '%4'", _plate,_uidnew,_uidold,_type]; 
      has error
      change to
      _query = format ["UPDATE vehicles SET pid='%2' WHERE plate='%1' and pid ='%3' and classname = '%4'", _plate,_uidnew,_uidold,_type]; 

      8o

    • Arma 3 Garage einparken funktioniert nicht.

      • apple123
      • 29. März 2020 um 19:15

      I think in fn_vehicleCreate and fn_vehicleStorehas error , try diag_log all part of the result.

    • Team questions, help!

      • apple123
      • 26. März 2020 um 23:09
      Zitat von nox

      As I already wrote in the shoutbox we need more information about your problem. Without this information, nobody can help you.

      Thank you very much for your reply. I have found the wrong place because of the wrong data type!

    • Team questions, help!

      • apple123
      • 26. März 2020 um 18:03

      I've added a team for the police and doctors, but I don't know where the problem is. Ask for help, any help will be appreciated!

      Dateien

      fn_requestReceived.sqf 5,95 kB – 218 Downloads fn_queryRequest.sqf 4,95 kB – 220 Downloads rpt.txt 346 Byte – 205 Downloads
    • Simple whitelist (only allowed players to enter the game)

      • apple123
      • 26. März 2020 um 16:06
      Zitat von PeterMayer

      I think you made an typing error in your sql code. It should it be whitelist not whitlist

      yeah,tks!

    • Simple whitelist (only allowed players to enter the game)

      • apple123
      • 25. März 2020 um 17:31

      Difficulty: Very simple

      Suitable for beginner

      fn_requestReceived.sqf

      find

      !isServer && (!isNil "life_adminlevel" || !isNil "life_coplevel" || !isNil "life_donorlevel")

      change it to

      !isServer && (!isNil "life_adminlevel" || !isNil "life_coplevel" || !isNil "life_donorlevel"|| !isNil "life_whitelist")

      then find

      CONST(life_coplevel,(_this select 7));

      Add code below it

      CONST(life_whitelist,(_this select 12));

      then find

      life_is_arrested = _this select 7;

      Add code below it

      CONST(life_whitelist,(_this select 13));

      then find

      CONST(life_medicLevel,(_this select 7));

      Add code below it

      CONST(life_whitelist,(_this select 11));

      then to

      fn_initciv.sqf

      add it:

      if((call life_whitelist) < 1) then {["NotWhitelistplayer",false,false] call BIS_fnc_endMission;};

      then to

      description.ext

      find

      class NotWhitelisted { title = "$STR_NotWhitelisted_Title"; subtitle = "$STR_NotWhitelisted_SubTitle"; description = "$STR_NotWhitelisted_Descript"; pictureBackground = ""; picture = ""; pictureColor[] = {0,0.3,0.6,1}; };

      Add code below it

      class NotWhitelistplayer { title = "You are not a whitelist player applied by the server, please contact the administrator"; subtitle = "You are not a whitelist player applied by the server, please contact the administrator"; description = "You are not a whitelist player applied by the server, please contact the administrator"; pictureBackground = ""; picture = ""; pictureColor[] = {0,0.3,0.6,1}; };

      then go to the life_server:

      find fn_queryRequest.sqf

      change it

      Code
      _query = switch (_side) do {
          // West - 11 entries returned
          case west: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime FROM players WHERE pid='%1'",_uid];};
          // Civilian - 12 entries returned
          case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime FROM players WHERE pid='%1'",_uid];};
          // Independent - 10 entries returned
          case independent: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime FROM players WHERE pid='%1'",_uid];};
      };

      to

      Code
      _query = switch (_side) do {
          // West - 11 entries returned
          case west: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime, whitelist FROM players WHERE pid='%1'",_uid];};
          // Civilian - 12 entries returned
          case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, whitelist FROM players WHERE pid='%1'",_uid];};
          // Independent - 10 entries returned
          case independent: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime, whitelist FROM players WHERE pid='%1'",_uid];};
      };

      at last you should add this to sql -> players

      `whitelist` ENUM('0','1') NOT NULL DEFAULT '0',

      If you change the value of whitelist to 1, players can enter, otherwise they cannot enter, that's it! :)

    • Safe zone civil clamp problem

      • apple123
      • 25. März 2020 um 16:35

      try seraching fn_restrainAction ,find "civilian" and "safezone" then you should // them.

    • i need help plz.about gangs

      • apple123
      • 25. März 2020 um 11:50

      tk you man, it work!

    • i need help plz.about gangs

      • apple123
      • 25. März 2020 um 09:53
      Zitat von apple123
      Code
      fn_updateGang.sqf
      params [
          ["_mode",0,[0]],
          ["_group",grpNull,[grpNull]]
      ];
      
      if (isNull _group) exitWith {};
      
      private _groupID = _group getVariable ["gang_id",-1];
      if (_groupID isEqualTo -1) exitWith {};
      
      private _query = "";
      switch (_mode) do {
          case 0: {
              private _bank = [(_group getVariable ["gang_bank",0])] call SOCK_fnc_numberSafe;
              private _maxMembers = _group getVariable ["gang_maxMembers",50];
              private _members = [(_group getVariable "gang_members")] call SOCK_fnc_mresArray;
              private _owner = _group getVariable ["gang_owner",""];
              if (_owner isEqualTo "") exitWith {};
      
              _query = format ["UPDATE gangs SET bank='%1', maxmembers='%2', owner='%3' WHERE id='%4'",_bank,_maxMembers,_owner,_groupID];
          };
      
          case 1: {
              _query = format ["UPDATE gangs SET bank='%1' WHERE id='%2'",([(_group getVariable ["gang_bank",0])] call DB_fnc_numberSafe),_groupID];
          };
      
          case 2: {
              _query = format ["UPDATE gangs SET maxmembers='%1' WHERE id='%2'",(_group getVariable ["gang_maxMembers",50]),_groupID];
          };
      
          case 3: {
              _owner = _group getVariable ["gang_owner",""];
              if (_owner isEqualTo "") exitWith {};
              _query = format ["UPDATE gangs SET owner='%1' WHERE id='%2'",_owner,_groupID];
          };
      
          case 4: {
              _members = _group getVariable "gang_members";
      
              if (count _members > (_group getVariable ["gang_maxMembers",50])) then {
                  _membersFinal = [];
                  for "_i" from 0 to _maxMembers -1 do {
                      _membersFinal pushBack (_members select _i);
                  };
              } else {
                  _membersFinal = _group getVariable "gang_members";
      
              };
      
               {
                   _x set [0,[_x select 0] call DB_fnc_mresString];
                   _membersFinal set[_forEachIndex,_x];
               } forEach _membersFinal;
              _membersFinal = [_membersFinal] call DB_fnc_mresArray;
      
              _query = format ["UPDATE gangs SET members='%1' WHERE id='%2'",_membersFinal,_groupID];
          };
      
          case 5: {
              _query = format ["UPDATE gangs SET tasks='%1' WHERE id='%2'",(_group getVariable ["gang_role",[0,[0,0,0,0,0,0]]]),_groupID];
          };
      };
      
      
      
      if (!isNil "_query") then {
          [_query,1] call DB_fnc_asyncCall;
      };
      Alles anzeigen
    • i need help plz.about gangs

      • apple123
      • 25. März 2020 um 09:52
      Code
      fn_updateGang.sqf
      params [
          ["_mode",0,[0]],
          ["_group",grpNull,[grpNull]]
      ];
      
      if (isNull _group) exitWith {};
      
      private _groupID = _group getVariable ["gang_id",-1];
      if (_groupID isEqualTo -1) exitWith {};
      
      private _query = "";
      switch (_mode) do {
          case 0: {
              private _bank = [(_group getVariable ["gang_bank",0])] call SOCK_fnc_numberSafe;
              private _maxMembers = _group getVariable ["gang_maxMembers",50];
              private _members = [(_group getVariable "gang_members")] call SOCK_fnc_mresArray;
              private _owner = _group getVariable ["gang_owner",""];
              if (_owner isEqualTo "") exitWith {};
      
              _query = format ["UPDATE gangs SET bank='%1', maxmembers='%2', owner='%3' WHERE id='%4'",_bank,_maxMembers,_owner,_groupID];
          };
      
          case 1: {
              _query = format ["UPDATE gangs SET bank='%1' WHERE id='%2'",([(_group getVariable ["gang_bank",0])] call DB_fnc_numberSafe),_groupID];
          };
      
          case 2: {
              _query = format ["UPDATE gangs SET maxmembers='%1' WHERE id='%2'",(_group getVariable ["gang_maxMembers",50]),_groupID];
          };
      
          case 3: {
              _owner = _group getVariable ["gang_owner",""];
              if (_owner isEqualTo "") exitWith {};
              _query = format ["UPDATE gangs SET owner='%1' WHERE id='%2'",_owner,_groupID];
          };
      
          case 4: {
              _members = _group getVariable "gang_members";
      
              if (count _members > (_group getVariable ["gang_maxMembers",50])) then {
                  _membersFinal = [];
                  for "_i" from 0 to _maxMembers -1 do {
                      _membersFinal pushBack (_members select _i);
                  };
              } else {
                  _membersFinal = _group getVariable "gang_members";
      
              };
      
               {
                   _x set [0,[_x select 0] call DB_fnc_mresString];
                   _membersFinal set[_forEachIndex,_x];
               } forEach _membersFinal;
              _membersFinal = [_membersFinal] call DB_fnc_mresArray;
      
              _query = format ["UPDATE gangs SET members='%1' WHERE id='%2'",_membersFinal,_groupID];
          };
      
          case 5: {
              _query = format ["UPDATE gangs SET tasks='%1' WHERE id='%2'",(_group getVariable ["gang_role",[0,[0,0,0,0,0,0]]]),_groupID];
          };
      };
      
      
      
      if (!isNil "_query") then {
          [_query,1] call DB_fnc_asyncCall;
      };
      Alles anzeigen
      Zitat von apple123
    • i need help plz.about gangs

      • apple123
      • 25. März 2020 um 08:26

      my server rpt

      Dateien

      ar3.rpt 4,59 kB – 211 Downloads
    • i need help plz.about gangs

      • apple123
      • 25. März 2020 um 08:22

      I encountered a very important problem that caused me a headache. When a player invited another player and accepted, members returned an empty array, but I debugged gang_members (hint str group player getVariable "gang_members") after debugging The array format is displayed normally, but the database displays []. This causes the player to drop the team after restarting the server or retreating the game, any help is greatly appreciated!dashdashdash

    • Willkommensnachricht nach dem Spawn

      • apple123
      • 20. März 2020 um 18:38

      Try here, the script posted by the author has some punctuation errors, I have modified it.


      welcome.sqf

      Code
      /*
       Script: Welcome Notification
       Author: Exodoos
       Beschreibung: 
       Zeigt einem nach dem Spawn evtl. Server Infos, oder alle Team Namen usw.
      */
      
      [] spawn {
       sleep 15; //WARTESCHLEIFE IN SEKUNDEN
       [
       [
       ["Willkommen bei","<t align = 'center' size = '0.7'>%1</t><br/>"], //OBERE ZEILE
       ["MEINEM SERVER","<t align = 'center' size ='1'>%1</t><br/>"] //UNTERE ZEILE
       ]
       ] spawn BIS_fnc_typeText; //TEXT TYP
       
       sleep 12;
       
       [
       [
       ["ÜBERSCHRIFT","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["NAMEN","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
       sleep 12;
       [
       [
       ["ÜBERSCHRIFT","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["NAMEN","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
       sleep 12;
       [
       [
       ["ÜBERSCHRIFT","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["NAMEN","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
       sleep 20;
       [
       [
        ["Besuche uns unter","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["WEBSITE","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
       sleep 12;
       [
       [
       ["Teamspeak 3 Server","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["TS IP SERVER","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
       sleep 12;
       [
       [
       ["Server Regeln und Changelogs","<t align = 'center' size = '0.7'>%1</t><br/>"],
       ["WEBSITE","<t align = 'center' size ='1'>%1</t><br/>"]
       ]
       ] spawn BIS_fnc_typeText;
      };
      Alles anzeigen
    • How to read the database contents on the server

      • apple123
      • 12. Februar 2020 um 13:27
      Zitat von LETUS

      OK,

      so, a way is to add the player over an webinterface or an extra programm. You need an html form with an little bit of php at the backend take an look here:

      https://www.w3schools.com/php/php_forms.asp and here https://www.cloudways.com/blog/connect-mysql-with-php/ you can also find a loot of tutorials an youtube. Also take a look at security that you can prevent an SQL Injection, you can also find a lot of tutorials on the internet.

      You can also do it from ingame. But isnt that good because you need to join on the server every time you would like to whitlist someone.

      Sorry, you misunderstood me. I have created a new table "pwhitelist" in the database table. My idea is that only when I add the player's uid - "player uid", can the server read it, and then the client remoteexec arrives, the player can enter the game.

    • How to read the database contents on the server

      • apple123
      • 12. Februar 2020 um 12:41
      Zitat von LETUS

      Hey,

      take a look at the fn_queryRequest.sqf:

      https://github.com/AsYetUntitled/…ueryRequest.sqf

      In these lines(31) you see the creation of the sql request:

      Code
      format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime FROM players WHERE pid='%1'",_uid];


      and here you send the query to the DB. For more informations about this, take a look at the header of the asyncCall function.

      Code
      _queryResult = [_query,2] call DB_fnc_asyncCall;

      In "_queryResult" you can find the result from the database.

      Alles anzeigen

      i know that,but I don't know how to make the server read the player uid so that whitelist is equal to the player uid in the database and runs at the same time as the server.

    • How to read the database contents on the server

      • apple123
      • 11. Februar 2020 um 23:03

      I want to implement a script so that when a new player enters the game as a civilian, he must have the player's UID in a specific table in the database. Otherwise, the task ends. This is my script.

      Code: fn_initciv.sqf
      private _uid = getPlayerUID player;
      if !(_uid in _whitelist)then{
      ["NotWhitelisted",false,true] call BIS_fnc_endMission;
      };
      [_whitelist] remoteExec ["DB_fnc_whitelist", 2];
      Code: pwhitelist.sql
      CREATE TABLE `pwhitelist` (
       `playerUID` VARCHAR(32) NULL DEFAULT NULL,
       `reason` VARCHAR(17) NULL DEFAULT NULL,
       PRIMARY KEY (`playerUID`)
      )
      COLLATE='utf8mb4_general_ci'
      ENGINE=InnoDB
      AUTO_INCREMENT=1
      ;
      Code: whitelist.sqf
      //life_server
      params [
      ["_whitelist","",[""]],
      ["_reason","",[""]]
      ];

      I don't know how to write next, so that I can add player UID to the database before players can play. This is similar to a whitelisting system, any help would be greatly appreciated!:D:D:D

    • Ask for help from the Chief of Police to issue rankings!

      • apple123
      • 18. Januar 2020 um 09:40

      fn_makecop.sqf

      Code
      #include "..\..\script_macros.hpp"
      private["_target"];
      _target = cursorObject;
      
      if((isNull _target) OR !(_target isKindOf "Man") OR !(alive _target)) exitWith{};
      
      private _action = [
          localize "STR_Gang_maketo",
          localize "STR_Gang_maketo",
          localize "STR_Global_Yes",
          localize "STR_Global_No"
      ] call BIS_fnc_guiMessage;
      
      
      if (_action) then {
          hint "successful";
          [_target,getPlayerUID _target,side _target] remoteExecCall ["TON_fnc_changeFraction",RSERV];
      } else {
          hint "cancel";
      };
      Alles anzeigen

      fn_changeFractionDone.sqf

      Code
      #include "..\..\script_macros.hpp"
      private _side = param [0,sideUnknown,[civilian]];
      
      if (_side == sideUnknown OR _side != playerSide) exitWith {life_fractionInUse = false;};
      
      switch(_side) do {
          case civilian: {                
              hint "successful john in";                
          };
          case independent: {    
              hint "successful john in";                
          };
      };
      
      life_fractionInUse = false;
      
      [] spawn life_fnc_logout;
      Alles anzeigen

      fn_setupaction.sqf

      player addAction["<t color='#002aff'>give cop licenses</t>",fn_makecop,"",0,false,false,"",' !isNull cursorObject && {player distance cursorObject < 3.5} && {isPlayer cursorObject} && {alive cursorObject} && {cursorObject isKindOf "Man"} && life_coplevel > 27 && !life_fractionInUse'];

      then in functions.hpp

      and server

      fn_changeFraction.sqf

      Code
      params [
          ["_unit",objNull,[objNull]],
          ["_uid","",[""]],
          ["_side",sideUnknown,[civilian]]
      ];
      if (isNull _unit || _uid isEqualTo "" || _side isEqualTo sideUnknown) exitWith {
          life_fractionInUse = false;
          owner _unit publicVariableClient "life_action_inUse";
      };
      
      _query = switch(_side) do {
          case civilian: {format ["UPDATE players SET civlevel='0', coplevel='1', reblevel='0', mediclevel='0' WHERE playerid='%1'",_uid]};
          case independent: {format ["UPDATE players SET civlevel='0', coplevel='1', reblevel='0', mediclevel='0' WHERE playerid='%1'",_uid]};
      };
      switch(_side) do {
          case civilian: {
              _arr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side],[]];
              missionNamespace setVariable [format ["%1_KEYS_%2",_uid,"GUER"],_arr];
          };
          case independent: {
              _arr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side],[]];
              missionNamespace setVariable [format ["%1_KEYS_%2",_uid,"CIV"],_arr];
          };
      };
      [_query,1] call DB_fnc_asyncCall;
      
      [_side] remoteExecCall ["life_fnc_changeFractionDone",(owner _unit)];
      Alles anzeigen

      and then in config.cpp

      The principle is that after issuing the certificate through the police chief, the player released by the wheel will immediately exit the game and get a level 1 police officer.

      But I don't know where the problem is, did not execute to the server and execute the mysql function.

      Any help, thanks!

      :)

    • How to remove AI corpses

      • apple123
      • 21. Dezember 2019 um 21:44

      tks a lot , it work !

    • How to remove AI corpses

      • apple123
      • 18. Dezember 2019 um 17:39

      Excuse me, I have placed some AI in the editor and run it at the beginning of the task. How can I set the corpses to be automatically removed after these AIs die? Thank you!

    • [Tutorial] [Altis Life 5.0] Auktionshaus

      • apple123
      • 17. Dezember 2019 um 16:58
      Zitat von blackfisch

      thats an issue with your server configuration, not the tutorial

      tks!

    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™