Nach wie vor wird keine IP gespeichert, langsam nervt mich das !
/*======================================================================*\
|| #################################################################### ||
|| # Dieses Script wurde von Scene-Sector gecoded, es ist weder etwas # ||
|| # feriges noch etwas halbes. Alle hier vorkommenden Codeschnipsel  # ||
|| # stammen aus dem Breadfish Forum und dienen lediglich der Übung.  # ||
|| #                                                                  # ||
|| # ---------------- PAWN CODE ARE ALL FREE TO USE! ---------------- # ||
|| #                    http://www.forum.sa-mp.de                     # ||
|| #################################################################### ||
\*======================================================================*/
/*
Merke :
	- %s = String ( Varchar = Gemischter Text und / oder Namen von Spielern etc ) Bugged ? NE Bullshit
		- %s = String aber es müssen Sonderzeichen escaped werden aka +#-.,
	- %i = Integer ( Wichtig für Zahlen )
	- %d = Könnte das gleiche wie mit dem Integer sein
Ocmd Hinweis :
	- Da der Host nicht weiter existent ist, habe ich die AutoUpdat Funktion rausgenommen!
 */
/*======================================================================*\
|| #################################################################### ||
|| # Hier sind die includes definiert !!!                             # ||
|| #################################################################### ||
\*======================================================================*/
#include <a_mysql>
#include <a_samp>
#include <sscanf>
#include <ocmd>
/*======================================================================*\
|						      Placeholder                                |
\*======================================================================*/
//Dialog IDs (gegebenenfalls ändern, falls bereits belegt)
#define DIALOG_REGISTER  1
#define DIALOG_LOGIN     2
/*======================================================================*\
|| #################################################################### ||
|| # Hier sind die Farben definiert !!!                               # ||
|| #################################################################### ||
\*======================================================================*/
#define COLOR_WHITE 0xFFFFFF
#define COLOR_RED 0xFF0000
#define COLOR_YELLOW 0xFFFF00
#define COLOR_GREEN 0xFF00FF00
/*======================================================================*\
|						      Placeholder                                |
\*======================================================================*/
/*======================================================================*\
|| #################################################################### ||
|| # Hier sind die New's definiert !!!                               # ||
|| #################################################################### ||
\*======================================================================*/
#define MYSQL_HOST    "127.0.0.1"      //IP Adresse des MySQL Servers
#define MYSQL_USER    "eliteund_mysql"           //Benutzername der angemeldet wird
#define MYSQL_PASS    "vvvvvvvvvvvvvvvvv..--##++"               //Passwort des Benutzers
#define MYSQL_DBSE    "eliteund_samp"        //Name der Datenbank
/*======================================================================*\
|						      Placeholder                                |
\*======================================================================*/
enum pDataEnum
{
	p_id,
	bool:pLoggedIn,
	pName[MAX_PLAYER_NAME],
	pIP[16],
	pAdmin,
	pLevel,
	pMoney,
	pKills,
	pDeaths
}
new PlayerInfo[MAX_PLAYERS][pDataEnum];
new handle; //Die Connection-Handle, über die wir später auf die Tabellen der Datenbank zugreifen
native WP_Hash(buffer[], len, const str[]);
main()
{
	print("----------------------------------");
	print("   Test Gamemode by Scene-Sector  ");
	print("----------------------------------");
	print("//======================================================================\");
	print("|| #################################################################### ||");
	print("|| # Dieses Script wurde von Scene-Sector gecoded, es ist weder etwas # ||");
	print("|| # feriges noch etwas halbes. Alle hier vorkommenden Codeschnipsel  # ||");
	print("|| # stammen aus dem Breadfish Forum und dienen lediglich der Übung.  # ||");
	print("|| #                                                                  # ||");
	print("|| # ---------------- PAWN CODE ARE ALL FREE TO USE! ---------------- # ||");
	print("|| #                    http://www.forum.sa-mp.de                     # ||");
	print("|| #################################################################### ||");
	print("\\======================================================================//");
}
public OnGameModeInit()
{
	handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DBSE, MYSQL_PASS);
	SetGameModeText("Role Play mal anders!");
	AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
	return 1;
}
public OnGameModeExit()
{
	mysql_close(handle);
	return 1;
}
public OnPlayerRequestClass(playerid)
{
	//Wenn der Spieler die Class-Selection betritt prüfe, ob er bereits eingeloggt ist
	if(!PlayerInfo[playerid][pLoggedIn])
	{
		//Wenn nicht, dann prüfe ob der Spieler ein Konto hat
		//Dazu wird ein Query gesendet und ein neues Callback aufgerufen
		//%e steht für einen geprüften String (sollte anstatt %s in Queries verwendet werden)
		new query[128];
		mysql_format(handle, query, sizeof(query), "SELECT id FROM users WHERE name = '%e'", PlayerInfo[playerid][pName]);
		//Das Query wird abgesendet und die playerid an OnUserCheck übergeben
		mysql_pquery(handle, query, "OnUserCheck", "d", playerid);
	}
	return 1;
}
public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][p_id]       = 0;
    GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 16);
	PlayerInfo[playerid][pLoggedIn]  = false;
	PlayerInfo[playerid][pAdmin]	 = 0;
	PlayerInfo[playerid][pLevel]     = 0;
	PlayerInfo[playerid][pMoney]     = 0;
	PlayerInfo[playerid][pKills]     = 0;
	PlayerInfo[playerid][pDeaths]    = 0;
    return 1;
}
public OnPlayerDisconnect(playerid, reason)
{   
    SaveUserStats(playerid);
    return 1;
}
public OnPlayerSpawn(playerid)
{
	new query[128];
	mysql_format(handle, query, sizeof(query), "UPDATE users SET IP = '%s' WHERE name = '%e'", PlayerInfo[playerid][pIP], PlayerInfo[playerid][pName]);
	mysql_pquery(handle, query);
	return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
	if(killerid != INVALID_PLAYER_ID)
	{
		PlayerInfo[killerid][pKills]++;
		GivePlayerMoney(killerid, 10);
		PlayerInfo[killerid][pMoney] += 10;
		if(PlayerInfo[killerid][pKills] > 3)
		{
			PlayerInfo[killerid][pLevel] = 1;
		}
	}
	PlayerInfo[playerid][pDeaths]++;
	return 1;
}
public OnVehicleSpawn(vehicleid)
{
	return 1;
}
public OnVehicleDeath(vehicleid, killerid)
{
	return 1;
}
public OnPlayerText(playerid, text[])
{
	return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
	if(IsPlayerAdmin(playerid)) 
	{
		SendClientMessage(playerid, -1, "Use /help to see avaible commands");
	}		
	else
	{
		SendClientMessage(playerid, -1, "Noe, ich mag den Befehl jetzt aber nicht!");
	}
	return 1;
}
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
	return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
	return 1;
}
public OnPlayerEnterCheckpoint(playerid)
{
	return 1;
}
public OnPlayerLeaveCheckpoint(playerid)
{
	return 1;
}
public OnPlayerEnterRaceCheckpoint(playerid)
{
	return 1;
}
public OnPlayerLeaveRaceCheckpoint(playerid)
{
	return 1;
}
public OnRconCommand(cmd[])
{
	return 1;
}
public OnPlayerRequestSpawn(playerid)
{
	return 1;
}
public OnObjectMoved(objectid)
{
	return 1;
}
public OnPlayerObjectMoved(playerid, objectid)
{
	return 1;
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
	return 1;
}
public OnVehicleMod(playerid, vehicleid, componentid)
{
	return 1;
}
public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
	return 1;
}
public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
	return 1;
}
public OnPlayerSelectedMenuRow(playerid, row)
{
	return 1;
}
public OnPlayerExitedMenu(playerid)
{
	return 1;
}
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
	return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	return 1;
}
public OnRconLoginAttempt(ip[], password[], success)
{
	return 1;
}
public OnPlayerUpdate(playerid)
{
	return 1;
}
public OnPlayerStreamIn(playerid, forplayerid)
{
	return 1;
}
public OnPlayerStreamOut(playerid, forplayerid)
{
	return 1;
}
public OnVehicleStreamIn(vehicleid, forplayerid)
{
	return 1;
}
public OnVehicleStreamOut(vehicleid, forplayerid)
{
	return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG_REGISTER)
	{
		if(!response) return Kick(playerid);
		if(strlen(inputtext) < 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Elite - Underground | Registrierung", "Bitte registriere Dich:\n{FF0000}Das Passwort muss Mindestens 5 Zeichen haben!", "Ok", "Abbrechen");
		new query[256], buf[256], IP[16];
		WP_Hash(buf, sizeof (buf),inputtext);
		GetPlayerIp(playerid, IP, 16);
		mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, IP) VALUES ('%e', '%e', '%s')", PlayerInfo[playerid][pName], PlayerInfo[playerid][pIP], buf);
		mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
		return 1;
	}
	if(dialogid == DIALOG_LOGIN)
	{
		if(!response) return Kick(playerid);
		if(strlen(inputtext) < 5) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Elite - Underground | Anmeldung", "Bitte logge Dich mit deinem Passwort ein:\n{FF0000}Das Passwort muss Mindestens 5 Zeichen haben!", "Ok", "Abbrechen");
		new query[256], buf[256];
        WP_Hash(buf, sizeof (buf),inputtext);
		mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e' AND password = '%e'", PlayerInfo[playerid][pName], buf);
		mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
		return 1;
	}
	return 0;
}
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
	return 1;
}
stock MySQL_SetupConnection(ttl = 3)
{
	print("[MySQL] Verbindungsaufbau...");
	mysql_log(LOG_ALL);  //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
	//Prüfen und gegebenenfalls wiederholen
	if(mysql_errno(handle) != 0)
	{
		//Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
		if(ttl > 1)
		{
			//Versuche erneut eine Verbindung aufzubauen
			print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
			printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
			return MySQL_SetupConnection(ttl-1);
		}
		else
		{
			//Abbrechen und Server schließen
			print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
			print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
			print("[MySQL] Der Server wird heruntergefahren.");
			return SendRconCommand("exit");
		}
	}
	printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", handle);
	return 1;
}
forward OnUserCheck(playerid);
public OnUserCheck(playerid)
{
	//Query wurde ausgeführt und das Ergebnis im Cache gespeichert
	if(cache_get_row_count() == 0)
	{
		//Der Spieler konnte nicht gefunden werden, er muss sich registrieren
		ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Elite - Underground | Registrierung", "Bitte registriere Dich:", "Ok", "Abbrechen");
	}
	else
	{
		//Es existiert ein Ergebnis, das heißt der Spieler ist registriert und muss sich einloggen
		ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Elite - Underground | Anmeldung", "Bitte logge Dich ein:", "Ok", "Abbrechen");
	}
	return 1;
}
forward OnUserRegister(playerid);
public OnUserRegister(playerid)
{
	//Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
	PlayerInfo[playerid][p_id] = cache_insert_id();
	SendClientMessage(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
	return 1;
}
forward OnUserLogin(playerid);
public OnUserLogin(playerid)
{
	//Query wurde ausgeführt und das Ergebnis im Cache gespeichert
	if(cache_get_row_count() == 0)
	{
		//Der Spieler hat ein falsches Passwort eingegeben
		ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
	}
	else
	{
		//Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
		//Wir lesen nun die erste Zeile des Caches aus (ID 0)
		PlayerInfo[playerid][p_id]       = cache_get_field_content_int(0, "id", handle);
		PlayerInfo[playerid][pIP]		 = cache_get_field_content( 0, "IP", PlayerInfo[playerid][pIP], handle, 16);
		PlayerInfo[playerid][pAdmin]	 = cache_get_field_content_int(0, "Admin", handle);
		PlayerInfo[playerid][pLevel]     = cache_get_field_content_int(0, "level", handle);
		PlayerInfo[playerid][pMoney]     = cache_get_field_content_int(0, "money", handle);
		PlayerInfo[playerid][pKills]     = cache_get_field_content_int(0, "kills", handle);
		PlayerInfo[playerid][pDeaths]    = cache_get_field_content_int(0, "deaths", handle);
		PlayerInfo[playerid][pLoggedIn]  = true;
		SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
		GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
	}
	return 1;
}
stock SaveUserStats(playerid)
{
	//Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
	if(!PlayerInfo[playerid][pLoggedIn]) return 1;
	//Ansonsten speichere sie
	new query[512];
	mysql_format(handle, query, sizeof(query), "UPDATE users SET IP = '%s', Admin = '%d', level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
		PlayerInfo[playerid][pIP], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
	//Das Query wird abgesendet
	mysql_pquery(handle, query);
	return 1;
}