/* * Irresistible Gaming (c) 2018 * Developed by Lorenc Pekaj * Module: cnr\features\car_jacker.pwn * Purpose: sell vehicles in select containers as a car jacker */ /* ** Includes ** */ #include < YSI\y_hooks > /* ** Definitions ** */ #define CONTAINER_LIMIT ( 6 ) /* ** Variables ** */ enum E_CONTAINER_DATA { E_OBJECT, E_DOOR[ 2 ], E_CHECKPOINT, Text3D: E_LABEL, Float: E_OPEN_ANGLE[ 2 ], Float: E_CLOSE_ANGLE[ 2 ], bool: E_CLOSED, Float: E_DOOR1_CORDS[ 3 ], Float: E_DOOR2_CORDS[ 3 ] } static stock g_containerData [ CONTAINER_LIMIT ] [ E_CONTAINER_DATA ], Iterator: containers < CONTAINER_LIMIT >, g_LastExportModel [ MAX_PLAYERS ] ; /* ** Hooks ** */ hook OnScriptInit( ) { // SF CreateCarjackerContainer( -1580.637817, 125.17828, 4.009482, 45.0, { -1579.241090, 121.606070, 3.939500 }, { -1577.006840, 123.784420, 3.939500 }, { -55.0, 0.0 }, { 45.00, -135.0 } ); CreateCarjackerContainer( -1559.313354, 134.51689, 4.004680, -45.0, { -1562.892940, 133.132600, 3.939500 }, { -1560.726070, 130.873600, 3.939500 }, { -160.0, -90.0 }, { -45.0, -225.0 } ); // LV CreateCarjackerContainer( 1637.343627, 2317.039062, 11.280317, 270.0, { 1633.789916, 2318.572753, 11.210318 }, { 1633.749877, 2315.451904, 11.210318 }, { 163.0, -152.0 }, { 270.0, 90.0 } ); CreateCarjackerContainer( 1637.307006, 2326.375000, 11.280316, 270.0, { 1633.789916, 2327.905517, 11.210318 }, { 1633.749877, 2324.812988, 11.210318 }, { 156.0, -150.0 }, { 270.0, 90.0 } ); // LS CreateCarjackerContainer( 2613.762939, -2213.233398, 14.002803, 0.000, { 2612.225830, -2216.737060, 13.936882 }, { 2615.337646, -2216.776367, 13.936882 }, { -105.0, -31.5 }, { 0.0, 180.0 } ); CreateCarjackerContainer( 2616.617187, -2240.118652, 14.016877, 180.0, { 2618.161132, -2236.586425, 13.956872 }, { 2615.048828, -2236.566406, 13.956872 }, { 50.0, 138.8 }, { 180.0, 360.0 } ); return 1; } hook OnPlayerDisconnect( playerid, reason ) { g_LastExportModel[ playerid ] = 0; return 1; } hook OnPlayerDriveVehicle( playerid, vehicleid ) { new iVehiclePrice = calculateVehicleSellPrice( vehicleid ); if ( IsPlayerJob( playerid, JOB_DIRTY_MECHANIC ) && p_Class[ playerid ] == CLASS_CIVILIAN && iVehiclePrice ) { if ( g_LastExportModel[ playerid ] == GetVehicleModel( vehicleid ) ) { ShowPlayerHelpDialog( playerid, 4000, "You have already exported this vehicle recently and cannot export it again at the docks." ); } else { ShowPlayerHelpDialog( playerid, 6000, "You can export this vehicle at the docks for around ~g~%s~w~~h~.~n~~n~~r~Damaging the vehicle will further decrease the value.", cash_format( iVehiclePrice ) ); } } return 1; } hook OnPlayerEnterDynamicCP( playerid, checkpointid ) { if ( IsPlayerInAnyVehicle( playerid ) ) { new iVehicle = GetPlayerVehicleID( playerid ), vModel = GetVehicleModel( iVehicle ), iCash = calculateVehicleSellPrice( iVehicle ), Float: X, Float: Y, Float: Z, Float: Angle ; if ( GetPlayerClass( playerid ) == CLASS_CIVILIAN && vModel ) { foreach ( new i : containers ) { if ( checkpointid == g_containerData[ i ] [ E_CHECKPOINT ] && ! g_containerData[ i ] [ E_CLOSED ] ) { if ( ! IsPlayerJob( playerid, JOB_DIRTY_MECHANIC ) ) { ShowPlayerHelpDialog( playerid, 4000, "You need to be a ~r~dirty mechanic~w~~h~ to export stolen vehicles!" ); break; } if ( g_LastExportModel[ playerid ] == vModel ) { ShowPlayerHelpDialog( playerid, 4000, "You cannot export the same type of vehicle, ~y~find a different vehicle." ); break; } if ( !iCash ) { ShowPlayerHelpDialog( playerid, 4000, "~r~You cannot export this vehicle." ); break; } if ( p_AntiExportCarSpam[ playerid ] > g_iTime ) { ShowPlayerHelpDialog( playerid, 4000, "You can export your next vehicle in %s.", secondstotime( p_AntiExportCarSpam[ playerid ] - g_iTime ) ); break; } GetDynamicObjectPos( g_containerData[ i ] [ E_OBJECT ], X, Y, Z ); GetDynamicObjectRot( g_containerData[ i ] [ E_OBJECT ], Angle, Angle, Angle ); X += 6 * -floatsin( -Angle, degrees ); Y += 6 * -floatcos( -Angle, degrees ); SetPlayerPos( playerid, X, Y, Z + 0.6 ); g_containerData [ i ] [ E_CLOSED ] = true; g_LastExportModel [ playerid ] = vModel; p_AntiExportCarSpam [ playerid ] = g_iTime + 60; MoveDynamicObject( g_containerData[ i ] [ E_DOOR ] [ 0 ], g_containerData[ i ] [ E_DOOR1_CORDS ] [ 0 ] + 0.05, g_containerData[ i ] [ E_DOOR1_CORDS ] [ 1 ] + 0.05, g_containerData[ i ] [ E_DOOR1_CORDS ] [ 2 ], ( 0.1 ), 0.0, 0.0, g_containerData[ i ] [ E_CLOSE_ANGLE ] [ 0 ] ); MoveDynamicObject( g_containerData[ i ] [ E_DOOR ] [ 1 ], g_containerData[ i ] [ E_DOOR2_CORDS ] [ 0 ] + 0.05, g_containerData[ i ] [ E_DOOR2_CORDS ] [ 1 ] + 0.05, g_containerData[ i ] [ E_DOOR2_CORDS ] [ 2 ], ( 0.1 ), 0.0, 0.0, g_containerData[ i ] [ E_CLOSE_ANGLE ] [ 1 ] ); GivePlayerWantedLevel( playerid, 6 ); GivePlayerCash( playerid, iCash ); GivePlayerScore( playerid, 2 ); //GivePlayerExperience( playerid, E_CAR_JACKER ); ach_HandleCarJacked( playerid ); SetTimerEx( "ExportVehicle", 3000, false, "dd", iVehicle, i ); SendServerMessage( playerid, "You have exported your "COL_GREY"%s"COL_WHITE" for "COL_GOLD"%s"COL_WHITE".", GetVehicleName( GetVehicleModel( iVehicle ) ), cash_format( iCash ) ); break; } } } } return 1; } /* ** Functions ** */ stock CreateCarjackerContainer( Float: X, Float: Y, Float: Z, Float: Angle, {Float,_}: fDoor1Cords[ 3 ], {Float,_}: fDoor2Cords[ 3 ], {Float,_}: fDoorOpenAngle[ 2 ], {Float,_}: fDoorCloseAngle[ 2 ] ) { new id = Iter_Free( containers ); if ( id != ITER_NONE ) { g_containerData[ id ] [ E_OBJECT ] = CreateDynamicObject( 19321, X, Y, Z, 0.000000, 0.000000, Angle ); g_containerData[ id ] [ E_DOOR ] [ 0 ] = CreateDynamicObject( 3062, fDoor1Cords[ 0 ], fDoor1Cords[ 1 ], fDoor1Cords[ 2 ], 0.000000, 0.000000, fDoorOpenAngle[ 0 ] ); g_containerData[ id ] [ E_DOOR ] [ 1 ] = CreateDynamicObject( 3062, fDoor2Cords[ 0 ], fDoor2Cords[ 1 ], fDoor2Cords[ 2 ], 0.000000, 0.000000, fDoorOpenAngle[ 1 ] ); g_containerData[ id ] [ E_OPEN_ANGLE ] [ 0 ] = fDoorOpenAngle[ 0 ]; g_containerData[ id ] [ E_OPEN_ANGLE ] [ 1 ] = fDoorOpenAngle[ 1 ]; g_containerData[ id ] [ E_CLOSE_ANGLE ] [ 0 ] = fDoorCloseAngle[ 0 ]; g_containerData[ id ] [ E_CLOSE_ANGLE ] [ 1 ] = fDoorCloseAngle[ 1 ]; g_containerData[ id ] [ E_DOOR1_CORDS ] = fDoor1Cords; g_containerData[ id ] [ E_DOOR2_CORDS ] = fDoor2Cords; g_containerData[ id ] [ E_CLOSED ] = false; g_containerData[ id ] [ E_CHECKPOINT ] = CreateDynamicCP( X, Y, Z, 2.0, -1, -1 ); g_containerData[ id ] [ E_LABEL ] = CreateDynamic3DTextLabel( "[VEHICLE EXPORT]", COLOR_GOLD, X, Y, Z, 15.0 ); Iter_Add(containers, id); } } stock IsCarjackableVehicleModel(value) { /* Bikes: 462, 581,522,561,521,463,586,468,471 Convertibles: 480,533,439,555 Industrial: 422, 482, 582, 600, 413, 440, 543, 605, 459,531,552,478,554 Lowriders: 536,575,534,567,535,566,576,412 Offroad: 568,424,579,400,500,489,505,495 Saloons: 445, 504, 401, 518, 527, 542, 507, 562, 585, 419, 526, 604, 466, 492, 474, 546, 517, 410, 551, 516, 467, 426, 436, 547, 405, 580, 560, 550, 549, 540, 491, 529, 421 Sport Vehicles: 602, 429, 496, 402, 541, 415, 589, 587, 565, 494, 502, 503, 411, 559, 603, 475, 506, 451, 558, 477 Station Wagons: 418, 404, 479, 458, 561 Generate: http://spelsajten.net/bitarray/ */ static const valid_values[7] = { 627883063, -871882352, -637145956, -965734447, -840109590, 779715047, 15616 }; if (400 <= value <= 605) { value -= 400; return (valid_values[value >>> 5] & (1 << (value & 31))) || false; } return false; } stock calculateVehicleSellPrice( vehicleid ) { static const g_aVehicleSellingPrice[ 212 ] = { 3500, 3000, 7000, 4500, 2700, 3200, 7500, 6000, 3500, 5000, 2500, 12500, 4500, 2300, 2700, 6500, 5500, 10000, 3000, 4700, 3500, 4700, 2900, 3300, 5000, 17000, 3500, 4200, 6000, 6500, 9000, 4900, 8000, 5500, 5400, 3000, 3200, 5000, 3300, 6500, 3900, 3000, 2900, 4650, 8500, 2600, 9800, 14000, 2300, 4000, 3500, 11000, 5600, 2900, 4400, 3300, 3400, 1500, 4700, 3900, 7500, 5100, 2700, 5500, 5000, 5000, 4000, 4500, 5700, 7600, 4500, 4600, 3200, 2900, 4200, 4300, 13500, 5500, 1500, 2400, 6800, 3200, 3600, 3800, 5700, 2000, 4200, 14000, 12500, 3400, 3900, 3500, 3900, 7600, 7400, 8200, 4600, 13500, 2300, 2000, 3900, 5000, 7800, 7600, 5600, 2700, 6000, 3200, 3700, 2300, 4200, 7800, 6900, 9000, 4000, 5700, 4300, 2700, 3000, 14000, 14500, 6500, 8000, 7500, 4200, 4000, 5400, 4700, 6000, 5000, 2200, 1900, 4900, 6400, 3900, 4800, 6900, 7500, 6400, 6500, 5200, 9000, 2000, 1200, 4300, 3200, 4900, 4200, 9000, 2700, 5600, 4200, 2700, 7500, 5500, 5200, 8000, 7000, 6500, 6300, 7500, 3400, 7900, 8000, 5000, 3800, 3000, 5800, 5700, 3200, 3200, 2500, 2500, 4800, 1200, 4800, 2000, 20000, 3200, 6800, 4000, 6100, 3800, 2300, 3000, 3900, 4500, 5100, 3500, 3900, 3000, 3200, 9000, 6000, 5000, 4500, 4700, 4700, 4700, 5000, 2300, 5300, 6400, 4200, 800, 700, 1000, 1200, 600, 2300, 1000, 2300 } ; if ( !IsValidVehicle( vehicleid ) ) return 0; new Float: fHealth, iModel = GetVehicleModel( vehicleid ) ; if ( !GetVehicleHealth( vehicleid, fHealth ) || !IsCarjackableVehicleModel( iModel ) || g_adminSpawnedCar{ vehicleid } || g_buyableVehicle{ vehicleid } || Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ) ) return 0; if ( fHealth > 1000.0 ) fHealth = 1000.0; if ( fHealth < 0.0 ) fHealth = 0.0; return floatround( float( g_aVehicleSellingPrice[ iModel - 400 ] ) * ( fHealth / 1000.0 ) * 0.75 ); } function ExportVehicle( vehicleid, container ) { MoveDynamicObject( g_containerData[ container ] [ E_DOOR ] [ 0 ], g_containerData[ container ] [ E_DOOR1_CORDS ] [ 0 ], g_containerData[ container ] [ E_DOOR1_CORDS ] [ 1 ], g_containerData[ container ] [ E_DOOR1_CORDS ] [ 2 ], ( 0.1 ), 0.0, 0.0, g_containerData[ container ] [ E_OPEN_ANGLE ] [ 0 ] ); MoveDynamicObject( g_containerData[ container ] [ E_DOOR ] [ 1 ], g_containerData[ container ] [ E_DOOR2_CORDS ] [ 0 ], g_containerData[ container ] [ E_DOOR2_CORDS ] [ 1 ], g_containerData[ container ] [ E_DOOR2_CORDS ] [ 2 ], ( 0.1 ), 0.0, 0.0, g_containerData[ container ] [ E_OPEN_ANGLE ] [ 1 ] ); g_containerData[ container ] [ E_CLOSED ] = false; SetVehicleToRespawn( vehicleid ); }