/*
 * Irresistible Gaming (c) 2018
 * Developed by Lorenc Pekaj
 * Module: cnr/commands/admin/admin_rcon.pwn
 * Purpose: level rcon administrator commands (cnr)
 */

/* ** Commands ** */
CMD:resetgangrespect( playerid, params[ ] )
{
	if ( ! IsPlayerAdmin( playerid ) )
		return 0;

	// reset preloaded and database
	foreach ( new g : gangs ) {
		g_gangData[ g ] [ E_RESPECT ] = 0;
	}

	mysql_single_query( "UPDATE `GANGS` SET `RESPECT` = 0" );
	SendGlobalMessage( -1, ""COL_PINK"[ADMIN]"COL_WHITE" %s(%d) has reset all gang respect!", ReturnPlayerName( playerid ), playerid );
	return 1;
}

CMD:hitmanbudget( playerid, params[ ] )
{
	if ( ! IsPlayerAdmin( playerid ) )
		return 0;

	new
		amount;

	if ( sscanf( params, "d", amount ) )
		return SendUsage( playerid, "/hitmanbudget [AMOUNT]" );

	UpdateServerVariable( "hitman_budget", GetGVarInt( "hitman_budget" ) + amount, 0.0, "", GLOBAL_VARTYPE_INT );
	SendServerMessage( playerid, "Hitman budget now currently at %s.", number_format( GetGVarInt( "hitman_budget" ) ) );
	return 1;
}

CMD:explosiverounds( playerid, params[ ] )
{
	if ( ! IsPlayerAdmin( playerid ) )
		return 0;

	new
		targetid, rounds;

	if ( sscanf( params, "ud", targetid, rounds ) )
		return SendUsage( playerid, "/explosiverounds [PLAYER_ID] [ROUNDS]" );

	p_ExplosiveBullets[ targetid ] += rounds;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]{FFFFFF} You've given %s(%d) %d explosive rounds.", ReturnPlayerName( targetid ), targetid, rounds );
	ShowPlayerHelpDialog( targetid, 1500, "You have %d explosive bullets remaining.", p_ExplosiveBullets[ targetid ] );
	return 1;
}

/*CMD:furnishhomes( playerid, params[ ] ) {
	if ( ! IsPlayerAdmin( playerid ) ) return 0;
	for ( new i = 0; i < MAX_HOUSES; i ++ ) if ( g_houseData[ i ] [ E_CREATED ] ) {
		new interior = GetInteriorType( i );
		if ( interior != -1 ) FillHomeWithFurniture( i, interior );
		else SendServerMessage( playerid, "House ID %d has an invalid inteiror", i );
	}
	SendServerMessage( playerid, "All houses have been furnished." );
	return 1;
}

stock GetInteriorType( houseid ) {
	for ( new i = 0; i < sizeof( g_houseInteriors ); i ++ ) {
		if ( IsPointToPoint( 2.0, g_houseInteriors[ i ] [ E_EX ], g_houseInteriors[ i ] [ E_EY ], g_houseInteriors[ i ] [ E_EZ ], g_houseData[ houseid ] [ E_TX ], g_houseData[ houseid ] [ E_TY ], g_houseData[ houseid ] [ E_TZ ] ) )
			return i;
	}
	return -1;
}*/

CMD:updatepool( playerid, params[ ] )
{
	new
		poolid, pool, win, gamble;

	if ( ! IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "ddD(0)D(0)", poolid, pool, win, gamble ) ) return SendError( playerid, "/updatepool [POOL_ID] [POOL_INCREMENT] [TOTAL_WON] [TOTAL_GAMBLED]" );
	else if ( !Iter_Contains( CasinoPool, poolid ) ) return SendError( playerid, "This Pool ID does not exist!" );
	else
	{
		UpdateCasinoPoolData( poolid, pool, win, gamble );
		SendServerMessage( playerid, "You have updated pool id %d", poolid );
	}
	return 1;
}

