900 lines
41 KiB
Plaintext
900 lines
41 KiB
Plaintext
/*
|
|
* Irresistible Gaming (c) 2018
|
|
* Developed by Lorenc Pekaj
|
|
* Module: cnr\features\vehicles\vehicles.pwn
|
|
* Purpose: personal vehicle system
|
|
*/
|
|
|
|
/* ** Includes ** */
|
|
#include < YSI\y_hooks >
|
|
|
|
/* ** Definitions ** */
|
|
#define MAX_BUYABLE_VEHICLES ( 20 + VIP_MAX_EXTRA_SLOTS )
|
|
#define MAX_CAR_MODS 15
|
|
|
|
/* ** Variables ** */
|
|
enum E_CAR_DATA
|
|
{
|
|
E_VEHICLE_ID, bool: E_CREATED, bool: E_LOCKED,
|
|
Float: E_X, Float: E_Y, Float: E_Z,
|
|
Float: E_ANGLE, E_OWNER_ID, E_PRICE,
|
|
E_COLOR[ 2 ], E_MODEL, E_PLATE[ 32 ],
|
|
E_PAINTJOB, E_SQL_ID, E_GARAGE
|
|
};
|
|
|
|
new
|
|
g_vehicleData [ MAX_PLAYERS ] [ MAX_BUYABLE_VEHICLES ] [ E_CAR_DATA ],
|
|
bool: g_buyableVehicle [ MAX_VEHICLES char ],
|
|
g_vehicleModifications [ MAX_PLAYERS ] [ MAX_BUYABLE_VEHICLES ] [ MAX_CAR_MODS ]
|
|
;
|
|
|
|
/* ** Hooks ** */
|
|
hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
|
|
{
|
|
if ( dialogid == DIALOG_VEHICLE_SPAWN && response )
|
|
{
|
|
if ( !listitem )
|
|
{
|
|
for( new id; id < MAX_BUYABLE_VEHICLES; id ++ )
|
|
if ( g_vehicleData[ playerid ] [ id ] [ E_CREATED ] && g_vehicleData[ playerid ] [ id ] [ E_OWNER_ID ] == p_AccountID[ playerid ] && IsValidVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) )
|
|
RespawnBuyableVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] );
|
|
|
|
SendServerMessage( playerid, "You have respawned all your vehicles." );
|
|
}
|
|
else
|
|
{
|
|
for( new id, x = 1; id < MAX_BUYABLE_VEHICLES; id ++ )
|
|
{
|
|
if ( g_vehicleData[ playerid ] [ id ] [ E_CREATED ] && g_vehicleData[ playerid ] [ id ] [ E_OWNER_ID ] == p_AccountID[ playerid ] && IsValidVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) )
|
|
{
|
|
if ( x == listitem )
|
|
{
|
|
RespawnBuyableVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] );
|
|
SendServerMessage( playerid, "You have respawned your "COL_GREY"%s"COL_WHITE".", GetVehicleName( GetVehicleModel( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) ) );
|
|
break;
|
|
}
|
|
x ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( dialogid == DIALOG_VEHICLE_LOCATE && response )
|
|
{
|
|
if ( GetPlayerInterior( playerid ) || GetPlayerVirtualWorld( playerid ) )
|
|
return SendError( playerid, "You cannot use this feature inside of an interior." );
|
|
|
|
for( new id, x = 0; id < MAX_BUYABLE_VEHICLES; id ++ )
|
|
{
|
|
if ( g_vehicleData[ playerid ] [ id ] [ E_CREATED ] == true && g_vehicleData[ playerid ] [ id ] [ E_OWNER_ID ] == p_AccountID[ playerid ] && IsValidVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) )
|
|
{
|
|
if ( x == listitem )
|
|
{
|
|
if ( GetPlayerCash( playerid ) < 10000 )
|
|
return SendError( playerid, "You need $10,000 to bring your vehicle to you." );
|
|
|
|
new
|
|
Float: X, Float: Y, Float: Z;
|
|
|
|
foreach( new i : Player )
|
|
{
|
|
if( GetPlayerVehicleID( i ) == g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] )
|
|
{
|
|
GetPlayerPos( i, X, Y, Z );
|
|
SetPlayerPos( i, X, Y, ( Z + 0.5 ) );
|
|
SendServerMessage( i, "You have been thrown out of the vehicle as the owner has teleported it away!" );
|
|
}
|
|
}
|
|
|
|
// get the player's position again
|
|
GetPlayerPos( playerid, X, Y, Z );
|
|
|
|
// get nearest node
|
|
new Float: nodeX, Float: nodeY, Float: nodeZ, Float: nextX, Float: nextY;
|
|
new nodeid = NearestNodeFromPoint( X, Y, Z );
|
|
new nextNodeid = NearestNodeFromPoint( X, Y, Z, 9999.9, nodeid );
|
|
|
|
GetNodePos( nextNodeid, nextX, nextY, nodeZ );
|
|
GetNodePos( nodeid, nodeX, nodeY, nodeZ );
|
|
|
|
new
|
|
Float: rotation = atan2( nextY - nodeY, nextX - nodeX ) - 90.0;
|
|
|
|
SetVehiclePos( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], nodeX, nodeY, nodeZ + 1.0 );
|
|
SetVehicleZAngle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], rotation );
|
|
LinkVehicleToInterior( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], 0 );
|
|
SetVehicleVirtualWorld( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], 0 );
|
|
|
|
// alert
|
|
Beep( playerid );
|
|
GivePlayerCash( playerid, -10000 );
|
|
p_VehicleBringCooldown[ playerid ] = g_iTime + 120;
|
|
SendServerMessage( playerid, "You have brought your "COL_GREY"%s"COL_WHITE". Check the nearest road for it.", GetVehicleName( GetVehicleModel( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) ) );
|
|
break;
|
|
}
|
|
x ++;
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnPlayerDriveVehicle( playerid, vehicleid )
|
|
{
|
|
if ( g_buyableVehicle{ vehicleid } == true )
|
|
{
|
|
new ownerid, slotid;
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid, slotid );
|
|
|
|
if ( v == -1 ) {
|
|
return 1; // ignore if unowned/erroneous
|
|
}
|
|
|
|
if ( ownerid == playerid )
|
|
{
|
|
SendClientMessage(playerid, -1, ""COL_GREY"[VEHICLE]"COL_WHITE" Welcome back to your vehicle.");
|
|
Beep( playerid );
|
|
GetVehicleParamsEx( vehicleid, engine, lights, alarm, doors, bonnet, boot, objective );
|
|
SetVehicleParamsEx( vehicleid, VEHICLE_PARAMS_ON, lights, VEHICLE_PARAMS_OFF, doors, bonnet, boot, objective );
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
if ( g_vehicleData[ ownerid ] [ slotid ] [ E_LOCKED ] == true )
|
|
{
|
|
if ( p_AdminLevel[ playerid ] < 3 || !p_AdminOnDuty{ playerid } )
|
|
{
|
|
new
|
|
model_id = GetVehicleModel( vehicleid );
|
|
|
|
GetVehicleParamsEx( vehicleid, engine, lights, alarm, doors, bonnet, boot, objective );
|
|
SetVehicleParamsEx( vehicleid, VEHICLE_PARAMS_ON, lights, VEHICLE_PARAMS_ON, doors, bonnet, boot, objective );
|
|
|
|
// Remove helicopter bottoms
|
|
if ( GetGVarInt( "heli_gunner", vehicleid ) && ( model_id == 487 || model_id == 497 ) ) {
|
|
DestroyDynamicObject( GetGVarInt( "heli_gunner", vehicleid ) );
|
|
DeleteGVar( "heli_gunner", vehicleid );
|
|
}
|
|
|
|
SyncObject( playerid, 1 ); // Just sets the players position where the vehicle is.
|
|
SendError( playerid, "You cannot drive this car, it has been locked by the owner." );
|
|
}
|
|
else SendClientMessage( playerid, -1, ""COL_PINK"[ADMIN]"COL_GREY" This is a locked vehicle." );
|
|
}
|
|
else SendClientMessageFormatted( playerid, -1, ""COL_GREY"[VEHICLE]"COL_WHITE" This vehicle is owned by %s.", ReturnPlayerName( ownerid ) );
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnEnterExitModShop( playerid, enterexit, interiorid )
|
|
{
|
|
if ( enterexit == 0 )
|
|
{
|
|
new
|
|
vehicleid = GetPlayerVehicleID( playerid );
|
|
|
|
if ( IsValidVehicle( vehicleid ) )
|
|
{
|
|
if ( g_buyableVehicle{ vehicleid } == true )
|
|
{
|
|
new
|
|
ownerid = INVALID_PLAYER_ID,
|
|
v = getVehicleSlotFromID( vehicleid, ownerid )
|
|
;
|
|
if ( ownerid == playerid && v != -1 )
|
|
{
|
|
if ( UpdateBuyableVehicleMods( playerid, v ) )
|
|
{
|
|
new
|
|
szMods[ MAX_CAR_MODS * 10 ];
|
|
|
|
for( new i; i < MAX_CAR_MODS; i++ ) {
|
|
format( szMods, sizeof( szMods ), "%s%d.", szMods, g_vehicleModifications[ playerid ] [ v ] [ i ] );
|
|
}
|
|
|
|
format( szBigString, sizeof( szBigString ), "UPDATE `VEHICLES` SET `MODS`='%s' WHERE `ID`=%d", szMods, g_vehicleData[ playerid ] [ v ] [ E_SQL_ID ] );
|
|
mysql_single_query( szBigString );
|
|
}
|
|
else SendError( playerid, "Couldn't update your vehicle mods due to an unexpected error (0x82FF)." );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnVehiclePaintjob( playerid, vehicleid, paintjobid )
|
|
{
|
|
if ( g_buyableVehicle{ vehicleid } == true )
|
|
{
|
|
new
|
|
ownerid = INVALID_PLAYER_ID,
|
|
v = getVehicleSlotFromID( vehicleid, ownerid )
|
|
;
|
|
if ( ownerid == playerid && v != -1 )
|
|
{
|
|
g_vehicleData[ playerid ] [ v ] [ E_PAINTJOB ] = paintjobid;
|
|
SaveVehicleData( playerid, v );
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnVehicleRespray( playerid, vehicleid, color1, color2 )
|
|
{
|
|
if ( g_buyableVehicle{ vehicleid } == true )
|
|
{
|
|
new
|
|
ownerid = INVALID_PLAYER_ID,
|
|
v = getVehicleSlotFromID( vehicleid, ownerid )
|
|
;
|
|
if ( ownerid == playerid && v != -1 )
|
|
{
|
|
g_vehicleData[ playerid ] [ v ] [ E_COLOR ] [ 0 ] = color1;
|
|
g_vehicleData[ playerid ] [ v ] [ E_COLOR ] [ 1 ] = color2;
|
|
SaveVehicleData( playerid, v );
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* ** Commands ** */
|
|
CMD:vehicle( playerid, params[ ] ) return cmd_v( playerid, params );
|
|
CMD:v( playerid, params[ ] )
|
|
{
|
|
if ( p_accountSecurityData[ playerid ] [ E_ID ] && ! p_accountSecurityData[ playerid ] [ E_VERIFIED ] && p_accountSecurityData[ playerid ] [ E_MODE ] != SECURITY_MODE_DISABLED )
|
|
return SendError( playerid, "You must be verified in order to use this feature. "COL_YELLOW"(use /verify)" );
|
|
|
|
// force hoarders to sell
|
|
if ( ! p_VIPLevel[ playerid ] && p_OwnedVehicles[ playerid ] > GetPlayerVehicleSlots( playerid ) && ! strmatch( params, "sell" ) && ! strmatch( params, "bring" ) ) {
|
|
for( new i = 0; i < p_OwnedVehicles[ playerid ]; i++ ) if ( g_vehicleData[ playerid ] [ i ] [ E_OWNER_ID ] == p_AccountID[ playerid ] ) {
|
|
g_vehicleData[ playerid ] [ i ] [ E_LOCKED ] = false;
|
|
}
|
|
return SendError( playerid, "Please renew your V.I.P or sell this vehicle to match your vehicle allocated limit. (/v sell/bring only)" );
|
|
}
|
|
|
|
new
|
|
vehicleid = GetPlayerVehicleID( playerid ),
|
|
ownerid = INVALID_PLAYER_ID
|
|
;
|
|
|
|
if ( isnull( params ) ) return SendUsage( playerid, "/v [SELL/COLOR/LOCK/PARK/RESPAWN/BRING/DATA/PLATE/PAINTJOB/RESET]" );
|
|
else if ( strmatch( params, "sell" ) )
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid );
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You need to be in a vehicle to use this command." );
|
|
else if ( v == -1 ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( g_buyableVehicle{ vehicleid } == false ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( playerid != ownerid ) return SendError( playerid, "You cannot sell this vehicle." );
|
|
else
|
|
{
|
|
format( szBigString, sizeof( szBigString ), "[SELL] [%s] %s | %d | %s\r\n", getCurrentDate( ), ReturnPlayerName( playerid ), v, GetVehicleName( GetVehicleModel( g_vehicleData[ playerid ] [ v ] [ E_VEHICLE_ID ] ) ) );
|
|
AddFileLogLine( "log_destroycar.txt", szBigString );
|
|
GivePlayerCash( playerid, ( g_vehicleData[ playerid ] [ v ] [ E_PRICE ] / 2 ) );
|
|
SendClientMessageFormatted( playerid, -1, ""COL_GREY"[VEHICLE]"COL_WHITE" You have sold this vehicle for half the price it was (%s).", cash_format( ( g_vehicleData[ playerid ] [ v ] [ E_PRICE ] / 2 ) ) );
|
|
DestroyBuyableVehicle( playerid, v );
|
|
}
|
|
}
|
|
else if ( strmatch( params, "lock" ) )
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid );
|
|
if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be in a vehicle to use this command." );
|
|
else if ( v == -1 ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( g_buyableVehicle{ vehicleid } == false ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( playerid != ownerid ) return SendError( playerid, "You cannot lock this vehicle." );
|
|
else
|
|
{
|
|
g_vehicleData[ playerid ] [ v ] [ E_LOCKED ] = !g_vehicleData[ playerid ] [ v ] [ E_LOCKED ];
|
|
SendClientMessageFormatted( playerid, -1, ""COL_GREY"[VEHICLE]"COL_WHITE" You have %s this vehicle.", g_vehicleData[ playerid ] [ v ] [ E_LOCKED ] == true ? ( "locked" ) : ( "un-locked" ) );
|
|
SaveVehicleData( playerid, v );
|
|
}
|
|
}
|
|
else if ( strmatch( params, "park" ) )
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid ), Float: X, Float: Y, Float: Z, Float: Angle;
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You need to be in a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( v == -1 ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( playerid != ownerid ) return SendError( playerid, "You cannot park this vehicle." );
|
|
else
|
|
{
|
|
if ( IsVehicleUpsideDown( GetPlayerVehicleID( playerid ) ) ) return SendError( playerid, "Sorry, you're just going to have to ditch your car as soon as possible." );
|
|
|
|
new
|
|
iBreach = PlayerBreachedGarageLimit( playerid, v );
|
|
|
|
if ( iBreach == -1 ) return SendError( playerid, "You cannot park vehicles that are not owned by the owner of this garage." );
|
|
if ( iBreach == -2 ) return SendError( playerid, "This garage has already reached its capacity of %d vehicles.", GetGarageVehicleCapacity( p_InGarage[ playerid ] ) );
|
|
|
|
GetVehiclePos( vehicleid, X, Y, Z );
|
|
GetVehicleZAngle( vehicleid, Angle );
|
|
g_vehicleData[ playerid ] [ v ] [ E_X ] = X, g_vehicleData[ playerid ] [ v ] [ E_Y ] = Y, g_vehicleData[ playerid ] [ v ] [ E_Z ] = Z, g_vehicleData[ playerid ] [ v ] [ E_ANGLE ] = Angle;
|
|
PutPlayerInVehicle( playerid, RespawnBuyableVehicle( vehicleid, playerid ), 0 );
|
|
SetTimerEx( "timedUpdates_RBV", 25, false, "ddf", playerid, INVALID_VEHICLE_ID, -1000.0 );
|
|
SaveVehicleData( playerid, v );
|
|
SendClientMessage( playerid, -1, ""COL_GREY"[VEHICLE]"COL_WHITE" You have parked this vehicle." );
|
|
}
|
|
}
|
|
else if ( strmatch( params, "respawn" ) )
|
|
{
|
|
if ( p_OwnedVehicles[ playerid ] > 0 )
|
|
{
|
|
szLargeString = ""COL_GREY"Respawn All Vehicles\n";
|
|
for( new i; i < p_OwnedVehicles[ playerid ]; i++ )
|
|
{
|
|
if ( g_vehicleData[ playerid ] [ i ] [ E_OWNER_ID ] == p_AccountID[ playerid ] && IsValidVehicle( g_vehicleData[ playerid ] [ i ] [ E_VEHICLE_ID ] ) ) {
|
|
format( szLargeString, sizeof( szLargeString ), "%s%s\n", szLargeString, GetVehicleName( GetVehicleModel( g_vehicleData[ playerid ] [ i ] [ E_VEHICLE_ID ] ) ) );
|
|
}
|
|
}
|
|
ShowPlayerDialog( playerid, DIALOG_VEHICLE_SPAWN, DIALOG_STYLE_LIST, "{FFFFFF}Spawn your vehicle", szLargeString, "Select", "Cancel" );
|
|
}
|
|
else SendError( playerid, "You don't own any vehicles." );
|
|
}
|
|
else if ( strmatch( params, "locate" ) ) return SendServerMessage( playerid, "This feature has been replaced with "COL_GREY"/v bring"COL_WHITE"." );
|
|
else if ( strmatch( params, "bring" ) )
|
|
{
|
|
if ( p_VehicleBringCooldown[ playerid ] > g_iTime )
|
|
return SendError( playerid, "You must wait %s before using this feature again.", secondstotime( p_VehicleBringCooldown[ playerid ] - g_iTime ) );
|
|
|
|
if ( p_OwnedVehicles[ playerid ] > 0 )
|
|
{
|
|
szLargeString = ""COL_WHITE"Bringing your vehicle to you will cost $10,000!\n";
|
|
for( new i; i < p_OwnedVehicles[ playerid ]; i++ )
|
|
{
|
|
if ( g_vehicleData[ playerid ] [ i ] [ E_OWNER_ID ] == p_AccountID[ playerid ] && IsValidVehicle( g_vehicleData[ playerid ] [ i ] [ E_VEHICLE_ID ] ) ) {
|
|
format( szLargeString, sizeof( szLargeString ), "%s%s\n", szLargeString, GetVehicleName( GetVehicleModel( g_vehicleData[ playerid ] [ i ] [ E_VEHICLE_ID ] ) ) );
|
|
}
|
|
}
|
|
ShowPlayerDialog( playerid, DIALOG_VEHICLE_LOCATE, DIALOG_STYLE_TABLIST_HEADERS, "{FFFFFF}Bring Vehicle", szLargeString, "Select", "Cancel" );
|
|
}
|
|
else SendError( playerid, "You don't own any vehicles." );
|
|
}
|
|
else if ( strmatch( params, "data" ) )
|
|
{
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You are not in any vehicle." );
|
|
else if ( g_buyableVehicle{ GetPlayerVehicleID( playerid ) } == false ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid );
|
|
if ( playerid != ownerid ) return SendError( playerid, "You don't own this vehicle." );
|
|
|
|
format( szBigString, sizeof( szBigString ), ""COL_GREY"Vehicle Owner:"COL_WHITE" %s\n"\
|
|
""COL_GREY"Vehicle Type:"COL_WHITE" %s\n"\
|
|
""COL_GREY"Vehicle ID:"COL_WHITE" %d\n"\
|
|
""COL_GREY"Vehicle Price:"COL_WHITE" %s",
|
|
ReturnPlayerName( ownerid ), GetVehicleName( GetVehicleModel( GetPlayerVehicleID( playerid ) ) ),
|
|
g_vehicleData[ playerid ] [ v ] [ E_SQL_ID ], cash_format( g_vehicleData[ playerid ] [ v ] [ E_PRICE ] ) );
|
|
ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_MSGBOX, "{FFFFFF}Vehicle Data", szBigString, "Okay", "" );
|
|
}
|
|
}
|
|
else if ( !strcmp( params, "color", false, 4 ) )
|
|
{
|
|
new
|
|
color1, color2
|
|
;
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You must be inside a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( sscanf( params[ 6 ], "dd", color1, color2 ) ) return SendUsage( playerid, "/v color [COLOR_1] [COLOR_2]" );
|
|
else if ( g_buyableVehicle{ GetPlayerVehicleID( playerid ) } == false ) return SendError( playerid, "This isn't a buyable vehicle." );
|
|
else if ( GetPlayerCash( playerid ) < 100 ) return SendError( playerid, "You don't have enough cash for this." );
|
|
else if ( color1 > 255 || color1 < 0 || color2 > 255 || color2 < 0 ) return SendError( playerid, "Invalid vehicle color ID." );
|
|
else
|
|
{
|
|
new vID = getVehicleSlotFromID( GetPlayerVehicleID( playerid ), ownerid );
|
|
if ( playerid != ownerid ) return SendError( playerid, "You don't own this vehicle." );
|
|
if ( IsVehicleUpsideDown( GetPlayerVehicleID( playerid ) ) ) return SendError( playerid, "Sorry, you're just going to have to ditch your car as soon as possible." );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 0 ] = color1;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 1 ] = color2;
|
|
GivePlayerCash( playerid, -100 );
|
|
PutPlayerInVehicle( playerid, RespawnBuyableVehicle( vehicleid, playerid ), 0 );
|
|
SaveVehicleData( playerid, vID );
|
|
SendServerMessage( playerid, "You have successfully changed your vehicle colors." );
|
|
}
|
|
}
|
|
else if ( !strcmp( params, "plate", false, 4 ) )
|
|
{
|
|
new
|
|
szPlate[ 32 ]
|
|
;
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You must be inside a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( sscanf( params[ 6 ], "s[32]", szPlate ) ) return SendUsage( playerid, "/v plate [TEXT]" );
|
|
else if ( g_buyableVehicle{ GetPlayerVehicleID( playerid ) } == false ) return SendError( playerid, "This isn't a buyable vehicle." );
|
|
else
|
|
{
|
|
new vID = getVehicleSlotFromID( GetPlayerVehicleID( playerid ), ownerid );
|
|
if ( playerid != ownerid ) return SendError( playerid, "You don't own this vehicle." );
|
|
if ( IsBoatVehicle( GetVehicleModel( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] ) ) || IsAirVehicle( GetVehicleModel( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] ) ) ) return SendError( playerid, "Sorry, this feature is not available on planes and boats." );
|
|
if ( IsVehicleUpsideDown( GetPlayerVehicleID( playerid ) ) ) return SendError( playerid, "Sorry, you're just going to have to ditch your car as soon as possible." );
|
|
format( g_vehicleData[ playerid ] [ vID ] [ E_PLATE ], 32, "%s", szPlate );
|
|
PutPlayerInVehicle( playerid, RespawnBuyableVehicle( vehicleid, playerid ), 0 );
|
|
SaveVehicleData( playerid, vID );
|
|
SendServerMessage( playerid, "Your have changed your vehicle's number plate to "COL_GREY"%s"COL_WHITE".", szPlate );
|
|
}
|
|
}
|
|
else if ( !strcmp( params, "paintjob", false, 7 ) )
|
|
{
|
|
new
|
|
paintjobid
|
|
;
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You must be inside a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( sscanf( params[ 9 ], "d", paintjobid ) ) return SendUsage( playerid, "/v paintjob [PAINT_JOB_ID]" );
|
|
else if ( g_buyableVehicle{ GetPlayerVehicleID( playerid ) } == false ) return SendError( playerid, "This isn't a buyable vehicle." );
|
|
else if ( GetPlayerCash( playerid ) < 500 ) return SendError( playerid, "You don't have enough cash for this." );
|
|
else if ( paintjobid < 0 || paintjobid > 3 ) return SendError( playerid, "Please specify a paintjob between 0 to 3." );
|
|
else
|
|
{
|
|
new vID = getVehicleSlotFromID( GetPlayerVehicleID( playerid ), ownerid );
|
|
if ( playerid != ownerid ) return SendError( playerid, "You don't own this vehicle." );
|
|
if ( !IsPaintJobVehicle( GetVehicleModel( GetPlayerVehicleID( playerid ) ) ) ) return SendError( playerid, "This vehicle cannot have a paintjob installed." );
|
|
if ( IsVehicleUpsideDown( GetPlayerVehicleID( playerid ) ) ) return SendError( playerid, "Sorry, you're just going to have to ditch your car as soon as possible." );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PAINTJOB ] = paintjobid;
|
|
ChangeVehiclePaintjob( GetPlayerVehicleID( playerid ), paintjobid );
|
|
GivePlayerCash( playerid, -500 );
|
|
PutPlayerInVehicle( playerid, RespawnBuyableVehicle( vehicleid, playerid ), 0 );
|
|
SaveVehicleData( playerid, vID );
|
|
}
|
|
}
|
|
else if ( !strcmp( params, "toggle", false, 5 ) )
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid );
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You need to be in a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( v == -1 ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( playerid != ownerid ) return SendError( playerid, "This vehicle does not belong to you." );
|
|
else
|
|
{
|
|
if ( !strlen( params[ 7 ] ) )
|
|
return SendUsage( playerid, "/v toggle [DOORS/BONNET/BOOT/LIGHTS/WINDOWS]" );
|
|
|
|
GetVehicleParamsEx( vehicleid, engine, lights, alarm, doors, bonnet, boot, objective );
|
|
|
|
if ( !strcmp( params[ 7 ], "doors", true, 5 ) ) {
|
|
if ( !strlen( params[ 13 ] ) ) return SendUsage( playerid, "/v toggle doors [OPEN/CLOSE]" );
|
|
if ( strmatch( params[ 13 ], "open" ) ) {
|
|
SetVehicleParamsCarDoors( vehicleid, 1, 1, 1, 1 );
|
|
return SendServerMessage( playerid, "You have opened the doors of this vehicle." );
|
|
}
|
|
else if ( strmatch( params[ 13 ], "close" ) ) {
|
|
SetVehicleParamsCarDoors( vehicleid, 0, 0, 0, 0 );
|
|
return SendServerMessage( playerid, "You have closed the doors of this vehicle." );
|
|
}
|
|
else {
|
|
return SendUsage( playerid, "/v toggle doors [OPEN/CLOSE]" );
|
|
}
|
|
}
|
|
|
|
else if ( !strcmp( params[ 7 ], "windows", true, 7 ) ) {
|
|
if ( !strlen( params[ 15 ] ) ) return SendUsage( playerid, "/v toggle windows [OPEN/CLOSE]" );
|
|
if ( strmatch( params[ 15 ], "open" ) ) {
|
|
SetVehicleParamsCarWindows( vehicleid, 0, 0, 0, 0 );
|
|
return SendServerMessage( playerid, "You have opened the windows of this vehicle." );
|
|
}
|
|
else if ( strmatch( params[ 15 ], "close" ) ) {
|
|
SetVehicleParamsCarWindows( vehicleid, 1, 1, 1, 1 );
|
|
return SendServerMessage( playerid, "You have closed the windows of this vehicle." );
|
|
}
|
|
else {
|
|
return SendUsage( playerid, "/v toggle windows [OPEN/CLOSE]" );
|
|
}
|
|
}
|
|
|
|
else if ( strmatch( params[ 7 ], "bonnet" ) ){
|
|
SendServerMessage( playerid, "You have %s the bonnet of this vehicle.", ( bonnet = !bonnet ) ? ( "opened" ) : ( "closed" ) );
|
|
}
|
|
|
|
else if ( strmatch( params[ 7 ], "boot" ) ) {
|
|
SendServerMessage( playerid, "You have %s the boot of this vehicle.", ( boot = !boot ) ? ( "opened" ) : ( "closed" ) );
|
|
}
|
|
|
|
else if ( strmatch( params[ 7 ], "lights" ) ) {
|
|
SendServerMessage( playerid, "You have %s the lights of this vehicle.", ( lights = !lights ) ? ( "switched on" ) : ( "switched off" ) );
|
|
}
|
|
|
|
else {
|
|
return SendUsage( playerid, "/v toggle [DOORS/BONNET/BOOT/LIGHTS/WINDOWS]" );
|
|
}
|
|
|
|
return SetVehicleParamsEx( vehicleid, engine, lights, alarm, doors, bonnet, boot, objective );
|
|
}
|
|
}
|
|
else if ( strmatch( params, "reset" ) )
|
|
{
|
|
new v = getVehicleSlotFromID( vehicleid, ownerid );
|
|
if ( !IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You need to be in a vehicle to use this command." );
|
|
else if ( GetPlayerState( playerid ) != PLAYER_STATE_DRIVER ) return SendError( playerid, "You need to be a driver to use this command." );
|
|
else if ( v == -1 ) return SendError( playerid, "This vehicle isn't a buyable vehicle." );
|
|
else if ( playerid != ownerid ) return SendError( playerid, "This vehicle does not belong to you." );
|
|
else
|
|
{
|
|
if ( IsVehicleUpsideDown( vehicleid ) ) return SendError( playerid, "Sorry, you're just going to have to ditch your car as soon as possible." );
|
|
ResetBuyableVehicleMods( playerid, v, 0 );
|
|
ChangeVehiclePaintjob( vehicleid, 3 );
|
|
g_vehicleData[ playerid ] [ v ] [ E_PAINTJOB ] = 3;
|
|
g_vehicleData[ playerid ] [ v ] [ E_COLOR ] [ 0 ] = 0;
|
|
g_vehicleData[ playerid ] [ v ] [ E_COLOR ] [ 1 ] = 0;
|
|
PutPlayerInVehicle( playerid, RespawnBuyableVehicle( vehicleid, playerid ), 0 );
|
|
SaveVehicleData( playerid, v );
|
|
SendClientMessage( playerid, -1, ""COL_GREY"[SERVER]"COL_WHITE" You have reset your vehicle's appearance." );
|
|
}
|
|
}
|
|
else SendUsage( playerid, "/v [SELL/COLOR/LOCK/PARK/RESPAWN/BRING/DATA/PLATE/PAINTJOB/TOGGLE/RESET]" );
|
|
return 1;
|
|
}
|
|
|
|
/* ** SQL Threads ** */
|
|
thread OnVehicleLoad( playerid )
|
|
{
|
|
if ( !IsPlayerConnected( playerid ) )
|
|
return 0;
|
|
|
|
new
|
|
rows, fields, i = -1, vID,
|
|
Query[ 76 ]
|
|
;
|
|
|
|
cache_get_data( rows, fields );
|
|
if ( rows )
|
|
{
|
|
while( ++i < rows )
|
|
{
|
|
for( vID = 0; vID < MAX_BUYABLE_VEHICLES; vID++ )
|
|
if ( !g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] ) break;
|
|
|
|
if ( vID >= MAX_BUYABLE_VEHICLES )
|
|
continue;
|
|
|
|
if ( g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] )
|
|
continue;
|
|
|
|
cache_get_field_content( i, "PLATE", g_vehicleData[ playerid ] [ vID ] [ E_PLATE ], dbHandle, 32 );
|
|
cache_get_field_content( i, "MODS", Query ), sscanf( Query, "p<.>e<ddddddddddddddd>", g_vehicleModifications[ playerid ] [ vID ] );
|
|
|
|
g_vehicleData[ playerid ] [ vID ] [ E_SQL_ID ] = cache_get_field_content_int( i, "ID", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_OWNER_ID ] = cache_get_field_content_int( i, "OWNER", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_MODEL ] = cache_get_field_content_int( i, "MODEL", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_LOCKED ] = !!cache_get_field_content_int( i, "LOCKED", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_X ] = cache_get_field_content_float( i, "X", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_Y ] = cache_get_field_content_float( i, "Y", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_Z ] = cache_get_field_content_float( i, "Z", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_ANGLE ] = cache_get_field_content_float( i, "ANGLE", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 0 ] = cache_get_field_content_int( i, "COLOR1", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 1 ] = cache_get_field_content_int( i, "COLOR2", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PRICE ] = cache_get_field_content_int( i, "PRICE", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PAINTJOB ] = cache_get_field_content_int( i, "PAINTJOB", dbHandle );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ] = cache_get_field_content_int( i, "GARAGE", dbHandle );
|
|
|
|
new iVehicle = CreateVehicle( g_vehicleData[ playerid ] [ vID ] [ E_MODEL ], g_vehicleData[ playerid ] [ vID ] [ E_X ], g_vehicleData[ playerid ] [ vID ] [ E_Y ], g_vehicleData[ playerid ] [ vID ] [ E_Z ], g_vehicleData[ playerid ] [ vID ] [ E_ANGLE ], g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 0 ], g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 1 ], 999 );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] = iVehicle;
|
|
|
|
if ( iVehicle != INVALID_VEHICLE_ID ) {
|
|
if ( g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ] != -1 ) {
|
|
LinkVehicleToInterior( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ], GetGarageInteriorID( g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ] ) );
|
|
SetVehicleVirtualWorld( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ], GetGarageVirtualWorld( g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ] ) );
|
|
}
|
|
|
|
SetVehicleNumberPlate( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ], g_vehicleData[ playerid ] [ vID ] [ E_PLATE ] );
|
|
ChangeVehiclePaintjob( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ], g_vehicleData[ playerid ] [ vID ] [ E_PAINTJOB ] );
|
|
for( new x = 0; x < MAX_CAR_MODS; x++ )
|
|
{
|
|
if ( g_vehicleModifications[ playerid ] [ vID ] [ x ] >= 1000 && g_vehicleModifications[ playerid ] [ vID ] [ x ] < 1193 )
|
|
{
|
|
if ( isLegalCarMod( GetVehicleModel( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] ), g_vehicleModifications[ playerid ] [ vID ] [ x ] ) )
|
|
AddVehicleComponent( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ], g_vehicleModifications[ playerid ] [ vID ] [ x ] );
|
|
else
|
|
g_vehicleModifications[ playerid ] [ vID ] [ x ] = 0;
|
|
}
|
|
}
|
|
g_adminSpawnedCar{ g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] } = false;
|
|
g_buyableVehicle{ g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] } = true;
|
|
}
|
|
|
|
g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] = true;
|
|
|
|
// Load vehicle components
|
|
format( szNormalString, sizeof( szNormalString ), "SELECT * FROM `COMPONENTS` WHERE `VEHICLE_ID`=%d", g_vehicleData[ playerid ] [ vID ] [ E_SQL_ID ] );
|
|
mysql_function_query( dbHandle, szNormalString, true, "OnVehicleComponentsLoad", "dd", playerid, vID );
|
|
}
|
|
|
|
p_OwnedVehicles[ playerid ] = rows;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
thread OnPlayerCreateBuyableVehicle( playerid, slot )
|
|
{
|
|
g_vehicleData[ playerid ] [ slot ] [ E_SQL_ID ] = cache_insert_id( );
|
|
return 1;
|
|
}
|
|
|
|
/* ** Functions ** */
|
|
stock CreateBuyableVehicle( playerid, Model, Color1, Color2, Float: X, Float: Y, Float: Z, Float: Angle, Cost )
|
|
{
|
|
new
|
|
vID,
|
|
szString[ 300 ],
|
|
iCar = INVALID_VEHICLE_ID
|
|
;
|
|
|
|
if ( playerid != INVALID_PLAYER_ID && !IsPlayerConnected( playerid ) )
|
|
return INVALID_PLAYER_ID;
|
|
|
|
for( vID = 0; vID < MAX_BUYABLE_VEHICLES; vID++ )
|
|
if ( !g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] ) break;
|
|
|
|
if ( vID >= MAX_BUYABLE_VEHICLES )
|
|
return -1;
|
|
|
|
if ( g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] )
|
|
return -1;
|
|
|
|
if ( vID != -1 )
|
|
{
|
|
strcpy( g_vehicleData[ playerid ] [ vID ] [ E_PLATE ], "SF-CNR" );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_LOCKED ] = false;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_X ] = X;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_Y ] = Y;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_Z ] = Z;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_ANGLE ] = Angle;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PRICE ] = Cost;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 0 ] = Color1;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 1 ] = Color2;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] = true;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PRICE ] = Cost;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_MODEL ] = Model;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_PAINTJOB ] = 3;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ] = -1;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_OWNER_ID ] = p_AccountID[ playerid ];
|
|
ResetBuyableVehicleMods( playerid, vID );
|
|
iCar = CreateVehicle( Model, X, Y, Z, Angle, Color1, Color2, 999999999 );
|
|
g_adminSpawnedCar{ iCar } = false;
|
|
//GetVehicleParamsEx( iCar, engine, lights, alarm, doors, bonnet, boot, objective );
|
|
//SetVehicleParamsEx( iCar, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective );
|
|
SetVehicleNumberPlate( iCar, "SF-CNR" );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] = iCar;
|
|
g_buyableVehicle{ iCar } = true;
|
|
format( szString, sizeof( szString ), "INSERT INTO `VEHICLES` (`MODEL`,`LOCKED`,`X`,`Y`,`Z`,`ANGLE`,`COLOR1`,`COLOR2`,`PRICE`,`OWNER`,`PLATE`,`PAINTJOB`,`MODS`) VALUES (%d,0,%f,%f,%f,%f,%d,%d,%d,%d,'SF-CNR',3,'0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.')", Model, X, Y, Z, Angle, Color1, Color2, Cost, g_vehicleData[ playerid ] [ vID ] [ E_OWNER_ID ] );
|
|
mysql_function_query( dbHandle, szString, true, "OnPlayerCreateBuyableVehicle", "dd", playerid, vID );
|
|
|
|
p_OwnedVehicles[ playerid ] ++; // Append value
|
|
}
|
|
return vID;
|
|
}
|
|
|
|
stock ResetBuyableVehicleMods( playerid, id, fordestroy=1 )
|
|
{
|
|
if ( id < 0 || id > MAX_BUYABLE_VEHICLES )
|
|
return;
|
|
|
|
if ( !g_vehicleData[ playerid ] [ id ] [ E_CREATED ] )
|
|
return;
|
|
|
|
for( new i = 0; i < MAX_CAR_MODS; i++ )
|
|
{
|
|
if ( !fordestroy && IsValidVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) ) {
|
|
if ( isLegalCarMod( GetVehicleModel( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ), g_vehicleModifications[ playerid ] [ id ] [ i ] ) )
|
|
RemoveVehicleComponent( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], g_vehicleModifications[ playerid ] [ id ] [ i ] );
|
|
}
|
|
g_vehicleModifications[ playerid ] [ id ] [ i ] = 0;
|
|
}
|
|
|
|
format( szNormalString, sizeof( szNormalString ), "UPDATE `VEHICLES` SET `MODS`='0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.' WHERE `ID`=%d", g_vehicleData[ playerid ] [ id ] [ E_SQL_ID ] );
|
|
mysql_single_query( szNormalString );
|
|
}
|
|
|
|
stock DestroyBuyableVehicle( playerid, vID, bool: db_remove = true )
|
|
{
|
|
if ( vID < 0 || vID > MAX_BUYABLE_VEHICLES )
|
|
return 0;
|
|
|
|
if ( playerid == INVALID_PLAYER_ID )
|
|
return INVALID_PLAYER_ID;
|
|
|
|
if ( !g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] )
|
|
return 0;
|
|
|
|
new
|
|
query[ 40 ]
|
|
;
|
|
|
|
if ( db_remove )
|
|
{
|
|
SendClientMessage( playerid, -1, ""COL_PINK"[VEHICLE]"COL_WHITE" One of your vehicles has been destroyed.");
|
|
p_OwnedVehicles[ playerid ] --;
|
|
|
|
format( query, sizeof( query ), "DELETE FROM `VEHICLES` WHERE `ID`=%d", g_vehicleData[ playerid ] [ vID ] [ E_SQL_ID ] );
|
|
mysql_single_query( query );
|
|
|
|
ResetBuyableVehicleMods( playerid, vID );
|
|
}
|
|
|
|
// Reset vehicle component data (hook into module)
|
|
DestroyVehicleCustomComponents( playerid, vID, db_remove );
|
|
|
|
// Reset vehicle data
|
|
g_vehicleData[ playerid ] [ vID ] [ E_OWNER_ID ] = 0;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_LOCKED ] = false;
|
|
g_vehicleData[ playerid ] [ vID ] [ E_CREATED ] = false;
|
|
g_buyableVehicle{ g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] } = false;
|
|
DestroyVehicle( g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] );
|
|
g_vehicleData[ playerid ] [ vID ] [ E_VEHICLE_ID ] = INVALID_VEHICLE_ID;
|
|
return 1;
|
|
}
|
|
|
|
stock RespawnBuyableVehicle( samp_veh_id, occupantid = INVALID_PLAYER_ID )
|
|
{
|
|
new playerid, id;
|
|
new gravy = getVehicleSlotFromID( samp_veh_id, playerid, id );
|
|
|
|
if ( gravy == -1 )
|
|
return INVALID_VEHICLE_ID;
|
|
|
|
if ( id == -1 && !g_vehicleData[ playerid ] [ id ] [ E_CREATED ] )
|
|
return INVALID_VEHICLE_ID;
|
|
|
|
if ( !IsValidVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ) )
|
|
return INVALID_VEHICLE_ID; // If it aint working.
|
|
|
|
new
|
|
Float: beforeAngle,
|
|
Float: Health,
|
|
newVeh = INVALID_VEHICLE_ID
|
|
;
|
|
|
|
GetVehicleZAngle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], beforeAngle );
|
|
GetVehicleDamageStatus( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], panels, doors, lights, tires ); // Can't do this to restore health.
|
|
GetVehicleHealth( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], Health );
|
|
|
|
if ( ( newVeh = CreateVehicle( g_vehicleData[ playerid ] [ id ] [ E_MODEL ], g_vehicleData[ playerid ] [ id ] [ E_X ], g_vehicleData[ playerid ] [ id ] [ E_Y ], g_vehicleData[ playerid ] [ id ] [ E_Z ], g_vehicleData[ playerid ] [ id ] [ E_ANGLE ], g_vehicleData[ playerid ] [ id ] [ E_COLOR ] [ 0 ], g_vehicleData[ playerid ] [ id ] [ E_COLOR ] [ 1 ], 999999999 ) ) == INVALID_VEHICLE_ID ) {
|
|
printf( "[ERROR] CreateVehicle(%d, %f, %f, %f, %f, %d, %d, %d);", g_vehicleData[ playerid ] [ id ] [ E_MODEL ], g_vehicleData[ playerid ] [ id ] [ E_X ], g_vehicleData[ playerid ] [ id ] [ E_Y ], g_vehicleData[ playerid ] [ id ] [ E_Z ], g_vehicleData[ playerid ] [ id ] [ E_ANGLE ], g_vehicleData[ playerid ] [ id ] [ E_COLOR ] [ 0 ], g_vehicleData[ playerid ] [ id ] [ E_COLOR ] [ 1 ], 999999999 );
|
|
return SendError( playerid, "Couldn't update vehicle due to a unknown error." );
|
|
}
|
|
|
|
// Reset special data
|
|
ResetVehicleMethlabData( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], true );
|
|
|
|
// Destroy vehicle
|
|
DestroyVehicle( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] );
|
|
g_buyableVehicle{ g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] } = false;
|
|
g_buyableVehicle{ newVeh } = true;
|
|
g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] = newVeh;
|
|
|
|
// Restore old data
|
|
SetVehicleNumberPlate( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], g_vehicleData[ playerid ] [ id ] [ E_PLATE ] );
|
|
ChangeVehiclePaintjob( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], g_vehicleData[ playerid ] [ id ] [ E_PAINTJOB ] );
|
|
for( new i = 0; i < MAX_CAR_MODS; i++ ) {
|
|
if ( g_vehicleModifications[ playerid ] [ id ] [ i ] >= 1000 && g_vehicleModifications[ playerid ] [ id ] [ i ] < 1193 )
|
|
{
|
|
if ( isLegalCarMod( GetVehicleModel( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ] ), g_vehicleModifications[ playerid ] [ id ] [ i ] ) )
|
|
AddVehicleComponent( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], g_vehicleModifications[ playerid ] [ id ] [ i ] );
|
|
else
|
|
g_vehicleModifications[ playerid ] [ id ] [ i ] = 0;
|
|
}
|
|
}
|
|
|
|
UpdateVehicleDamageStatus( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], panels, doors, lights, tires );
|
|
SetVehicleHealth( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], Health );
|
|
|
|
if ( g_vehicleData[ playerid ] [ id ] [ E_GARAGE ] != -1 ) {
|
|
LinkVehicleToInterior( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], GetGarageInteriorID( g_vehicleData[ playerid ] [ id ] [ E_GARAGE ] ) );
|
|
SetVehicleVirtualWorld( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], GetGarageVirtualWorld( g_vehicleData[ playerid ] [ id ] [ E_GARAGE ] ) );
|
|
}
|
|
|
|
if ( occupantid != INVALID_PLAYER_ID ) // So nothing bugs with /v color
|
|
{
|
|
new Float: X, Float: Y, Float: Z;
|
|
SyncSpectation( playerid ); // Bug?
|
|
GetPlayerPos( occupantid, X, Y, Z );
|
|
SetVehiclePos( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], X, Y, Z + 1 );
|
|
LinkVehicleToInterior( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], GetPlayerInterior( playerid ) );
|
|
SetVehicleVirtualWorld( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], GetPlayerVirtualWorld( playerid ) );
|
|
SetTimerEx( "timedUpdates_RBV", 50, false, "ddf", occupantid, g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], beforeAngle );
|
|
}
|
|
|
|
// Replace components (hook into module)
|
|
ReplaceVehicleCustomComponents( playerid, id );
|
|
|
|
if ( !g_vehicleData[ playerid ] [ id ] [ E_OWNER_ID ] ) {
|
|
GetVehicleParamsEx( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], engine, lights, alarm, doors, bonnet, boot, objective );
|
|
SetVehicleParamsEx( g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ], VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective );
|
|
}
|
|
|
|
return g_vehicleData[ playerid ] [ id ] [ E_VEHICLE_ID ];
|
|
}
|
|
|
|
stock SaveVehicleData( playerid, vID )
|
|
{
|
|
if ( vID == -1 )
|
|
return 0;
|
|
|
|
new
|
|
szPlate[ 32 ];
|
|
|
|
// Plate System
|
|
if ( isnull( g_vehicleData[ playerid ] [ vID ] [ E_PLATE ] ) )
|
|
szPlate = "SF-CNR";
|
|
else
|
|
strcat( szPlate, g_vehicleData[ playerid ] [ vID ] [ E_PLATE ] );
|
|
|
|
// Begin Saving
|
|
format( szLargeString, sizeof( szLargeString ), "UPDATE `VEHICLES` SET `MODEL`=%d,`LOCKED`=%d,`X`=%f,`Y`=%f,`Z`=%f,`ANGLE`=%f,`COLOR1`=%d,`COLOR2`=%d,`PRICE`=%d,`PAINTJOB`=%d,`OWNER`=%d,`PLATE`='%s',`GARAGE`=%d WHERE `ID`=%d",
|
|
g_vehicleData[ playerid ] [ vID ] [ E_MODEL ], g_vehicleData[ playerid ] [ vID ] [ E_LOCKED ], g_vehicleData[ playerid ] [ vID ] [ E_X ], g_vehicleData[ playerid ] [ vID ] [ E_Y ], g_vehicleData[ playerid ] [ vID ] [ E_Z ],
|
|
g_vehicleData[ playerid ] [ vID ] [ E_ANGLE ], g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 0 ], g_vehicleData[ playerid ] [ vID ] [ E_COLOR ] [ 1 ], g_vehicleData[ playerid ] [ vID ] [ E_PRICE ], g_vehicleData[ playerid ] [ vID ] [ E_PAINTJOB ],
|
|
g_vehicleData[ playerid ] [ vID ] [ E_OWNER_ID ], mysql_escape( szPlate ), g_vehicleData[ playerid ] [ vID ] [ E_GARAGE ],
|
|
g_vehicleData[ playerid ] [ vID ] [ E_SQL_ID ] );
|
|
|
|
mysql_single_query( szLargeString );
|
|
return 1;
|
|
}
|
|
|
|
stock dischargeVehicles( playerid )
|
|
{
|
|
if ( p_OwnedVehicles[ playerid ] )
|
|
{
|
|
for( new v; v < MAX_BUYABLE_VEHICLES; v++ )
|
|
DestroyBuyableVehicle( playerid, v, .db_remove = false );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
function timedUpdates_RBV( playerid, vehicleid, Float: angle ) {
|
|
if ( vehicleid != INVALID_VEHICLE_ID )
|
|
SetVehicleZAngle( vehicleid, angle );
|
|
}
|
|
|
|
stock UpdateBuyableVehicleMods( playerid, v )
|
|
{
|
|
if ( v < 0 || v > MAX_BUYABLE_VEHICLES ) return 0;
|
|
if ( !g_vehicleData[ playerid ] [ v ] [ E_CREATED ] ) return 0;
|
|
new vehicleid = g_vehicleData[ playerid ] [ v ] [ E_VEHICLE_ID ];
|
|
if ( !IsValidVehicle( vehicleid ) ) return 0;
|
|
|
|
for( new i; i < MAX_CAR_MODS; i++ )
|
|
if ( ( g_vehicleModifications[ playerid ] [ v ] [ i ] = GetVehicleComponentInSlot( vehicleid, i ) ) < 1000 ) g_vehicleModifications[ playerid ] [ v ] [ i ] = 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
stock getVehicleSlotFromID( vID, &playerid=0, &slot=0 )
|
|
{
|
|
foreach(new i : Player)
|
|
{
|
|
for( new x; x < MAX_BUYABLE_VEHICLES; x++ ) if ( g_vehicleData[ i ] [ x ] [ E_CREATED ] )
|
|
{
|
|
if ( g_vehicleData[ i ] [ x ] [ E_VEHICLE_ID ] == vID )
|
|
{
|
|
playerid = i;
|
|
slot = x;
|
|
return x;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
stock SetPlayerVehicleInteriorData( iOwner, iSlot, iInterior, iWorld, Float: fX, Float: fY, Float: fZ, Float: fAngle, iGarage = -1 )
|
|
{
|
|
new
|
|
iVehicle = g_vehicleData[ iOwner ] [ iSlot ] [ E_VEHICLE_ID ];
|
|
|
|
SetVehiclePos( iVehicle, fX, fY, fZ );
|
|
SetVehicleZAngle( iVehicle, fAngle );
|
|
|
|
LinkVehicleToInterior( iVehicle, iInterior );
|
|
SetVehicleVirtualWorld( iVehicle, iWorld );
|
|
|
|
ReplaceVehicleCustomComponents( iOwner, iSlot ); // Change virtual worlds
|
|
|
|
// Update for passengers etc
|
|
foreach ( new i : Player )
|
|
{
|
|
if ( GetPlayerVehicleID( i ) == iVehicle || GetPlayerSurfingVehicleID( i ) == iVehicle )
|
|
{
|
|
p_InGarage[ i ] = iGarage;
|
|
SetPlayerInterior( i, iInterior );
|
|
SetPlayerVirtualWorld( i, iWorld );
|
|
}
|
|
}
|
|
}
|