Heyho Commu
Da ich noch immer ein paar Kapazitäten habe um euch einige Dinge zu entwickeln, setze ich einfach dieses TUT noch zu meiner Referenzliste hinzu.
Ich denke jeder kennt das Problem, Spieler kommen auf den Server, schauen sich ein paar Minuten alles an, gehen vom Server und kommen nie wieder.
Oder aber, Spieler kommen auf den Server und wollen einfach nur die Mission abgreifen, die werden jedoch in der DB gespeichert und bleiben nun als Müll zurück.
Mit der Zeit sammeln sich so hunderte "unbenutze" Accounts an und man verliert den Überblick.
Dafür denke ich, habe ich eine Lösung für euch.
Voraussetzungen:
extDB2 <-
AL Version 4.+ <-
MySQL als DB <-
gesunden Menschenverstand
Fangen wir mit dem Code an für die Serverseitige Einstellung.
Server -> init.sqf;
["resetLifeVehicles",1] spawn DB_fnc_asyncCall; // in der init.sqf im Server sollte diese Zeile stehen und darunter
["deleteOldPlayer",1] spawn DB_fnc_asyncCall;
// fügen wir diese Zeile zunächst einmal ein :)
Dies ist der Aufruf zur DB eine Prozedur zu starten (folgt noch).
Server -> Functions\MySQL\fn_queryRequest.sqf;
// sucht bitte folgende Zeilen:
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];
Unterhalb dieser Zeilen kommt nun folgendes:
_query = format["DateDiffNew:%1",_uid];
[_query,1] call DB_fnc_asyncCall;
// wir updaten nur, also brauchen wir keine Results
Nun kommen wir zum etwas Haarigem Teil.
MySQL Einstellungen
ACHTUNG! Wer Navicat nutzt, dem kann ich nur empfehlen "MySQL Workbench" zu nutzen. Kostenfrei wird ständig aktualisiert und man hat weit mehr Möglichkeiten etwas einzustellen.
Diesen Part kann ich derzeit nur in Workbench bereitstellen, da ich weder Navicat nutze noch weiß ob es diese Einstellungen dort gibt.
Zunächst editiert ihr eure Tabelle für den Spieler und fügt eine weitere Spalte ein:
Erklärung ->
Checkbox 1 = PK -> nicht anklicken
Checkbox 2 = NN -> NotNull -> bitte anklicken!
Ganz hinten ist der default wert der beim neuerstellen eines Charakters automatisch eingetragen wird. Diesen müsst ihr EXAKT so eintragen, auch mit den einfachen Anführungszeichen.
Dieses 'NOW()' steht im übrigen dafür, die Aktuelle Uhrzeit sowie Datum in diese Spalte einzutragen. Diese wird bei der Prozedur später entscheidend sein.
Speichert nun die Table ab und geht in den Reiter "Stored Procedures"
Legt eine neue Prozedur an mit dem Namen
deleteOldPlayer
In dieser Neuen Prozedur fügt ihr nun diese Zeilen ein und speichert es vorerst ab.
CREATE DEFINER=`MYSQL-USER`@`localhost` PROCEDURE `deleteOldPlayer`()
BEGIN
DELETE FROM `houses` WHERE `pid` IN (SELECT `playerid` FROM `players` WHERE (DATEDIFF(NOW(),`logged`) >=60));
DELETE FROM `vehicles` WHERE `pid` IN (SELECT `playerid` FROM `players` WHERE (DATEDIFF(NOW(),`logged`) >=60));
DELETE FROM `players` WHERE (DATEDIFF(NOW(),`logged`) >=60);
END
Was bedeuten diese Zeilen?
Die Prozedur sucht nun von oben nach unten, die Tabellen Houses, Vehicles bis Players ab und nimmt dabei den Wert von 'logged'
Ist der Zeitunterschied nun Größer oder gleich 60 (Tage) wird der Spieler einschließlich aller Häuser sowie seine Fahrzeuge aus der Datenbank UNWIDERRUFLICH gelöscht.
Diese 60, steht für die Anzahl an Tagen. Ich empfehle eine Zahl hier zwischen 30 und 90. Quasi ein Monat bis 3 Monate.
Achtet hier darauf EUREN Datenbank Nutzernamen einzutragen!
Nun fehlt lediglich die Abfrage für extDB2 bzw. die kleinen Zeilen die der Datenbank sagen sollen dass sie dem Spieler das Neue Datum beim Login setzen soll:
;;______________________________________________________________
[DateDiffNew]
;;
SQL1_1 = UPDATE players SET logged=NOW() WHERE playerid=?;
SQL1_INPUTS = 1
Number of Inputs = 1
;;______________________________________________________________
[DeleteOldPlayer]
SQL1_1 = CALL deleteOldPlayer;
Number of Inputs = 0
Prepared Statement Cache = false
;;______________________________________________________________
Alles anzeigen
Ziemlich einfach gestaltet oder?
Warum der Schwierigkeitsgrad 3? -> Wie oben beschrieben, kann ich euch nicht sagen wie es bei Navicat läuft, sollte mir das jemand erklären können, wird der Eintrag nachgereicht und mit Namen versehen
Ich übernehme KEINERLEI Verantwortung wenn ihr diese Zeilen nicht zum laufen bringt.
~ Shinji