CMD:updatedonortd( playerid, params[ ] )
{
	new
		targetid, Float: amount, reset;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "D(0)D(65535)F(0.0)", reset, targetid, amount ) ) return SendUsage( playerid, "/updatedonortd [RESET] [PLAYER_ID] [AMOUNT]" );
	else
	{
		// Reset the top donor
		if ( reset ) {
			TextDrawSetString( g_TopDonorTD, "Nobody Donated :(" );
		}

		// Update it incase
		UpdateGlobalDonated( targetid, amount );
		SendServerMessage( playerid, "Updating latest donor now (player id %d, amount %f)", targetid, amount );
	}
	return 1;
}

CMD:destroygang( playerid, params[ ] )
{
	new
	    gID
	;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "d", gID ) ) return SendUsage( playerid, "/destroygang [GANG_ID]" );
	else if ( gID < 0 || gID > MAX_GANGS ) return SendError( playerid, "Invalid gang ID." );
	else if ( !Iter_Contains( gangs, gID ) ) return SendError( playerid, "Invalid gang ID." );
	else
	{
		AddAdminLogLineFormatted( "%s(%d) has deleted a gang", ReturnPlayerName( playerid ), playerid );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GANG]"COL_WHITE" You have destroyed \"%s\" which was the ID of %d.", g_gangData[ gID ] [ E_NAME ], gID );
	    DestroyGang( gID, false );
	}
	return 1;
}

CMD:time( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) )
		return 0;

	new
		timeid;

	if ( sscanf( params, "d", timeid ) )
		return SendUsage( playerid, "/time [SECONDS]" );

	g_WorldClockSeconds = timeid;
	return 1;
}

CMD:playsound( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) )
		return 0;

	new
		pID,
		sound;

	if ( sscanf( params, ""#sscanf_u"d", pID, sound ) )
		return SendUsage( playerid, "/playsound [PLAYER_ID] [SOUND]" );

	PlayerPlaySound( pID, sound, 0.0, 0.0, 0.0 );
	return 1;
}

CMD:addgpci( playerid, params[ ] )
{
	new
	    pID;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, #sscanf_u, pID ) ) SendUsage( playerid, "/addgpci [PLAYER_ID]");
	else if ( !IsPlayerConnected( pID ) || IsPlayerNPC( pID ) ) return SendError( playerid, "Invalid Player ID." );
	else
	{
		new
			playerserial[ 45 ];

		gpci( pID, playerserial, sizeof( playerserial ) );
	  	AddFileLogLine( "gpci.txt", sprintf( "USER : %s , GPCI : %s\r\n", ReturnPlayerName( pID ), playerserial ) );
	}
	return 1;
}

CMD:vipdiscount( playerid, params[ ] )
{
	new Float: percent;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "f", percent ) ) return SendUsage( playerid, "/vipdiscount [PERCENTAGE]" );
	// else if ( percent < 50.0 || percent > 100.0 ) return SendError( playerid, "The percentage must be over 50 and less than 100." );
	else
	{
	    SendServerMessage( playerid, "V.I.P discount percentage set to %f! (old = %f)", percent, GetGVarFloat( "vip_discount" ) );
		UpdateServerVariable( "vip_discount", 0, ( 1 - ( percent / 100 ) ), "", GLOBAL_VARTYPE_FLOAT );
    }
	return 1;
}

CMD:vipbonus( playerid, params[ ] )
{
	new Float: percent;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "f", percent ) ) return SendUsage( playerid, "/vipbonus [PERCENTAGE]" );
	else if ( percent < 0.0 || percent > 100.0 ) return SendError( playerid, "The percentage must be over 0 and less than 100." );
	else
	{
	    SendServerMessage( playerid, "V.I.P bonus percentage set to %f! (old = %f)", percent, GetGVarFloat( "vip_bonus" ) );
		UpdateServerVariable( "vip_bonus", 0, ( percent / 100 ), "", GLOBAL_VARTYPE_FLOAT );
    }
	return 1;
}

CMD:blockip( playerid, params[ ] )
{
	new address[16], timems;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if (sscanf(params, "ds[16]", timems, address)) SendUsage(playerid, "/blockip [TIME_MS] [IP_ADDRESS]");
	else
	{
		SendClientMessageFormatted( playerid, -1, ""COL_GREY"[BLOCKED]"COL_WHITE" IP %s has been blocked (%d timems).", address, timems );
		BlockIpAddress( address, timems );
	}
	return 1;
}

