#include <a_samp>
#include <dini>
#include <ocmd>

//FARBEN
#define GRUN 	0x00FF0B9A
#define	ROT 	0xFF000BB5
#define GELB 	0xF1F129B5
#define BLAU 	0x0091FFFF
#define BRAUN 	0xA500009D
#define WEIS    0xFFFFFFFF


//Variablen
new bsnenter, bsnexit;
new tor[2];
new camcar[2];
new lspdcar[3];
new saedcar[2];
new bsnraub;
new spielerinbsn[MAX_PLAYERS];
new bsntimerkill;

//Dialoge
#define DIALOG_BSN 1
#define DIALOG_REG 2
#define DIALOG_LOG 3
#define DIALOG_STATS 4

//////////////
//Fraktionen//
//////////////

//Fraktionsnamen
#define frak1   "LSPD"
#define frak2   "SAED"
#define frak3   "Camorra"


//Fraktionsspawn
#define pdspawn   	1545.3442,-1675.6758,13.5602 //LSPD Spawnpunkt
#define saedspawn   1183.6156,-1329.7151,13.5797 //SAED Spawnpunkt
#define camspawn  	673.5221,-1268.1155,13.6250 //LCN Spawnpunkt



//Tortimer
forward torzeit1();
forward torzeit2();

//bsn raubtimer
forward bsnraubtimer();
forward bsnraubzeit(playerid);



main()
{
	print("\n----------------------------------");
	print("Carlos Test");
	print("----------------------------------\n");
}
//raubtimer
public bsnraubtimer()
{
	bsnraub =0;
	return 1;
}
public bsnraubzeit(playerid)
{
	if(spielerinbsn[playerid]==0)return SendClientMessage(playerid,ROT,"Du bist nicht im BSN!");
	GivePlayerMoney(playerid,500+random(500));
	SendClientMessage(playerid,GRUN,"Du hast den BSN erfolgreich ausgeraubt!");
	KillTimer(bsntimerkill);
	return 1;
}

//Tortimer
public torzeit1()
{
	MoveObject(tor[0],1540.3000488281, -1627.8000488281, 14.10000038147,5);
	return 1;
}
public torzeit2()
{
	MoveObject(tor[1],786, -1152.4000244141, 25.39999961853,5);
	return 1;
}
//////////////////////////
//////////////////////////
//////////////////////////
//////////////////////////
public OnGameModeInit()
{
	//Ein-und Ausgang Pickups
	bsnenter=CreatePickup(1318,1,1199.2699,-918.1412,43.1231);
	bsnexit=CreatePickup(1318,1,362.8682,-75.1657,1001.5078);
	
	//3D Textdraws für Pickups
	Create3DTextLabel("BSN\n Eingang",BLAU,1199.2699,-918.1412,43.1231,10,0);
	Create3DTextLabel("BSN\n Ausgang",BLAU,362.8682,-75.1657,1001.5078,10,0);
	
	//Blendet alle Ein-und Ausgänge aus
	DisableInteriorEnterExits();
	
	//CJ bewegungen einschalten
	UsePlayerPedAnims();
	
	//Beginn Spawn
	SetGameModeText("Carlos TestMode");
	AddPlayerClass(26,1743.5021,-1848.5187,13.5803,176.4724,0,0,0,0,0,0); //Noob spawn
    
	//LSPD Frakcars
	lspdcar[0]=SetVehicleNumberPlate(CreateVehicle(596,1591.3577,-1711.4739,5.6177,358.9287,1,94,0),"LSPD-1"); // pdcar1
	lspdcar[1]=SetVehicleNumberPlate(CreateVehicle(596,1587.4432,-1711.3868,5.6177,359.5422,1,94,0),"LSPD-2"); // pdcar2
	lspdcar[2]=SetVehicleNumberPlate(CreateVehicle(596,1583.3331,-1711.0627,5.6177,359.3796,1,94,0),"LSPD-3"); // pdcar3
	
	//Camorra Frakcars
	camcar[0]=SetVehicleNumberPlate(CreateVehicle(411,682.1573,-1266.7075,13.2993,61.6191,1,1,0),"CAMORRA"); // lcncar1
	camcar[1]=SetVehicleNumberPlate(CreateVehicle(411,683.1236,-1259.3961,13.2929,51.1857,1,1,0),"CAMORRA"); // lcncar2
	
	//SAED Frakcars
	saedcar[0]=SetVehicleNumberPlate(CreateVehicle(416,1181.6388,-1338.5703,13.8504,268.3006,1,3,0),"SAED"); // saedcar1
	saedcar[1]=SetVehicleNumberPlate(CreateVehicle(416,1180.6018,-1308.6353,13.8465,269.0208,1,3,0),"SAED"); // saedcar2
	
	//Beginn Zäune
	CreateObject(3749, 1541.5999755859, -1627.5999755859, 18.200000762939, 0, 0, 270);
	tor[0]=CreateObject(7657, 1540.3000488281, -1627.8000488281, 14.10000038147, 0, 0, 270); //LSPD TOR
	tor[1]=CreateObject(980, 786, -1152.4000244141, 25.39999961853, 0, 0, 270); //LCN TOR
	
	return 1;
}

