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
Fr: 16 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] SQL basiertes Smartphone

      • Altis Life
    • Exodoos
    • 1. August 2016 um 18:57
    • Exodoos
      Fortgeschrittener
      Reaktionen
      164
      Trophäen
      10
      Beiträge
      332
      • 1. August 2016 um 18:57
      • #1

      SQL BASIERTES SMARTPHONE FÜR 4.4 UND 4.4 R4
      Upgedated von Alaskavet , Basis Code von Silex

      Hallo, heute mache ich mal was ganz schmackhaftes, was viele von euch kennen und lieben gelernt haben.

      Dann fangen wir mal an.

      CLIENT PART:

      Öffnet eure "configuration.sqf" und fügt dort, wo die life_variables sind, das hier ein:

      SQL: configuration.sqf
      life_smartphoneTarget = ObjNull;



      In der "CfgRemoteExec.hpp", fügt das hier ein:

      SQL: CfgRemoteExec.hpp
      F(TON_fnc_handleMessages,SERVER)
      F(TON_fnc_msgRequest,SERVER)


      Dann geht in die "Functions.hpp" und fügt das hier unter der class "Player_Menu" ein:

      SQL: Functions.hpp
      class smartphone {};
      class newMsg {};
      class showMsg {};


      Öffnet eure "Masterhandler.hpp", diese findet ihr im "dialog" Ordner und fügt das ein:

      SQL: Masterhandler.hpp
      #include "smartphone.hpp"


      Dann geht in die "player_inv.hpp" im "dialog" Ordner, sucht nach "ButtonCell" und ersetzt diesen Event "onButtonClick" mit diesem hier:

      SQL: player_inv.hpp
      createDialog ""Life_my_smartphone"";


      Erstellt im "dialog" Ordner eine neue Datei namens "smartphone.hpp" und fügt das hier ein:

      SQL: smartphone.hpp
      class Life_my_smartphone {
      	idd = 88888;
      	name = "life_my_telephone_menu";
      	movingEnable = false;
      	enableSimulation = true;
      	onLoad = "[] spawn life_fnc_smartphone;";
      	class controlsBackground {
      		class Life_RscTitleBackground:Life_RscText {
      			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
      			idc = -1;
      			x = 0.1;
      			y = 0.2;
      			w = 0.95;
      			h = (1 / 25);
      		};
      		class MainBackground:Life_RscText {
      			colorBackground[] = {0, 0, 0, 0.7};
      			idc = -1;
      			x = 0.1;
      			y = 0.2 + (11 / 250);
      			w = 0.95;
      			h = 0.7 - (22 / 250);
      		};
      		class PlayerListTitleBackground:Life_RscText {
      			colorBackground[] = {0.588, 0.424, 0.145, 1.0};
      			idc = -1;
      			x = 0.11;
      			y = 0.25;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class MessageTitleBackground:Life_RscText {
      			colorBackground[] = {0.588, 0.424, 0.145, 1.0};
      			idc = -1;
      			x = 0.325;
      			y = 0.25;
      			w = 0.7;
      			h = (1 / 25);
      		};
      		class RandomTitleBackground:Life_RscText {
      			colorBackground[] = {0.588, 0.424, 0.145, 1.0};
      			idc = -1;
      			x = 0.325;
      			y = 0.25 + 0.3 + (1 / 25);
      			w = 0.7;
      			h = (1 / 25);
      		};
      	};
      
      
      
      
      	class controls {
      		class MessageTitle : Life_RscTitle {
      			colorBackground[] = {0, 0, 0, 0};
      			idc = 88886;
      			text = "";
      			sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.9)";
      			x = 0.325;
      			y = 0.25;
      			w = 0.7;
      			h = (1 / 25);
      		};
      		class RandomTitle : Life_RscTitle {
      			colorBackground[] = {0, 0, 0, 0};
      			idc = 88890;
      			text = "$STR_SMARTPHONE_RANDOMTITLE";
      			sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.9)";
      			x = 0.325;
      			y = 0.25 + 0.3 + (1 / 25);
      			w = 0.7;
      			h = (1 / 25);
      		};
      		class PlayerList : Life_RscListBox {
      			idc = 88881;
      			onLBSelChanged = "[2] spawn life_fnc_smartphone;";
      			sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)";
      			x = 0.11;
      			y = 0.25 + (1 / 25);
      			w = 0.2;
      			h = 0.5;
      		};
      		class MessageList : Life_RscListNBox {
      			idc = 88882;
      			onLBSelChanged = "[(lbCurSel 88882)] call life_fnc_showMsg;";
      			//sizeEx = 0.04;
      			sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)";
      			colorBackground[] = {0, 0, 0, 0.0};
      			columns[] = {0,0.3};
      			x = 0.325;
      			y = 0.25 + (1 / 25);
      			w = 0.7;
      			h = 0.3;
      		};
      		class TextShow : Life_RscControlsGroup {
      			x = 0.325;
      			y =  0.25 + 0.3 + (1 / 25) + (1 / 25);
      			w =  0.7;
      			h =  0.15;
      			class HScrollbar : HScrollbar {
      			height = 0;
      			};
      			class controls {
      				class showText : Life_RscStructuredText {
      					idc = 88887;
      					text = "";
      					colorBackground[] = {0.28,0.28,0.28,0.28};
      					size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)";
      					shadow = 0;
      					x = 0;
      					y = 0;
      					w = 0.69;//w = 0.7;
      					h = 1;//h = 2.15;
      				};
      			};
      		};
      		class Schreiben : Life_RscButtonMenu {
      		idc = 887892;
      		text = "$STR_SMARTPHONE_SCHREIBEN";
      		onButtonClick = "[4] call life_fnc_smartphone;";
      		colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1.0};
      		x = 0.11;
      		y = 0.25 + (1 / 25) + 0.51;
      		w = 0.2;
      		h = (1 / 25);
      		};
      		class Title : Life_RscTitle {
      		colorBackground[] = {0, 0, 0, 0};
      		idc = -1;
      		text = "$STR_SMARTPHONE_TITLE";
      		sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
      		x = 0.1;
      		y = 0.2;
      		w = 0.95;
      		h = (1 / 25);
      		};
      		class PlayerListTitle : Life_RscTitle {
      		colorBackground[] = {0, 0, 0, 0};
      		idc = -1;
      		text = "$STR_SMARTPHONE_PLAYERLISTTITLE";
      		sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.9)";
      		x = 0.11;
      		y = 0.25;
      		w = 0.2;
      		h = (1 / 25);
      		};
      		class CloseLoadMenu : Life_RscButtonMenu {
      		idc = -1;
      		text = "$STR_Global_Close";
      		onButtonClick = "closeDialog 0;";
      		x = -0.06 + (6.25 / 40) + (1 / 250 / (safezoneW / safezoneH));
      		y = 0.9 - (1 / 25);
      		w = (6.25 / 40);
      		h = (1 / 25);
      		};
      		class Notruf : Life_RscButtonMenu {
      			idc = -1;
      			text = "$STR_SMARTPHONE_NOTRUF";
      			onButtonClick = "createDialog ""Life_smartphone_notruf"";";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			x = 0.325 + 0.7 - (6.25 / 40);
      			y = 0.25 + (1 / 25) + 0.51;
      			w = (6.25 / 40);
      			h = (1 / 25);
      		};
      	};
      
      
      
      
      };
      
      
      
      
      class Life_smartphone_schreiben{
      	idd = 88883;
      	name = "life_my_smartphone_schreiben";
      	movingEnable = false;
      	enableSimulation = true;
      	onLoad = "";
      	class controlsBackground {
      		class Life_RscTitleBackground:Life_RscText {
      			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
      			idc = -1;
      			x = 0.1;
      			y = 0.2;
      			w = 0.6;
      			h = (1 / 25);
      		};
      		class MainBackground:Life_RscText {
      			colorBackground[] = {0, 0, 0, 0.7};
      			idc = -1;
      			x = 0.1;
      			y = 0.2 + (11 / 250);
      			w = 0.6;
      			h = 0.1;
      		};
      	};
      	class controls {
      		class Title : Life_RscTitle {
      			colorBackground[] = {0, 0, 0, 0};
      			idc = 88886;
      			text = "$STR_SMARTPHONE_NACHRICHTTITLE";
      			x = 0.1;
      			y = 0.2;
      			w = 0.95;
      			h = (1 / 25);
      		};
      		class Absenden : Life_RscButtonMenu {
      			idc = 88885;
      			text = "$STR_SMARTPHONE_ABSENDEN";
      			onButtonClick = "[1,-1,(ctrlText 88884)] call life_fnc_newMsg;";
      			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1.0};
      			x = 0.6 - (6.25 / 40) + 0.088;
      			y = 0.3 + (1 / 25)  - 0.048;
      			w = (6.25 / 40);
      			h = (1 / 25);
      		};
      		class AdminMsg : life_RscButtonMenu 
      		{
      			idc = 888897;
      			text = "$STR_CELL_AdminMsg";
      			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1.0};
      			onButtonClick = "[5,-1,(ctrlText 88884)] call life_fnc_newMsg;";
      			x = 0.6 - (6.25 / 40) - 0.121;
      			y = 0.3 + (1 / 25)  - 0.048;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class Close : Life_RscButtonMenu {
      			idc = -1;
      			text = "$STR_Global_Close";
      			onButtonClick = "closeDialog 0;";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			x = 0.11;
      			y = 0.3 + (1 / 25)  - 0.048;
      			w = (6.25 / 40);
      			h = (1 / 25);
      		};
      		class textEdit : Life_RscEdit {
      			idc = 88884;
      			text = "";
      			sizeEx = 0.030;
      			x = 0.11; y = 0.3 - 0.048;
      			w = 0.58; h = 0.03;
      		};
      	};
      };
      
      
      
      
      class Life_smartphone_notruf {
      	idd = 887890;
      	name= "life_my_smartphone_notruf";
      	movingEnable = false;
      	enableSimulation = true;
      	onLoad = "[6] spawn life_fnc_newMsg;";
      	class controlsBackground {
      		class Life_RscTitleBackground:Life_RscText {
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			idc = -1;
      			x = 0.1;
      			y = 0.2;
      			w = 0.64;
      			h = (1 / 25);
      		};
      		class MainBackground:Life_RscText {
      			colorBackground[] = {0, 0, 0, 0.7};
      			idc = -1;
      			x = 0.1;
      			y = 0.2 + (11 / 250);
      			w = 0.64;
      			h = 0.15 - (5 / 250);
      		};
      	};
      	class controls {
      		class Title : Life_RscTitle {
      			colorBackground[] = {0, 0, 0, 0};
      			idc = 888892;
      			text = "$STR_SMARTPHONE_Notruftitle";
      			x = 0.1;
      			y = 0.2;
      			w = 0.6;
      			h = (1 / 25);
      		};
      		class textEdit : Life_RscEdit {
      			idc = 888894;
      			text = "";
      			sizeEx = 0.030;
      			x = 0.11; y = 0.25;
      			w = 0.62; h = 0.03;
      		};
      		class TxtCopButton : life_RscButtonMenu 
      		{
      			idc = 888895;
      			text = "$STR_CELL_TextPolice";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			onButtonClick = "[2,-1,(ctrlText 888894)] call life_fnc_newMsg;";
      			x = 0.32;
      			y = 0.30;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class TxtAdminButton : life_RscButtonMenu 
      		{
      			idc = 888896;
      			text = "$STR_CELL_TextAdmins";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			onButtonClick = "[3,-1,(ctrlText 888894)] call life_fnc_newMsg;";
      			x = 0.53;
      			y = 0.30;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class AdminMsgAll : life_RscButtonMenu 
      		{
      			idc = 888898;
      			text = "$STR_CELL_AdminMSGAll";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			onButtonClick = "[7,-1,(ctrlText 888894)] call life_fnc_newMsg;";
      			x = 0.53;
      			y = 0.30;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class EMSReq : life_RscButtonMenu
      		{
      			idc = 888899;
      			text = "$STR_CELL_EMSRequest";
      			colorBackground[] = {0.584, 0.086, 0.086,1.0};
      			onButtonClick = "[4,-1,(ctrlText 888894)] call life_fnc_newMsg;";
      			x = 0.11;
      			y = 0.30;
      			w = 0.2;
      			h = (1 / 25);
      		};
      		class CloseButton : Life_RscButtonMenu {
      			idc = -1;
      			text = "$STR_Global_Close";
      			onButtonClick = "closeDialog 0;";
      			x = -0.06 + (6.25 / 40) + (1 / 250 / (safezoneW / safezoneH));
      			y = 0.36 + (1 / 50);
      			w = (6.25 / 40);
      			h = (1 / 25);
      		};
      	};
      };
      Alles anzeigen


      Öffnet dann eure "stringtable.xml" und fügt eine neue Package ein:

      XML: stringtable.xml
      <Package name="Smartphone">
          <Key ID="STR_PM_Smartphone">
              <Original>Smartphone</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_TITLE">
              <Original>Smartphone Menu</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_PLAYERLISTTITLE">
              <Original>List of Players</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_MESSAGETITLE">
              <Original>New Message</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_RANDOMTITLE">
              <Original>Select a message to read</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_SCHREIBEN">
              <Original>Write</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_NOTRUF">
              <Original>Emergency call</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_Absenden">
              <Original>Send</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_NACHRICHTTITLE">
              <Original>Message:</Original>
          </Key>
          <Key ID="STR_SMARTPHONE_Notruftitle">
              <Original>CALLS EMERGENCY | Abuse leads to BAN!</Original>
          </Key>
      </Package>
      Alles anzeigen


      Geht dann in den Ordner "core\pmenu" und erstellt 3 neue Dateien:

      "fn_newMsg.sqf" , "fn_smartphone.sqf" , fn_showMsg.sqf

      1. fn_newMsg.sqf

      SQL: fn_newMessage.sqf
      #include "..\..\script_macros.hpp"
      /*
      file: fn_newMsg.sqf	
      Author: Silex	
      */
      private["_to","_type","_playerData","_msg"];
      disableSerialization;
      _type = [_this,0,-1] call BIS_fnc_param;
      _playerData = [_this,1,-1] call BIS_fnc_param;
      _msg = [_this,2,"",[""]] call BIS_fnc_param;
      _display = findDisplay 88888;
      _cPlayerList = _display displayCtrl 88881;
      _cMessageEdit = _display displayCtrl 88884;
      switch(_type) do{	
      	case 0:	{		
      		life_smartphoneTarget = call compile format["%1",_playerData];
      		ctrlSetText[88886, format["message: %1",name life_smartphoneTarget]];
      		if((FETCH_CONST(life_adminlevel) < 1)) then	{
      			ctrlShow[888897,false];
      		};
      	};
      	//normal message	
      	case 1:	{		
      	if(isNUll life_smartphoneTarget) exitWith {hint format["No person selected!"];
      };
      		ctrlShow[88885, false];
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      		ctrlShow[88885, true];
      };
      [life_smartphoneTarget,_msg,player,0] remoteExec ["TON_fnc_handleMessages",2];
      		hint format["You sent %1 a message: %2",name life_smartphoneTarget,_msg];
      			ctrlShow[88885, true];
      		closeDialog 88883;
      	};
      	//copmessage	
      	case 2:	{ if(({side _x == west} count playableUnits) == 0) exitWith {hint format["The police is currently inaccessible. Please try again later."];
      };
      		ctrlShow[888895,false];
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      		ctrlShow[888895,true];
      };
      [ObjNull,_msg,player,1] remoteExec ["TON_fnc_handleMessages",2];
      		_to = "Police";
      		hint format["You sent %1 a message: %2",_to,_msg];
      		ctrlShow[888895,true];
      		closeDialog 887890;
      	};
      	//msgadmin	
      	case 3:	{ ctrlShow[888896,false];
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      		ctrlShow[888896,true];
      };
      [ObjNull,_msg,player,2] remoteExec ["TON_fnc_handleMessages",2];
      		_to = "The Admins";
      		hint format["You sent %1 a message: %2",_to,_msg];
      		ctrlShow[888896,true];
      		closeDialog 887890;
      	};
      	//emsrequest	
      	case 4:	{ if(({side _x == independent} count playableUnits) == 0) exitWith {hint format["Currently there is no EMS on duty . Please try again later."];
      };
      		ctrlShow[888899,false];
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      		ctrlShow[888899,true];
      };
      [ObjNull,_msg,player,3] remoteExec ["TON_fnc_handleMessages",2];
      		hint format["You have sent a message to all EMS units.",_msg];
      		ctrlShow[888899,true];
      		closeDialog 887890;
      	};
      	//adminToPerson	
      	case 5:	{ if((call life_adminlevel) < 1) exitWith {hint "You are not an admin!";
      };
      		if(isNULL life_smartphoneTarget) exitWith {hint format["No person selected!"];
      		};
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      	};
      [life_smartphoneTarget,_msg,player,4] remoteExec ["TON_fnc_handleMessages",2];
      		hint format["Administrator Message sent: %1 - Message: %2",name life_smartphoneTarget,_msg];
      		closeDialog 88883;
      	};
      	//emergencyloading	
      	case 6:	{ if((FETCH_CONST(life_adminlevel) < 1)) then {
      	ctrlShow[888898,false];
      	ctrlShow[888896,true];
      	} else {			
      	ctrlShow[888898,true];
      	ctrlShow[888896,false];
      		};
      	};
      	//adminMsgAll	
      	case 7:	{ if((FETCH_CONST(life_adminlevel) < 1)) exitWith {hint "You are not an admin!";
      };
      		if(_msg == "") exitWith {hint "You must enter a message to be sent!";
      	};
      [ObjNull,_msg,player,5] remoteExec ["TON_fnc_handleMessages",2];
      		hint format["A message sent to all admins: %1",_msg];
      		closeDialog 887890;
      	};
      };
      Alles anzeigen


      2. fn_smartphone.sqf

      SQL: fn_smartphone.sqf
      #include "..\..\script_macros.hpp"
      /*	file: fn_smartphone.sqf	Author: Silex	*/
      private["_display","_units","_type","_data","_rowData","_msg"];
      _type = [_this,0,0] call BIS_fnc_param;
      _data = [_this,1,0,["",[],0]] call BIS_fnc_param;
      disableSerialization;
      waitUntil {!isNull findDisplay 88888};
      _display = findDisplay 88888;
      _cPlayerList = _display displayCtrl 88881;
      _cMessageList = _display displayCtrl 88882;
      _cMessageHeader = _display displayCtrl 88886;
      _cMessageHeader ctrlSetText format["Message's From:Players:"];
      ctrlEnable[887892,false];
      switch(_type) do{	
      case 0:	{ lbClear _cPlayerList;
      		{if(alive _x && _x != player) then {				
      		switch(side _x) do	
      		{					
      		case west: {_type = "Cop"};
      		case civilian: {_type = "Civ"};
      		case independent: {_type = "Med"};
      		};
      				_cPlayerList lbAdd format["%1 (%2)",_x getVariable["realname", name _x],_type];
      				_cPlayerList lbSetData [(lbSize _cPlayerList)-1,str(_x)];
      			};
      		} forEach playableUnits;
      [getPlayerUID player, player] remoteExec ["TON_fnc_msgRequest",2];
      		ctrlEnable[887892,false];
      	};
      	case 1:	{ _msg = [_data select 2,40] call KRON_StrLeft;
      		_rowData = [_data select 0, _data select 1, _data select 2, _data select 3];
      		_cMessageList lnbAddRow[_data select 3,format["%1 ...",_msg]];
      		_cMessageList lnbSetData[[((lnbSize _cMessageList) select 0)-1,0],str(_rowData)];
      	};
      	case 2:	{		ctrlEnable[887892,true];
      		_target = lbData[88881,(lbCurSel 88881)];
      		life_smartphoneTarget = call compile format["%1",_target];
      	};
      	case 4:	{
      		createDialog "Life_smartphone_schreiben";
      		ctrlSetText[88886, format["Message: %1",name life_smartphoneTarget]];
      		if((FETCH_CONST(life_adminlevel) < 1)) then	{			
      		ctrlShow[888897,false];
      		};
      	};
      };
      Alles anzeigen


      3. fn_showMsg.sqf

      SQL: fn_showMsg.sqf
      #include "..\..\script_macros.hpp"
          /*    
          file: fn_showMsg.sqf    
          Author: Silex
          */
      private["_index", "_data", "_status"];
      _index = [_this, 0, 0] call BIS_fnc_param;
      disableSerialization;
      waitUntil {
          !isNull findDisplay 88888
      };
      _display = findDisplay 88888;
      _cMessageList = _display displayCtrl 88882;
      _cMessageShow = _display displayCtrl 88887;
      _cMessageHeader = _display displayCtrl 88890;
      _data = call compile(_cMessageList lnbData[_index, 0]);
      _status = "[OFFLINE]"; {
          if (getPlayerUID _x == _data select 0) then {
              _status = "[ONLINE]";
              life_smartphoneTarget = _x;
              ctrlEnable[887892, true];
          };
      }
      forEach playableUnits;
      _cMessageHeader ctrlSetText format["%1 %2 written:", _data select 3, _status];
      _cMessageShow ctrlSetText format["%1", _data select 2];
      Alles anzeigen


      LIFE_SERVER PART:

      Öffnet eure "config.cpp" und sucht nach der class "TON_system", unter diesem class fügt eine weitere class hinzu:

      SQL: config.cpp
      class Smartphone
      {
      	file = "\life_server\Functions\Smartphone";
      	class handleMessages {};
      	class msgRequest {};
      };


      Geh in den "Functions" Ordner und erstelle einen Ordner namens "Smartphone", in diesem Ordner erstellt 2 Dateien:

      "fn_handleMessages.sqf" , "fn_msgRequest.sqf"

      1. fn_handleMessages.sqf

      SQL: fn_handleMessages.sqf
      /*	file: fn_handleMessages.sqf	Author: Silex*/
      private["_msg","_to","_target","_player","_type"];
      _target = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param;
      _msg = [_this,1,"",[""]] call BIS_fnc_param;
      _player = [_this,2,ObjNull,[ObjNull]] call BIS_fnc_param;
      _type = [_this,3,-1] call BIS_fnc_param;
      switch(_type) do{	//normal message	
      case 0:	{		if(isNULL _target)  exitWith {};
      		_to = call compile format["%1", _target];
      [_msg,name _player,0] remoteExec ["TON_fnc_clientMessage",_to];
      				private["_query","_pid","_toID"];
      		_pid = getPlayerUID _player;
      		_toID = getPlayerUID _target;
      		_msg = [_msg] call DB_fnc_mresString;
      		_fromName = name _player;
      		_toName = name _target;
      		_query = format["INSERT INTO messages (fromID, toID, message, fromName, toName) VALUES('%1', '%2', '""%3""', '%4', '%5')",_pid,_toID,_msg,_fromName,_toName];
      		diag_log format["Query: %1",_query];
      		waitUntil{!DB_Async_Active};
      		[_query,1] call DB_fnc_asyncCall;
      	};
      	//message to cops	
      	case 1:	{ 
      [_msg,name _player,1] remoteExec ["TON_fnc_clientMessage",west];
      	};
      	//to admins	
      	case 2:	{			
      [_msg,name _player,2] remoteExec ["TON_fnc_clientMessage",0];
      	};
      	//ems request	
      	case 3:	{			
      [_msg,name _player,5] remoteExec ["TON_fnc_clientMessage",independent];
      	};
      	//adminToPerson	
      	case 4:	{		_to = call compile format["%1", _target];
      		if(isNull _to) exitWith {};
      [_msg,name _player,3] remoteExec ["TON_fnc_clientMessage",_to];
      	};
      	//adminMsgAll	
      	case 5:	{[_msg,name _player,4] remoteExec ["TON_fnc_clientMessage",0];
      	};
      };
      Alles anzeigen


      2. fn_msgRequest.sqf

      SQL: fn_msgRequest.sqf
      /*	file: fn_msgRequest.sqf	
      Author: Silex		
      Fills the Messagelist
      */
      private["_query", "_queryResult", "_uid", "_player"];
      
      
      
      
      _uid = [_this, 0, "", [""]] call BIS_fnc_param;
      _player = [_this, 1, ObjNull, [ObjNull]] call BIS_fnc_param;
      _query = format["SELECT fromID, toID, message, fromName, toName FROM messages WHERE toID='%1' ORDER BY time DESC", _uid];
      
      
      
      
      waitUntil {
          !DB_Async_Active
      };
      
      
      
      
      _queryResult = [_query, 2, true] call DB_fnc_asyncCall;
      if (count _queryResult == 0) exitWith {}; {
          [1, _x] remoteExec["life_fnc_smartphone", _player];
      }
      forEach _queryResult;
      
      
      
      
      _queryResult = [_query,2,true] call DB_fnc_asyncCall;
      if(count _queryResult == 0) exitWith {};
      	{[1,_x] remoteExec ["life_fnc_smartphone",_player];
      }forEach _queryResult;
      Alles anzeigen


      Erstellt nun eine neue Datei auf dem Desktop namens "smartphone.sql" und fügt folgendes ein:

      SQL: smartphone.sql
      CREATE TABLE IF NOT EXISTS `messages` (
        `uid` int(12) NOT NULL AUTO_INCREMENT,
        `fromID` varchar(50) NOT NULL,
        `toID` varchar(50) NOT NULL,
        `message` text,
        `fromName` varchar(32) NOT NULL,
        `toName` varchar(32) NOT NULL,
        `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (`uid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      Nun führt ihr diese Datei in eurer Datenbank aus und schon habt ihr die Tabelle "messages".


      FERTIG!

      Falls ihr irgendwelche Fragen habt, stellt Sie mir einfach


      Mit freundlichen Grüßen,

      Exodoos
      ________________________________

      Macht euch doch ein Bild!

      Ohne Logs & entsprechende Dateien kein Support!

      5 Mal editiert, zuletzt von Exodoos (2. August 2016 um 23:44)

    • LittleBlack
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      27
      • 1. August 2016 um 20:55
      • #2
      Zitat von Exodoos

      Geht dann in den Ordner "core\pmenu" und erstellt 3 neue Dateien:

      "fn_newMessage.sqf" , "fn_s,artphone.sqf" , fn_showMsg.sqf

      1. fn_newMessage.sqf


      fn_newMessage.sqf muss fn_newMsg.sqf heißen ;)


      Spoiler anzeigen
      • class smartphone {};
      • class newMsg {}; <------
      • class showMsg {};
    • Killarobo
      Schüler
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      97
      • 1. August 2016 um 21:58
      • #3

      4.4 r4? Wo bekomme ich die her?! Ich will auch

    • Exodoos
      Fortgeschrittener
      Reaktionen
      164
      Trophäen
      10
      Beiträge
      332
      • 1. August 2016 um 22:16
      • #4

      Funktioniert aber auch für die 4.4 habe es getestet. :)

      Mit freundlichen Grüßen,

      Exodoos
      ________________________________

      Macht euch doch ein Bild!

      Ohne Logs & entsprechende Dateien kein Support!

    • D.Tanne
      Anfänger
      Reaktionen
      11
      Trophäen
      9
      Beiträge
      57
      • 1. August 2016 um 22:30
      • #5
      Zitat von Killarobo

      4.4 r4?

      das meinte er :P ^^

    • Bundeswehr_Zockt
      Schüler
      Reaktionen
      4
      Trophäen
      9
      Beiträge
      163
      • 2. August 2016 um 19:52
      • #6

      Kannst du die vllt. Bilder hinzufügen?

    • Exodoos
      Fortgeschrittener
      Reaktionen
      164
      Trophäen
      10
      Beiträge
      332
      • 2. August 2016 um 20:10
      • #7
      Zitat von Bundeswehr_Zockt

      Kannst du die vllt. Bilder hinzufügen?

      [HOWTO] SQL Based Smartphone - 3.X - Altis Life RPG

      Mit freundlichen Grüßen,

      Exodoos
      ________________________________

      Macht euch doch ein Bild!

      Ohne Logs & entsprechende Dateien kein Support!

    • MWZflyer
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      41
      • 2. August 2016 um 22:31
      • #8

      Hab die 4.4 r3, bin strikt nach Anleitung gegangen -> extDB2 zickt rum und kann nicht mehr connecten.
      Logs zeigen keine wirkliche Fehlermeldung an. -.- Schade.

    • Exodoos
      Fortgeschrittener
      Reaktionen
      164
      Trophäen
      10
      Beiträge
      332
      • 2. August 2016 um 22:39
      • #9
      Zitat von MWZflyer

      Hab die 4.4 r3, bin strikt nach Anleitung gegangen -> extDB2 zickt rum und kann nicht mehr connecten.
      Logs zeigen keine wirkliche Fehlermeldung an. -.- Schade.

      [lexicon]extDB[/lexicon] Logs, RPT Logs alles bereits durchgeschaut?

      Mit freundlichen Grüßen,

      Exodoos
      ________________________________

      Macht euch doch ein Bild!

      Ohne Logs & entsprechende Dateien kein Support!

    • MWZflyer
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      41
      • 2. August 2016 um 22:56
      • #10
      Zitat von Exodoos

      [lexicon]extDB[/lexicon] Logs, RPT Logs alles bereits durchgeschaut?

      Jep, einzig Auffällige wären die [lexicon]extDB[/lexicon] Logs, die Anzeigen: "[22:47:16 +02:00] [Thread 27207] extDB2: No Config Option Found: "

      Was laut Lexicon auf einen falschen Prefix hinweist, dieser wurde aber nicht verändert. Nehme ich die PBOs vor der Bearbeitung, (ohne die extDB2.ini anzurühren), startet der Server ohne solche Fehler.

      Und in der Konsole natürlich: "22:47:16 "extDB2: Error with Database Connection"" als Meldung

    • Killarobo
      Schüler
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      97
      • 2. August 2016 um 23:28
      • #11
      Zitat von Exodoos

      2. fn_smartphone.sql

      Diese Datei müsste doch eine .sqf sein oder? Jedenfalls sagt mein Server:
      Script/core/pmenu/fn_smartphone.sql not found


      Zitat von Exodoos

      fn_showMsg.sql

      Sowie die Datei "fn_showMsg.sqf":

      Script/core/pmenu/fn_showMsg.sql not found

    • Exodoos
      Fortgeschrittener
      Reaktionen
      164
      Trophäen
      10
      Beiträge
      332
      • 2. August 2016 um 23:41
      • #12
      Zitat von MWZflyer

      Jep, einzig Auffällige wären die [lexicon]extDB[/lexicon] Logs, die Anzeigen: "[22:47:16 +02:00] [Thread 27207] extDB2: No Config Option Found: "
      Was laut Lexicon auf einen falschen Prefix hinweist, dieser wurde aber nicht verändert. Nehme ich die PBOs vor der Bearbeitung, (ohne die extDB2.ini anzurühren), startet der Server ohne solche Fehler.

      Und in der Konsole natürlich: "22:47:16 "extDB2: Error with Database Connection"" als Meldung

      Da kann ich dir leider nicht helfen, kenne diesen Fehlern nicht.


      Zitat von Killarobo

      Diese Datei müsste doch eine .sqf sein oder? Jedenfalls sagt mein Server:Script/core/pmenu/fn_smartphone.sql not found


      Sowie die Datei "fn_showMsg.sqf":
      Script/core/pmenu/fn_showMsg.sql not found

      Ups hab mich da vertippt. Aber ist ja logisch oder nicht Killarobo?

      Mit freundlichen Grüßen,

      Exodoos
      ________________________________

      Macht euch doch ein Bild!

      Ohne Logs & entsprechende Dateien kein Support!

    • Killarobo
      Schüler
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      97
      • 2. August 2016 um 23:46
      • #13

      ja hab mich schon gewundert warum das nicht geht ;) hätte ja auch sein können das in ner datei was falsch ist

    • Killarobo
      Schüler
      Reaktionen
      10
      Trophäen
      11
      Beiträge
      97
      • 2. August 2016 um 23:56
      • #14

      Ich habe alles eingefügt. zuerst hatte der Server keine Verbindung mehr zur Datenbank. Dann habe ich den life_server Part neu gemacht aber nun wenn ich auf Telefon drücken will kommt nix. es passiert einfach gar nichts.
      Im Anhang meine RPT LOG.txt ;) cce7c9d79c.rpt

    • MWZflyer
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      41
      • 3. August 2016 um 00:32
      • #15
      Zitat von Killarobo

      Ich habe alles eingefügt. zuerst hatte der Server keine Verbindung mehr zur Datenbank. Dann habe ich den life_server Part neu gemacht aber nun wenn ich auf Telefon drücken will kommt nix. es passiert einfach gar nichts.
      Im Anhang meine RPT LOG.txt ;) cce7c9d79c.rpt

      Was hast du beim "life_server Part" denn neu gemacht?
      Ich hab alles fein säuberlich nach Anleitung gemacht, gerade nochmals wiederholt, dennoch der selbe Fehler. Keine DB Verbindung mehr. Ich erkenne auch kein Fehler.

    • B4v4r!4n_Str!k3r
      Nerd
      Reaktionen
      246
      Trophäen
      11
      Beiträge
      725
      Bilder
      5
      • 3. August 2016 um 00:46
      • #16
      Zitat von MWZflyer

      Jep, einzig Auffällige wären die [lexicon]extDB[/lexicon] Logs, die Anzeigen: "[22:47:16 +02:00] [Thread 27207] extDB2: No Config Option Found: "
      Was laut Lexicon auf einen falschen Prefix hinweist, dieser wurde aber nicht verändert. Nehme ich die PBOs vor der Bearbeitung, (ohne die extDB2.ini anzurühren), startet der Server ohne solche Fehler.

      Und in der Konsole natürlich: "22:47:16 "extDB2: Error with Database Connection"" als Meldung

      Das Problem hatte ich einmal auch, als ich einen Fehler in meiner MasterHandler.hpp hatte und da vor dem [lexicon]extDB[/lexicon] Prefix in der description.ext die MasterHandler.hpp includet wird, siehe hier:

      Bash: description.ext
      disableChannels[]={{0,true,true},{1,true,true},{2,true,true}};    // Disabled text and voice for global, side, and command channels. disableChannels[] = {{channelID<number>, disableChat<bool>, disableVoice<bool>}};
      
      
      
      
      #include "config\Config_Spyglass.hpp"
      #include "CfgRemoteExec.hpp"
      #include "dialog\MasterHandler.hpp"
      #include "config\Config_Master.hpp"
      
      
      
      
      class CfgServer {
          DatabaseName = "altislife"; //Config name that'll be grep in the extdb-conf.ini. Default: [altislife]
          DebugMode = 0; //Enable many server/hc debugging logs. Default: 0 (1 = Enabled / 0 = Disabled)
          HeadlessSupport = 0; //Enable/Disable Headless client support. Default: 1 (1 = Enabled / 0 = Disabled)
          /*
          Enabled: When HeadlessSupport is set to 1 (enabled), the server will run without fault when no Headless Client is connected. However, it will support the Headless Client if you choose to connect one.
          Disabled: If HeadlessSupport is set to 0 (disabled), the connection of a Headless Client will make no difference. This option will increase server performance a TINY but negligible amount.
          */
      };
      
      
      
      
      .....
      Alles anzeigen

      wird der [lexicon]extDB[/lexicon] Prefix nicht richtig an den Server übergeben.
      Mein Fehler damals war, dass ich in der MasterHandler.hpp #include "smartphone.hpp" vor #include "common.hpp" eingefügt habe.

      Ob das bei dir jetzt genauso ist, kann ich nicht sagen. Jedenfalls andere

      Zitat von Exodoos

      Da kann ich dir leider nicht helfen, kenne diesen Fehlern nicht.

      wissen anscheinend auch nicht weiter. Und auch wenn es nur Vermutungen meinerseits sind, vielleicht ist das für dich ein nützlicher Denkanstoß.

      23106-logo-schrift-dunkel-390-70-png class=

      Services rund um ArmA RPG Life

      ArmA Bibel: https://community.bistudio.com/wiki/

    • MWZflyer
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      41
      • 3. August 2016 um 01:09
      • #17

      Vielen Dank für dein Denkanstoß.
      Es macht auch durchaus Sinn, wenn die Including Reihenfolge so ist.
      Ich hab nochmal alles nachvollzogen und kontrolliert:

      Das #include "smartphone.hpp" habe ich in der MasterHandler.hpp am Ende inkludiert. Also auch nach dem common.hpp. Nichts desto trotz habe ich die MasterHandler nach dem initalisieren des Prefix Testweise gesetzt, immer noch der selbe Fehler.

      Nungut, ich schau es mir morgen nochmals an ob ich irgend ein Fehler erkennen kann, bis dato ist es aber 1 zu 1 wie im Tutorial.

      Ich hab absolut keine Ahnung wo der Hund begraben liegt.


      Nachtrag:
      Ich bin nun dem "Original" auf Englisch gefolgt und habe dementsprechend auch die Sachen dort kopiert und eingefügt. Jetzt fährt der Server normal hoch. Senden und Empfangen funktioniert auch Wunderbar.

      Nur 2 Bugs:

      1. Nachrichten werden doppelt angezeigt. Beispielsweise, man schickt mir Nachricht A und B, dann ist in der Auflistung der Nachrichten "A B A B" am stehen.
      2. Ich erhalte die Fehlermeldung "No Entry 'mpmission\_cur_MP.Altis\http://description.ext/Life_my_smartp…eList.rowHeight'.


      Fehlermeldungen in den Logs erhalte ich nun garkeine. Nachrichten sind in der DB auch nicht doppelt. Weiß bei den zwei Dingen jemand Rat?
      Screenshot:

    • B4v4r!4n_Str!k3r
      Nerd
      Reaktionen
      246
      Trophäen
      11
      Beiträge
      725
      Bilder
      5
      • 3. August 2016 um 06:05
      • #18

      Zu den doppelten Einträgen: hier in Tutorial ist im life_server-Teil in der Datei fn_msgRequest.sqf

      Code
      _queryResult = [_query,2,true] call DB_fnc_asyncCall;
      if(count _queryResult == 0) exitWith {};
       {[1,_x] remoteExec ["life_fnc_smartphone",_player];
      }forEach _queryResult;

      doppelt vorhanden, was im Tutorial auf altisliferpg.com nicht der Fall ist.

      23106-logo-schrift-dunkel-390-70-png class=

      Services rund um ArmA RPG Life

      ArmA Bibel: https://community.bistudio.com/wiki/

    • Snakeshit
      Schüler
      Reaktionen
      9
      Trophäen
      9
      Beiträge
      173
      • 3. August 2016 um 06:41
      • #19

      zu deinem Screenshot:

      du musst bei deiner Common.hpp bei class Life_RscListNBox das unten hinzufügen wie es bei mir im Code ist.

      drawSideArrows = 0;
      idcLeft = -1;
      idcRight = -1;

      Code
      class Life_RscListNBox
      {
      	style = 16;
      	type = 102;
      	shadow = 0;
      	font = "PuristaMedium";
      	sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
      	color[] = {0.95,0.95,0.95,1};
      	colorText[] = {1,1,1,1.0};
      	colorDisabled[] = {1,1,1,0.25};
      	colorScrollbar[] = {0.95,0.95,0.95,1};
      	colorSelect[] = {0,0,0,1};
      	colorSelect2[] = {0,0,0,1};
      	colorSelectBackground[] = {0.8,0.8,0.8,1};
      	colorSelectBackground2[] = {1,1,1,0.5};
      	colorPicture[] = {1,1,1,1};
      	colorPictureSelected[] = {1,1,1,1};
          colorPictureDisabled[] = {1,1,1,1};
      	soundSelect[] = {"",0.1,1};
      	soundExpand[] = {"",0.1,1};
      	soundCollapse[] = {"",0.1,1};
      	period = 1.2;
      	maxHistoryDelay = 0.5;
      	autoScrollSpeed = -1;
      	autoScrollDelay = 5;
      	autoScrollRewind = 0;
      	rowHeight = 0.04;
      	drawSideArrows = 0;
      	idcLeft = -1;
      	idcRight = -1;
      	class ListScrollBar: Life_RscScrollBar{};
      	class ScrollBar: Life_RscScrollBar{};
      Alles anzeigen
    • MWZflyer
      Anfänger
      Reaktionen
      12
      Trophäen
      9
      Beiträge
      41
      • 3. August 2016 um 12:41
      • #20
      Zitat von B4v4r!4n_Str!k3r

      ....

      Vielen vielen Dank, daran hat es gelegen! :)

      Zitat von Snakeshit

      ....

      Auch dir vielen vielen Dank!
      Ich habe mir zusätzlich noch das "rowHeight" gemobst, hat ebenfalls gefehlt :)


      Nun funktioniert das Smartphone Klasse. Einzige was ich wünschenswert finden würde:
      Wenn die Medics / Cops die Nachrichten, welche per Handy verschickt wurden als Notrufe ebenfalls dort angezeigt werden würden. Zumindestens solang die jeweiligen Einsatzkräfte online sind.
      Ansonsten nochmals vielen Dank für das Script und die tatkräftige Hilfe :)

    Registrieren oder Einloggen

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

    Benutzerkonto erstellen

    Ähnliche Themen

    • Datenbank fehler

      • TaktischerSpeck
      • 1. Mai 2017 um 10:15
      • Hilfeforum
    • [Sammelthread] Scripts/Links/Tutorials/Anleitungen ArmA 3

      • Stig
      • 2. September 2016 um 18:29
      • Tutorials & Releases
    • Was ist ein Sql basiertes Smartphone?

      • ZiegeRette
      • 8. Mai 2017 um 21:36
      • Hilfeforum
    • Suche SQL Smartphone!

      • Zotti
      • 3. August 2016 um 21:58
      • Hilfeforum
    • AL 5.0 Smartphone von Silex geht nicht, RemoteExecFehler

      • BLACKLIST
      • 23. März 2017 um 15:06
      • Hilfeforum

    Tags

    • smartphone
    • sql
    • Altislife
    • 4.4
    • r4

    Benutzer online in diesem Thema

    • 1 Besucher

    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. Verhaltensregeln
    3. Datenschutzerklärung
    4. Impressum
    5. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™