CMD:unblockip( playerid, params[ ] )
{
	new address[16];
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if (sscanf(params, "s[16]", address)) SendUsage(playerid, "/unblockip [IP_ADDRESS]");
	else
	{
		SendClientMessageFormatted( playerid, -1, ""COL_GREY"[BLOCKED]"COL_WHITE" IP %s has been unblocked.", address );
 		UnBlockIpAddress( address );
	}
	return 1;
}

CMD:svrquery( playerid, params[ ] )
{
	new
		szQuery[ 144 ];

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "s[144]", szQuery ) ) return SendUsage( playerid, "/svrquery [QUERY]" );
	else if ( p_AccountID[ playerid ] != 1 ) return SendError( playerid, "No." );
	else
	{
		SendServerMessage( playerid, "%s", szQuery );
  		mysql_function_query( dbHandle, szQuery, true, "OnQueryServerViaRCON", "i", playerid );
	}
	return 1;
}

thread OnQueryServerViaRCON( playerid )
{
	new
		rows, fields, affected = cache_affected_rows( );

    cache_get_data( rows, fields );
	SendClientMessageFormatted( playerid, COLOR_YELLOW, "Query Sent. (Rows: %d, Fields: %d, Affected: %d)", rows, fields, affected );
	return 1;
}

#if ENABLED_SECURE_TRUCK == true
	CMD:connectnpc( playerid, params[ ] )
	{
		if ( !IsPlayerAdmin( playerid ) ) return 0;
		ConnectNPC( SECURE_TRUCK_DRIVER_NAME, "secureguard" );
		SendServerMessage( playerid, "Connecting NPC now." );
		return 1;
	}
#endif

#if ENABLED_EASTER_EGG == true
	CMD:setegg( playerid, params[ ] )
	{
		if ( !IsPlayerAdmin( playerid ) ) return 0;
		if ( g_EasterHunt ) return SendError( playerid, "The " #EASTEREGG_NAME " hunt has already started." );

		new
		    Float: X, Float: Y, Float: Z;

		if ( GetPlayerPos( playerid, X, Y, Z ) ) {
			if ( CreateEasterEgg( X, Y, Z ) != -1 ) {
				SendServerMessage( playerid, "Planted " #EASTEREGG_NAME " at your current position." );
				AddAdminLogLineFormatted( "%s(%d) has set a " #EASTEREGG_NAME "", ReturnPlayerName( playerid ), playerid );
			}
			else SendError( playerid, "There isn't enough room for another " #EASTEREGG_NAME "." );
		}
		return 1;
	}

	CMD:treasurehunt( playerid, params[ ] )
	{
		if ( !IsPlayerAdmin( playerid ) )
			return 0;

		if ( Iter_Count(eastereggs) < 1 )
			return SendError( playerid, "There are not enough " #EASTEREGG_NAME "s planted to start the treasure hunt." );

		// if its false, destroy all egs
		if ( ( g_EasterHunt = ! g_EasterHunt ) == false )
	    {
			for ( new i = 0; i < MAX_EGGS; i ++)
				DestroyEasterEgg( i );
	    }

	    // alert admin log
		AddAdminLogLineFormatted( "%s(%d) has started a treasurehunt", ReturnPlayerName( playerid ), playerid );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_GOLD" Treasure Hunt has been %s", g_EasterHunt == true ? ("activated, look around for " #EASTEREGG_NAME "s and get a free gift.") : ("de-activated.") );
		return 1;
	}
#endif

CMD:addcomponent( playerid, params[ ] )
{
	new
		componentid;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "d", componentid ) ) return SendUsage( playerid, "/addcomponent [COMPONENT_ID]" );
	else if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You need to be in a vehicle." );
	else
	{
		new vehicleid = GetPlayerVehicleID( playerid );
     	AddVehicleComponent( vehicleid, componentid );
     	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" Added componentid id %d to this vehicle.", componentid );
	}
	return 1;
}

CMD:replenishsafe( playerid, params[ ] )
{
	new
		rID;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "d", rID ) ) return SendUsage( playerid, "/replenishsafe [SAFE_ID]" );
	else if (!Iter_Contains(RobberyCount, rID)) return SendError( playerid, "This is an invalid Safe ID." );
	else
	{
		printf( "[GM:ADMIN] %s has replenished %d! (Success: %d)", ReturnPlayerName( playerid ), rID, setSafeReplenished( rID ) );

		SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You've replenished Safe ID %d: "COL_GREY"%s"COL_WHITE".", rID, g_robberyData[ rID ] [ E_NAME ] );
	}
	return 1;
}

CMD:driveby( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	g_Driveby = !g_Driveby;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have %s driveby.", g_Driveby == false ? ("enabled") : ("disabled"));
	return 1;
}

CMD:debug( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	g_Debugging = !g_Debugging;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have %s debugging.", g_Debugging == true ? ("enabled") : ("disabled"));
	return 1;
}

CMD:vippm( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	g_VipPrivateMsging = !g_VipPrivateMsging;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have %s vip only messaging.", g_VipPrivateMsging == true ? ("enabled") : ("disabled"));
	return 1;
}

CMD:logcmd( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	g_CommandLogging = !g_CommandLogging;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You are %s commands.", g_CommandLogging == true ? ("logging") : ("not logging"));
	return 1;
}

CMD:logdialog( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	g_DialogLogging = !g_DialogLogging;
	SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You are %s dialogs.", g_CommandLogging == true ? ("logging") : ("not logging"));
	return 1;
}

CMD:settaxrate( playerid, params[ ] )
{
	new Float: rate;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "f", rate ) ) return SendUsage( playerid, "/settaxrate [PERCENTAGE]" );
	else if ( rate < 0 || rate > 10.0 ) return SendError( playerid, "The rate must be over 0 and less than 10." );
	else
	{
	    SendServerMessage( playerid, "You have changed the tax rate from "COL_GREY"%0.2f"COL_WHITE" to "COL_GREY"%0.2f"COL_WHITE".", GetGVarFloat( "taxrate" ), rate );
		UpdateServerVariable( "taxrate", 0, rate, "", GLOBAL_VARTYPE_FLOAT );
    }
	return 1;
}