public OnGameModeExit()
{
	return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid,1743.5021,-1848.5187,13.5803);
	SetPlayerCameraPos(playerid,-2036.8306,69.0078,270.3972);
	SetPlayerCameraLookAt(playerid,-2036.8306,69.0078,270.3972);
	SetPlayerFacingAngle(playerid,176.4724);
	return 1;
}

public OnPlayerConnect(playerid)
{
	new Spielerdatei[64];
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
	if(dini_Exists(Spielerdatei))
	{
	    ShowPlayerDialog(playerid,DIALOG_LOG,DIALOG_STYLE_INPUT,"Login","Dein Account wurde gefunden.Gib bitte dein Passwort ein:","Login","Abbrechen");
	    return 1;
	}
	else
	{
		ShowPlayerDialog(playerid,DIALOG_REG,DIALOG_STYLE_INPUT,"Registrieren","Bitte gib dein gewünschtes Passwort ein:","Register","Abbrechen");
		return 1;
	}
}
public OnPlayerDisconnect(playerid, reason)
{
	if(GetPVarInt(playerid,"loggedin")==1)
	{
	SaveAcc(playerid);
	}
	return 1;
}

public OnPlayerSpawn(playerid)
{
	switch(GetPVarInt(playerid,"Fraktion"))
	{
	    case 0:{}
	    case 1:{SetPlayerPos(playerid,pdspawn);GivePlayerWeapon(playerid,24,100);SetPlayerSkin(playerid,266);}
	    case 2:{SetPlayerPos(playerid,saedspawn);GivePlayerWeapon(playerid,3,1);SetPlayerSkin(playerid,274);}
	    case 3:{SetPlayerPos(playerid,camspawn);GivePlayerWeapon(playerid,24,100);SetPlayerSkin(playerid,126);}
	    case 4:{}
	    case 5:{}
	    case 6:{}
	    case 7:{}
	}
	spielerinbsn[playerid]=0;
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	return 1;
}

public OnVehicleSpawn(vehicleid)
{
	return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
	return 1;
}

