2018-10-01 03:30:25 +00:00
/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc Pekaj
* Module: cnr\features\business\business.pwn
* Purpose: business system for sa-mp
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#define MAX_BUSINESSES ( 250 )
#define MAX_DROPS ( 5 )
#define MAX_BUSINESS_MEMBERS ( 8 )
#define MAX_BIZ_VEH_MODELS ( 18 )
#define MAX_BIZ_ACTORS ( 9 )
#define BUSINESS_WEED ( 0 )
#define BUSINESS_METH ( 1 )
#define BUSINESS_COKE ( 2 )
#define BUSINESS_WEAPON ( 3 )
#define MAX_WEED_AMOUNT ( 30 )
#define MAX_METH_AMOUNT ( 20 )
#define MAX_COKE_AMOUNT ( 10 )
#define MAX_WEAPON_AMOUNT ( 10 )
/* ** Variables ** */
enum E_BUSINESS_DATA
{
E_NAME[ 32 ], E_COST, E_WORLD,
E_OWNER_ID, E_INTERIOR_TYPE, E_MEMBERS[ MAX_BUSINESS_MEMBERS ],
E_SUPPLIES, E_PRODUCT, Text3D: E_PROD_LABEL,
E_PROD_TIMESTAMP, E_BANK, E_SECURITY_LEVEL,
E_CAR_MODEL_ID, E_HELI_MODEL_ID, E_EXTRA_MEMBERS,
bool: E_CAR_NOS, bool: E_CAR_RIMS, E_UPGRADES,
bool: E_CRACKED, bool: E_BEING_CRACKED, E_CRACKED_TS,
E_CRACKED_WAIT, E_ROBBERY_ID,
E_EXPORT_CP[ MAX_DROPS ], E_EXPORT_ICON[ MAX_DROPS ], E_EXPORT_INDEX[ MAX_DROPS ],
E_EXPORT_VALUE, E_EXPORT_CIRCLE[ MAX_DROPS ], E_EXPORT_STARTED,
E_EXPORT_CITY, bool: E_EXPORTED[ MAX_DROPS ], E_EXPORTED_AMOUNT,
Float: E_X, Float: E_Y, Float: E_Z,
E_ENTER_CP, E_EXIT_CP, E_VEHICLE_DECOR,
Text3D: E_ENTER_LABEL, Text3D: E_EXIT_LABEL,
};
enum E_BUSINESS_INT_DATA
{
E_NAME[ 8 ],
Float: E_X, Float: E_Y, Float: E_Z,
Float: E_PROD_X, Float: E_PROD_Y, Float: E_PROD_Z,
E_COST_PRICE, E_PRODUCTION_TIME, E_MAX_SUPPLIES,
E_UPGRADE_COST,
Float: E_SAFE_X, Float: E_SAFE_Y, Float: E_SAFE_Z,
Float: E_SAFE_ROTATION
};
enum E_BUSINESS_VEHICLE_DATA
{
E_ID, // used only for saving it in the database (change MAX_BIZ_VEH_MODEL on new entry)
E_NAME[ 12 ], E_MODEL, E_BOOT_OPEN,
E_OBJECT_MODEL,
Float: E_O_X, Float: E_O_Y, Float: E_O_Z,
Float: E_O_RX, Float: E_O_RY, Float: E_O_RZ,
E_COST
};
/*enum E_SECURITY_LEVEL_DATA
{
E_LEVEL[ 17 ], Float: E_COST_MULTIPLIER, E_BREAKIN_COOLDOWN
};*/
new
g_businessInteriorData [ 4 ] [ E_BUSINESS_INT_DATA ] =
{
2018-10-01 04:18:16 +00:00
{ "Weed", -1719.1877, -1377.3049, 5874.8721, -1734.094, -1374.4567, 5874.1475, 10000, 6, MAX_WEED_AMOUNT, 2500000, -1741.97705, -1380.14294, 5873.60009, -90.00000 }, // 12
{ "Meth", 2040.54810, 1011.41470, 1513.2777, 2029.2456, 1003.55200, 1510.2416, 18000, 8, MAX_METH_AMOUNT, 4000000, 2031.918945, 1000.044006, 1509.69104, 180.00000 }, // 16
{ "Coke", 2566.50070, -1273.2887, 1143.7203, 2558.5261, -1290.6298, 1143.7242, 50000, 10, MAX_COKE_AMOUNT, 7500000, 2555.145019, -1314.12695, 1143.17395, 180.00000 }, // 20
{ "Weapons", -6962.5542, -269.4713, 836.5154, -6969.2417, -248.1167, 836.5154, 125000, 24, MAX_WEAPON_AMOUNT, 16000000, -6942.84814, -246.391998, 836.989990, 90.000000 } // 48
2018-10-01 03:30:25 +00:00
},
g_businessCarModelData[ ] [ E_BUSINESS_VEHICLE_DATA ] =
{
{ -1, "Yosemite", 554, 0, 3800, 0.000000, -1.200000, 0.000000, 0.000000, 0.000000, 0.000000, 0 },
{ 0, "Buccaneer", 518, 0, 1279, 0.000000, -2.250000, -0.07500, 21.60000, 0.000000, 0.000000, 500000 },
{ 1, "Dune", 573, 0, 0, 0.000000, 0.0000000, 0.000000, 0.000000, 0.000000, 0.000000, 1000000 },
{ 2, "Sabre", 475, 1, 1279, 0.000000, -2.175000, -0.07500, 24.30000, 0.000000, 0.000000, 2500000 },
{ 3, "Patriot", 470, 1, 1279, 0.000000, -1.800000, 0.150000, 29.70000, 0.000000, 0.000000, 10000000 },
{ 4, "Buffalo", 402, 1, 1279, 0.000000, -2.250000, 0.225000, 140.3999, 0.000000, 0.000000, 15000000 },
{ 5, "Elegy", 562, 1, 1279, 0.000000, -1.875000, 0.075000, 21.60000, 0.000000, 0.000000, 18000000 },
{ 6, "Savanna", 567, 1, 1279, 0.000000, -1.875000, 0.075000, 21.60000, 0.000000, 0.000000, 20000000 },
{ 7, "Sultan", 560, 1, 1279, 0.000000, -1.875000, 0.150000, 29.70000, 0.000000, 0.000000, 25000000 },
{ 8, "Infernus", 411, 0, 0, 0.000000, 0.0000000, 0.000000, 0.000000, 0.000000, 0.000000, 27500000 },
{ 9, "Turismo", 451, 0, 18694, 0.000000, -2.475000, -1.95000, 0.000000, 0.000000, 180.0000, 30000000 },
{ 10, "ChuffSec", 428, 0, 19601, -0.075000, 3.000001, -0.52499, -10.800000, 0.0000, 180.8998, 1337 }
},
g_businessAirModelData[ ] [ E_BUSINESS_VEHICLE_DATA ] =
{
{ -1, "Levetian", 417, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0 },
{ 11, "Raindance", 563, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5000000 },
{ 12, "Sparrow", 469, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12500000 },
{ 13, "Shamal", 519, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17500000 },
{ 14, "Dodo", 593, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20000000 },
{ 15, "Maverick", 487, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25000000 },
{ 16, "Rustler", 476, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30000000 },
{ 17, "Seasparrow", 447, 0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1337 }
},
/*g_businessSecurityData[ 4 ] [ E_SECURITY_LEVEL_DATA ] =
{
{ ""COL_RED"NONE", 0.0, 300 },
{ ""COL_ORANGE"LOW", 0.25, 14400 },
{ ""COL_YELLOW"Medium", 0.75, 28800 },
{ ""COL_GREEN"High", 1.65, 43200 }
},*/
Float: g_roadBusinessExportData[ 3 ] [ 20 ] [ 3 ] =
{
// sf
{
{ -1955.7727, -859.1984, 31.6437 }, { -1821.7363, -175.0119, 8.97350 }, { -2052.4871, -42.96680, 34.9414 }, { -2474.6616, -128.5411, 25.2988 },
{ -2755.9614, -130.8518, 6.41240 }, { -2796.0234, 772.94480, 50.2686 }, { -2471.4382, 786.22140, 35.1719 }, { -2438.4072, 1038.4346, 50.1885 },
{ -2513.1267, 1217.6478, 36.9885 }, { -2141.8496, 1217.6788, 47.1079 }, { -2049.0244, 1108.5524, 53.1531 }, { -1822.6821, 1302.3539, 59.2771 },
{ -1629.2491, 886.42290, 8.97560 }, { -1808.1614, 781.52560, 30.2879 }, { -1758.9180, 515.09530, 28.1970 }, { -2191.0745, 1031.4736, 79.8809 },
{ -2495.9778, 322.49280, 30.3050 }, { -2496.6187, 153.75120, 7.07910 }, { -2278.0718, 0.8677000, 34.9636 }, { -1931.6978, 268.7024, 40.6186 }
},
// lv
{
{ 2213.5220, 1968.3105, 10.4767 }, { 2636.1663, 1070.0991, 10.5039 }, { 2524.9036, 918.76700, 10.5057 }, { 2452.5000, 697.58150, 11.1406 },
{ 2493.1589, 1211.8390, 10.5000 }, { 2810.7197, 2021.3927, 10.5000 }, { 2825.9368, 2602.4082, 10.5000 }, { 2113.6406, 2416.5217, 49.2031 },
{ 1747.8733, 2240.5823, 10.5000 }, { 1062.3818, 2071.9485, 10.5000 }, { 1165.3585, 1998.6810, 10.5000 }, { 1091.2410, 1890.5908, 10.5000 },
{ 1461.9596, 972.89570, 9.81850 }, { 1696.4849, 918.22110, 10.4934 }, { 1920.3811, 959.92890, 10.4965 }, { 2490.7720, 2397.3308, 3.89006 },
{ 423.12482, 2547.1460, 16.2824 }, { -141.1849, 1239.3811, 19.4340 }, { -106.3463, 1373.7528, 10.2663 }, { -830.0345, 1461.5646, 14.3749 }
},
// ls
{
{ 2473.6917, -1692.1799, 13.0918 }, { 2299.9851, -1796.2080, 13.1327 }, { 2185.0979, -1669.2697, 14.1983 }, { 2087.7139, -1569.9736, 12.7890 },
{ 2352.3740, -1159.1722, 27.2014 }, { 1027.1260, -1364.0104, 13.4350 }, { 369.96310, -2043.9053, 7.54070 }, { 1449.2119, -1842.7052, 13.4189 },
{ 1859.6608, -1855.0867, 13.4456 }, { 1924.1621, -2124.3977, 13.4511 }, { 2107.5293, -2416.4065, 13.4130 }, { 2174.3906, -2265.9956, 13.2424 },
{ 2780.3481, -2494.4780, 13.5250 }, { 2457.3801, -1969.2207, 13.3801 }, { 1826.3085, -1125.9072, 23.8518 }, { 973.43920, -1257.8624, 16.6373 },
{ 1344.5089, -1752.9572, 13.0808 }, { 1315.9122, -918.28160, 37.7431 }, { 995.74950, -921.07030, 41.8990 }, { 659.64170, -1417.0704, 13.5658 }
}
},
Float: g_airBusinessExportData[ 3 ] [ 20 ] [ 3 ] =
{
// SF
{
//-1860.0874,801.0096,117.2762
{ -2031.557617, -32.978599, 56.509998 }, { -2150.111572, -251.47599, 47.49000 }, { -2550.367431, 64.2822030, 25.639999 }, { -2786.211425, 784.576416, 59.41999 },
{ -2632.868896, 1417.777709, 24.76000 }, { -1542.633800, 924.657800, 6.611400 }, { -1466.235473, 920.849975, 29.129999 }, { -1538.288696, 86.039398, 17.319999 },
{ -1854.864379, -153.065704, 21.64999 }, { -2522.358642, -654.40240, 147.8999 }, { -2676.479248, 250.410903, 14.350000 }, { -2476.141357, 785.419372, 35.16999 },
{ -1421.171142, -559.867370, 14.14000 }, { -1944.489624, -1035.7249, 53.34000 }, { -1983.709960, 751.809082, 85.919998 }, { -1870.065917, 970.645812, 49.79999 },
{ -1864.599975, 807.597290, 112.54000 }, { -1778.899047, 574.798583, 234.8899 }, { -2232.311035, 133.423599, 57.900001 }, { -1766.309082, 1018.421386, 97.7099 }
},
// LV
{
{ 1529.842651, 1028.566040, 10.819999 }, { 2586.644042, 1120.391113, 16.729999 }, { 2644.996826, 1771.328125, 18.799999 }, { 2778.071289, 2595.210449, 10.81999 },
{ 2555.316650, 2312.920410, 10.819999 }, { 2484.965087, 2342.515625, 10.819999 }, { 2388.430664, 2813.810058, 10.819999 }, { 923.603027, 2164.776367, 10.819999 },
{ 1742.377441, 2216.271240, 10.819999 }, { 1141.489501, 1961.233642, 10.819999 }, { 697.5897820, 1983.606567, 8.6300000 }, { 431.901306, 2544.465820, 21.600000 },
{ 1449.718750, 2370.324462, 10.819999 }, { 2046.728759, 2233.209716, 10.819999 }, { 1714.863769, 1795.094116, 10.819999 }, { 2301.520751, 1734.541748, 10.81999 },
{ 2436.147949, 716.4329830, 10.819999 }, { 1902.672119, 950.4011230, 10.819999 }, { -164.004104, 1227.733764, 19.739999 }, { -823.314025, 1454.987060, 13.93999 }
},
// LS
{
{ 2491.046875, -1669.197143, 13.329999 }, { 2418.060302, -1232.265502, 24.43000 }, { 1211.151855, -1097.152343, 25.459999 }, { 666.427124, -1289.167236, 13.460000 },
{ 1289.633911, -787.4636230, 96.449996 }, { 656.0767820, -1865.779418, 5.460000 }, { 369.996093, -2029.1451410, 7.6700000 }, { 708.949829, -1430.432617, 13.529999 },
{ 1005.249572, -1349.099853, 13.340000 }, { 1480.326782, -1895.195922, 22.27000 }, { 1119.803833, -2037.035400, 78.209999 }, { 1657.912231, -1705.729614, 20.47999 },
{ 1923.681030, -1679.990112, 13.539999 }, { 1700.012207, -2146.625732, 13.53999 }, { 1700.012207, -2146.625732, 13.539999 }, { 2746.048583, -2445.280273, 13.64000 },
{ 1908.276855, -1319.675048, 14.189999 }, { 1286.067504, 181.42990100, 20.27000 }, { 2314.976318, -4.973299000, 32.529998 }, { 665.014404, -614.880187, 16.3299999 }
}
},
g_businessData [ MAX_BUSINESSES ] [ E_BUSINESS_DATA ],
g_businessActors [ MAX_BUSINESSES ] [ MAX_BIZ_ACTORS ],
g_isBusinessVehicle [ MAX_VEHICLES ] = { -1, ... },
g_businessVehicle [ MAX_BUSINESSES ] = { INVALID_VEHICLE_ID, ... },
bool: g_businessVehicleUnlocked [ MAX_BUSINESSES ] [ MAX_BIZ_VEH_MODELS char ],
2018-10-01 04:25:54 +00:00
Iterator: business < MAX_BUSINESSES >
2018-10-01 04:18:16 +00:00
//g_BusinessUpdateTickCount = 0
2018-10-01 03:30:25 +00:00
;
/* ** Hooks ** */
hook OnScriptInit( )
{
mysql_function_query( dbHandle, "SELECT * FROM `BUSINESSES`", true, "OnBusinessLoad", "" );
return 1;
}
hook OnServerUpdate( )
{
2018-10-01 04:18:16 +00:00
/*new
current_tickcount = GetTickCount( );
if ( current_tickcount < g_BusinessUpdateTickCount ) {
// incase the server update timer is faster than 960ms
g_BusinessUpdateTickCount = current_tickcount + 950;
return 1;
}*/
2018-10-01 03:30:25 +00:00
// Replenish product
2018-10-01 04:18:16 +00:00
foreach ( new businessid : business ) if ( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] )
2018-10-01 03:30:25 +00:00
{
2018-10-01 04:18:16 +00:00
new
members = 0;
2018-10-01 03:30:25 +00:00
2018-10-01 04:18:16 +00:00
GetOnlineBusinessAssociates( businessid, members );
2018-10-01 03:30:25 +00:00
2018-10-01 04:18:16 +00:00
if ( members )
{
// reduce business production time by a second
g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] --;
// if the production timestamp is less than 0 ... refuel
if ( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] <= 0 )
{
// update the timestamps and switch stock for product
g_businessData[ businessid ] [ E_PRODUCT ] += g_businessData[ businessid ] [ E_SUPPLIES ];
g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] = 0;
g_businessData[ businessid ] [ E_SUPPLIES ] = 0;
// alert any associates
foreach ( new p : Player ) if ( IsBusinessAssociate( p, businessid ) ) {
SendClientMessageFormatted( p, -1, ""COL_GREY"[BUSINESS]"COL_WHITE" Production has completed for "COL_GREY"%s"COL_WHITE".", g_businessData[ businessid ] [ E_NAME ] );
}
// update db
UpdateBusinessData( businessid );
}
else if ( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] % 60 == 0 ) // every minute that passes, update in the sql
{
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `PROD_TIMESTAMP` = %d WHERE `ID` = %d", g_businessData[ businessid ] [ E_PROD_TIMESTAMP ], businessid ) );
2018-10-01 03:30:25 +00:00
}
2018-10-01 04:18:16 +00:00
// update label anyway
UpdateBusinessProductionLabel( businessid );
2018-10-01 03:30:25 +00:00
}
}
return 1;
}
hook OnVehicleDeath( vehicleid, killerid )
{
if ( g_isBusinessVehicle[ vehicleid ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ) )
{
new
businessid = g_isBusinessVehicle[ vehicleid ], attackerid = g_VehicleLastAttacker[ vehicleid ],
payout = floatround( float( g_businessData[ businessid ] [ E_EXPORT_VALUE ] * ( MAX_DROPS - g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] ) ) * ( p_Class[ killerid ] == CLASS_POLICE ? 0.3 : 0.25 ) )
;
if ( g_businessData[ businessid ] [ E_EXPORT_STARTED ] == 1 )
{
// printf("2.is associate %d, ticks %d", IsBusinessAssociate( attackerid, businessid ), g_iTime - g_VehicleLastAttacked[ vehicleid ] );
if ( IsPlayerConnected( attackerid ) && ! IsBusinessAssociate( attackerid, businessid ) && ( g_iTime - g_VehicleLastAttacked[ vehicleid ] ) < 8 )
{
GivePlayerScore( attackerid, 2 );
GivePlayerCash( attackerid, payout );
if ( p_Class[ attackerid ] != CLASS_POLICE ) GivePlayerWantedLevel( attackerid, 6 ), GivePlayerExperience( attackerid, E_ROBBERY );
else GivePlayerExperience( attackerid, E_POLICE );
SendGlobalMessage( -1, ""COL_GREY"[BUSINESS]"COL_WHITE" %s(%d) has destroyed a business vehicle and earned "COL_GOLD"%s"COL_WHITE"!", ReturnPlayerName( attackerid ), attackerid, cash_format( payout ) );
}
else
{
if ( IsPlayerConnected( killerid ) ) {
if ( IsBusinessAssociate( killerid, businessid ) ) SendGlobalMessage( -1, ""COL_GREY"[BUSINESS]"COL_WHITE" %s(%d)'s business vehicle with "COL_GOLD"%s"COL_WHITE" in inventory got destroyed!", ReturnPlayerName( killerid ), killerid, cash_format( g_businessData[ businessid ] [ E_EXPORT_VALUE ] * ( MAX_DROPS - g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] ) ) );
else
{
GivePlayerScore( killerid, 2 );
GivePlayerCash( killerid, payout );
if ( p_Class[ killerid ] != CLASS_POLICE ) GivePlayerWantedLevel( killerid, 6 ), GivePlayerExperience( killerid, E_ROBBERY );
else GivePlayerExperience( killerid, E_POLICE );
SendGlobalMessage( -1, ""COL_GREY"[BUSINESS]"COL_WHITE" %s(%d) has destroyed a business vehicle and earned "COL_GOLD"%s"COL_WHITE"!", ReturnPlayerName( killerid ), killerid, cash_format( payout ) );
}
}
}
// stop the mission
StopBusinessExportMission( businessid );
}
}
return 1;
}
/* ** Command ** */
CMD:b( playerid, params[ ] ) return cmd_business( playerid, params );
CMD:business( playerid, params[ ] )
{
if ( ! IsPlayerSecurityVerified( playerid ) )
return SendError( playerid, "You must be verified in order to use this feature. "COL_YELLOW"(use /verify)" );
new
iBusiness = p_InBusiness[ playerid ];
if ( strmatch( params, "production" ) )
{
new
bool: has = false;
szBigString = ""COL_WHITE"Name\t"COL_WHITE"Production Time\t"COL_WHITE"Product\n";
foreach ( new businessid : business ) if ( g_businessData[ businessid ] [ E_OWNER_ID ] == p_AccountID[ playerid ] )
{
format( szBigString, sizeof( szBigString ), "%s%s\t%s\t"COL_GOLD"%s\n",
szBigString, g_businessData[ businessid ] [ E_NAME ],
2018-10-01 04:18:16 +00:00
g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] ? ( secondstotime( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ], ", ", 5 ) ) : ( ""COL_GREEN"Production Finished" ),
g_businessData[ businessid ] [ E_PRODUCT ] == 0 ? ( ""COL_RED"No Product" ) : ( cash_format( g_businessData[ businessid ] [ E_PRODUCT ] * GetProductPrice( businessid ) ) )
2018-10-01 03:30:25 +00:00
), has = true;
}
if ( ! has ) {
return SendError( playerid, "You cannot use this command since you don't own any businesses." );
} else {
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST_HEADERS, ""COL_WHITE"Business Production", szBigString, "Close", "" );
}
}
else if ( strmatch( params, "spawn" ))
{
SendServerMessage( playerid, "We have changed the command to simply "COL_GREY"/spawn"COL_WHITE"." );
return ShowPlayerSpawnMenu( playerid );
}
if ( strmatch( params, "buy" ) )
{
if ( p_OwnedBusinesses[ playerid ] >= GetPlayerBusinessSlots( playerid ) ) return SendError( playerid, "You cannot purchase any more businesses, you've reached the limit." );
if ( GetPlayerScore( playerid ) < 1000 ) return SendError( playerid, "You need at least 1,000 score to buy a business." );
foreach ( new b : business )
{
if ( IsPlayerInDynamicCP( playerid, g_businessData[ b ] [ E_ENTER_CP ] ) || ( iBusiness != -1 && iBusiness == b ) )
{
if ( ! g_businessData[ b ] [ E_OWNER_ID ] )
{
if ( GetPlayerCash( playerid ) < g_businessData[ b ] [ E_COST ] )
return SendError( playerid, "You don't have enough money to purchase this business." );
p_OwnedBusinesses[ playerid ] ++;
g_businessData[ b ] [ E_OWNER_ID ] = p_AccountID[ playerid ];
UpdateBusinessData( b );
UpdateBusinessTitle( b );
GivePlayerCash( playerid, -( g_businessData[ b ] [ E_COST ] ) );
autosaveStart( playerid, true );
SendClientMessageFormatted( playerid, -1, ""COL_GREY"[BUSINESS]"COL_WHITE" You have bought this business for "COL_GOLD"%s"COL_WHITE".", cash_format( g_businessData[ b ] [ E_COST ] ) );
return 1;
}
else return SendError( playerid, "This business isn't for sale." );
}
}
SendError( playerid, "You are not near any business entrances." );
return 1;
}
else if ( strmatch( params, "sell" ) )
{
if ( iBusiness == -1 ) return SendError( playerid, "You are not in any business." );
else if ( g_businessData[ iBusiness ] [ E_OWNER_ID ] != p_AccountID[ playerid ] ) return SendError( playerid, "You are not the owner of this business." );
else
{
new
iCashMoney = floatround( g_businessData[ iBusiness ] [ E_COST ] / 2 );
p_OwnedBusinesses[ playerid ] --;
g_businessData[ iBusiness ] [ E_OWNER_ID ] = 0;
2018-10-01 04:39:08 +00:00
ResetBusiness( iBusiness, .hard_reset = true );
2018-10-01 03:30:25 +00:00
StopBusinessExportMission( iBusiness );
UpdateBusinessData( iBusiness );
UpdateBusinessTitle( iBusiness ); // No point querying (add on resale)
GivePlayerCash( playerid, iCashMoney );
SetPlayerPosEx( playerid, g_businessData[ iBusiness ] [ E_X ], g_businessData[ iBusiness ] [ E_Y ], g_businessData[ iBusiness ] [ E_Z ], 0 ), SetPlayerVirtualWorld( playerid, 0 );
SendServerMessage( playerid, "You have successfully sold your business for "COL_GOLD"%s"COL_WHITE".", cash_format( iCashMoney ) );
}
return 1;
}
else if ( strmatch( params, "leave" ) )
{
if ( iBusiness == -1 ) return SendError( playerid, "You are not in any business." );
else if ( g_businessData[ iBusiness ] [ E_OWNER_ID ] == p_AccountID[ playerid ] ) return SendError( playerid, "This command is only for your business members." );
else if ( ! IsBusinessAssociate( playerid, iBusiness ) ) return SendError( playerid, "You're not an associate of this business" );
else
{
// alert business members
foreach (new i : Player) if ( IsBusinessAssociate( i, iBusiness ) ) {
SendClientMessageFormatted( i, -1, ""COL_GREY"[BUSINESS]"COL_WHITE" %s(%d) has left "COL_GREY"%s"COL_WHITE".", ReturnPlayerName( playerid ), playerid, g_businessData[ iBusiness ] [ E_NAME ] );
}
// nullify user
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ ) if ( g_businessData[ iBusiness ] [ E_MEMBERS ] [ i ] == p_AccountID[ playerid ] ) {
g_businessData[ iBusiness ] [ E_MEMBERS ] [ i ] = 0;
}
// save and update title
UpdateBusinessData( iBusiness ), UpdateBusinessTitle( iBusiness );
}
return 1;
}
return SendUsage( playerid, "/(b)usiness [BUY/PRODUCTION/SELL/LEAVE]" );
}
hook OnPlayerDriveVehicle( playerid, vehicleid )
{
if ( g_isBusinessVehicle[ vehicleid ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ) )
{
new
businessid = g_isBusinessVehicle[ vehicleid ];
if ( IsBusinessAssociate( playerid, businessid ) )
{
new
model = GetVehicleModel( vehicleid );
if ( p_WantedLevel[ playerid ] < 12 )
GivePlayerWantedLevel( playerid, 12 - p_WantedLevel[ playerid ] );
if ( IsBusinessAerialVehicle( businessid, model ) && g_businessData[ businessid ] [ E_EXPORT_STARTED ] == 2 )
{
new
ignore_drop_ids[ sizeof( g_airBusinessExportData[ ] ) ] = { -1, ... };
for ( new x = 0; x < MAX_DROPS; x ++ )
{
new
drop_off_index = randomExcept( ignore_drop_ids, sizeof( ignore_drop_ids ) ),
city = random( sizeof( g_airBusinessExportData ) )
;
// so we get random drops always
ignore_drop_ids[ drop_off_index ] = drop_off_index;
// clear them incase
g_businessData[ businessid ] [ E_EXPORTED ] [ x ] = false;
DestroyDynamicMapIcon( g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ] );
DestroyDynamicRaceCP( g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ] );
DestroyDynamicArea( g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ x ] );
// assign indexes (used for dropping the shit off)
g_businessData[ businessid ] [ E_EXPORT_CITY ] = city;
g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index;
// map icons, cp, areas
g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ] = CreateDynamicMapIcon( g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ], 19, -1, -1, -1, 0, 6000.0, MAPICON_GLOBAL );
g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ] = CreateDynamicRaceCP( 1, g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ], 0, 0, 0, 5.0, -1, -1, 0 );
g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ x ] = CreateDynamicCircle( g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], 15.0 );
// reset players in map icon/cp
Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ], E_STREAMER_PLAYER_ID, 0 );
Streamer_RemoveArrayData( STREAMER_TYPE_RACE_CP, g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ], E_STREAMER_PLAYER_ID, 0 );
// stream to players
foreach (new i : Player) if ( IsBusinessAssociate( i, businessid ) ) {
Streamer_AppendArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ], E_STREAMER_PLAYER_ID, i );
Streamer_AppendArrayData( STREAMER_TYPE_RACE_CP, g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ], E_STREAMER_PLAYER_ID, i );
}
}
// message people
g_businessData[ businessid ] [ E_EXPORT_STARTED ] = 1;
ShowPlayerHelpDialog( playerid, 5000, "Drop the drugs off on the flag blips of your radar." );
SendGlobalMessage( COLOR_GREY, "[BUSINESS]"COL_WHITE" %s(%d) has begun transporting "COL_GOLD"%s"COL_WHITE" of business product!", ReturnPlayerName( playerid ), playerid, cash_format( g_businessData[ businessid ] [ E_EXPORT_VALUE ] * ( MAX_DROPS - g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] ) ) );
}
}
}
return 1;
}
hook OnPlayerEnterDynArea( playerid, areaid )
{
new player_state = GetPlayerState( playerid );
new vehicleid = GetPlayerVehicleID( playerid );
if ( player_state == PLAYER_STATE_DRIVER && vehicleid != 0 )
{
new
modelid = GetVehicleModel( vehicleid );
// alert player if hes near the drugs
if ( g_isBusinessVehicle[ vehicleid ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ))
{
new
businessid = g_isBusinessVehicle[ vehicleid ];
if ( IsBusinessAerialVehicle( businessid, modelid ) && IsBusinessAssociate( playerid, businessid ) )
{
for ( new i = 0; i < 2; i ++ ) if ( areaid == g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ i ] ) {
ShowPlayerHelpDialog( playerid, 5000, "~y~~h~Press ~k~~PED_FIREWEAPON~ to drop off the drugs!" );
}
}
}
}
return 1;
}
hook OnPlayerEnterDynRaceCP( playerid, checkpointid )
{
new
iVehicle = GetPlayerVehicleID( playerid );
if ( p_Class[ playerid ] == CLASS_CIVILIAN && g_isBusinessVehicle[ iVehicle ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ iVehicle ] ) )
{
new
businessid = g_isBusinessVehicle[ iVehicle ];
// printf("Is Associate : {user:%s,veh:%d,associate:%d}", ReturnPlayerName( playerid ), iVehicle, IsBusinessAssociate( playerid, businessid ));
if ( ! IsBusinessAerialVehicle( businessid, GetVehicleModel( iVehicle ) ) && IsBusinessAssociate( playerid, businessid ) )
{
for ( new i = 0; i < MAX_DROPS; i ++ )
{
if ( g_businessData[ businessid ] [ E_EXPORT_CP ] [ i ] == checkpointid )
{
if ( g_businessData[ businessid ] [ E_EXPORTED ] [ i ] )
return SendError( playerid, "This location has already been sold product recently." );
// count drugs exported
SellBusinessProduct( playerid, businessid, i );
break;
}
}
return 1;
}
}
return 1;
}
hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
{
if ( PRESSED( KEY_FIRE ) )
{
if ( IsPlayerInAnyVehicle( playerid ) )
{
new
vehicleid = GetPlayerVehicleID( playerid );
if ( p_Class[ playerid ] == CLASS_CIVILIAN && g_isBusinessVehicle[ vehicleid ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ) )
{
new
businessid = g_isBusinessVehicle[ vehicleid ];
if ( IsBusinessAerialVehicle( businessid, GetVehicleModel( vehicleid ) ) && IsBusinessAssociate( playerid, businessid ) )
{
new
Float: playerZ, tempObject, moveSpeed;
for ( new i = 0; i < MAX_DROPS; i ++ ) if ( IsPlayerInDynamicArea( playerid, g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ i ] ) )
{
new
city = g_businessData[ businessid ] [ E_EXPORT_CITY ], drop_off_index = g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ i ];
GetVehiclePos( vehicleid, playerZ, playerZ, playerZ );
//if ( g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] > finalZ + 20.0 )
// finalZ = g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ];
if ( playerZ - g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] < 20.0 )
return SendError( playerid, "You need to be HIGHER to drop off the drugs (%0.1f metres).", 20.0 - ( playerZ - g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] ) );
if ( playerZ - g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] > 100.0 )
return SendError( playerid, "You need to be LOWER to drop off the drugs (%0.1f metres).", 100.0 - ( playerZ - g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] ) );
if ( g_businessData[ businessid ] [ E_EXPORTED ] [ i ] )
return SendError( playerid, "This location has already been sold product recently." );
// create temporary bag object
tempObject = CreateDynamicObject( 18849, g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], playerZ + 2.0, 0.0, 0.0, 0.0 );
moveSpeed = MoveDynamicObject( tempObject, g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ] + 7.0, 8.0 );
SetTimerEx( "Timer_DestroyObject", moveSpeed + 4000, false, "d", tempObject );
// count drugs exported
SellBusinessProduct( playerid, businessid, i );
break;
}
}
}
}
}
return 1;
}
function Timer_DestroyObject( objectid )
return DestroyDynamicObject( objectid ), 1;
hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
{
if ( dialogid == DIALOG_BUSINESSES )
{
if ( ! response )
return ShowPlayerSpawnMenu( playerid );
new
x = 0;
foreach ( new b : business )
{
if ( IsBusinessAssociate( playerid, b ) )
{
if ( x == listitem )
{
SetPlayerSpawnLocation( playerid, "BIZ", b );
SendServerMessage( playerid, "Business spawning has been set at "COL_GREY"%s"COL_WHITE".", g_businessData[ b ] [ E_NAME ] );
break;
}
x ++;
}
}
return 1;
}
else if ( ( dialogid == DIALOG_BUSINESS_TERMINAL ) && response )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
switch ( listitem )
{
// rename business
case 0: ShowPlayerDialog( playerid, DIALOG_BUSINESS_NAME, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", sprintf( ""COL_WHITE"The current business name is %s\n\n"COL_WHITE"Enter below the new name for it", g_businessData[ businessid ] [ E_NAME ] ), "Update", "Back" );
// bank account
case 1: ShowPlayerDialog( playerid, DIALOG_BUSINESS_WITHDRAW, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", sprintf( ""COL_WHITE"Enter the amount that you are willing to withdraw from your business bank account.\n\n"COL_GREY"Current Balance:"COL_WHITE" %s", cash_format( g_businessData[ businessid ] [ E_BANK ] ) ), "Withdraw", "Back" );
// add members
case 2: ShowBusinessMembers( playerid, businessid );
// sell stock
case 3:
{
new
prod = GetProductPrice( businessid, true ), prod_hardened = GetProductPrice( businessid, false );
format( szBigString, sizeof( szBigString ),
""COL_WHITE"Your business has %d product\t \nSell Product Locally\t%s%s\nSell Product Nationally\t%s%s",
g_businessData[ businessid ] [ E_PRODUCT ], prod > g_businessInteriorData[ business_type ] [ E_COST_PRICE ] ? ( COL_GREEN ) : ( COL_RED ),
cash_format( prod ), prod_hardened > g_businessInteriorData[ business_type ] [ E_COST_PRICE ] ? ( COL_GREEN ) : ( COL_RED ), cash_format( prod_hardened )
);
ShowPlayerDialog( playerid, DIALOG_BUSINESS_SELL, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", szBigString, "Select", "Back" );
}
// buy stock
case 4: ShowPlayerDialog( playerid, DIALOG_BUSINESS_BUY, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", sprintf( ""COL_WHITE"Your business has %d supplies\t \nBuy Supply\t%s\nSteal Supplies\t"COL_YELLOW"FREE", g_businessData[ businessid ] [ E_SUPPLIES ], cash_format( GetResupplyPrice( business_type ) ) ), "Select", "Back" );
// upgrade
case 5: ShowBusinessUpgrades( playerid, businessid );
}
return 1;
}
/*else if ( dialogid == DIALOG_BUSINESS_SECURITY )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
new business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
new security_cost = floatround( float( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) * g_businessSecurityData[ listitem ] [ E_COST_MULTIPLIER ] );
if ( GetPlayerCash( playerid ) < security_cost ) SendError( playerid, "You do not have enough money for this business upgrade (%s).", cash_format( security_cost ) );
else if ( listitem < g_businessData[ businessid ] [ E_SECURITY_LEVEL ] ) SendError( playerid, "You cannot downgrade your security level." );
else if ( listitem == g_businessData[ businessid ] [ E_SECURITY_LEVEL ] ) SendError( playerid, "You have already upgraded your business to this security level." );
else
{
g_businessData[ businessid ] [ E_SECURITY_LEVEL ] = listitem;
UpdateBusinessData( businessid );
GivePlayerCash( playerid, -security_cost );
SendServerMessage( playerid, "You have upgraded your business security to %s"COL_WHITE" for "COL_GOLD"%s"COL_WHITE".", g_businessSecurityData[ listitem ] [ E_LEVEL ], cash_format( security_cost ) );
return 1;
}
return ShowBusinessSecurityUpgrades( playerid, businessid );
}*/
else if ( dialogid == DIALOG_BUSINESS_UPGRADES )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
switch ( listitem )
{
// upgrade security
// case 0: return ShowBusinessSecurityUpgrades( playerid, businessid );
// upgrade car
case 0:
{
szLargeString = ""COL_WHITE"Vehicle\t"COL_WHITE"Cost\n";
for ( new i = 0; i < sizeof( g_businessCarModelData ); i ++ )
{
new vehicle_model_index = g_businessCarModelData[ i ] [ E_ID ], bool: is_unlocked = ( 0 <= vehicle_model_index < MAX_BIZ_VEH_MODELS ) ? ( g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } ) : false;
format( szLargeString, sizeof( szLargeString ), "%s%s%s\t"COL_GOLD"%s\n", szLargeString, is_unlocked ? ( COL_LGREEN ) : ( "" ), g_businessCarModelData[ i ] [ E_NAME ], cash_format( g_businessCarModelData[ i ] [ E_COST ] ) );
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_CAR, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", szLargeString, "Purchase", "Back" );
}
// upgrade heli
case 1:
{
szLargeString = ""COL_WHITE"Vehicle\t"COL_WHITE"Cost\n";
for ( new i = 0; i < sizeof( g_businessAirModelData ); i ++ ) {
new vehicle_model_index = g_businessAirModelData[ i ] [ E_ID ], bool: is_unlocked = ( 0 <= vehicle_model_index < MAX_BIZ_VEH_MODELS ) ? ( g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } ) : false;
format( szLargeString, sizeof( szLargeString ), "%s%s%s\t"COL_GOLD"%s\n", szLargeString, is_unlocked ? ( COL_LGREEN ) : ( "" ), g_businessAirModelData[ i ] [ E_NAME ], cash_format( g_businessAirModelData[ i ] [ E_COST ] ) );
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_HELI, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", szLargeString, "Purchase", "Back" );
}
// upgrade staff
case 2:
{
if ( g_businessData[ businessid ] [ E_UPGRADES ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "Your business production has been already upgraded." );
if ( GetPlayerCash( playerid ) < g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You don't have enough money to upgrade this business (%s).", cash_format( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) );
CreateBusinessActors( businessid );
g_businessData[ businessid ] [ E_UPGRADES ] = 1;
GivePlayerCash( playerid, - g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] );
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `UPGRADES`=1 WHERE `ID`=%d", businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), SendServerMessage( playerid, "You have upgraded business production for "COL_GOLD"%s"COL_WHITE".", cash_format( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) );
}
// upgrade slots
case 3:
{
if ( g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] >= 4 )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You have maximized the number of business member slots." );
if ( GetPlayerCash( playerid ) < 500000 )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You don't have enough money to buy an additional member slot ($500,000)." );
GivePlayerCash( playerid, -500000 );
g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] ++;
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `EXTRA_MEMBERS`=%d WHERE `ID`=%d", g_businessData[ businessid ] [ E_EXTRA_MEMBERS ], businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), SendServerMessage( playerid, "You have bought an additional member slot for "COL_GOLD"$500,000"COL_WHITE"." );
}
// nos
case 4:
{
if ( g_businessData[ businessid ] [ E_CAR_NOS ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You have already purchased business car nitrous." );
if ( GetPlayerCash( playerid ) < 250000 )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You don't have enough money to buy business car nitrous ($250,000)." );
GivePlayerCash( playerid, -250000 );
g_businessData[ businessid ] [ E_CAR_NOS ] = true;
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `HAS_NOS`=1 WHERE `ID`=%d", businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), SendServerMessage( playerid, "You have bought nitrous for "COL_GOLD"$250,000"COL_WHITE"." );
}
// rims
case 5:
{
if ( g_businessData[ businessid ] [ E_CAR_RIMS ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You have already purchased gold rims for the business vehicle." );
if ( GetPlayerCash( playerid ) < 250000 )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You don't have enough money to buy gold rims ($250,000)." );
GivePlayerCash( playerid, -250000 );
g_businessData[ businessid ] [ E_CAR_RIMS ] = true;
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `HAS_RIMS`=1 WHERE `ID`=%d", businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), SendServerMessage( playerid, "You have bought gold rims for "COL_GOLD"$250,000"COL_WHITE"." );
}
}
return 1;
}
else if ( dialogid == DIALOG_BUSINESS_HELI )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessUpgrades( playerid, businessid );
new
vehicle_model_index = g_businessAirModelData[ listitem ] [ E_ID ];
if ( vehicle_model_index != -1 && vehicle_model_index < MAX_BIZ_VEH_MODELS && ! g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } )
{
if ( GetPlayerCash( playerid ) < g_businessAirModelData[ listitem ] [ E_COST ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You cannot afford this vehicle." );
if ( g_businessAirModelData[ listitem ] [ E_COST ] == 1337 && ! ( p_AccountID[ playerid ] == 314783 || p_AccountID[ playerid ] == 13 || p_AccountID[ playerid ] == 341204 || p_AccountID[ playerid ] == 30 || p_AccountID[ playerid ] == 479950 || p_AccountID[ playerid ] == 25 || p_AccountID[ playerid ] == 1 ) )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You did not contribute enough to the crowdfund to use this feature." );
g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } = true;
GivePlayerCash( playerid, -g_businessAirModelData[ listitem ] [ E_COST ] );
mysql_single_query( sprintf( "INSERT INTO `BUSINESS_VEHICLES` VALUES (%d, %d)", businessid, vehicle_model_index ) );
}
g_businessData[ businessid ] [ E_HELI_MODEL_ID ] = g_businessAirModelData[ listitem ] [ E_MODEL ];
foreach (new p : Player) if ( IsBusinessAssociate( p, businessid ) ) {
SendClientMessageFormatted( p, COLOR_GREY, "[BUSINESS]"COL_WHITE" %s(%d) has upgraded the business air vehicle to a "COL_GREY"%s"COL_WHITE".", ReturnPlayerName( playerid ), playerid, g_businessAirModelData[ listitem ] [ E_NAME ] );
}
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `AIR_MODEL`=%d WHERE `ID`=%d", g_businessAirModelData[ listitem ] [ E_MODEL ], businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), 1;
}
else if ( dialogid == DIALOG_BUSINESS_CAR )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessUpgrades( playerid, businessid );
new
vehicle_model_index = g_businessCarModelData[ listitem ] [ E_ID ];
if ( vehicle_model_index != -1 && vehicle_model_index < MAX_BIZ_VEH_MODELS && ! g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } )
{
if ( GetPlayerCash( playerid ) < g_businessCarModelData[ listitem ] [ E_COST ] )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You cannot afford this vehicle." );
if ( g_businessCarModelData[ listitem ] [ E_COST ] == 1337 && ! ( p_AccountID[ playerid ] == 314783 || p_AccountID[ playerid ] == 13 || p_AccountID[ playerid ] == 341204 || p_AccountID[ playerid ] == 30 || p_AccountID[ playerid ] == 479950 || p_AccountID[ playerid ] == 25 || p_AccountID[ playerid ] == 1 ) )
return ShowBusinessUpgrades( playerid, businessid ), SendError( playerid, "You did not contribute enough to the crowdfund to use this feature." );
g_businessVehicleUnlocked[ businessid ] { vehicle_model_index } = true;
GivePlayerCash( playerid, -g_businessCarModelData[ listitem ] [ E_COST ] );
mysql_single_query( sprintf( "INSERT INTO `BUSINESS_VEHICLES` VALUES (%d, %d)", businessid, vehicle_model_index ) );
}
g_businessData[ businessid ] [ E_CAR_MODEL_ID ] = g_businessCarModelData[ listitem ] [ E_MODEL ];
foreach (new p : Player) if ( IsBusinessAssociate( p, businessid ) ) {
SendClientMessageFormatted( p, COLOR_GREY, "[BUSINESS]"COL_WHITE" %s(%d) has upgraded the business car to a "COL_GREY"%s"COL_WHITE".", ReturnPlayerName( playerid ), playerid, g_businessCarModelData[ listitem ] [ E_NAME ] );
}
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `CAR_MODEL`=%d WHERE `ID`=%d", g_businessCarModelData[ listitem ] [ E_MODEL ], businessid ) );
return ShowBusinessUpgrades( playerid, businessid ), 1;
}
else if ( dialogid == DIALOG_BUSINESS_WITHDRAW )
{
new
businessid = p_InBusiness[ playerid ];
if ( ! Iter_Contains( business, businessid ) || g_businessData[ businessid ] [ E_OWNER_ID ] != p_AccountID[ playerid ] )
return SendError( playerid, "You must be the owner of the business to use this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
new
iWithdraw;
if ( sscanf( inputtext, "d", iWithdraw ) ) SendError( playerid, "Invalid amount specified." );
else if ( iWithdraw > 99999999 || iWithdraw < 0 ) SendError( playerid, "Invalid amount specified." );
else if ( iWithdraw > g_businessData[ businessid ] [ E_BANK ] ) SendError( playerid, "The business bank account does not have this much money." );
else
{
g_businessData[ businessid ] [ E_BANK ] -= iWithdraw;
GivePlayerCash( playerid, iWithdraw );
UpdateBusinessData( businessid );
UpdateBusinessProductionLabel( businessid );
SendServerMessage( playerid, "You have withdrawn %s from your business account.", cash_format( iWithdraw ) );
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_WITHDRAW, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", sprintf( ""COL_WHITE"Enter the amount that you are willing to withdraw from your business bank account.\n\n"COL_GREY"Current Balance:"COL_WHITE" %s", cash_format( g_businessData[ businessid ] [ E_BANK ] ) ), "Withdraw", "Back" );
}
else if ( dialogid == DIALOG_BUSINESS_MEMBERS )
{
new
businessid = p_InBusiness[ playerid ];
if ( ! Iter_Contains( business, businessid ) || g_businessData[ businessid ] [ E_OWNER_ID ] != p_AccountID[ playerid ] )
return SendError( playerid, "You must be the owner of the business to use this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
if ( listitem == 0 )
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_ADD_MEMBER, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", ""COL_WHITE"Type the name of the player you wish to add as a member.", "Add", "Back" );
for( new i, x = 1; i < MAX_BUSINESS_MEMBERS; i ++ )
{
if ( g_businessData[ businessid ] [ E_MEMBERS ] [ i ] )
{
if ( x == listitem )
{
// alert player if online
foreach (new p : Player) if ( g_businessData[ businessid ] [ E_MEMBERS ] [ i ] == p_AccountID[ p ] ) {
SendServerMessage( p, "You have been removed as a member of "COL_GREY"%s"COL_WHITE".", g_businessData[ businessid ] [ E_NAME ] );
break;
}
// null entry
g_businessData[ businessid ] [ E_MEMBERS ] [ i ] = 0;
// save
UpdateBusinessData( businessid ), UpdateBusinessTitle( businessid );
SendServerMessage( playerid, "You have removed a member from the business." );
break;
}
x ++;
}
}
ShowBusinessMembers( playerid, businessid );
return 1;
}
else if ( dialogid == DIALOG_BUSINESS_ADD_MEMBER )
{
new
businessid = p_InBusiness[ playerid ];
if ( ! Iter_Contains( business, businessid ) || g_businessData[ businessid ] [ E_OWNER_ID ] != p_AccountID[ playerid ] )
return SendError( playerid, "You must be the owner of the business to use this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
new
memberid;
if ( sscanf( inputtext, "u", memberid ) ) SendError( playerid, "Specify a name or id of the player you wish to add as a business member." );
else if ( ! IsPlayerConnected( memberid ) || IsPlayerNPC( memberid ) ) SendError( playerid, "The player specified is not connected." );
else if ( p_OwnedBusinesses[ memberid ] >= GetPlayerBusinessSlots( memberid ) ) SendError( playerid, "This player cannot be added to any more businesses." );
else
{
new
slotid = -1;
// get slot for new member anyway
for ( new x = 0; x < MAX_BUSINESS_MEMBERS; x ++ ) if ( g_businessData[ businessid ] [ E_MEMBERS ] [ x ] == 0 ) {
slotid = x;
break;
}
// proceed
if ( slotid == -1 ) SendError( playerid, "The business has reached the maximum number of members." );
else if ( IsBusinessAssociate( memberid, businessid ) ) SendError( playerid, "This member is already apart of your organization." );
else
{
new
current_members = GetBusinessAssociates( businessid ) - 1; // not including owner
if ( current_members >= 4 + g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] )
return SendError( playerid, "You must pay to add more than %d members.", 4 + g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] );
// add member in
p_OwnedBusinesses[ memberid ] ++;
g_businessData[ businessid ] [ E_MEMBERS ] [ slotid ] = p_AccountID[ memberid ];
// alert and save
foreach (new i : Player) if ( IsBusinessAssociate( i, businessid ) ) {
SendClientMessageFormatted( i, -1, ""COL_GREY"[BUSINESS]"COL_WHITE" %s(%d) has been added as a member to "COL_GREY"%s"COL_WHITE".", ReturnPlayerName( memberid ), memberid, g_businessData[ businessid ] [ E_NAME ] );
}
UpdateBusinessData( businessid ), UpdateBusinessTitle( businessid );
return ShowBusinessMembers( playerid, businessid );
}
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_ADD_MEMBER, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", ""COL_WHITE"Type the name of the player you wish to add as a member.", "Add", "Back" );
}
else if ( dialogid == DIALOG_BUSINESS_NAME )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
if ( textContainsIP( inputtext ) )
return SendError( playerid, "We do not condone advertising." );
if ( ! ( 3 <= strlen( inputtext ) <= 32 ) ) {
SendError( playerid, "Please make sure your business name is between 3 and 32 characters." );
} else {
format( g_businessData[ businessid ] [ E_NAME ], 32, "%s", inputtext );
UpdateBusinessData( businessid ), UpdateBusinessTitle( businessid );
SendServerMessage( playerid, "The business name has now been set to "COL_GREY"%s"COL_WHITE".", g_businessData[ businessid ] [ E_NAME ] );
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_NAME, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", sprintf( ""COL_WHITE"The current business name is %s\n\n"COL_WHITE"Enter below the new name for it", g_businessData[ businessid ] [ E_NAME ] ), "Update", "Back" );
}
else if ( dialogid == DIALOG_BUSINESS_SELL )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
if ( ! response )
return ShowBusinessTerminal( playerid );
new
current_product_levels = g_businessData[ businessid ] [ E_PRODUCT ];
if ( current_product_levels - MAX_DROPS < 0 )
return SendError( playerid, "Your business needs %d more product to allow for distribution.", MAX_DROPS - current_product_levels );
if ( g_businessData[ businessid ] [ E_EXPORT_STARTED ] )
return SendError( playerid, "Product exporting has already started for the business." );
// destroy preexisting shit incase
StopBusinessExportMission( businessid );
// update product levels
g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] = 0;
g_businessData[ businessid ] [ E_PRODUCT ] -= MAX_DROPS;
UpdateBusinessProductionLabel( businessid );
// create a new export mission
switch ( listitem )
{
case 0:
{
g_businessData[ businessid ] [ E_EXPORT_STARTED ] = 1;
g_businessData[ businessid ] [ E_EXPORT_VALUE ] = GetProductPrice( businessid, .hardened = true );
SetRandomDropoffLocation( playerid, businessid, .heli = false );
return 1;
}
case 1:
{
g_businessData[ businessid ] [ E_EXPORT_STARTED ] = 2;
g_businessData[ businessid ] [ E_EXPORT_VALUE ] = GetProductPrice( businessid, .hardened = false );
SetRandomDropoffLocation( playerid, businessid, .heli = true );
return 1;
}
}
return 1;
}
else if ( ( dialogid == DIALOG_BUSINESS_BUY ) && response )
{
new
businessid = p_InBusiness[ playerid ];
if ( p_Class[ playerid ] != CLASS_CIVILIAN || ! Iter_Contains( business, businessid ) || ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You do not have access to this feature." );
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
switch ( listitem )
{
case 0:
{
2018-10-01 04:18:16 +00:00
// check we havent breached any limits
if ( g_businessData[ businessid ] [ E_SUPPLIES ] >= g_businessInteriorData[ business_type ] [ E_MAX_SUPPLIES ] )
return ShowBusinessTerminal( playerid ), SendError( playerid, "The business met the limit of %d supplies.", g_businessInteriorData[ business_type ] [ E_MAX_SUPPLIES ] );
if ( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] )
return ShowBusinessTerminal( playerid ), SendError( playerid, "You cannot resupply the business as it is currently in its production phase." );
2018-10-01 03:30:25 +00:00
// buy with cash
new
price = GetResupplyPrice( business_type );
if ( GetPlayerCash( playerid ) < price )
return ShowBusinessTerminal( playerid ), SendError( playerid, "You don't have enough money to resupply your business." );
if ( g_businessData[ businessid ] [ E_PRODUCT ] >= g_businessInteriorData[ business_type ] [ E_MAX_SUPPLIES ] * 3 )
return ShowBusinessTerminal( playerid ), SendError( playerid, "Your business has too much product that has not been exported yet." );
if ( g_businessData[ businessid ] [ E_EXPORT_STARTED ] )
return SendError( playerid, "Supplies cannot be purchased when you have begun an exporting mission." );
// commence
GivePlayerCash( playerid, -price );
g_businessData[ businessid ] [ E_SUPPLIES ] ++;
// alert and redirect
SendServerMessage( playerid, "You have bought business supplies for "COL_GOLD"%s"COL_WHITE". "COL_ORANGE"(%d/%d)", cash_format( price ), g_businessData[ businessid ] [ E_SUPPLIES ], g_businessInteriorData[ business_type ] [ E_MAX_SUPPLIES ] );
// start prod if viable
StartBusinessDrugProduction( businessid );
}
case 1:
{
ShowBusinessTerminal( playerid );
SendError( playerid, "This feature is currently under construction." );
}
}
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_BUY, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", sprintf( ""COL_WHITE"Your business has %d supplies\t \nBuy Supply\t%s\nSteal Supplies\t"COL_YELLOW"FREE", g_businessData[ businessid ] [ E_SUPPLIES ], cash_format( GetResupplyPrice( business_type ) ) ), "Select", "Back" ), 1;
}
return 1;
}
hook OnVehicleStreamIn( vehicleid, forplayerid )
{
if ( g_isBusinessVehicle[ vehicleid ] != -1 && Iter_Contains( business, g_isBusinessVehicle[ vehicleid ] ) )
{
// new businessid = g_isBusinessVehicle[ vehicleid ];
// if ( IsBusinessAssociate( forplayerid, businessid ) )
SetVehicleParamsForPlayer( vehicleid, forplayerid, 1, 0 );
}
return 1;
}
hook OnPlayerDisconnect( playerid, reason )
{
foreach ( new businessid : business ) if ( g_businessData[ businessid ] [ E_EXPORT_STARTED ] && IsBusinessAssociate( playerid, businessid ) ) {
new
members = 0;
2018-10-01 04:18:16 +00:00
GetOnlineBusinessAssociates( playerid, members, playerid );
2018-10-01 03:30:25 +00:00
// printf ("%d online players for business %d, stopping mission?", members, businessid );
if ( members <= 0 ) {
// print( "stopped" );
StopBusinessExportMission( businessid );
}
}
return 1;
}
/* ** Threads ** */
thread OnBusinessLoad( )
{
new
rows, fields, i = -1,
loadingTick = GetTickCount( )
;
cache_get_data( rows, fields );
if ( rows )
{
new
szName[ 32 ], szMembers[ 96 ];
while( ++i < rows )
{
new
businessid = cache_get_field_content_int( i, "ID", dbHandle );
// get business name
cache_get_field_content( i, "NAME", szName, sizeof( szName ) );
cache_get_field_content( i, "MEMBERS", szMembers, sizeof( szMembers ) );
// create business
new b = CreateBusiness(
cache_get_field_content_int( i, "OWNER_ID", dbHandle ),
szName,
cache_get_field_content_int( i, "COST", dbHandle ),
cache_get_field_content_int( i, "TYPE", dbHandle ),
cache_get_field_content_float( i, "X", dbHandle ),
cache_get_field_content_float( i, "Y", dbHandle ),
cache_get_field_content_float( i, "Z", dbHandle ),
cache_get_field_content_int( i, "SUPPLIES", dbHandle ),
cache_get_field_content_int( i, "PRODUCT", dbHandle ),
cache_get_field_content_int( i, "PROD_TIMESTAMP", dbHandle ),
cache_get_field_content_int( i, "BANK", dbHandle ),
cache_get_field_content_int( i, "SECURITY", dbHandle ),
businessid
);
// check if valid business
if ( b != ITER_NONE )
{
// add members
if ( sscanf( szMembers, sprintf( "a<i>[%d]", MAX_BUSINESS_MEMBERS ), g_businessData[ businessid ] [ E_MEMBERS ] ) ) {
// must have fucked up, we'll reset members
for ( new x = 0; x < MAX_BUSINESS_MEMBERS; x ++ )
g_businessData[ businessid ] [ E_MEMBERS ] [ x ] = 0;
}
// apply upgrades
g_businessData[ businessid ] [ E_CAR_MODEL_ID ] = cache_get_field_content_int( i, "CAR_MODEL", dbHandle );
g_businessData[ businessid ] [ E_HELI_MODEL_ID ] = cache_get_field_content_int( i, "AIR_MODEL", dbHandle );
g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] = cache_get_field_content_int( i, "EXTRA_MEMBERS", dbHandle );
g_businessData[ businessid ] [ E_UPGRADES ] = cache_get_field_content_int( i, "UPGRADES", dbHandle );
g_businessData[ businessid ] [ E_CAR_NOS ] = !! cache_get_field_content_int( i, "HAS_NOS", dbHandle );
g_businessData[ businessid ] [ E_CAR_RIMS ] = !! cache_get_field_content_int( i, "HAS_RIMS", dbHandle );
// add bots inside if neccessary
if ( g_businessData[ businessid ] [ E_UPGRADES ] ) CreateBusinessActors( businessid );
// unlock models?
mysql_function_query( dbHandle, sprintf( "SELECT * FROM `BUSINESS_VEHICLES` WHERE `BUSINESS_ID`=%d", businessid ), true, "OnBusinessVehicleLoad", "d", businessid );
}
else printf( "[BUSINESS ERROR]: Unable to create business id %d", b );
}
}
printf( "[BUSINESSES]: %d businesses have been loaded. (Tick: %dms)", i, GetTickCount( ) - loadingTick );
return 1;
}
thread OnBusinessVehicleLoad( businessid )
{
new
rows, fields, i = -1;
cache_get_data( rows, fields );
if ( rows ) {
while( ++i < rows ) {
new vehicle_index = cache_get_field_content_int( i, "VEHICLE_INDEX", dbHandle );
if ( vehicle_index < MAX_BIZ_VEH_MODELS ) // Must be something wrong otherwise...
g_businessVehicleUnlocked[ businessid ] { vehicle_index } = true;
}
}
return 1;
}
thread OnUpdateBusinessTitle( businessid )
{
new
rows, szOwner[ MAX_PLAYER_NAME ] = "No-one", associates = GetBusinessAssociates( businessid );
cache_get_data( rows, tmpVariable );
if ( rows )
cache_get_field_content( 0, "NAME", szOwner );
new biz_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
// update robbery checkpoints
/*foreach ( new robberyid : RobberyCount ) if ( robberyid == g_businessData[ businessid ] [ E_ROBBERY_ID ] ) {
format( g_robberyData[ robberyid ] [ E_NAME ], 32, "%s", g_businessData[ businessid ] [ E_NAME ] );
UpdateDynamic3DTextLabelText( g_robberyData[ robberyid ] [ E_LABEL ], COLOR_GREY, sprintf( "%s\n"COL_WHITE"Left ALT To Crack Safe", g_businessData[ businessid ] [ E_NAME ] ) );
}*/
// update business title
format( szBigString, sizeof( szBigString ), ""COL_GOLD"%s Business:"COL_WHITE" %s(%d)\n"COL_GOLD"Owner:"COL_WHITE" %s\n"COL_GOLD"Price:"COL_WHITE" %s\n"COL_GOLD"Members:"COL_WHITE" %d", g_businessInteriorData[ biz_type ] [ E_NAME ], g_businessData[ businessid ] [ E_NAME ], businessid, szOwner, cash_format( g_businessData[ businessid ] [ E_COST ] ), associates );
UpdateDynamic3DTextLabelText( g_businessData[ businessid ] [ E_ENTER_LABEL ], COLOR_GOLD, szBigString );
return 1;
}
/* ** Functions ** */
stock CreateBusiness( iAccountID, szBusiness[ 32 ], iPrice, iType, Float: fX, Float: fY, Float: fZ, iSupply = 0, iProduct = 0, iProductionTimestamp = 0, iBank = 0, iSecurity = 0, iExistingID = ITER_NONE )
{
new
iBusiness = iExistingID != ITER_NONE ? iExistingID : Iter_Free(business);
if ( Iter_Contains( business, iExistingID ) )
iBusiness = ITER_NONE; // In the unlikelihood...
if ( iBusiness != ITER_NONE )
{
format( g_businessData[ iBusiness ] [ E_NAME ], 32, "%s", szBusiness );
ResetBusiness( iBusiness ); // reset data just incase first
g_businessData[ iBusiness ] [ E_OWNER_ID ] = iAccountID;
g_businessData[ iBusiness ] [ E_COST ] = iPrice;
g_businessData[ iBusiness ] [ E_INTERIOR_TYPE ] = iType;
g_businessData[ iBusiness ] [ E_WORLD ] = iBusiness + ( MAX_BUSINESSES ); // Random
g_businessData[ iBusiness ] [ E_X ] = fX;
g_businessData[ iBusiness ] [ E_Y ] = fY;
g_businessData[ iBusiness ] [ E_Z ] = fZ;
g_businessData[ iBusiness ] [ E_BANK ] = iBank;
g_businessData[ iBusiness ] [ E_PRODUCT ] = iProduct;
g_businessData[ iBusiness ] [ E_SUPPLIES ] = iSupply;
g_businessData[ iBusiness ] [ E_SECURITY_LEVEL ] = iSecurity;
g_businessData[ iBusiness ] [ E_PROD_TIMESTAMP ] = iProductionTimestamp;
// add robbery safe lmao
/*new robberyid = CreateRobberyCheckpoint( szBusiness, 0, g_businessInteriorData[ iType ] [ E_SAFE_X ], g_businessInteriorData[ iType ] [ E_SAFE_Y ], g_businessInteriorData[ iType ] [ E_SAFE_Z ], g_businessInteriorData[ iType ] [ E_SAFE_ROTATION ], g_businessData[ iBusiness ] [ E_WORLD ] );
if ( robberyid != ITER_NONE ) {
g_businessData[ iBusiness ] [ E_ROBBERY_ID ] = robberyid;
g_robberyData[ robberyid ] [ E_BUSINESS_ID ] = iBusiness;
} else {
g_businessData[ iBusiness ] [ E_ROBBERY_ID ] = ITER_NONE;
}*/
// reset actor id (otherwise it defaults as 0)
for ( new i = 0; i < sizeof( g_businessActors[ ] ); i ++ ) {
g_businessActors[ iBusiness ] [ i ] = -1;
}
// production label
g_businessData[ iBusiness ] [ E_PROD_LABEL ] = CreateDynamic3DTextLabel( "... Loading ...", COLOR_GOLD, g_businessInteriorData[ iType ] [ E_PROD_X ], g_businessInteriorData[ iType ] [ E_PROD_Y ], g_businessInteriorData[ iType ] [ E_PROD_Z ], 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, g_businessData[ iBusiness ] [ E_WORLD ], g_businessData[ iBusiness ] [ E_INTERIOR_TYPE ] + 20 );
UpdateBusinessProductionLabel( iBusiness );
// add a private vehicle!
if ( iType == BUSINESS_WEAPON ) {
new baggage = CreateVehicle( 485, -4301.9580, 209.8583, 1303.1013, 90.0, -1, -1, 360 );
SetVehicleVirtualWorld( baggage, g_businessData[ iBusiness ] [ E_WORLD ] );
LinkVehicleToInterior( baggage, 20 + iType );
}
// checkpoints
g_businessData[ iBusiness ] [ E_ENTER_CP ] = CreateDynamicCP( fX, fY, fZ, 1.0, -1, 0, -1, 100.0 );
g_businessData[ iBusiness ] [ E_EXIT_CP ] = CreateDynamicCP( g_businessInteriorData[ iType ] [ E_X ], g_businessInteriorData[ iType ] [ E_Y ], g_businessInteriorData[ iType ] [ E_Z ], 1.0, g_businessData[ iBusiness ] [ E_WORLD ], g_businessData[ iBusiness ] [ E_INTERIOR_TYPE ] + 20, -1, 100.0 );
format( szBigString, sizeof( szBigString ), ""COL_GOLD"%s Business:"COL_WHITE" %s(%d)\n"COL_GOLD"Owner:"COL_WHITE" No-one\n"COL_GOLD"Price:"COL_WHITE" %s\n"COL_GOLD"Members:"COL_WHITE" 0", g_businessInteriorData[ iType ] [ E_NAME ], szBusiness, iBusiness, cash_format( g_businessData[ iBusiness ] [ E_COST ] ) );
g_businessData[ iBusiness ] [ E_ENTER_LABEL ] = CreateDynamic3DTextLabel( szBigString, COLOR_GOLD, fX, fY, fZ, 20.0 );
g_businessData[ iBusiness ] [ E_EXIT_LABEL ] = CreateDynamic3DTextLabel( "[EXIT]", COLOR_GOLD, g_businessInteriorData[ iType ] [ E_X ], g_businessInteriorData[ iType ] [ E_Y ], g_businessInteriorData[ iType ] [ E_Z ], 20.0 );
// just incase, reset variables
StopBusinessExportMission( iBusiness );
// insert or readjust name
if ( iExistingID != ITER_NONE && iAccountID != 0 ) UpdateBusinessTitle( iBusiness );
else if ( iExistingID == ITER_NONE )
{
format( szBigString, sizeof( szBigString ), "INSERT INTO `BUSINESSES`(`ID`, `OWNER_ID`, `NAME`, `COST`, `TYPE`, `X`, `Y`, `Z`) VALUES (%d,%d,'%s',%d,%d,%f,%f,%f)", iBusiness, iAccountID, szBusiness, iPrice, iType, fX, fY, fZ );
mysql_single_query( szBigString );
}
Iter_Add(business, iBusiness);
}
return iBusiness;
}
stock DestroyBusiness( businessid )
{
if ( !Iter_Contains( business, businessid ) )
return 0;
new
playerid = GetPlayerIDFromAccountID( g_businessData[ businessid ] [ E_OWNER_ID ] );
if ( IsPlayerConnected( playerid ) ) {
p_OwnedBusinesses[ playerid ] --;
SendClientMessage( playerid, -1, ""COL_PINK"[BUSINESS]"COL_WHITE" One of your businesses has been destroyed.");
}
mysql_single_query( sprintf( "DELETE FROM `BUSINESSES` WHERE `ID`=%d", businessid ) );
Iter_Remove(business, businessid);
DestroyRobberyCheckpoint( g_businessData[ businessid ] [ E_ROBBERY_ID ] );
g_businessData[ businessid ] [ E_OWNER_ID ] = 0;
DestroyDynamicCP( g_businessData[ businessid ] [ E_ENTER_CP ] );
DestroyDynamicCP( g_businessData[ businessid ] [ E_EXIT_CP ] );
DestroyDynamic3DTextLabel( g_businessData[ businessid ] [ E_PROD_LABEL ] );
DestroyDynamic3DTextLabel( g_businessData[ businessid ] [ E_ENTER_LABEL ] );
DestroyDynamic3DTextLabel( g_businessData[ businessid ] [ E_EXIT_LABEL ] );
StopBusinessExportMission( businessid );
2018-10-01 04:39:08 +00:00
ResetBusiness( businessid, .hard_reset = true );
2018-10-01 03:30:25 +00:00
return 1;
}
2018-10-01 04:39:08 +00:00
stock ResetBusiness( iBusiness, bool: hard_reset = false )
2018-10-01 03:30:25 +00:00
{
// data
g_businessData[ iBusiness ] [ E_PRODUCT ] = 0;
g_businessData[ iBusiness ] [ E_SUPPLIES ] = 0;
// upgrades
g_businessData[ iBusiness ] [ E_CAR_MODEL_ID ] = 554;
g_businessData[ iBusiness ] [ E_HELI_MODEL_ID ] = 417;
g_businessData[ iBusiness ] [ E_EXTRA_MEMBERS ] = 0;
g_businessData[ iBusiness ] [ E_UPGRADES ] = 0;
g_businessData[ iBusiness ] [ E_CAR_NOS ] = false;
g_businessData[ iBusiness ] [ E_CAR_RIMS ] = false;
// reset members
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ )
g_businessData[ iBusiness ] [ E_MEMBERS ] [ i ] = 0;
// reset vehicle models
for ( new i = 0; i < MAX_BIZ_VEH_MODELS; i ++ )
g_businessVehicleUnlocked[ iBusiness ] { i } = false;
// reset actors
for ( new i = 0; i < sizeof( g_businessActors[ ] ); i ++ )
DestroyActor( g_businessActors[ iBusiness ] [ i ] ), g_businessActors[ iBusiness ] [ i ] = -1;
// queries
2018-10-01 04:39:08 +00:00
if ( hard_reset )
{
mysql_single_query( sprintf( "DELETE FROM `BUSINESS_VEHICLES` WHERE `BUSINESS_ID`=%d", iBusiness ) );
mysql_single_query( sprintf( "UPDATE `USERS` SET `SPAWN`=NULL WHERE `SPAWN`='BIZ %d'", iBusiness ) );
}
2018-10-01 03:30:25 +00:00
}
stock GetBusinessAssociates( businessid ) {
new
members = 0;
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ )
if ( g_businessData[ businessid ] [ E_MEMBERS ] [ i ] != 0 )
members ++;
if ( g_businessData[ businessid ] [ E_OWNER_ID ] != 0 )
members ++;
return members;
}
stock StartBusinessDrugProduction( businessid )
{
if ( ! Iter_Contains( business, businessid ) )
return;
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
// only if the stock is maxed
if ( g_businessData[ businessid ] [ E_SUPPLIES ] >= g_businessInteriorData[ business_type ] [ E_MAX_SUPPLIES ] )
{
if ( g_businessData[ businessid ] [ E_UPGRADES ] ) {
2018-10-01 04:18:16 +00:00
g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] = 1800 * g_businessInteriorData[ business_type ] [ E_PRODUCTION_TIME ]; // doubles time necessary
2018-10-01 03:30:25 +00:00
} else {
2018-10-01 04:18:16 +00:00
g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] = 3600 * g_businessInteriorData[ business_type ] [ E_PRODUCTION_TIME ];
2018-10-01 03:30:25 +00:00
}
UpdateBusinessProductionLabel( businessid );
UpdateBusinessData( businessid );
// alert players
foreach (new i : Player) if ( IsBusinessAssociate( i, businessid ) ) {
SendClientMessageFormatted( i, -1, ""COL_GREY"[BUSINESS]"COL_WHITE" Supply levels for "COL_GREY"%s"COL_WHITE" have replenished. Production will commence.", g_businessData[ businessid ] [ E_NAME ] );
}
}
}
stock GetPlayerOwnedBusinesses( playerid )
{
new
count = 0;
foreach (new businessid : business) if ( IsBusinessAssociate( playerid, businessid ) ) {
count ++;
}
return count;
}
stock CreateBusinessActors( businessid )
{
static const
g_businessActorData[ 4 ] [ MAX_BIZ_ACTORS ] [ E_ACTOR_DATA ] =
{
// Weed lab
{
{ 21, -1747.3533, -1372.9813, 5874.1333, 2.07910, "INT_SHOP", "shop_loop", 0 },
{ 22, -1749.7698, -1377.1772, 5874.1333, 87.3066, "INT_SHOP", "shop_loop", 0 },
{ 41, -1749.7698, -1378.2697, 5874.1333, 87.9333, "INT_SHOP", "shop_loop", 0 },
{ 143, -1746.3678, -1377.1827, 5874.1333, 89.5236, "INT_SHOP", "shop_loop", 0 },
{ 183, -1734.0258, -1359.8907, 5874.1372, 49.1026, "COP_AMBIENT", "Coplook_think", 0 },
{ 184, -1730.9587, -1370.6337, 5874.1455, 320.139, "INT_SHOP", "shop_pay", 0 },
{ 220, -1734.9357, -1379.7953, 5874.1475, 242.118, "INT_SHOP", "shop_loop", 0 },
{ 222, -1727.6835, -1367.3120, 5874.1436, 86.0996, "INT_SHOP", "shop_loop", 0 },
{ 168, -1743.6840, -1368.3126, 5874.1333, 339.252, "INT_SHOP", "shop_shelf", 0 }
},
// Meth Lab
{
{ 70,2023.7355, 1001.6071, 1510.2416, 182.2146, "INT_SHOP", "shop_loop", 0 },
{ 70,2019.7291, 1001.6071, 1510.2416, 179.7077, "INT_SHOP", "shop_loop", 0 },
{ 153,2026.5404, 1008.3461, 1510.2416, 178.4305, "COP_AMBIENT", "Coplook_think", 0 },
{ 259,2026.3182, 1005.4316, 1510.2416, 359.1620, "COP_AMBIENT", "Copbrowse_loop", 0 },
{ 290,2026.3282, 1000.9877, 1510.2416, 177.4259, "INT_SHOP", "shop_pay", 0 },
{ 71,2034.8290, 1006.0858, 1510.2416, 88.77530, "COP_AMBIENT", "Coplook_loop", 0 },
{ -1, 0.0, 0.0, 0.0, 0.0, "", "", 0 },
{ -1, 0.0, 0.0, 0.0, 0.0, "", "", 0 },
{ -1, 0.0, 0.0, 0.0, 0.0, "", "", 0 }
},
// Cocaine Lab
{
{ 146, 2554.8198, -1287.2550, 1143.7559, 358.8902, "INT_SHOP", "shop_loop", 0 },
{ 146, 2553.5564, -1293.3484, 1143.7539, 180.9151, "INT_SHOP", "shop_loop", 0 },
{ 145, 2555.1589, -1295.2550, 1143.7559, 0.433400, "INT_SHOP", "shop_loop", 0 },
{ 146, 2560.0005, -1294.4984, 1143.7559, 269.8790, "INT_SHOP", "shop_loop", 0 },
{ 146, 2562.7671, -1293.3485, 1143.7539, 177.1313, "INT_SHOP", "shop_loop", 0 },
{ 145, 2564.3228, -1293.3485, 1143.7539, 181.2047, "INT_SHOP", "shop_loop", 0 },
{ 146, 2560.0005, -1286.4615, 1143.7559, 267.9984, "INT_SHOP", "shop_loop", 0 },
{ 146, 2564.1406, -1285.3485, 1143.7539, 180.8909, "INT_SHOP", "shop_loop", 0 },
{ 145, 2548.4253, -1297.8320, 1143.7242, 89.43240, "INT_SHOP", "shop_loop", 0 }
},
// Bunker
{
{ 108, -6977.029785, -266.735992, 836.515014, 47.79999, "ped", "Gun_stand", 0 },
{ 116, -6977.370117, -257.923004, 836.515014, 70.59999, "camera", "picstnd_take", 0 },
{ 173, -6976.370117, -260.894012, 836.515014, 68.19999, "ped", "Gun_stand", 0 },
{ 202, -6982.250000, -228.962005, 838.228027, -129.899, "crack", "Bbalbat_Idle_02", 0 },
{ 122, -6976.950195, -248.820007, 838.174987, 81.69999, "graffiti", "spraycan_fire", 0 },
{ 133, -6976.729980, -246.692001, 838.174987, 105.0000, "graffiti", "graffiti_Chkout", 0 },
{ 179, -6963.290039, -258.019012, 836.515014, -39.2000, "Wuzi", "Wuzi_Greet_Plyr", 0 },
{ 206, -6960.500000, -269.334014, 836.515014, 0.000000, "dealer", "DEALER_IDLE", 0 },
{ -1, 0.0, 0.0, 0.0, 0.0, "", "", 0 }
}
}
;
new
biz_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
for ( new i = 0; i < MAX_BIZ_ACTORS; i ++ ) if ( g_businessActorData[ biz_type ] [ i ] [ E_SKIN ] != -1 )
{
g_businessActors[ businessid ] [ i ] = CreateDynamicActor( g_businessActorData[ biz_type ] [ i ] [ E_SKIN ], g_businessActorData[ biz_type ] [ i ] [ E_X ], g_businessActorData[ biz_type ] [ i ] [ E_Y ], g_businessActorData[ biz_type ] [ i ] [ E_Z ], g_businessActorData[ biz_type ] [ i ] [ E_RZ ] );
SetDynamicActorInvulnerable( g_businessActors[ businessid ] [ i ], true );
SetDynamicActorVirtualWorld( g_businessActors[ businessid ] [ i ], g_businessData[ businessid ] [ E_WORLD ] );
ApplyDynamicActorAnimation( g_businessActors[ businessid ] [ i ], g_businessActorData[ biz_type ] [ i ] [ E_ANIM_LIB ], g_businessActorData[ biz_type ] [ i ] [ E_ANIM_NAME ], 4.1, 1, 1, 1, 1, 0 );
ApplyDynamicActorAnimation( g_businessActors[ businessid ] [ i ], g_businessActorData[ biz_type ] [ i ] [ E_ANIM_LIB ], g_businessActorData[ biz_type ] [ i ] [ E_ANIM_NAME ], 4.1, 1, 1, 1, 1, 0 );
}
return 1;
}
stock UpdateBusinessProductionLabel( businessid )
{
new
prod_price = g_businessData[ businessid ] [ E_PRODUCT ] * GetProductPrice( businessid ), supply_price = g_businessData[ businessid ] [ E_SUPPLIES ] * GetResupplyPrice( g_businessData[ businessid ] [ E_INTERIOR_TYPE ] );
// check if its processing
2018-10-01 04:18:16 +00:00
if ( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ] ) {
format( szBigString, sizeof( szBigString ), ""COL_GREEN"Bank:"COL_WHITE" %s\n"COL_GREEN"Product:"COL_WHITE" %d (%s)\n"COL_GREEN"Supplies:"COL_WHITE" %d (%s)\n"COL_ORANGE"%s until production finishes", cash_format( g_businessData[ businessid ] [ E_BANK ] ), g_businessData[ businessid ] [ E_PRODUCT ], cash_format( prod_price ), g_businessData[ businessid ] [ E_SUPPLIES ], cash_format( supply_price ), secondstotime( g_businessData[ businessid ] [ E_PROD_TIMESTAMP ], ", ", 5 ) );
2018-10-01 03:30:25 +00:00
} else {
format( szBigString, sizeof( szBigString ), ""COL_GREEN"Bank:"COL_WHITE" %s\n"COL_GREEN"Product:"COL_WHITE" %d (%s)\n"COL_GREEN"Supplies:"COL_WHITE" %d (%s)\n"COL_GREEN"Production finished", cash_format( g_businessData[ businessid ] [ E_BANK ] ), g_businessData[ businessid ] [ E_PRODUCT ], cash_format( prod_price ), g_businessData[ businessid ] [ E_SUPPLIES ], cash_format( supply_price ) );
}
// update label
UpdateDynamic3DTextLabelText( g_businessData[ businessid ] [ E_PROD_LABEL ], -1, szBigString );
}
stock UpdateBusinessData( businessid )
{
new
members[ 96 ];
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ )
format( members, sizeof( members ), "%s%d ", members, g_businessData[ businessid ] [ E_MEMBERS ] [ i ] );
format( szLargeString, sizeof( szLargeString ), "UPDATE `BUSINESSES` SET `OWNER_ID`=%d,`NAME`='%s',`SUPPLIES`=%d,`PRODUCT`=%d,`MEMBERS`='%s',`PROD_TIMESTAMP`=%d,`BANK`=%d,`SECURITY`=%d WHERE `ID`=%d",
g_businessData[ businessid ] [ E_OWNER_ID ], mysql_escape( g_businessData[ businessid ] [ E_NAME ] ), g_businessData[ businessid ] [ E_SUPPLIES ], g_businessData[ businessid ] [ E_PRODUCT ],
members, g_businessData[ businessid ] [ E_PROD_TIMESTAMP ], g_businessData[ businessid ] [ E_BANK ], g_businessData[ businessid ] [ E_SECURITY_LEVEL ], businessid );
mysql_single_query( szLargeString );
return 1;
}
stock GetProductPrice( businessid, bool: hardened = false )
{
new Float: price, player_count = Iter_Count(Player);
// based on formula : https://i.gyazo.com/af5796ce25aee7c871adcddc5eb0a0ac.png
// calculate here : https://www.geogebra.org/m/eBHzJyKt
switch ( g_businessData[ businessid ] [ E_INTERIOR_TYPE ] )
{
// (10,125), (100,350)
case BUSINESS_WEAPON: price = 111487.4 * floatpower( 1.0115, player_count ); // 111.4874 * 1.0115^x for x in [25, 50, 75, 100, 125, 150]
// (10,50), (100,140)
case BUSINESS_COKE: price = 44595.0 * floatpower( 1.0115, player_count ); // 43.2117 * 1.0147^x for x in [25, 50, 75, 100, 125, 150]
// (10,18), (100,50)
case BUSINESS_METH: price = 16068.4 * floatpower( 1.0115, player_count ); // 15757.0 * 1.0134^x for x in [25, 50, 75, 100, 125, 150]
// (10,10), (100,28)
case BUSINESS_WEED: price = 8919.0 * floatpower( 1.0115, player_count ); // 8.909 * 1.0116^x for x in [25, 50, 75, 100, 125, 150]
}
// San Fierro Priority
static szCity[ MAX_ZONE_NAME ];
Get2DCity( szCity, g_businessData[ businessid ] [ E_X ], g_businessData[ businessid ] [ E_Y ], g_businessData[ businessid ] [ E_Z ] );
if ( strmatch( szCity, "San Fierro" ) ) {
price *= 1.10;
}
// hardened with vehicle, 25% more profit
if ( hardened ) {
price *= 1.25;
}
return floatround( price );
}
stock GetResupplyPrice( business_type )
{
return g_businessInteriorData[ business_type ] [ E_COST_PRICE ];
}
stock ShowBusinessTerminal( playerid )
{
new
businessid = p_InBusiness[ playerid ];
if ( ! Iter_Contains( business, businessid ) )
return SendError( playerid, "The server can't detect what business you're in. Re-enter the facility." );
if ( ! IsBusinessAssociate( playerid, businessid ) )
return SendError( playerid, "You're not an associate of this business." );
new
members = GetBusinessAssociates( businessid );
format( szBigString, sizeof( szBigString ), "Rename Business\t"COL_GREY"%s\nWithdraw Bank Money\t"COL_GREY"%s\nManage Members\t"COL_GREY"%d %s\nSell Inventory\t"COL_GREY"%d product\nResupply Business\t"COL_GREY"%d %s\nBusiness Upgrades\t ",
g_businessData[ businessid ] [ E_NAME ],
cash_format( g_businessData[ businessid ] [ E_BANK ] ),
members, members == 1 ? ( "member" ) : ( "members" ),
g_businessData[ businessid ] [ E_PRODUCT ],
g_businessData[ businessid ] [ E_SUPPLIES ], g_businessData[ businessid ] [ E_SUPPLIES ] == 1 ? ( "supply" ) : ( "supplies" )
);
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_TERMINAL, DIALOG_STYLE_TABLIST, ""COL_GREY"Business System", szBigString, "Select", "Cancel" );
}
stock ShowBusinessUpgrades( playerid, businessid )
{
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ];
/*format( szBigString, sizeof( szBigString ), "Security Level\t%s\nUpgrade Car\t"COL_GREY"%s\nUpgrade Air Vehicle\t"COL_GREY"%s\n",
g_businessSecurityData[ g_businessData[ businessid ] [ E_SECURITY_LEVEL ] ] [ E_LEVEL ], GetVehicleName( g_businessData[ businessid ] [ E_CAR_MODEL_ID ] ), GetVehicleName( g_businessData[ businessid ] [ E_HELI_MODEL_ID ] ) );*/
format( szBigString, sizeof( szBigString ), "Upgrade Car\t"COL_GREY"%s\nUpgrade Air Vehicle\t"COL_GREY"%s\n",
GetVehicleName( g_businessData[ businessid ] [ E_CAR_MODEL_ID ] ), GetVehicleName( g_businessData[ businessid ] [ E_HELI_MODEL_ID ] ) );
format( szBigString, sizeof( szBigString ), "%sUpgrade Production\t"COL_GREEN"%s\nAdd Member Slot\t"COL_GREEN"%s\n", szBigString,
g_businessData[ businessid ] [ E_UPGRADES ] >= 1 ? ( "MAXED" ) : ( cash_format( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) ), g_businessData[ businessid ] [ E_EXTRA_MEMBERS ] >= 4 ? ( "MAXED" ) : ( "$500,000" ) );
format( szBigString, sizeof( szBigString ), "%sAdd Nitrous To Car\t"COL_GREEN"%s\nAdd Gold Rims\t"COL_GREEN"%s\n", szBigString,
g_businessData[ businessid ] [ E_CAR_NOS ] ? ( "ADDED" ) : ( "$250,000" ), g_businessData[ businessid ] [ E_CAR_RIMS ] ? ( "ADDED" ) : ( "$250,000" ) );
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_UPGRADES, DIALOG_STYLE_TABLIST, ""COL_GREY"Business System", szBigString, "Select", "Back" );
}
stock IsBusinessAssociate( playerid, businessid )
{
if ( ! IsPlayerConnected( playerid ) )
return 0;
if ( businessid == -1 )
return 0;
new
accountid = p_AccountID[ playerid ];
if ( accountid == 0 )
return 0;
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ )
if ( g_businessData[ businessid ] [ E_MEMBERS ] [ i ] == accountid )
return 1;
return g_businessData[ businessid ] [ E_OWNER_ID ] == accountid;
}
stock SetRandomDropoffLocation( playerid, businessid, bool: heli = false )
{
static const
Float: g_helicopterSpawns[ 3 ] [ 3 ] [ 4 ] =
{
// san fierro
{ { -1279.6904, -8.909900, 14.4117, 113.0514 }, { -1475.6725, -172.7831, 14.3233, 107.4014 }, { -1480.9645, -561.67210, 14.3281, 224.6014 } },
// las ventuas
{ { 1570.4276, 1473.7267, 11.07640, 94.42440 }, { 1551.9801, 1428.9448, 11.03680, 87.83020 }, { 1310.77920, 1400.50050, 11.3766, 214.995 } },
// los santos
{ { 1914.0532, -2339.2131, 13.8111, 162.1368 }, { 2023.2230, -2436.9309, 13.7232, 73.29400 }, { 1828.49350, -2420.6563, 13.9001, 121.6646 } }
}
;
static
szLocation[ MAX_ZONE_NAME ], city_id;
// figure the city of the business
Get2DCity( szLocation, g_businessData[ businessid ] [ E_X ], g_businessData[ businessid ] [ E_Y ], g_businessData[ businessid ] [ E_Z ] );
// assign index
if ( strmatch( szLocation, "Las Venturas" ) )
city_id = 1;
else if ( strmatch( szLocation, "Los Santos" ) )
city_id = 2;
else
city_id = 0;
// create checkpoints etc
if ( ! heli )
{
new
Float: nodeX, Float: nodeY, Float: nodeZ, Float: nextX, Float: nextY,
nodeid = NearestNodeFromPoint( g_businessData[ businessid ] [ E_X ], g_businessData[ businessid ] [ E_Y ], g_businessData[ businessid ] [ E_Z ] ),
nextNodeid = NearestNodeFromPoint( g_businessData[ businessid ] [ E_X ], g_businessData[ businessid ] [ E_Y ], g_businessData[ businessid ] [ E_Z ], 9999.9, nodeid )
;
GetNodePos( nextNodeid, nextX, nextY, nodeZ );
GetNodePos( nodeid, nodeX, nodeY, nodeZ );
new
business_car = GetBusinessCarModelIndex( g_businessData[ businessid ] [ E_CAR_MODEL_ID ] ),
Float: rotation = atan2( nextY - nodeY, nextX - nodeX ) - 90.0
;
g_businessVehicle[ businessid ] = CreateVehicle( g_businessCarModelData[ business_car ] [ E_MODEL ], nodeX, nodeY, nodeZ, rotation, 3, 3, -1 );
if ( g_businessCarModelData[ business_car ] [ E_OBJECT_MODEL ] != 0 ) {
g_businessData[ businessid ] [ E_VEHICLE_DECOR ] = CreateDynamicObject( g_businessCarModelData[ business_car ] [ E_OBJECT_MODEL ], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 );
AttachDynamicObjectToVehicle( g_businessData[ businessid ] [ E_VEHICLE_DECOR ], g_businessVehicle[ businessid ], g_businessCarModelData[ business_car ] [ E_O_X ], g_businessCarModelData[ business_car ] [ E_O_Y ], g_businessCarModelData[ business_car ] [ E_O_Z ], g_businessCarModelData[ business_car ] [ E_O_RX ], g_businessCarModelData[ business_car ] [ E_O_RY ], g_businessCarModelData[ business_car ] [ E_O_RZ ] );
}
else g_businessData[ businessid ] [ E_VEHICLE_DECOR ] = INVALID_OBJECT_ID;
// just incase of index bug
if ( g_businessVehicle[ businessid ] )
{
g_isBusinessVehicle[ g_businessVehicle[ businessid ] ] = businessid;
// add nos
if ( g_businessData[ businessid ] [ E_CAR_NOS ] ) {
AddVehicleComponent( g_businessVehicle[ businessid ], 1010 );
}
// gold rim
if ( g_businessData[ businessid ] [ E_CAR_RIMS ] ) {
AddVehicleComponent( g_businessVehicle[ businessid ], 1080 );
}
if ( g_businessCarModelData[ business_car ] [ E_BOOT_OPEN ] ) {
GetVehicleParamsEx( g_businessVehicle[ businessid ], engine, lights, alarm, doors, bonnet, boot, objective );
SetVehicleParamsEx( g_businessVehicle[ businessid ], engine, lights, alarm, doors, bonnet, VEHICLE_PARAMS_ON, objective );
}
}
// create new drop locations
new
ignore_drop_ids[ sizeof( g_roadBusinessExportData[ ] ) ] = { -1, ... };
for ( new x = 0; x < MAX_DROPS; x ++ )
{
new
drop_off_index = randomExcept( ignore_drop_ids, sizeof( ignore_drop_ids ) );
// so we get random drops always
ignore_drop_ids[ drop_off_index ] = drop_off_index;
// clear them incase
g_businessData[ businessid ] [ E_EXPORTED ] [ x ] = false;
DestroyDynamicMapIcon( g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ] );
DestroyDynamicRaceCP( g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ] );
DestroyDynamicArea( g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ x ] );
// assign indexes (used for dropping the shit off)
g_businessData[ businessid ] [ E_EXPORT_CITY ] = city_id;
g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index;
// map icons, cp, areas
g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ] = CreateDynamicMapIcon( g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 0 ], g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 1 ], g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 2 ], 19, -1, -1, -1, 0, 6000.0, MAPICON_GLOBAL );
g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ] = CreateDynamicRaceCP( 1, g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 0 ], g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 1 ], g_roadBusinessExportData[ city_id ] [ drop_off_index ] [ 2 ], 0, 0, 0, 5.0, -1, -1, 0 );
// reset players in map icon/cp
Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ], E_STREAMER_PLAYER_ID, 0 );
Streamer_RemoveArrayData( STREAMER_TYPE_RACE_CP, g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ], E_STREAMER_PLAYER_ID, 0 );
// stream to players
foreach (new i : Player) if ( IsBusinessAssociate( i, businessid ) ) {
Streamer_AppendArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ x ], E_STREAMER_PLAYER_ID, i );
Streamer_AppendArrayData( STREAMER_TYPE_RACE_CP, g_businessData[ businessid ] [ E_EXPORT_CP ] [ x ], E_STREAMER_PLAYER_ID, i );
}
}
// alert player
ShowPlayerHelpDialog( playerid, 5000, "Exit the facility and enter the business vehicle marked outside." );
SendGlobalMessage( COLOR_GREY, "[BUSINESS]"COL_WHITE" %s(%d) has begun transporting "COL_GOLD"%s"COL_WHITE" of business product!", ReturnPlayerName( playerid ), playerid, cash_format( g_businessData[ businessid ] [ E_EXPORT_VALUE ] * ( MAX_DROPS - g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] ) ) );
}
else
{
// create the heli
new
business_heli = GetBusinessAirModelIndex( g_businessData[ businessid ] [ E_HELI_MODEL_ID ] ),
random_index = random( sizeof( g_helicopterSpawns[ ] ) )
;
g_businessVehicle[ businessid ] = CreateVehicle( g_businessAirModelData[ business_heli ] [ E_MODEL ], g_helicopterSpawns[ city_id ] [ random_index ] [ 0 ], g_helicopterSpawns[ city_id ] [ random_index ] [ 1 ], g_helicopterSpawns[ city_id ] [ random_index ] [ 2 ], g_helicopterSpawns[ city_id ] [ random_index ] [ 3 ], -1, -1, -1 );
if ( g_businessVehicle[ businessid ] ) {
g_isBusinessVehicle[ g_businessVehicle[ businessid ] ] = businessid;
}
// map icon to heli
g_businessData[ businessid ] [ E_EXPORT_ICON ] [ 0 ] = CreateDynamicMapIcon( g_helicopterSpawns[ city_id ] [ random_index ] [ 0 ], g_helicopterSpawns[ city_id ] [ random_index ] [ 1 ], g_helicopterSpawns[ city_id ] [ random_index ] [ 2 ], 5, -1, -1, -1, 0, 6000.0, MAPICON_GLOBAL );
// reset players in map icon/cp
Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ 0 ], E_STREAMER_PLAYER_ID, 0 );
// stream to players
foreach (new i : Player) if ( IsBusinessAssociate( i, businessid ) ) {
Streamer_AppendArrayData( STREAMER_TYPE_MAP_ICON, g_businessData[ businessid ] [ E_EXPORT_ICON ] [ 0 ], E_STREAMER_PLAYER_ID, i );
}
// destroy cp, unnused
DestroyDynamicRaceCP( g_businessData[ businessid ] [ E_EXPORT_CP ] [ 0 ] ), g_businessData[ businessid ] [ E_EXPORT_CP ] [ 0 ] = -1;
// alert
ShowPlayerHelpDialog( playerid, 5000, "Exit the facility and go to your local airport." );
}
return 1;
}
stock StopBusinessExportMission( businessid )
{
new
vehicleid = g_businessVehicle[ businessid ], modelid = GetVehicleModel( vehicleid );
// reset variables
for ( new i = 0; i < MAX_DROPS; i ++ ) {
g_businessData[ businessid ] [ E_EXPORTED ] [ i ] = false;
DestroyDynamicMapIcon( g_businessData[ businessid ] [ E_EXPORT_ICON ] [ i ] ), g_businessData[ businessid ] [ E_EXPORT_ICON ] [ i ] = -1;
DestroyDynamicRaceCP( g_businessData[ businessid ] [ E_EXPORT_CP ] [ i ] ), g_businessData[ businessid ] [ E_EXPORT_CP ] [ i ] = -1;
DestroyDynamicArea( g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ i ] ), g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ i ] = -1;
}
// export stop
g_businessData[ businessid ] [ E_EXPORT_STARTED ] = 0;
g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ] = 0;
// destroy vehicle
DestroyVehicle( g_businessVehicle[ businessid ] ), g_businessVehicle[ businessid ] = INVALID_VEHICLE_ID;
DestroyDynamicObject( g_businessData[ businessid ] [ E_VEHICLE_DECOR ] ), g_businessData[ businessid ] [ E_VEHICLE_DECOR ] = INVALID_OBJECT_ID;
// reset vehicle variable if needed
if ( vehicleid != INVALID_VEHICLE_ID )
g_isBusinessVehicle[ vehicleid ] = -1;
// slap the player in the heli high and stop the mission
foreach (new playerid : Player) if ( IsPlayerInVehicle( playerid, vehicleid ) && IsBusinessAerialVehicle( businessid, modelid ) ) {
SyncObject( playerid, 0.0, 0.0, 250.0 );
GivePlayerWeapon( playerid, 46, 1 );
}
}
stock SellBusinessProduct( playerid, businessid, locationid )
{
// destroy checkpoint
g_businessData[ businessid ] [ E_EXPORTED ] [ locationid ] = true;
DestroyDynamicMapIcon( g_businessData[ businessid ] [ E_EXPORT_ICON ] [ locationid ] ), g_businessData[ businessid ] [ E_EXPORT_ICON ] [ locationid ] = -1;
DestroyDynamicRaceCP( g_businessData[ businessid ] [ E_EXPORT_CP ] [ locationid ] ), g_businessData[ businessid ] [ E_EXPORT_CP ] [ locationid ] = -1;
DestroyDynamicArea( g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ locationid ] ), g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ locationid ] = -1;
// count drugs exported
new
drugsSold = ++ g_businessData[ businessid ] [ E_EXPORTED_AMOUNT ];
// award business
new
product_amount = g_businessData[ businessid ] [ E_EXPORT_VALUE ];
g_businessData[ businessid ] [ E_BANK ] += product_amount;
UpdateBusinessData( businessid );
UpdateBusinessProductionLabel( businessid );
//GivePlayerExperience( playerid, E_TRANSPORT );
GivePlayerScore( playerid, 2 );
GivePlayerWantedLevel( playerid, 6 );
SendServerMessage( playerid, "You have successfully exported "COL_GOLD"%s"COL_WHITE" worth of product. "COL_ORANGE"(%d/%d)", cash_format( product_amount ), drugsSold, MAX_DROPS );
// calculate if it was the last batch
if ( drugsSold == MAX_DROPS )
{
new
business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ],
profit = ( product_amount - g_businessInteriorData[ business_type ] [ E_COST_PRICE ] ) * MAX_DROPS
;
// P&L
SendServerMessage( playerid, "You have completed selling all business product. Total profit %s%s"COL_WHITE".", profit > 0 ? ( COL_GREEN ) : ( COL_RED ), cash_format( profit ) );
// Destroy checkpoint and vehicle
StopBusinessExportMission( businessid );
}
// just send alerts fuck it
SendGlobalMessage( COLOR_GREY, "[BUSINESS]"COL_WHITE" %s(%d) has dropped off their %d%s batch of drugs for "COL_GOLD"%s"COL_WHITE"!", ReturnPlayerName( playerid ), playerid, drugsSold, positionToString( drugsSold ), cash_format( product_amount ) );
}
stock ShowBusinessMembers( playerid, businessid )
{
new
szMembers[ 96 ] = "0";
for ( new i = 0; i < MAX_BUSINESS_MEMBERS; i ++ ) if ( g_businessData[ businessid ] [ E_MEMBERS ] [ i ] ) {
format( szMembers, sizeof( szMembers ), "%s,%d", szMembers, g_businessData[ businessid ] [ E_MEMBERS ] [ i ] );
}
format( szBigString, sizeof( szBigString ), "SELECT `NAME` FROM `USERS` WHERE `ID` IN (%s)", szMembers );
mysql_function_query( dbHandle, szBigString, true, "OnShowBusinessMembers", "dd", playerid, businessid );
return 1;
}
function OnShowBusinessMembers( playerid, businessid )
{
new
rows, fields, member[ MAX_PLAYER_NAME ];
cache_get_data( rows, fields );
if ( rows )
{
szBigString = ""COL_GREY"Add a new member...\n";
for( new i = 0; i < rows; i++ )
{
// get member name
cache_get_field_content( i, "NAME", member, sizeof( member ) );
format( szBigString, sizeof( szBigString ), "%s%s\n", szBigString, member );
}
ShowPlayerDialog( playerid, DIALOG_BUSINESS_MEMBERS, DIALOG_STYLE_LIST, ""COL_GREY"Business System", szBigString, "Kick", "Back" );
}
else
{
SendServerMessage( playerid, "Couldn't find any members for the business, add one if you desire." );
ShowPlayerDialog( playerid, DIALOG_BUSINESS_ADD_MEMBER, DIALOG_STYLE_INPUT, ""COL_GREY"Business System", ""COL_WHITE"Type the name of the player you wish to add as a member.", "Add", "Back" );
}
}
stock GetBusinessCarModelIndex( modelid ) {
new
index = 0;
for( new i = 0; i < sizeof( g_businessCarModelData ); i ++ ) if ( g_businessCarModelData[ i ] [ E_MODEL ] == modelid ) {
index = i;
break;
}
return index;
}
stock GetBusinessAirModelIndex( modelid ) {
new
index = 0;
for( new i = 0; i < sizeof( g_businessAirModelData ); i ++ ) if ( g_businessAirModelData[ i ] [ E_MODEL ] == modelid ) {
index = i;
break;
}
return index;
}
stock IsBusinessAerialVehicle( businessid, vehicleid ) {
return ( vehicleid == g_businessData[ businessid ] [ E_HELI_MODEL_ID ] );
}
/*stock ShowBusinessSecurityUpgrades( playerid, businessid )
{
new business_type = g_businessData[ businessid ] [ E_INTERIOR_TYPE ], security_cost;
new security[ 400 ] = ""COL_WHITE"Security Level\t"COL_WHITE"Protection\t"COL_WHITE"Price\n";
format( security, sizeof( security ), "%s"COL_RED"NONE\t25%s Safe Security + 50%s chance of breaking in\t"COL_GOLD"$0\n", security, "%", "%" );
security_cost = floatround( float( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) * g_businessSecurityData[ 1 ] [ E_COST_MULTIPLIER ] );
format( security, sizeof( security ), "%s"COL_ORANGE"LOW\t50%s Safe Security + 25%s chance of breaking in\t"COL_GOLD"%s\n", security, "%", "%", cash_format( security_cost ) );
security_cost = floatround( float( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) * g_businessSecurityData[ 2 ] [ E_COST_MULTIPLIER ] );
format( security, sizeof( security ), "%s"COL_YELLOW"MEDIUM\t75%s Safe Security + 10.0%s chance of breaking in\t"COL_GOLD"%s\n", security, "%", "%", cash_format( security_cost ) );
security_cost = floatround( float( g_businessInteriorData[ business_type ] [ E_UPGRADE_COST ] ) * g_businessSecurityData[ 3 ] [ E_COST_MULTIPLIER ] );
format( security, sizeof( security ), "%s"COL_GREEN"HIGH\t100%s Safe Security + 0.0%s chance of breaking in\t"COL_GOLD"%s\n", security, "%", "%", cash_format( security_cost ) );
return ShowPlayerDialog( playerid, DIALOG_BUSINESS_SECURITY, DIALOG_STYLE_TABLIST_HEADERS, ""COL_GREY"Business System", security, "Purchase", "Back" );
}*/
2018-10-01 04:18:16 +00:00
stock GetOnlineBusinessAssociates( businessid, &members = 0, playerid = -1 ) {
foreach ( new i : Player ) if ( playerid != i && IsBusinessAssociate( i, businessid ) ) {
members ++;
}
}