CMD:settaxtime( playerid, params[ ] )
{
	new time;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "d", time ) ) return SendUsage( playerid, "/settaxrate [TIMESTAMP]" );
	else
	{
		if ( time < g_iTime ) {
	    	SendServerMessage( playerid, "Tax time updated. Players to be taxed A.S.A.P.", secondstotime( time - g_iTime ) );
		} else {
	    	SendServerMessage( playerid, "Tax time updated. %s until tax.", secondstotime( time - g_iTime ) );
		}
		UpdateServerVariable( "taxtime", time, 0.0, "", GLOBAL_VARTYPE_INT );
    }
	return 1;
}

CMD:givewanted( playerid, params[ ] )
{
	new
	    pID, wantedlvl
	;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"d", pID, wantedlvl ) ) SendUsage( playerid, "/givewanted [PLAYER_ID] [WANTED_LVL]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
        AddAdminLogLineFormatted( "%s(%d) has gave %s(%d) %d wanted level", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( pID ), pID, wantedlvl );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have modified %s(%d)'s wanted level by %d.", ReturnPlayerName( pID ), pID, wantedlvl );
        SendClientMessageFormatted( pID, -1, ""COL_PINK"[ADMIN]"COL_WHITE" Your wanted level has been modified by %s(%d).", ReturnPlayerName( playerid ), playerid );
		GivePlayerWantedLevel( pID, wantedlvl );
	}
	return 1;
}

CMD:givescore( playerid, params[ ] )
{
	new
	    pID, score
	;
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"d", pID, score ) ) SendUsage( playerid, "/givescore [PLAYER_ID] [SCORE]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
        AddAdminLogLineFormatted( "%s(%d) has given %s(%d)'s %d score", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( pID ), pID, score );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have given %s(%d) %d score!", ReturnPlayerName( pID ), pID, score );
        SendClientMessageFormatted( pID, -1, ""COL_PINK"[ADMIN]"COL_WHITE" You have been given %d score from %s(%d)!", score, ReturnPlayerName( playerid ), playerid );
		SetPlayerScore( pID, GetPlayerScore( pID ) + score );
	}
	return 1;
}