public OnPlayerText(playerid, text[])
{
	return 1;
}
ocmd:auf(playerid,params[])
{
	if(IsPlayerConnected(playerid))
	{
 		if(isPlayerInFrak(playerid,1))
   		{
   		   	if(IsPlayerInRangeOfPoint(playerid,10,1540.3000488281,-1627.8000488281,14.10000038147))
			{
				MoveObject(tor[0],1540.3000488281, -1627.8000488281, 14.10000038147-10,5);
				SendClientMessage(playerid, WEIS,"Das Tor schließt sich wieder in 10 sekunden!");
				SetTimer("torzeit1",10000,0);
			}
			else
			{
			    SendClientMessage(playerid, WEIS,"Du bist nicht in der nähe vom Tor!");
			}
		}
		if(isPlayerInFrak(playerid,3))
		{
		   	if(IsPlayerInRangeOfPoint(playerid,10,786, -1152.4000244141, 25.39999961853))
			{
				MoveObject(tor[1],786, -1152.4000244141, 25.39999961853-10,5);
   				SendClientMessage(playerid, WEIS,"Das Tor schließt sich wieder in 10 sekunden!");
				SetTimer("torzeit2",10000,0);
			}
			else
			{
			    SendClientMessage(playerid, WEIS,"Du bist nicht in der nähe vom Tor!");
			}
	    }
	}
	return 1;
}
ocmd:f(playerid,params[])
{
	new frakchat[128];
	if(sscanf(params,"s",frakchat))	return SendClientMessage(playerid,ROT,"/f [TEXT]");
	format(frakchat,sizeof(frakchat),"Member %s: %s",SpielerName(playerid),frakchat);
	for(new i=0; i<GetMaxPlayers(); i++)
	{
	    if(IsPlayerConnected(i))
	    {
	        if(isPlayerInFrak(i,GetPVarInt(playerid,"Fraktion")))
			{
				SendClientMessage(i,BRAUN,frakchat);
			}
		}
	}
	return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
	if (strcmp(cmdtext,"/bsn", true) == 0)
	{
	    if(isPlayerAnAdmin(playerid,3))
	    {
	    ShowPlayerDialog(playerid,DIALOG_BSN,DIALOG_STYLE_MSGBOX,"BSN","Möchten sie zum BSN teleportieren?","Ja","Nein");
		return 1;
		}
		SendClientMessage(playerid,ROT,"Du bist kein Admin!");
		return 1;
	}
	if(strcmp(cmdtext,"/restart", true)== 0)
	{
	    if(isPlayerAnAdmin(playerid,5))
	    {
		SendRconCommand("gmx");
		return 1;
		}
		SendClientMessage(playerid,ROT,"Du bist kein Admin!");
		return 1;
	}
	if(strcmp(cmdtext,"/kill", true)== 0)
	{
		SetPlayerHealth(playerid,0);
		return 1;
	}
	if(strcmp(cmdtext,"/stats", true)==0)
	{
	    new string[128];
	    new fraktname[64];
	    new geld = GetPVarInt(playerid,"Geld");
	    switch(GetPVarInt(playerid,"Fraktion"))
	    {
	        case 0:{fraktname="Keine";}
			case 1:{fraktname=frak1;}
			case 2:{fraktname=frak2;}
			case 3:{fraktname=frak3;}
		}
	    //1 Reihe
	    format(string,sizeof(string),"Name:%s \nLevel:%i \nGeld:%i \nAdminlevel:%i \nFraktion:%s",SpielerName(playerid),GetPlayerScore(playerid),geld,GetPVarInt(playerid,"Adminlevel"),fraktname);
	    ShowPlayerDialog(playerid,DIALOG_STATS,DIALOG_STYLE_MSGBOX,"Deine Stats",string,"Ok","Abbrechen");
	}
	return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
	return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	if(newstate==PLAYER_STATE_DRIVER)
 	{
	    for(new l=0; l<sizeof(lspdcar); l++)
	    {
	        if(GetPlayerVehicleID(playerid)==lspdcar[l])
	        {
	            if(isPlayerInFrak(playerid,1))
	            {
	            }
	            else
	            {
					RemovePlayerFromVehicle(playerid);
	                SendClientMessage(playerid,ROT,"Du darfst dieses Fahrzeug nicht fahren.");
				}
	        }
	    }
	    for(new s=0; s<sizeof(saedcar); s++)
	    {
	        if(GetPlayerVehicleID(playerid)==saedcar[s])
	        {
	            if(isPlayerInFrak(playerid,2))
	            {
	            }
	            else
	            {
					RemovePlayerFromVehicle(playerid);
	                SendClientMessage(playerid,ROT,"Du darfst dieses Fahrzeug nicht fahren.");
				}
	        }
	    }
	    for(new c=0; c<sizeof(camcar); c++)
	    {
	        if(GetPlayerVehicleID(playerid)==camcar[c])
	        {
	            if(isPlayerInFrak(playerid,3))
	            {
	            }
	            else
	            {
					RemovePlayerFromVehicle(playerid);
	                SendClientMessage(playerid,ROT,"Du darfst dieses Fahrzeug nicht fahren.");
				}
			}
		}
	}
	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)
{
	if(pickupid==bsnenter)
	{
	    SetPlayerPos(playerid,366.5464,-73.1617,1001.5078);
	    SetPlayerFacingAngle(playerid,291.4795);
	    SetCameraBehindPlayer(playerid);
		SetPlayerInterior(playerid,10);
		GameTextForPlayer(playerid,"~w~BSN",1500,1);
		spielerinbsn[playerid]=1;
	}
	if(pickupid==bsnexit)
 	{
 	    SetPlayerPos(playerid,1199.8568,-922.5401,43.0210);
 	    SetPlayerFacingAngle(playerid,192.3399);
 	    SetCameraBehindPlayer(playerid);
 	    SetPlayerInterior(playerid,0);
 	    spielerinbsn[playerid]=0;
 	}
	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_BSN)
	{
		if(response==1)
		{
  			SetPlayerPos(playerid,1224.1138,-904.3784,42.4583);
	    	SendClientMessage(playerid,GRUN,"Du wurdest zum BSN teleportiert.");
		}
		if(response==0)
		{
		    SendClientMessage(playerid,ROT,"Teleport wurde abgebrochen.");
		}
	}
	if(dialogid==DIALOG_REG)
	{
		if(response==0)
		{
		    SendClientMessage(playerid,ROT,"Du hast die Registration abgebrochen.");
		    Kick(playerid);
		    return 1;
		}
	    if(response==1)
		{
		    if(!strlen(inputtext))
		    {
		        SendClientMessage(playerid,ROT,"Das Passwort war nicht lang genug!");
		        ShowPlayerDialog(playerid,DIALOG_REG,DIALOG_STYLE_INPUT,"Registrieren","Bitte gib dein wunsch Passwort ein:","Register","Abbrechen");
		        return 1;
		    }
		    else
		    {
		    	Register(playerid,inputtext);
		    	return 1;
		    }
		}
	}
	if(dialogid==DIALOG_LOG)
	{
		if(response==0)
		{
 			SendClientMessage(playerid,ROT,"Du hast dich nicht eingeloggt.");
		    Kick(playerid);
		    return 1;
		}
	    if(response==1)
		{
		    if(!strlen(inputtext))
		    {
		        SendClientMessage(playerid,ROT,"Das Passwort war nicht lang genug!");
		        ShowPlayerDialog(playerid,DIALOG_LOG,DIALOG_STYLE_PASSWORD,"Login","Dein Account wurde gefunden.Gib bitte dein Passwort ein:","Login","Abbrechen");
		        return 1;
		    }
		    else
		    {
		    	Login(playerid,inputtext);
		    	return 1;
		    }
		}
	}
	return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
	return 1;
}

