diff --git a/gamemodes/irresistible/cnr/features/gangs/facilities.pwn b/gamemodes/irresistible/cnr/features/gangs/facilities.pwn index 464f2fe..9a08278 100644 --- a/gamemodes/irresistible/cnr/features/gangs/facilities.pwn +++ b/gamemodes/irresistible/cnr/features/gangs/facilities.pwn @@ -34,7 +34,7 @@ enum E_GANG_FACILITIES Float: E_X, Float: E_Y, Float: E_Z, E_AMMU_CP, E_SHOP_CP, E_CANNON_CP, - E_TRAVEL_CP, + E_TRAVEL_CP, E_MECHANIC_CP, bool: E_WAR, E_WAR_TIMER, E_WAR_TICK, @@ -51,8 +51,8 @@ enum E_FACILITY_INTERIOR Float: E_TRAVEL_POS[ 4 ], Float: E_ATM_POS[ 4 ], Float: E_BOMB_POS_1[ 4 ], - Float: E_BOMB_POS_2[ 4 ] - //Float: E_MECHANIC_POS[ 4 ] + Float: E_BOMB_POS_2[ 4 ], + Float: E_MECHANIC_POS[ 4 ] }; new @@ -66,8 +66,9 @@ new { 259.9110, 1850.9300, 1858.7600, 0.000000 }, { 261.0079, 1869.5808, 1858.7600, 90.00000 }, { 262.5575, 1850.0053, 1858.3671, 180.0000 }, - { 246.722503, 1816.183593, 1855.371826, 90.000000 }, - { 246.722503, 1827.754516, 1855.371826, 90.000000 } + { 246.7225, 1816.1835, 1855.3718, 90.00000 }, + { 246.7225, 1827.7545, 1855.3718, 90.00000 }, + { 244.6742, 1843.2554, 1858.7576, 0.000000 } } }, g_gangFacilities [ MAX_FACILITIES ] [ E_GANG_FACILITIES ], @@ -95,12 +96,12 @@ hook OnPlayerEnterDynamicCP( playerid, checkpointid ) foreach ( new facility : gangfacilities ) { + new turfid = g_gangFacilities[ facility ] [ E_TURF_ID ]; + new facility_gangid = Turf_GetFacility( turfid ); + // entrance if ( checkpointid == g_gangFacilities[ facility ] [ E_CHECKPOINT ] [ 0 ] ) { - new turfid = g_gangFacilities[ facility ] [ E_TURF_ID ]; - new facility_gangid = Turf_GetFacility( turfid ); - // not in the gang / not a turf owner if ( ! ( Turf_GetOwner( turfid ) == gangid || facility_gangid == gangid ) ) { @@ -167,6 +168,12 @@ hook OnPlayerEnterDynamicCP( playerid, checkpointid ) return ShowPlayerAirportMenu( playerid ); } + // mechanic + else if ( checkpointid == g_gangFacilities[ facility ] [ E_TRAVEL_CP ] ) + { + return ShowPlayerGangVehicleMenu( playerid, facility_gangid ); + } + // orbital cannon else if ( checkpointid == g_gangFacilities[ facility ] [ E_CANNON_CP ] ) { @@ -443,11 +450,19 @@ thread OnGangFaciltiesLoad( ) g_gangFacilities[ id ] [ E_TRAVEL_CP ] = CreateDynamicCP( infront_x, infront_y, g_gangFacilityInterior[ type ] [ E_TRAVEL_POS ] [ 2 ], 1.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); CreateDynamic3DTextLabel( "[FAST TRAVEL]", COLOR_GOLD, infront_x, infront_y, g_gangFacilityInterior[ type ] [ E_TRAVEL_POS ] [ 2 ], 20.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); + // mechanic actor + CreateDynamicActor( 61, g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 0 ], g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 1 ], g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 2 ], g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 3 ], true, 100.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); + + infront_x = g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 0 ] + 2.0 * floatsin( -g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 3 ], degrees ); + infront_y = g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 1 ] + 2.0 * floatcos( -g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 3 ], degrees ); + + g_gangFacilities[ id ] [ E_MECHANIC_CP ] = CreateDynamicCP( infront_x, infront_y, g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 2 ], 1.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); + CreateDynamic3DTextLabel( "[GANG VEHICLES]", COLOR_GOLD, infront_x, infront_y, g_gangFacilityInterior[ type ] [ E_MECHANIC_POS ] [ 2 ], 20.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); + // create atm CreateATM( g_gangFacilityInterior[ type ] [ E_ATM_POS ] [ 0 ], g_gangFacilityInterior[ type ] [ E_ATM_POS ] [ 1 ], g_gangFacilityInterior[ type ] [ E_ATM_POS ] [ 2 ], g_gangFacilityInterior[ type ] [ E_ATM_POS ] [ 3 ], 0.0, g_gangFacilities[ id ] [ E_WORLD ] ); // more actors - CreateDynamicActor( 268, 244.6742, 1843.2554, 1858.7576, 0.000000, true, 100.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ); ApplyDynamicActorAnimation( CreateDynamicActor( 70, 212.868576, 1819.894531, 1856.413818, 117.200050, true, 100.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ), "COP_AMBIENT", "Coplook_loop", 4.1, 1, 1, 1, 1, 0 ); ApplyDynamicActorAnimation( CreateDynamicActor( 70, 213.705627, 1827.192993, 1856.413818, 60.300289, true, 100.0, .worldid = g_gangFacilities[ id ] [ E_WORLD ] ), "COP_AMBIENT", "Coplook_think", 4.1, 1, 1, 1, 1, 0 ); diff --git a/gamemodes/irresistible/cnr/features/gangs/gangs.pwn b/gamemodes/irresistible/cnr/features/gangs/gangs.pwn index f5f3971..51df0bb 100644 --- a/gamemodes/irresistible/cnr/features/gangs/gangs.pwn +++ b/gamemodes/irresistible/cnr/features/gangs/gangs.pwn @@ -16,8 +16,11 @@ /* ** Macros ** */ #define IsGangPrivate(%0) ( g_gangData[ %0 ] [ E_INVITE_ONLY ] ) +#define GetGangSqlID(%0) ( g_gangData[ %0 ] [ E_SQL_ID ] ) #define GetPlayerGang(%0) ( p_GangID[ %0 ] ) +#define IsValidGangID(%0) (0 <= %0 < MAX_GANGS && Iter_Contains(gangs, %0)) + /* ** Variables ** */ enum e_gang_data { diff --git a/gamemodes/irresistible/cnr/features/gangs/gvehicles.pwn b/gamemodes/irresistible/cnr/features/gangs/gvehicles.pwn index b50573d..c4c0ca3 100644 --- a/gamemodes/irresistible/cnr/features/gangs/gvehicles.pwn +++ b/gamemodes/irresistible/cnr/features/gangs/gvehicles.pwn @@ -9,16 +9,27 @@ #include < YSI\y_hooks > /* ** Definitions ** */ -#define MAX_GANG_VEHICLES ( 30 ) +#define MAX_GANG_VEHICLES ( 3 ) + +#define DIALOG_GANG_VEHICLE_MENU 2399 +#define DIALOG_GANG_VEHICLE_SPAWN 2400 +#define DIALOG_GANG_VD_BUY 2401 +#define DIALOG_GANG_VD_OPTIONS 2402 +#define DIALOG_GANG_VD_CATEGORY 2403 + +#define PREVIEW_MODEL_GVEHICLE ( 6 ) /* ** Macros ** */ #define IsValidGangVehicle(%0,%1) \ ( 0 <= %0 < MAX_GANG_VEHICLES && Iter_Contains( gangvehicles<%0>, %1 ) ) +/* ** Constants ** */ +static const GANG_VEHICLE_PRICE_FACTOR = 4; + /* ** Variables ** */ enum E_GANG_VEHICLE_DATA { - E_SQL_ID, E_VEHICLE_ID, + E_SQL_ID, E_VEHICLE_ID, E_ACTIVATION_TIME, E_COLOR[ 2 ], E_MODEL, E_PAINTJOB }; @@ -27,10 +38,154 @@ new g_gangVehicleData [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ E_GANG_VEHICLE_DA new g_gangVehicleModifications [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ MAX_CAR_MODS ]; new Iterator: gangvehicles < MAX_GANGS, MAX_GANG_VEHICLES >; - /* ** Hooks ** */ +hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] ) +{ + new + current_time = GetServerTime( ); + + if ( dialogid == DIALOG_GANG_VEHICLE_MENU && response ) + { + new gangid = GetPVarInt( playerid, "gang_vehicle_gang" ); + + if ( ! IsValidGangID ( gangid ) ) { + return SendError( playerid, "There was an error processing gang vehicles, please try again." ); + } + + switch ( listitem ) + { + // spawn vehicle + case 0: + { + if ( ! Iter_Count( gangvehicles< gangid > ) ) { + SendError( playerid, "This gang does not have any vehicles purchased." ); + return ShowPlayerGangVehicleMenu( playerid, gangid ); + } + + szBigString = ""COL_WHITE"Vehicle\t"COL_WHITE"Availablity\n"; + + foreach ( new slotid : gangvehicles< gangid > ) + { + format( szBigString, sizeof( szBigString ), "%s%s\t%s\n", szBigString, + GetVehicleName( g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] ), + g_gangVehicleData[ gangid ] [ slotid ] [ E_ACTIVATION_TIME ] > current_time ? ( secondstotime( g_gangVehicleData[ gangid ] [ slotid ] [ E_ACTIVATION_TIME ] - current_time ) ) : ( COL_GREEN # "Available!" ) + ); + } + return ShowPlayerDialog( playerid, DIALOG_GANG_VEHICLE_SPAWN, DIALOG_STYLE_TABLIST_HEADERS, ""COL_WHITE"Gang Vehicles - Spawn", szBigString, "Select", "Close" ); + } + + // buy vehicle + case 1: ShowBuyableVehiclesList( playerid, DIALOG_GANG_VD_CATEGORY, "Back" ); + } + return 1; + } + else if ( dialogid == DIALOG_GANG_VD_BUY ) + { + if ( response ) + { + new + type_id = GetPVarInt( playerid, "vehicle_preview" ); + + for ( new id = 0, x = 0; id < sizeof( g_BuyableVehicleData ); id ++ ) + { + if ( g_BuyableVehicleData[ id ] [ E_TYPE ] == type_id ) + { + if ( x == listitem ) + { + SetPVarInt( playerid, "buying_vehicle", id ); + ShowPlayerDialog( playerid, DIALOG_GANG_VD_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Vehicles - Purchase", "Purchase This Vehicle\nPreview Vehicle", "Select", "Back" ); + return 1; + } + x++; + } + } + } + return ShowBuyableVehiclesList( playerid, DIALOG_GANG_VD_CATEGORY, "Back" ); + } + else if ( dialogid == DIALOG_GANG_VD_OPTIONS ) + { + if ( ! response ) { + return GangVehicles_ShowBuyableList( playerid, GetPVarInt( playerid, "vehicle_preview" ) ); + } + + switch ( listitem ) + { + // bought the vehicle + case 0: + { + // TODO: + } + + // preview + case 1: + { + return ShowPlayerModelPreview( playerid, PREVIEW_MODEL_GVEHICLE, "Gang Vehicle Preview", g_BuyableVehicleData[ GetPVarInt( playerid, "buying_vehicle" ) ] [ E_MODEL ] ); + } + } + return 1; + } + else if ( dialogid == DIALOG_GANG_VD_CATEGORY ) + { + new gangid = GetPVarInt( playerid, "gang_vehicle_gang" ); + + if ( ! IsValidGangID ( gangid ) ) { + return SendError( playerid, "There was an error processing gang vehicles, please try again." ); + } + + if ( ! response ) { + return ShowPlayerGangVehicleMenu( playerid, gangid ); + } + + return GangVehicles_ShowBuyableList( playerid, listitem + 1 ); + } + else if ( dialogid == DIALOG_GANG_VEHICLE_SPAWN ) + { + new gangid = GetPVarInt( playerid, "gang_vehicle_gang" ); + + if ( ! IsValidGangID ( gangid ) ) { + return SendError( playerid, "There was an error processing gang vehicles, please try again." ); + } + + if ( ! response ) { + return ShowPlayerGangVehicleMenu( playerid, gangid ); + } + + new + x = 0; + + foreach ( new slotid : gangvehicles< gangid > ) + { + if ( x == listitem ) + { + if ( g_gangVehicleData[ gangid ] [ slotid ] [ E_ACTIVATION_TIME ] > current_time ) { + return SendError( playerid, "This vehicle cannot be spawned for another %s.", secondstotime( g_gangVehicleData[ gangid ] [ slotid ] [ E_ACTIVATION_TIME ] - current_time ) ); + } + + // TODO: spawn vehicle + SendServerMessage( playerid, "You have spawned slot id %d", slotid ); + break; + } + x ++; + } + return 1; + } + return 1; +} + hook OnGangLoad( gangid ) { + mysql_tquery( dbHandle, sprintf( "SELECT * FROM `GANG_VEHICLES` WHERE `GANG_ID` = %d ", GetGangSqlID( gangid ) ), "GangVehicles_LoadVehicles", "d", gangid ); + return 1; +} + +hook OnPlayerEndModelPreview( playerid, handleid ) +{ + if ( handleid == PREVIEW_MODEL_GVEHICLE ) + { + SendServerMessage( playerid, "You have finished looking at the gang vehicle preview." ); + ShowPlayerDialog( playerid, DIALOG_GANG_VD_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Vehicles - Purchase", "Purchase This Vehicle\nPreview Vehicle", "Select", "Back" ); + return Y_HOOKS_BREAK_RETURN_1; + } return 1; } @@ -38,40 +193,64 @@ CMD:car( playerid ) { new Float: X, Float: Y, Float: Z; GetPlayerPos( playerid, X, Y, Z ); - CreateGangVehicle( GetPlayerGang( playerid ), 560, X, Y, Z ); + CreateGangVehicle( GetPlayerGang( playerid ), 560 ); + return 1; +} + +/* ** SQL Threads ** */ +thread GangVehicles_LoadVehicles( gangid ) +{ + new + rows = cache_get_row_count( ); + + if ( rows ) + { + static + paintjob[ 90 ]; + + for ( new row = 0; row < rows; row ++ ) + { + new slotid = CreateGangVehicle( + gangid, + cache_get_field_content_int( row, "MODEL_ID" ), + cache_get_field_content_int( row, "COLOR1" ), + cache_get_field_content_int( row, "COLOR2" ), + cache_get_field_content_int( row, "PAINTJOB" ) + ); + + // load the paintjobs in + if ( slotid != ITER_NONE ) { + cache_get_field_content( row, "MODS", paintjob ); + sscanf( paintjob, "p<.>e", g_gangVehicleModifications[ gangid ] [ slotid ] ); + } + } + } return 1; } /* ** Functions ** */ -stock CreateGangVehicle( gangid, modelid, Float: X, Float: Y, Float: Z, color1 = -1, color2 = -1, paintjob = 3 ) +stock CreateGangVehicle( gangid, modelid, color1 = -1, color2 = -1, paintjob = 3 ) { new slotid = Iter_Free( gangvehicles< gangid > ); if ( slotid != ITER_NONE ) { + g_gangVehicleData[ gangid ] [ slotid ] [ E_ACTIVATION_TIME ] = 0; g_gangVehicleData[ gangid ] [ slotid ] [ E_COLOR ] [ 0 ] = color1; g_gangVehicleData[ gangid ] [ slotid ] [ E_COLOR ] [ 1 ] = color2; g_gangVehicleData[ gangid ] [ slotid ] [ E_PAINTJOB ] = paintjob; g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] = modelid; - ResetGangVehicleMods( gangid, slotid ); - new vehicleid = CreateVehicle( modelid, X, Y, Z, 0.0, Color1, Color2, 999999999 ); - - g_adminSpawnedCar{ vehicleid } = false; - SetVehicleNumberPlate( vehicleid, g_gangData[ gangid ] [ E_NAME ] ); - g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ] = vehicleid; - - //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 ); + Iter_Add( gangvehicles< gangid >, slotid ); } return slotid; } stock ResetGangVehicleMods( gangid, slotid, fordestroy=1 ) { - if ( IsValidGangVehicle( gangid, slotid ) ) + if ( ! IsValidGangVehicle( gangid, slotid ) ) return; for ( new i = 0; i < MAX_CAR_MODS; i++ ) @@ -87,3 +266,37 @@ stock ResetGangVehicleMods( gangid, slotid, fordestroy=1 ) format( szNormalString, sizeof( szNormalString ), "UPDATE `GANG_VEHICLES` SET `MODS`='0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.' WHERE `ID`=%d", g_gangVehicleData[ gangid ] [ slotid ] [ E_SQL_ID ] ); mysql_single_query( szNormalString ); } + +stock ShowPlayerGangVehicleMenu( playerid, gangid ) +{ + SetPVarInt( playerid, "gang_vehicle_gang", gangid ); + ShowPlayerDialog( playerid, DIALOG_GANG_VEHICLE_MENU, DIALOG_STYLE_LIST, ""COL_WHITE"Gang Vehicles", "Spawn Gang Vehicle\nBuy Gang Vehicle", "Select", "Close" ); + return 1; +} + +static stock GangVehicles_ShowBuyableList( playerid, type_id ) +{ + static + szBuyableVehicles[ 1400 ]; + + if ( szBuyableVehicles[ 0 ] != '\0' ) { + for ( new i = 0; i < sizeof( g_BuyableVehicleData ); i ++ ) if ( g_BuyableVehicleData[ i ] [ E_TYPE ] == type_id ) { + format( szBuyableVehicles, sizeof( szBuyableVehicles ), "%s"COL_GOLD"%s%s%s\t%s\n", szBuyableVehicles, cash_format( g_BuyableVehicleData[ i ] [ E_PRICE ] * GANG_VEHICLE_PRICE_FACTOR ), g_BuyableVehicleData[ i ] [ E_VIP ] ? ( "" ) : ( #COL_WHITE ), g_BuyableVehicleData[ i ] [ E_PRICE ] < 100000 ? ( "\t" ) : ( "" ), g_BuyableVehicleData[ i ] [ E_NAME ] ); + } + } + SetPVarInt( playerid, "vehicle_preview", type_id ); + return ShowPlayerDialog( playerid, DIALOG_GANG_VD_BUY, DIALOG_STYLE_LIST, "{FFFFFF}Vehicle Dealership", szBuyableVehicles, "Options", "Cancel" ); +} + +/* ** Migrations ** */ +/* + CREATE TABLE IF NOT EXISTS `GANG_VEHICLES` ( + `ID` int(11) auto_increment primary key, + `GANG_ID` int(11), + `MODEL_ID` int(11), + `COLOR1` int(4), + `COLOR2` int(4), + `PAINTJOB` tinyint(2), + `MODS` varchar(90) + ); + */ diff --git a/gamemodes/irresistible/cnr/features/vehicles/vdealership.pwn b/gamemodes/irresistible/cnr/features/vehicles/vdealership.pwn index c889355..0279af4 100644 --- a/gamemodes/irresistible/cnr/features/vehicles/vdealership.pwn +++ b/gamemodes/irresistible/cnr/features/vehicles/vdealership.pwn @@ -397,7 +397,7 @@ hook OnPlayerEndModelPreview( playerid, handleid ) } /* ** Functions ** */ -stock ShowBuyableVehiclesList( playerid ) +stock ShowBuyableVehiclesList( playerid, dialogid = DIALOG_VEHDEALER, secondary_button[ ] = "Cancel" ) { static szCategory[ 16 * sizeof( g_BVCategories ) ]; @@ -407,7 +407,7 @@ stock ShowBuyableVehiclesList( playerid ) format( szCategory, sizeof( szCategory ), "%s%s\n", szCategory, g_BVCategories[ i ] ); } } - return ShowPlayerDialog( playerid, DIALOG_VEHDEALER, DIALOG_STYLE_LIST, "{FFFFFF}Vehicle Dealership", szCategory, "Select", "Cancel" ); + return ShowPlayerDialog( playerid, dialogid, DIALOG_STYLE_LIST, "{FFFFFF}Vehicle Dealership", szCategory, "Select", secondary_button ); } stock ShowBuyableVehiclesTypeDialog( playerid, type_id )