CMD:ping( playerid, params[ ] )
{
	new ping;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
	else if ( sscanf( params, "d", ping ) ) return SendUsage( playerid, "/ping [PING]" );
	else if ( ping < 200 ) return SendError( playerid, "The ping cannot be under 200." );
	else
	{
	    g_PingLimit = ping;
		AddAdminLogLineFormatted( "%s(%d) set the ping limit to %d", ReturnPlayerName( playerid ), playerid, ping );
		SendGlobalMessage( -1, ""COL_PINK"[ADMIN]"COL_WHITE" %s(%d) set the ping limit to %d", ReturnPlayerName( playerid ), playerid, ping );
	}
	return 1;
}

CMD:givexp( playerid, params [ ] )
{
	new
	    pID,
	    xp
	;
	if ( !IsPlayerAdmin( playerid ) || !IsPlayerLorenc( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"d", pID, xp ) ) SendUsage( playerid, "/givexp [PLAYER_ID] [XP_AMOUNT]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
	    GivePlayerXP( pID, xp );
        AddAdminLogLineFormatted( "%s(%d) has given %s(%d) %d XP", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( pID ), pID, xp );
	    SendClientMessageFormatted( pID, -1, ""COL_PINK"[ADMIN]{FFFFFF} %s(%d) has given you %d XP.", ReturnPlayerName( playerid ), playerid, xp );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]{FFFFFF} You've given %s(%d) %d XP.", ReturnPlayerName( pID ), pID, xp );
	}
	return 1;
}

CMD:giveip( playerid, params [ ] )
{
	new
	    pID,
	    ip
	;
	if ( !IsPlayerAdmin( playerid ) || !IsPlayerLorenc( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"d", pID, ip ) ) SendUsage( playerid, "/giveip [PLAYER_ID] [IP_AMOUNT]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
	    GivePlayerIrresistiblePoints( pID, ip );
        //AddAdminLogLineFormatted( "%s(%d) has given %s(%d) %d IP", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( pID ), pID, ip );
	   	//SendClientMessageFormatted( pID, -1, ""COL_PINK"[ADMIN]{FFFFFF} %s(%d) has given you %d IP.", ReturnPlayerName( playerid ), playerid, ip );
	    //SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]{FFFFFF} You've given %s(%d) %d IP.", ReturnPlayerName( pID ), pID, ip );
	}
	return 1;
}

CMD:givecoins( playerid, params [ ] )
{
	new
	    sendtoid,
	    Float: coins
	;
	if ( !IsPlayerAdmin( playerid ) || !IsPlayerLorenc( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"f", sendtoid, coins ) ) SendUsage( playerid, "/givecoins [PLAYER_ID] [COINS]" );
	else if ( !IsPlayerConnected( sendtoid ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
	    p_IrresistibleCoins[ sendtoid ] += coins;
        AddAdminLogLineFormatted( "%s(%d) has given %s(%d) %0.2f IC", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( sendtoid ), sendtoid, coins );
	    SendClientMessageFormatted( sendtoid, -1, ""COL_PINK"[ADMIN]{FFFFFF} %s(%d) has given you %0.2f IC.", ReturnPlayerName( playerid ), playerid, coins );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]{FFFFFF} You've given %s(%d) %0.2f IC.", ReturnPlayerName( sendtoid ), sendtoid, coins );
	}
	return 1;
}