//--------------------------------------------------------------------------Befehle------------------------------------------------------------------------//
ocmd:kick(playerid,params[])
{
	if(!isPlayerAnAdmin(playerid,5))return SendClientMessage(playerid,ROT,"Du bist kein Admin!");
	new pID, reason[128],string[128];
	if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,ROT,"/kick [ID][Grund]");
	format(string,sizeof(string),"Admin: %s wurde von %s gekickt.Grund: %s",SpielerName(pID),SpielerName(playerid),reason);
	SendClientMessageToAll(ROT,string);
	Kick(pID);
	return 1;
}
ocmd:ban(playerid,params[])
{
	if(!isPlayerAnAdmin(playerid,5))return SendClientMessage(playerid,ROT,"Du bist kein Admin!");
	new pID, reason[128],string[128];
	if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,ROT,"/ban [ID][Grund]");
	format(string,sizeof(string),"Admin: %s wurde von %s gebannt.Grund: %s",SpielerName(pID),SpielerName(playerid),reason);
	SendClientMessageToAll(ROT,string);
	SetPVarInt(pID,"Baned",1);
	Ban(pID);
	return 1;
}
ocmd:gibadmin(playerid,params[])
{
	if(!isPlayerAnAdmin(playerid,5))return SendClientMessage(playerid,ROT,"Du bist kein Admin!");
	new pID, rank;
	if(sscanf(params,"ui",pID,rank))return SendClientMessage(playerid,ROT,"/gibadmin [ID][Level]");
	if(rank<1||rank>5)return SendClientMessage(playerid,ROT,"Bitte einen gültigen Adminrang eingeben.");
	SetPVarInt(pID,"Adminlevel",rank);
	SaveAcc(pID);
	SendClientMessageToAll(GRUN,"Es wurde jemand zum Admin ernannt!");
	return 1;
}
ocmd:gibleader(playerid,params[])
{
	if(!isPlayerAnAdmin(playerid,5))return SendClientMessage(playerid,ROT,"Du bist kein Admin!");
	new pID, frak;
	if(sscanf(params,"ui",pID,frak))return SendClientMessage(playerid,ROT,"/gibleader [ID][Fraktion]");
	if(frak<1||frak>6)return SendClientMessage(playerid,ROT,"Bitte eine gültige Fraktion eingeben.");
	SetPVarInt(pID,"Fraktion",frak);
	SaveAcc(pID);
	SendClientMessage(pID,GRUN,"Du wurdest zum Leader ernannt.");
	return 1;
}
ocmd:bsnrauben(playerid,params[])
{
	if(IsPlayerConnected(playerid))
	{
	    if(GetPVarInt(playerid,"Fraktion")==1)return SendClientMessage(playerid,ROT,"Du bist ein Cop!");
	    if(bsnraub==1)return SendClientMessage(playerid,GRUN,"Du kannst den BSN noch nicht ausrauben!");
     	SendClientMessage(playerid,GRUN,"Du überfällst den BSN, verlasse den Ort nicht!");
     	bsnraub =1;
     	SetTimer("bsnraubtimer",7200000,0);
     	bsntimerkill=SetTimerEx("bsnraubzeit",300000,1,"i",playerid);
	}
	return 1;
}






