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
Sa: 17 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 Easy Exp System

      • Altis Life
    • Risk
    • 21. Oktober 2017 um 20:25
    • Julian
      Nerd
      Reaktionen
      76
      Trophäen
      8
      Beiträge
      820
      • 11. Mai 2018 um 16:30
      • #81
      Zitat von NNature

      Also ich hab alles im TUT gemacht und Request hab ich verändert weil der Server nicht mehr ging

      Dazu hab ich in der fn_requestReceived das Level von 13 auf 14 geändert da dort schon ein Ausweis war.

      Hast du alle dinge die daran hängen geändert ?

      Mit freundlichen Grüßen,

      Julian


      Bitte erst Denken und dann Fragen


      Hier lesen: das Heilige Buch der Arma3 Scripter

    • Lucifer Lucius
      Amateur
      Reaktionen
      5
      Trophäen
      8
      Beiträge
      200
      • 26. August 2018 um 19:28
      • #82

      Ist das ganze auch für die 4.4.4 möglich

    • moeck
      Erleuchteter
      Reaktionen
      632
      Trophäen
      9
      Beiträge
      3.160
      Bilder
      9
      • 27. August 2018 um 07:04
      • #83

      ja das funzt auch mit der 4.4 ;)

      Signatur? Was ist eine Signatur? Kann man das essen?

      Bitte beachten: Ich gebe keinen Support über private Nachrichten!


      Ganz wichtig: [Leitfaden] Wie frage Ich richtig um Hilfe?

      Nicht zu vergessen [Tutorial/Selbst-Test] Sollte ich einen Life Server eröffnen ?

    • Lucifer Lucius
      Amateur
      Reaktionen
      5
      Trophäen
      8
      Beiträge
      200
      • 27. August 2018 um 14:55
      • #84

      ok danke musste paar sachen ändern aber ich muss mich wieso erstmal an ein paar fehler ran setzten

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 11. Oktober 2018 um 13:47
      • #85

      Habe einen fehler in der fn_queryRequest.sqf

      Error :

      Spoiler anzeigen
      Code
      13:31:33 Error in expression <ew select 2] call TON_fnc_setPlayTime;
      
             _tmp = _queryResult select>
      13:31:33   Error position: <       _tmp = _queryResult select>
      13:31:33   Error Invalid number in expression
      13:31:33 File \life_server\Functions\MySQL\fn_queryRequest.sqf [DB_fnc_queryRequest], line 182
      13:31:33 Error in expression <ew select 2] call TON_fnc_setPlayTime;
      
             _tmp = _queryResult select>
      13:31:33   Error position: <       _tmp = _queryResult select>
      13:31:33   Error Invalid number in expression
      13:31:33 File \life_server\Functions\MySQL\fn_queryRequest.sqf [DB_fnc_queryRequest], line 182
      Alles anzeigen

      Meine Datei :

      Spoiler anzeigen
      Code
      #include "\life_server\script_macros.hpp"
      /*
       File: fn_queryRequest.sqf
       Author: Bryan "Tonic" Boardwine
      
       Description:
       Handles the incoming request and sends an asynchronous query
       request to the database.
      
       Return:
       ARRAY - If array has 0 elements it should be handled as an error in client-side files.
       STRING - The request had invalid handles or an unknown error and is logged to the RPT.
      */
      private ["_uid","_side","_query","_queryResult","_tickTime","_tmp"];
      _uid = [_this,0,"",[""]] call BIS_fnc_param;
      _side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param;
      _ownerID = [_this,2,objNull,[objNull]] call BIS_fnc_param;
      
      if (isNull _ownerID) exitWith {};
      _ownerID = owner _ownerID;
      
      _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 - 13 entries returned
       case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, EXP, LEVEL 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];};
      };
      
      _tickTime = diag_tickTime;
      _queryResult = [_query,2] call DB_fnc_asyncCall;
      
      if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then {
       diag_log "------------- Client Query Request -------------";
       diag_log format ["QUERY: %1",_query];
       diag_log format ["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)];
       diag_log format ["Result: %1",_queryResult];
       diag_log "------------------------------------------------";
      };
      
      if (_queryResult isEqualType "") exitWith {
       [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID];
      };
      
      if (count _queryResult isEqualTo 0) exitWith {
       [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID];
      };
      
      //Blah conversion thing from a2net->extdb
      _tmp = _queryResult select 2;
      _queryResult set[2,[_tmp] call DB_fnc_numberSafe];
      _tmp = _queryResult select 3;
      _queryResult set[3,[_tmp] call DB_fnc_numberSafe];
      
      //Parse licenses (Always index 6)
      _new = [(_queryResult select 6)] call DB_fnc_mresToArray;
      if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
      _queryResult set[6,_new];
      
      //Convert tinyint to boolean
      _old = _queryResult select 6;
      for "_i" from 0 to (count _old)-1 do {
       _data = _old select _i;
       _old set[_i,[_data select 0, ([_data select 1,1] call DB_fnc_bool)]];
      };
      
      _queryResult set[6,_old];
      
      _new = [(_queryResult select 8)] call DB_fnc_mresToArray;
      if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
      _queryResult set[8,_new];
      //Parse data for specific side.
      switch (_side) do {
       case west: {
       _queryResult set[9,([_queryResult select 9,1] call DB_fnc_bool)];
      
       //Parse Stats
       _new = [(_queryResult select 10)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[10,_new];
      
       //Playtime
       _new = [(_queryResult select 11)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _index = TON_fnc_playtime_values_request find [_uid, _new];
       if (_index != -1) then {
       TON_fnc_playtime_values_request set[_index,-1];
       TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       } else {
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       };
       [_uid,_new select 0] call TON_fnc_setPlayTime;
       };
      
       case civilian: {
       _queryResult set[7,([_queryResult select 7,1] call DB_fnc_bool)];
      
       //Parse Stats
       _new = [(_queryResult select 9)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[9,_new];
      
       //Position
       _queryResult set[10,([_queryResult select 10,1] call DB_fnc_bool)];
       _new = [(_queryResult select 11)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[11,_new];
      
       //Playtime
       _new = [(_queryResult select 12)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _index = TON_fnc_playtime_values_request find [_uid, _new];
       if (_index != -1) then {
       TON_fnc_playtime_values_request set[_index,-1];
       TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       } else {
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       };
       [_uid,_new select 2] call TON_fnc_setPlayTime;
      
              _tmp = _queryResult select 13;
       _queryResult set[12,[_tmp] call DB_fnc_numberSafe];
              _tmp = _queryResult select 14;
       _queryResult set[13,[_tmp] call DB_fnc_numberSafe];
      
       /* Make sure nothing else is added under here */
       _houseData = _uid spawn TON_fnc_fetchPlayerHouses;
       waitUntil {scriptDone _houseData};
       _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]);
       _gangData = _uid spawn TON_fnc_queryPlayerGang;
       waitUntil{scriptDone _gangData};
       _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]);
      
       };
      
       case independent: {
       //Parse Stats
       _new = [(_queryResult select 9)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[9,_new];
      
       //Playtime
       _new = [(_queryResult select 10)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _index = TON_fnc_playtime_values_request find [_uid, _new];
       if !(_index isEqualTo -1) then {
       TON_fnc_playtime_values_request set[_index,-1];
       TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       } else {
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       };
       [_uid,_new select 1] call TON_fnc_setPlayTime;
       };
      };
      
      publicVariable "TON_fnc_playtime_values_request";
      
      _keyArr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side],[]];
      _queryResult pushBack _keyArr;
      
      _queryResult remoteExec ["SOCK_fnc_requestReceived",_ownerID];
      Alles anzeigen

      Weiß jemand wie man das fixt ?

    • moeck
      Erleuchteter
      Reaktionen
      632
      Trophäen
      9
      Beiträge
      3.160
      Bilder
      9
      • 11. Oktober 2018 um 14:01
      • #86

      häng mal bitte die extDB logs an und die kompletten logs

      Signatur? Was ist eine Signatur? Kann man das essen?

      Bitte beachten: Ich gebe keinen Support über private Nachrichten!


      Ganz wichtig: [Leitfaden] Wie frage Ich richtig um Hilfe?

      Nicht zu vergessen [Tutorial/Selbst-Test] Sollte ich einen Life Server eröffnen ?

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 11. Oktober 2018 um 14:07
      • #87

      Hier, bitteschön

      Dateien

      13-32-13.log 897 Byte – 136 Downloads arma3server_2018-10-11_13-31-16.rpt 60,11 kB – 150 Downloads
    • moeck
      Erleuchteter
      Reaktionen
      632
      Trophäen
      9
      Beiträge
      3.160
      Bilder
      9
      • 11. Oktober 2018 um 14:20
      • #88

      so du hast vergessen das mit der exp und dem level einzufügen im case civilian

      Code
      case civilian: {
       _queryResult set[7,([_queryResult select 7,1] call DB_fnc_bool)];
       //Parse Stats
       _new = [(_queryResult select 9)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[9,_new];
       //Position
       _queryResult set[10,([_queryResult select 10,1] call DB_fnc_bool)];
       _new = [(_queryResult select 11)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _queryResult set[11,_new];
       //Playtime
       _new = [(_queryResult select 12)] call DB_fnc_mresToArray;
       if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
       _index = TON_fnc_playtime_values_request find [_uid, _new];
       if (_index != -1) then {
       TON_fnc_playtime_values_request set[_index,-1];
       TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       } else {
       TON_fnc_playtime_values_request pushBack [_uid, _new];
       };
       [_uid,_new select 2] call TON_fnc_setPlayTime;
              _tmp = _queryResult select 13;
       _queryResult set[12,[_tmp] call DB_fnc_numberSafe];
              _tmp = _queryResult select 14;
       _queryResult set[13,[_tmp] call DB_fnc_numberSafe];
       /* Make sure nothing else is added under here */
       _houseData = _uid spawn TON_fnc_fetchPlayerHouses;
       waitUntil {scriptDone _houseData};
       _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]);
       _gangData = _uid spawn TON_fnc_queryPlayerGang;
       waitUntil{scriptDone _gangData};
       _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]);
       };
      Alles anzeigen

      Signatur? Was ist eine Signatur? Kann man das essen?

      Bitte beachten: Ich gebe keinen Support über private Nachrichten!


      Ganz wichtig: [Leitfaden] Wie frage Ich richtig um Hilfe?

      Nicht zu vergessen [Tutorial/Selbst-Test] Sollte ich einen Life Server eröffnen ?

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 11. Oktober 2018 um 14:29
      • #89

      Dank dir funktioniert jetzt einwandfrei. Natürlich auch ein großes Danke an Risk der das alles kostenfrei zu verfügung stellt.

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 11. Oktober 2018 um 14:35
      • #90

      Doch noch ein kleines Problem, unzwar wie verbinde ich jetzt diese config mit dem Script.

      Habe die Config mit der Config_Master.hpp verknüpft.

      und die fn_handleEXP.sqf habe ich im functions ordern und in der functions.hpp eingetragen.

      Jedoch kriege ich bis jetzt kein Levelup wenn ich die entsprechende EXP erreicht habe.

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 14. Oktober 2018 um 18:55
      • #91

      ?

    • Julian
      Nerd
      Reaktionen
      76
      Trophäen
      8
      Beiträge
      820
      • 14. Oktober 2018 um 20:05
      • #92

      Deine Aussage war so UnDEUTSCHlich :D das sie keiner Verstanden hat ... :)

      Mit freundlichen Grüßen,

      Julian


      Bitte erst Denken und dann Fragen


      Hier lesen: das Heilige Buch der Arma3 Scripter

    • nicohack
      Anfänger
      Reaktionen
      5
      Trophäen
      9
      Beiträge
      71
      Dateien
      2
      • 14. Oktober 2018 um 20:08
      • #93

      Auf Seite 4 dieses Beitrag findet man ja eine Config.

      Diese sorgt so wie ich es verstehe dafür das, dass level automatisch hochgesetzt wird bei einer bestimmten Anazhl von EXP.

      Ich habe sie jetzt in der Config_Master.hpp eingebunden mithilfe von "#include".

      Jedoch funktioniert das net ganz.

      Da ich vermute das ich die falsch eingefügt habe wollte ich nachfragen wie man die Config denn richtig hinzufügt.

    • Julian
      Nerd
      Reaktionen
      76
      Trophäen
      8
      Beiträge
      820
      • 14. Oktober 2018 um 21:49
      • #94

      Config einbinden wie du es schon gemacht hast ...

      In der handleExp siehst du ja das er aus der config liest darin steht nur wann es nen Level up fürderhin gibt also wie viele exp du benötigst

      Mit freundlichen Grüßen,

      Julian


      Bitte erst Denken und dann Fragen


      Hier lesen: das Heilige Buch der Arma3 Scripter

    • Chase McCain
      Gast
      • 9. Juni 2019 um 20:45
      • #95

      hallo das level steigt bei mir nicht

      Einmal editiert, zuletzt von Chase McCain (10. Juni 2019 um 12:48)

    • Chase McCain
      Gast
      • 10. Juni 2019 um 16:40
      • #96

      habt ihr eine idee woran das liegt

      habe aber auch nur noch errors

      arma3server_2019-06-10_16-28-49.rpt

    • SelfTanoa
      Schüler
      Reaktionen
      2
      Trophäen
      9
      Beiträge
      87
      • 11. Februar 2020 um 21:54
      • #97

      hey hey

      ich bekomme beim erstellen der DB leider immer die selbe meldung


      Fehler

      SQL-Befehl:

      Code
      ALTER TABLE `altislife`.`players`
      ADD COLUMN `EXP` INT(100) NOT NULL DEFAULT 0
      ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0

      MySQL meldet: Dokumentation

      #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0' in Zeile 3




    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 11. Februar 2020 um 22:51
      • #98
      Zitat von SelfTanoa

      hey hey

      ich bekomme beim erstellen der DB leider immer die selbe meldung


      Fehler

      SQL-Befehl:

      Code
      ALTER TABLE `altislife`.`players`
      ADD COLUMN `EXP` INT(100) NOT NULL DEFAULT 0
      ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0

      MySQL meldet: Dokumentation

      #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0' in Zeile 3




      Alles anzeigen
      SQL
      ALTER TABLE `altislife`.`players`
      ADD COLUMN `EXP` INT(100) NOT NULL DEFAULT 0,
      ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0

      mehrere Anfragen mit Komma seperiert. habs im tut gefixt ;)

      #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!

      ______________________

    • SelfTanoa
      Schüler
      Reaktionen
      2
      Trophäen
      9
      Beiträge
      87
      • 12. Februar 2020 um 20:03
      • #99

      Der Meldung zur folge wird der code von meinem Anbieter geblockt oder wie ist das zu verstehen.

      Code
      ALTER TABLE `altislife`.`players`
      ADD COLUMN `EXP` INT(100) NOT NULL DEFAULT 0,
      ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0

      MySQL meldet: Dokumentation

      #1142 - ALTER Befehl nicht erlaubt für Benutzer 'altislife'@'localhost' auf Tabelle 'players'

    • nox
      Administrator
      Reaktionen
      1.860
      Trophäen
      11
      Artikel
      2
      Beiträge
      1.866
      Dateien
      36
      Bilder
      11
      • 12. Februar 2020 um 20:51
      • Offizieller Beitrag
      • #100
      Zitat von SelfTanoa

      Der Meldung zur folge wird der code von meinem Anbieter geblockt oder wie ist das zu verstehen.

      Code
      ALTER TABLE `altislife`.`players`
      ADD COLUMN `EXP` INT(100) NOT NULL DEFAULT 0,
      ADD COLUMN `LEVEL` INT(100) NOT NULL DEFAULT 0

      MySQL meldet: Dokumentation

      #1142 - ALTER Befehl nicht erlaubt für Benutzer 'altislife'@'localhost' auf Tabelle 'players'

      Das bedeutet dass der Benutzer altislife keine Berechtigung für diese Aktion besitzt. Bei welchem Anbieter bist du denn?

      Wichtige Links:

      [Erklärung|Leitfaden] Arma 3 Logs - Client, Server & extDB Log
      [Tutorial] ArmA 3 Altis Life RPG & Tanoa Life RPG Server einrichten unter Windows (mit extDB & BEC)
      BattlEye Filter - Guide und Erklärungen

      • Nächster offizieller Beitrag

    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™