CMD:givecash( playerid, params [ ] )
{
	new
	    pID,
	    cash
	;
	if ( !IsPlayerAdmin( playerid ) || !IsPlayerLorenc( playerid ) ) return 0;
	else if ( sscanf( params, ""#sscanf_u"d", pID, cash ) ) SendUsage( playerid, "/givecash [PLAYER_ID] [CASH]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else
	{
	    GivePlayerCash( pID, cash );
		AddAdminLogLineFormatted( "%s(%d) has given %s(%d) %d dollars", ReturnPlayerName( playerid ), playerid, ReturnPlayerName( pID ), pID, cash );
	    SendClientMessageFormatted( pID, -1, ""COL_PINK"[ADMIN]{FFFFFF} %s(%d) has given you "COL_GOLD"%s", ReturnPlayerName( playerid ), playerid, number_format( cash ) );
	    SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]{FFFFFF} You've given %s(%d) "COL_GOLD"%s", ReturnPlayerName( pID ), pID, number_format( cash ) );
	}
	return 1;
}

CMD:setviplevel( playerid, params[ ] )
{
	new
	    pID,
	    level
	;

	if ( !IsPlayerAdmin( playerid ) || !IsPlayerLorenc( playerid ) ) return 0;
    else if ( sscanf( params, ""#sscanf_u"d", pID, level ) ) return SendUsage( playerid, "/setviplevel [PLAYER_ID] [VIP_LEVEL]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else if ( p_PlayerLogged{ pID } == false ) return SendError( playerid, "This player is not logged in." );
	else if ( level > VIP_DIAMOND || level < 0 ) return SendError( playerid, "Specify a level between 0 - 5 please!" );
    else
    {
	    SetPlayerVipLevel( pID, level );
        SendClientMessageFormatted( playerid, -1, ""COL_GOLD"[VIP LEVEL]"COL_WHITE" You have set %s(%d)'s VIP package to %s.", ReturnPlayerName( pID ), pID, VIPToString( level ) );
		SendClientMessageFormatted( pID, -1, ""COL_GOLD"[VIP LEVEL]"COL_WHITE" Your VIP package has been set to %s by %s(%d)", VIPToString( level ), ReturnPlayerName( playerid ), playerid );
    }
	return 1;
}

CMD:extendvip( playerid, params[ ] )
{
	new
	    pID,
	    days
	;

	if ( !IsPlayerAdmin( playerid ) ) return 0;
    else if ( sscanf( params, ""#sscanf_u"d", pID, days ) ) return SendUsage( playerid, "/extendvip [PLAYER_ID] [DAYS]" );
	else if ( !IsPlayerConnected( pID ) ) SendError( playerid, "Invalid Player ID." );
	else if ( p_VIPLevel[ pID ] < VIP_REGULAR ) return SendError( playerid, "This player doesn't have a V.I.P level." );
	else if ( days < -365 || days > 365 ) return SendError( playerid, "Extension can only vary from -365 to 365 days." );
	else
	{
	    p_VIPExpiretime[ pID ] += ( days ) * 86400;
	    if ( days >= 0 )
	    {
			SendClientMessageFormatted( pID, -1, ""COL_GOLD"[VIP EXTENSION]"COL_WHITE" You have had your V.I.P extended for "COL_GREEN"%d days"COL_WHITE" by %s(%d).", days, ReturnPlayerName( playerid ), playerid );
			SendClientMessageFormatted( playerid, -1, ""COL_GOLD"[VIP EXTENSION]"COL_WHITE" You have extended %s(%d)'s V.I.P for "COL_GREEN"%d days"COL_WHITE".", ReturnPlayerName( pID ), pID, days );
		}
		else
		{
            days = days * -1; // conversion to whole number
			SendClientMessageFormatted( pID, -1, ""COL_GOLD"[VIP EXTENSION]"COL_WHITE" You have had your V.I.P decremented for "COL_RED"%d days"COL_WHITE" by %s(%d).", days, ReturnPlayerName( playerid ), playerid );
			SendClientMessageFormatted( playerid, -1, ""COL_GOLD"[VIP EXTENSION]"COL_WHITE" You have decremented %s(%d)'s V.I.P for "COL_RED"%d days"COL_WHITE".", ReturnPlayerName( pID ), pID, days );
		}
    }
	return 1;
}

CMD:kickall( playerid, params[ ] )
{
	if ( !IsPlayerAdmin( playerid ) ) return 0;
	SetServerRule( "password", "updating" );
	SendClientMessageToAll( -1, ""COL_PINK"[ADMIN]"COL_WHITE" Everyone has been kicked from the server due to a server update." );
	for( new i; i < MAX_PLAYERS; i++ ) if ( IsPlayerConnected( i ) && ! IsPlayerNPC( i ) && p_AccountID[ i ] != 1 ) {
		Kick( i );
	}
	return 1;
}