//--------------------------------------------------------------------------Befehle ende------------------------------------------------------------------------//
stock Register(playerid,key[])
{
	new Spielerdatei[64];
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
	dini_Create(Spielerdatei);
	dini_Set(Spielerdatei,"Passwort",key);
	SendClientMessage(playerid,GRUN,"Erfolgreich registriert.Viel Spaß!");
	SetPlayerScore(playerid,0);
	SetPVarInt(playerid,"loggedin",1);
	SetPVarInt(playerid,"Geld",10000);
	return 1;
}
stock Login(playerid,key[])
{
	new Spielerdatei[64];
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
	if(!strcmp(key,dini_Get(Spielerdatei,"Passwort"),false))
	{
	    LoadAcc(playerid);
	    SendClientMessage(playerid,GRUN,"Erfolgreich eingeloggt.Viel Spaß!");
	    return 1;
	}
	else
	{
	    SendClientMessage(playerid,ROT,"Falsches Passwort!");
        ShowPlayerDialog(playerid,DIALOG_LOG,DIALOG_STYLE_PASSWORD,"Login","Dein Account wurde gefunden.Gib bitte dein Passwort ein:","Login","Abbrechen");
        return 1;
	}
}
stock LoadAcc(playerid)
{
	new Spielerdatei[64];
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
	SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level"));
	GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
	SetPVarInt(playerid,"Adminlevel",dini_Int(Spielerdatei,"Adminlevel"));
	SetPVarInt(playerid,"Fraktion",dini_Int(Spielerdatei,"Fraktion"));
	SetPVarInt(playerid,"loggedin",1);
	SetPVarInt(playerid,"banned",dini_Int(Spielerdatei,"Baned"));
	return 1;
}
stock SaveAcc(playerid)
{
    if(GetPVarInt(playerid,"loggedin")==1)
    {
		new Spielerdatei[64];
		new name[MAX_PLAYER_NAME];
		GetPlayerName(playerid,name,sizeof(name));
		format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
		dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid));
		dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
		dini_IntSet(Spielerdatei,"Adminlevel",GetPVarInt(playerid,"Adminlevel"));
		dini_IntSet(Spielerdatei,"Fraktion",GetPVarInt(playerid,"Fraktion"));
		dini_IntSet(Spielerdatei,"Baned",GetPVarInt(playerid,"Baned"));
		return 1;
	}
	return 1;
}
stock isPlayerInFrak(playerid,frakid)
{
	if(GetPVarInt(playerid,"Fraktion")==frakid)return 1;
	return 0;
}
stock isPlayerAnAdmin(playerid,rang)
{
	if(GetPVarInt(playerid,"Adminlevel")>=rang)return 1;
	return 0;
}
stock SpielerName(playerid)
{
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	return name;
}















//////////////////////////////////////////////////////////////////////////////////////////
///////////////////// SSCANF /////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
stock sscanf(string[], format[], {Float,_}:...)
{
	#if defined isnull
		if (isnull(string))
	#else
		if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
	#endif
		{
			return format[0];
		}
	#pragma tabsize 4
	new
		formatPos = 0,
		stringPos = 0,
		paramPos = 2,
		paramCount = numargs(),
		delim = ' ';
	while (string[stringPos] && string[stringPos] <= ' ')
	{
		stringPos++;
	}
	while (paramPos < paramCount && string[stringPos])
	{
		switch (format[formatPos++])
		{
			case '\0':
			{
				return 0;
			}
			case 'i', 'd':
			{
				new
					neg = 1,
					num = 0,
					ch = string[stringPos];
				if (ch == '-')
				{
					neg = -1;
					ch = string[++stringPos];
				}
				do
				{
					stringPos++;
					if ('0' <= ch <= '9')
					{
						num = (num * 10) + (ch - '0');
					}
					else
					{
						return -1;
					}
				}
				while ((ch = string[stringPos]) > ' ' && ch != delim);
				setarg(paramPos, 0, num * neg);
			}
			case 'h', 'x':
			{
				new
					num = 0,
					ch = string[stringPos];
				do
				{
					stringPos++;
					switch (ch)
					{
						case 'x', 'X':
						{
							num = 0;
							continue;
						}
						case '0' .. '9':
						{
							num = (num << 4) | (ch - '0');
						}
						case 'a' .. 'f':
						{
							num = (num << 4) | (ch - ('a' - 10));
						}
						case 'A' .. 'F':
						{
							num = (num << 4) | (ch - ('A' - 10));
						}
						default:
						{
							return -1;
						}
					}
				}
				while ((ch = string[stringPos]) > ' ' && ch != delim);
				setarg(paramPos, 0, num);
			}
			case 'c':
			{
				setarg(paramPos, 0, string[stringPos++]);
			}
			case 'f':
			{

				new changestr[16], changepos = 0, strpos = stringPos;
				while(changepos < 16 && string[strpos] && string[strpos] != delim)
				{
					changestr[changepos++] = string[strpos++];
    				}
				changestr[changepos] = '\0';
				setarg(paramPos,0,_:floatstr(changestr));
			}
			case 'p':
			{
				delim = format[formatPos++];
				continue;
			}
			case '\'':
			{
				new
					end = formatPos - 1,
					ch;
				while ((ch = format[++end]) && ch != '\'') {}
				if (!ch)
				{
					return -1;
				}
				format[end] = '\0';
				if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
				{
					if (format[end + 1])
					{
						return -1;
					}
					return 0;
				}
				format[end] = '\'';
				stringPos = ch + (end - formatPos);
				formatPos = end + 1;
			}
			case 'u':
			{
				new
					end = stringPos - 1,
					id = 0,
					bool:num = true,
					ch;
				while ((ch = string[++end]) && ch != delim)
				{
					if (num)
					{
						if ('0' <= ch <= '9')
						{
							id = (id * 10) + (ch - '0');
						}
						else
						{
							num = false;
						}
					}
				}
				if (num && IsPlayerConnected(id))
				{
					setarg(paramPos, 0, id);
				}
				else
				{
					#if !defined foreach
						#define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
						#define __SSCANF_FOREACH__
					#endif
					string[end] = '\0';
					num = false;
					new
						name[MAX_PLAYER_NAME];
					id = end - stringPos;
					foreach (Player, playerid)
					{
						GetPlayerName(playerid, name, sizeof (name));
						if (!strcmp(name, string[stringPos], true, id))
						{
							setarg(paramPos, 0, playerid);
							num = true;
							break;
						}
					}
					if (!num)
					{
						setarg(paramPos, 0, INVALID_PLAYER_ID);
					}
					string[end] = ch;
					#if defined __SSCANF_FOREACH__
						#undef foreach
						#undef __SSCANF_FOREACH__
					#endif
				}
				stringPos = end;
			}
			case 's', 'z':
			{
				new
					i = 0,
					ch;
				if (format[formatPos])
				{
					while ((ch = string[stringPos++]) && ch != delim)
					{
						setarg(paramPos, i++, ch);
					}
					if (!i)
					{
						return -1;
					}
				}
				else
				{
					while ((ch = string[stringPos++]))
					{
						setarg(paramPos, i++, ch);
					}
				}
				stringPos--;
				setarg(paramPos, i, '\0');
			}
			default:
			{
				continue;
			}
		}
		while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
		{
			stringPos++;
		}
		while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
		{
			stringPos++;
		}
		paramPos++;
	}
	do
	{
		if ((delim = format[formatPos++]) > ' ')
		{
			if (delim == '\'')
			{
				while ((delim = format[formatPos++]) && delim != '\'') {}
			}
			else if (delim != 'z')
			{
				return delim;
			}
		}
	}
	while (delim > ' ');
	return 0;
}
