Merged hardpoint into master

This commit is contained in:
Lorenc Pekaj 2018-11-10 18:01:07 +11:00
commit 2117e37235
10 changed files with 1189 additions and 761 deletions

View File

@ -38,3 +38,7 @@
- Called when a gang is loaded - Called when a gang is loaded
- `OnGangUnload( gangid, bool: deleted )` - `OnGangUnload( gangid, bool: deleted )`
- Called when a gang is unloaded (or deleted) - Called when a gang is unloaded (or deleted)
- `OnPlayerJoinGang( playerid, gangid )`
- Called when a player joins a gang
- `OnPlayerLeaveGang( playerid, gangid, reason )`
- Called when a player leaves a gang

View File

@ -442,7 +442,7 @@ hook OnPlayerDriveVehicle( playerid, vehicleid )
g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index; g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index;
// map icons, cp, areas // 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_ICON ] [ x ] = CreateDynamicMapIcon( g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 2 ], 53, -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_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 ); g_businessData[ businessid ] [ E_EXPORT_CIRCLE ] [ x ] = CreateDynamicCircle( g_airBusinessExportData[ city ] [ drop_off_index ] [ 0 ], g_airBusinessExportData[ city ] [ drop_off_index ] [ 1 ], 15.0 );
@ -1787,7 +1787,7 @@ stock SetRandomDropoffLocation( playerid, businessid, bool: heli = false )
g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index; g_businessData[ businessid ] [ E_EXPORT_INDEX ] [ x ] = drop_off_index;
// map icons, cp, areas // 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_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 ], 53, -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 ); 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 // reset players in map icon/cp

View File

@ -799,7 +799,7 @@ stock DestroyGang( gangid, bool: soft_delete, bool: iter_remove = true )
g_gangData[ gangid ] [ E_SQL_ID ] = 0; g_gangData[ gangid ] [ E_SQL_ID ] = 0;
g_gangData[ gangid ] [ E_LEADER ] = 0; g_gangData[ gangid ] [ E_LEADER ] = 0;
g_gangData[ gangid ] [ E_SOFT_DELETE_TS ] = 0; g_gangData[ gangid ] [ E_SOFT_DELETE_TS ] = 0;
g_gangData[ gangid ] [ E_COLOR ] = COLOR_GANGZONE; g_gangData[ gangid ] [ E_COLOR ] = g_gangColors[ random( sizeof( g_gangColors ) ) ];
g_gangData[ gangid ] [ E_NAME ] [ 0 ] = '\0'; g_gangData[ gangid ] [ E_NAME ] [ 0 ] = '\0';
g_gangData[ gangid ] [ E_BANK ] = 0; g_gangData[ gangid ] [ E_BANK ] = 0;
g_gangData[ gangid ] [ E_RESPECT ] = 0; g_gangData[ gangid ] [ E_RESPECT ] = 0;
@ -985,6 +985,7 @@ stock SetPlayerGang( playerid, joining_gang )
if ( GetPlayerWantedLevel( playerid ) < 1 ) SetPlayerColor( playerid, g_gangData[ joining_gang ] [ E_COLOR ] ); if ( GetPlayerWantedLevel( playerid ) < 1 ) SetPlayerColor( playerid, g_gangData[ joining_gang ] [ E_COLOR ] );
mysql_single_query( sprintf( "UPDATE `USERS` SET `GANG_ID`=%d WHERE `ID`=%d", g_gangData[ joining_gang ] [ E_SQL_ID ], GetPlayerAccountID( playerid ) ) ); mysql_single_query( sprintf( "UPDATE `USERS` SET `GANG_ID`=%d WHERE `ID`=%d", g_gangData[ joining_gang ] [ E_SQL_ID ], GetPlayerAccountID( playerid ) ) );
SendClientMessageToGang( joining_gang, g_gangData[ joining_gang ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) has joined the gang.", ReturnPlayerName( playerid ), playerid ); SendClientMessageToGang( joining_gang, g_gangData[ joining_gang ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) has joined the gang.", ReturnPlayerName( playerid ), playerid );
CallLocalFunction( "OnPlayerJoinGang", "dd", playerid, joining_gang );
return 1; return 1;
} }
@ -1007,7 +1008,7 @@ stock SetGangColorsToGang( gangid )
foreach ( new i : Player ) foreach ( new i : Player )
{ {
// refresh player turfs // refresh player turfs
Turf_RedrawPlayerGangZones( i, gangid ); Turf_RedrawPlayerGangZones( i );
// set new colour of player // set new colour of player
if ( p_GangID[ i ] == gangid && p_WantedLevel[ i ] <= 0 && p_Class[ i ] == CLASS_CIVILIAN ) { if ( p_GangID[ i ] == gangid && p_WantedLevel[ i ] <= 0 && p_Class[ i ] == CLASS_CIVILIAN ) {
@ -1018,10 +1019,12 @@ stock SetGangColorsToGang( gangid )
stock ReturnGangName( i ) stock ReturnGangName( i )
{ {
static new
szGang[ 30 ]; szGang[ 30 ] = "Unknown";
if ( i == INVALID_GANG_ID || !Iter_Contains( gangs, i ) ) szGang = "Unoccupied";
else format( szGang, sizeof( szGang ), "%s", g_gangData[ i ] [ E_NAME ] ); if ( IsValidGangID( i ) ) {
format( szGang, sizeof( szGang ), "%s", g_gangData[ i ] [ E_NAME ] );
}
return szGang; return szGang;
} }

View File

@ -22,7 +22,7 @@
/* ** Macros ** */ /* ** Macros ** */
#define IsValidGangVehicle(%0,%1) \ #define IsValidGangVehicle(%0,%1) \
( 0 <= %1 < MAX_GANG_VEHICLES && Iter_Contains( gangvehicles<%0>, %1 ) ) ( 0 <= %1 < MAX_GANG_VEHICLES && Iter_Contains( gangvehicles[%0], %1 ) )
/* ** Constants ** */ /* ** Constants ** */
static const GANG_VEHICLE_PRICE_FACTOR = 4; static const GANG_VEHICLE_PRICE_FACTOR = 4;
@ -38,10 +38,16 @@ enum E_GANG_VEHICLE_DATA
new g_gangVehicleData [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ E_GANG_VEHICLE_DATA ]; new g_gangVehicleData [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ E_GANG_VEHICLE_DATA ];
new g_gangVehicleModifications [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ MAX_CAR_MODS ]; new g_gangVehicleModifications [ MAX_GANGS ] [ MAX_GANG_VEHICLES ] [ MAX_CAR_MODS ];
new Iterator: gangvehicles < MAX_GANGS, MAX_GANG_VEHICLES >; new Iterator: gangvehicles [ MAX_GANGS ] < MAX_GANG_VEHICLES >;
new bool: g_gangVehicle [ MAX_VEHICLES char ]; new bool: g_gangVehicle [ MAX_VEHICLES char ];
/* ** Hooks ** */ /* ** Hooks ** */
hook OnScriptInit( )
{
Iter_Init( gangvehicles ); // reset the gang vehicles iterator
return 1;
}
hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] ) hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
{ {
new new
@ -61,7 +67,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
// spawn vehicle // spawn vehicle
case 0: case 0:
{ {
if ( ! Iter_Count( gangvehicles< gangid > ) ) { if ( ! Iter_Count( gangvehicles[ gangid ] ) ) {
SendError( playerid, "This gang does not have any vehicles purchased." ); SendError( playerid, "This gang does not have any vehicles purchased." );
return ShowPlayerGangVehicleMenu( playerid, facilityid ); return ShowPlayerGangVehicleMenu( playerid, facilityid );
} }
@ -75,7 +81,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
// sell vehicle // sell vehicle
case 2: case 2:
{ {
if ( ! Iter_Count( gangvehicles< gangid > ) ) { if ( ! Iter_Count( gangvehicles[ gangid ] ) ) {
SendError( playerid, "This gang does not have any vehicles purchased." ); SendError( playerid, "This gang does not have any vehicles purchased." );
return ShowPlayerGangVehicleMenu( playerid, facilityid ); return ShowPlayerGangVehicleMenu( playerid, facilityid );
} }
@ -87,7 +93,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
szBigString = ""COL_WHITE"Vehicle\t"COL_WHITE"Sell Price\n"; szBigString = ""COL_WHITE"Vehicle\t"COL_WHITE"Sell Price\n";
foreach ( new slotid : gangvehicles< gangid > ) foreach ( new slotid : gangvehicles[ gangid ] )
{ {
new new
sell_price = ( GetBuyableVehiclePrice( g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] ) * GANG_VEHICLE_PRICE_FACTOR ) / 2; sell_price = ( GetBuyableVehiclePrice( g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] ) * GANG_VEHICLE_PRICE_FACTOR ) / 2;
@ -115,7 +121,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
new new
x = 0; x = 0;
foreach ( new slotid : gangvehicles< gangid > ) foreach ( new slotid : gangvehicles[ gangid ] )
{ {
if ( x == listitem ) if ( x == listitem )
{ {
@ -184,7 +190,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
} }
new new
num_vehicles = Iter_Count( gangvehicles< gangid > ); num_vehicles = Iter_Count( gangvehicles[ gangid ] );
if ( num_vehicles >= MAX_GANG_VEHICLES ) { if ( num_vehicles >= MAX_GANG_VEHICLES ) {
ShowPlayerDialog( playerid, DIALOG_GANG_VD_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Vehicles - Purchase", "Purchase This Vehicle\nPreview Vehicle", "Select", "Back" ); ShowPlayerDialog( playerid, DIALOG_GANG_VD_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Vehicles - Purchase", "Purchase This Vehicle\nPreview Vehicle", "Select", "Back" );
@ -273,7 +279,7 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
new new
x = 0; x = 0;
foreach ( new slotid : gangvehicles< gangid > ) foreach ( new slotid : gangvehicles[ gangid ] )
{ {
if ( x == listitem ) if ( x == listitem )
{ {
@ -344,9 +350,9 @@ hook OnGangLoad( gangid )
hook OnGangUnload( gangid, bool: deleted ) hook OnGangUnload( gangid, bool: deleted )
{ {
foreach ( new slotid : gangvehicles< gangid > ) { foreach ( new slotid : gangvehicles[ gangid ] ) {
RemoveGangVehicle( gangid, slotid ); RemoveGangVehicle( gangid, slotid );
Iter_SafeRemove( gangvehicles< gangid >, slotid, slotid ); Iter_SafeRemove( gangvehicles[ gangid ], slotid, slotid );
} }
return 1; return 1;
} }
@ -529,7 +535,7 @@ thread GangVehicles_InsertVehicle( gangid, slotid ) {
stock CreateGangVehicle( gangid, modelid, color1 = -1, color2 = -1, paintjob = 3, sql_id = -1 ) stock CreateGangVehicle( gangid, modelid, color1 = -1, color2 = -1, paintjob = 3, sql_id = -1 )
{ {
new new
slotid = Iter_Free( gangvehicles< gangid > ); slotid = Iter_Free( gangvehicles[ gangid ] );
if ( slotid != ITER_NONE ) if ( slotid != ITER_NONE )
{ {
@ -549,24 +555,24 @@ stock CreateGangVehicle( gangid, modelid, color1 = -1, color2 = -1, paintjob = 3
} }
ResetGangVehicleMods( gangid, slotid ); ResetGangVehicleMods( gangid, slotid );
Iter_Add( gangvehicles< gangid >, slotid ); Iter_Add( gangvehicles[ gangid ], slotid );
} }
return slotid; return slotid;
} }
stock DestroyGangVehicle( gangid, slotid ) stock DestroyGangVehicle( gangid, slotid )
{ {
if ( Iter_Contains( gangvehicles< gangid >, slotid ) ) { if ( Iter_Contains( gangvehicles[ gangid ], slotid ) ) {
RemoveGangVehicle( gangid, slotid ); RemoveGangVehicle( gangid, slotid );
mysql_single_query( sprintf( "DELETE FROM `GANG_VEHICLES` WHERE `ID` = %d", g_gangVehicleData[ gangid ] [ slotid ] [ E_SQL_ID ] ) ); mysql_single_query( sprintf( "DELETE FROM `GANG_VEHICLES` WHERE `ID` = %d", g_gangVehicleData[ gangid ] [ slotid ] [ E_SQL_ID ] ) );
Iter_Remove( gangvehicles< gangid >, slotid ); Iter_Remove( gangvehicles[ gangid ], slotid );
} }
return 0; return 0;
} }
stock RemoveGangVehicle( gangid, slotid ) stock RemoveGangVehicle( gangid, slotid )
{ {
if ( Iter_Contains( gangvehicles< gangid >, slotid ) ) { if ( Iter_Contains( gangvehicles[ gangid ], slotid ) ) {
if ( g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ] != -1 ) { if ( g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ] != -1 ) {
g_gangVehicle{ g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ] } = false; g_gangVehicle{ g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ] } = false;
} }
@ -581,7 +587,7 @@ stock SpawnGangVehicle( gangid, slotid, Float: X, Float: Y, Float: Z, Float: RZ
new new
vehicleid = 0; vehicleid = 0;
if ( Iter_Contains( gangvehicles< gangid >, slotid ) ) if ( Iter_Contains( gangvehicles[ gangid ], slotid ) )
{ {
// reset special data // reset special data
ResetVehicleMethlabData( g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ], true ); ResetVehicleMethlabData( g_gangVehicleData[ gangid ] [ slotid ] [ E_VEHICLE_ID ], true );
@ -659,7 +665,7 @@ static stock GangVehicles_ShowBuyableList( playerid, type_id )
stock GetGangVehicleData( vehicleid, &gangid, &slotid ) { stock GetGangVehicleData( vehicleid, &gangid, &slotid ) {
foreach ( new g : gangs ) { foreach ( new g : gangs ) {
foreach ( new v : gangvehicles< g > ) if ( g_gangVehicleData[ g ] [ v ] [ E_VEHICLE_ID ] == vehicleid ) { foreach ( new v : gangvehicles[ g ] ) if ( g_gangVehicleData[ g ] [ v ] [ E_VEHICLE_ID ] == vehicleid ) {
gangid = g; gangid = g;
slotid = v; slotid = v;
break; break;
@ -673,7 +679,7 @@ static stock GangVehicles_ShowSpawnList( playerid, gangid ) {
szBigString = ""COL_WHITE"Vehicle\t"COL_WHITE"Availablity\n"; szBigString = ""COL_WHITE"Vehicle\t"COL_WHITE"Availablity\n";
foreach ( new slotid : gangvehicles< gangid > ) foreach ( new slotid : gangvehicles[ gangid ] )
{ {
format( szBigString, sizeof( szBigString ), "%s%s\t%s\n", szBigString, format( szBigString, sizeof( szBigString ), "%s%s\t%s\n", szBigString,
GetVehicleName( g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] ), GetVehicleName( g_gangVehicleData[ gangid ] [ slotid ] [ E_MODEL ] ),

View File

@ -19,367 +19,44 @@
#define TAKEOVER_NEEDED_PEOPLE ( 1 ) #define TAKEOVER_NEEDED_PEOPLE ( 1 )
/* #define COLOR_GANGZONE 0x00000080
Mean (μ): 61551.012315113 #define COLOR_HARDPOINT 0xFF000080
Median: 38190.51
Modes: 36520.39 56000.00
Lowest value: 1561.59
Highest value: 663634.31
Range: 662072.72
Interquartile range: 54438.43
First quartile: 19224.91
Third quartile: 73663.34
Variance (σ2): 5620059337.0135
Standard deviation (σ): 74967.055010941
Quartile deviation: 27219.215
Mean absolute deviation (MAD): 47203.259159645
*/
#define TURF_SIZE_SMALL 19224.91 /* ** Macros ** */
#define TURF_SIZE_LARGE 73663.34 #define ShowHardpointIconForPlayer(%0) \
Streamer_AppendArrayData( STREAMER_TYPE_MAP_ICON, g_gangHardpointMapIcon, E_STREAMER_PLAYER_ID, %0 )
#define HideHardpointIconForPlayer(%0) \
Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_gangHardpointMapIcon, E_STREAMER_PLAYER_ID, %0 )
/* ** Variables ** */ /* ** Variables ** */
enum e_GANG_ZONE_DATA enum e_GANG_ZONE_DATA
{ {
E_NAME[ 16 ],
Float: E_MIN_X, Float: E_MIN_X,
Float: E_MIN_Y, Float: E_MIN_Y,
Float: E_MAX_X, Float: E_MAX_X,
Float: E_MAX_Y, Float: E_MAX_Y,
Float: E_SIZE,
E_CITY E_CITY
}; };
new const static const
g_gangzoneData[ ] [ e_GANG_ZONE_DATA ] = g_gangzoneData[ ] [ e_GANG_ZONE_DATA ] =
{ {
{ "SF-CITY", -2076.0, 1036.5, -1873.0, 1088.5, TURF_SIZE_LARGE, CITY_SF }, { -1725.0, 1301.5, -1538.0, 1437.5, CITY_SF },
{ "SF-CITY", -2014.0, 937.5, -1873.0, 1036.5, TURF_SIZE_LARGE, CITY_SF }, { -2868.0, 1012.5, -2768.0, 1217.5, CITY_SF },
{ "SF-CITY", -2014.0, 829.5, -1886.0, 937.5, TURF_SIZE_LARGE, CITY_SF }, { -2497.0, 932.5, -2392.0, 1069.5, CITY_SF },
{ "SF-CITY", -1873.0, 937.5, -1787.0, 1112.5, TURF_SIZE_LARGE, CITY_SF }, { -2054.0, 1084.5, -1892.0, 1171.5, CITY_SF },
{ "SF-CITY", -2014.0, 719.5, -1886.0, 829.5, TURF_SIZE_LARGE, CITY_SF }, { -1569.0, 822.5, -1418.0, 1019.5, CITY_SF },
{ "SF-CITY", -1886.0, 829.5, -1788.0, 937.5, TURF_SIZE_LARGE, CITY_SF }, { -2088.0, 570.5, -2010.0, 728.5, CITY_SF },
{ "SF-CITY", -1886.0, 719.5, -1788.0, 829.5, TURF_SIZE_LARGE, CITY_SF }, { -2526.0, 571.5, -2391.0, 705.5, CITY_SF },
{ "SF-CITY", -1788.0, 829.5, -1723.0, 937.5, TURF_SIZE_LARGE, CITY_SF }, { -2766.0, 324.5, -2651.0, 426.5, CITY_SF },
{ "SF-CITY", -1723.0, 829.5, -1642.0, 937.5, TURF_SIZE_LARGE, CITY_SF }, { -2386.0, 70.5, -2273.0, 227.5, CITY_SF },
{ "SF-CITY", -1642.0, 829.5, -1564.0, 937.5, TURF_SIZE_LARGE, CITY_SF }, { -2139.0, 115.5, -2013.0, 311.5, CITY_SF },
{ "SF-CITY", -1564.0, 828.5, -1421.0, 1015.5, TURF_SIZE_LARGE, CITY_SF }, { -2001.0, 69.5, -1911.0, 219.5, CITY_SF },
{ "SF-CITY", -1667.0, 720.5, -1563.0, 829.5, TURF_SIZE_LARGE, CITY_SF }, { -2096.0, -279.5, -2011.0, -111.5, CITY_SF },
{ "SF-CITY", -1788.0, 719.5, -1667.0, 829.5, TURF_SIZE_LARGE, CITY_SF }, { -2523.0, -321.5, -2264.0, -215.5, CITY_SF },
{ "SF-CITY", -1787.0, 935.5, -1704.0, 1037.5, TURF_SIZE_LARGE, CITY_SF }, { -2153.0, -515.5, -1960.0, -374.5, CITY_SF },
{ "SF-CITY", -1787.0, 1037.5, -1704.0, 1112.5, TURF_SIZE_LARGE, CITY_SF }, { -2000.0, 853.5, -1904.0, 913.5, CITY_SF }
{ "SF-CITY", -2130.0, 816.5, -2014.0, 1036.5, TURF_SIZE_LARGE, CITY_SF }
/*{ "ELS3c", 2381.677, -1494.030, 2421.030, -1454.348, 1561.60, CITY_LS },
{ "LVA5", 1236.630, 1163.410, 1277.050, 1203.280, 1611.54, CITY_LV },
{ "BINT3", 1277.050, 1044.687, 1315.348, 1087.630, 1644.62, CITY_LV },
{ "SUN3c", 1252.328, -926.999, 1357.000, -910.169, 1761.63, CITY_LS },
{ "LVA4", 1315.348, 1044.687, 1375.598, 1087.630, 2587.31, CITY_LV },
{ "LFL1a", 2581.729, -1454.348, 2632.830, -1393.420, 3113.48, CITY_LS },
{ "LDT1a", 1370.848, -1170.869, 1463.900, -1130.848, 3724.03, CITY_LS },
{ "ESPE1", -1620.300, 1176.520, -1580.010, 1274.260, 3937.94, CITY_SF },
{ "JEF1a", 2185.330, -1210.739, 2281.447, -1154.588, 5397.06, CITY_LS },
{ "MUL7b", 1318.130, -910.169, 1357.000, -768.026, 5525.09, CITY_LS },
{ "JEF3a", 1996.910, -1449.670, 2056.860, -1350.718, 5932.18, CITY_LS },
{ "JTW2", 1236.630, 2142.860, 1297.468, 2243.229, 6106.24, CITY_LV },
{ "JEF3c", 2124.656, -1494.030, 2266.208, -1449.670, 6279.24, CITY_LS },
{ "JTN6", 1848.400, 2478.489, 1938.800, 2553.489, 6780.00, CITY_LV },
{ "ROD4c", 422.678, -1570.197, 466.221, -1406.050, 7147.45, CITY_LS },
{ "LDT1c", 1391.050, -1026.328, 1463.900, -926.999, 7236.11, CITY_LS },
{ "REDW4", 1704.588, 2243.229, 1777.390, 2342.830, 7251.15, CITY_LV },
{ "LMEX1b", 1758.900, -1722.260, 1812.619, -1577.588, 7771.63, CITY_LS },
{ "BINT4", 1375.598, 823.228, 1457.390, 919.447, 7869.94, CITY_LV },
{ "ROD1c", 334.502, -1501.947, 422.678, -1406.050, 8455.81, CITY_LS },
{ "RIH6a", 225.164, -1369.619, 334.502, -1292.067, 8479.38, CITY_LS },
{ "LDT6", 1724.760, -1250.900, 1812.619, -1150.869, 8788.62, CITY_LS },
{ "STRIP4", 2027.400, 1703.229, 2137.395, 1783.229, 8799.59, CITY_LV },
{ "LDT1b", 1378.328, -1130.848, 1463.900, -1026.328, 8943.98, CITY_LS },
{ "BINT2", 1197.390, 1044.687, 1277.050, 1163.390, 9455.88, CITY_LV },
{ "CONF1a", 1073.218, -1842.270, 1323.900, -1804.208, 9541.46, CITY_LS },
{ "SILLY3", -2270.040, -430.276, -2178.687, -324.114, 9698.21, CITY_SF },
{ "MUL5a", 1096.468, -910.169, 1169.130, -768.026, 10328.39, CITY_LS },
{ "YBELL2", 1457.458, 2723.229, 1534.560, 2863.229, 10794.28, CITY_LV },
{ "STRIP3", 2027.400, 1783.229, 2162.385, 1863.229, 10798.79, CITY_LV },
{ "JEF1b", 2056.860, -1210.739, 2185.330, -1126.317, 10845.69, CITY_LS },
{ "MUL5b", 952.604, -937.184, 1096.468, -860.619, 11014.94, CITY_LS },
{ "ALDEA", -1372.140, 2498.520, -1277.588, 2615.350, 11046.51, CITY_DESERTS },
{ "CHC2a", 2126.860, -1126.317, 2185.330, -934.489, 11216.17, CITY_LS },
{ "CHC1a", 1994.328, -1100.817, 2056.860, -920.815, 11255.90, CITY_LS },
{ "RIH5b", 647.557, -954.661, 768.692, -860.619, 11391.77, CITY_LS },
{ "LVA3", 1277.050, 1087.630, 1375.598, 1203.280, 11397.07, CITY_LV },
{ "JTN7", 1377.390, 2433.229, 1534.560, 2507.229, 11630.58, CITY_LV },
{ "LIND2b", 2201.820, -2095.000, 2324.000, -1989.900, 12841.10, CITY_LS },
{ "JTN8", 1704.588, 2342.830, 1848.400, 2433.229, 13000.45, CITY_LV },
{ "SUN3a", 1252.328, -1130.848, 1378.328, -1026.328, 13169.52, CITY_LS },
{ "LMEX1a", 1701.900, -1842.270, 1812.619, -1722.260, 13287.38, CITY_LS },
{ "WESTP3", -2411.218, 373.539, -2253.540, 458.411, 13382.44, CITY_SF },
{ "RIH6b", 225.164, -1292.067, 466.221, -1235.067, 13740.24, CITY_LS },
{ "SUN3b", 1252.328, -1026.328, 1391.050, -926.999, 13779.11, CITY_LS },
{ "ELS3b", 2266.260, -1494.030, 2381.677, -1372.040, 14079.71, CITY_LS },
{ "JTE2", 2623.177, 943.234, 2749.895, 1055.958, 14284.16, CITY_LV },
{ "LIND4c", 2541.697, -1941.400, 2703.580, -1852.869, 14331.66, CITY_LS },
{ "CHC1b", 2056.860, -1126.317, 2126.860, -920.815, 14385.14, CITY_LS },
{ "JTE3", 2625.156, 2202.760, 2685.156, 2442.550, 14387.40, CITY_LV },
{ "ROD1b", 225.164, -1501.947, 334.502, -1369.619, 14468.48, CITY_LS },
{ "JTE4", 2536.427, 2442.550, 2685.156, 2542.550, 14872.90, CITY_LV },
{ "ROD2a", 334.502, -1406.050, 466.221, -1292.067, 15013.73, CITY_LS },
{ "VIN1b", 647.557, -1227.280, 787.460, -1118.280, 15249.42, CITY_LS },
{ "ROD3b", 422.678, -1684.650, 558.098, -1570.197, 15499.22, CITY_LS },
{ "JTN1", 2498.208, 2542.550, 2685.156, 2626.550, 15703.63, CITY_LV },
{ "LDT7", 1724.760, -1430.869, 1812.619, -1250.900, 15811.89, CITY_LS },
{ "ROD1a", 225.164, -1684.650, 312.803, -1501.947, 16011.91, CITY_LS },
{ "JEF3b", 2056.860, -1449.670, 2266.208, -1372.040, 16251.67, CITY_LS },
{ "SUN4", 1096.468, -1130.838, 1252.328, -1026.328, 16288.92, CITY_LS },
{ "VERO2", 1046.150, -1722.260, 1161.520, -1577.588, 16690.80, CITY_LS },
{ "COM1a", 1323.900, -1722.260, 1440.900, -1577.588, 16926.62, CITY_LS },
{ "MUL7a", 1357.000, -926.999, 1463.900, -768.026, 16994.22, CITY_LS },
{ "ROD4b", 466.221, -1570.197, 558.098, -1385.067, 17009.19, CITY_LS },
{ "MUL5c", 911.802, -860.619, 1096.468, -768.026, 17098.78, CITY_LS },
{ "MUL4", 768.692, -954.661, 952.604, -860.619, 17295.44, CITY_LS },
{ "JTS2", 2377.385, 788.893, 2537.385, 897.901, 17441.27, CITY_LV },
{ "IWD3a", 1812.619, -1852.869, 1971.660, -1742.310, 17583.41, CITY_LS },
{ "LDOC1a", 2089.000, -2394.330, 2201.820, -2235.840, 17880.85, CITY_LS },
{ "COM1b", 1370.848, -1577.588, 1463.900, -1384.947, 17925.63, CITY_LS },
{ "JTN3", 2121.395, 2508.229, 2237.395, 2663.166, 17972.69, CITY_LV },
{ "SUN2", 1096.468, -1026.328, 1252.328, -910.169, 18104.53, CITY_LS },
{ "GLN2a", 1812.619, -1449.670, 1996.910, -1350.718, 18235.96, CITY_LS },
{ "SFAIR2", -1242.979, -50.096, -1213.910, 578.395, 18269.58, CITY_SF },
{ "STRIP2", 2106.697, 1863.229, 2162.385, 2202.760, 18907.79, CITY_LV },
{ "LIND4a", 2541.697, -2059.229, 2703.580, -1941.400, 19074.51, CITY_LS },
{ "MAR2", 807.921, -1577.588, 926.921, -1416.250, 19199.22, CITY_LS },
{ "VAIR3", 1457.369, 1143.208, 1777.400, 1203.280, 19224.91, CITY_LV },
{ "IWD3b", 1812.619, -1742.310, 1951.660, -1602.310, 19465.74, CITY_LS },
{ "ESPE2", -1580.010, 1025.979, -1499.890, 1274.260, 19892.27, CITY_SF },
{ "LDT3", 1370.848, -1384.947, 1463.900, -1170.869, 19920.38, CITY_LS },
{ "ROD3a", 312.803, -1684.650, 422.678, -1501.947, 20074.49, CITY_LS },
{ "PER1", 1440.900, -1722.260, 1583.500, -1577.588, 20630.22, CITY_LS },
{ "MUL1a", 687.802, -860.619, 911.802, -768.026, 20740.83, CITY_LS },
{ "GANTB1", -2741.070, 1490.468, -2616.395, 1659.680, 21096.51, CITY_SF },
{ "CHC2b", 2185.330, -1154.588, 2281.447, -934.489, 21155.24, CITY_LS },
{ "MUL6", 1169.130, -910.169, 1318.130, -768.026, 21179.30, CITY_LS },
{ "JTN4", 1938.800, 2508.229, 2121.395, 2624.229, 21181.01, CITY_LV },
{ "COM3", 1667.958, -1577.588, 1812.619, -1430.869, 21224.51, CITY_LS },
{ "ROD5a", 72.648, -1544.170, 225.164, -1404.968, 21230.53, CITY_LS },
{ "ROCE2", 2536.427, 2202.760, 2625.156, 2442.550, 21276.33, CITY_LV },
{ "ROD5b", 72.648, -1684.650, 225.164, -1544.170, 21425.44, CITY_LS },
{ "MKT4", 952.663, -1310.208, 1072.660, -1130.848, 21522.66, CITY_LS },
{ "CHC4b", 2632.739, -1135.040, 2747.739, -945.033, 21850.80, CITY_LS },
{ "MUL1c", 861.085, -674.885, 1156.550, -600.895, 21861.45, CITY_COUNTRY },
{ "THEA3", -2253.540, 373.539, -1993.280, 458.411, 22088.78, CITY_SF },
{ "REDE3", 1848.400, 2342.830, 2011.937, 2478.489, 22185.25, CITY_LV },
{ "SFDWT4", -1580.010, 744.267, -1499.890, 1025.979, 22570.76, CITY_SF },
{ "CONF1b", 1046.150, -1804.208, 1323.900, -1722.260, 22761.05, CITY_LS },
{ "RIH5a", 647.557, -1118.280, 787.460, -954.661, 22890.79, CITY_LS },
{ "OCEAF1", -2994.489, 277.411, -2867.850, 458.411, 22921.64, CITY_SF },
{ "GGC2", 964.390, 930.890, 1166.530, 1044.687, 23002.92, CITY_LV },
{ "GLN1b", 1812.619, -1100.817, 1994.328, -973.380, 23156.44, CITY_LS },
{ "LVA2", 1375.598, 919.447, 1457.369, 1203.280, 23209.30, CITY_LV },
{ "TOM", -405.769, 1712.859, -276.717, 1892.750, 23215.29, CITY_DESERTS },
{ "VERO3", 1161.520, -1722.260, 1323.900, -1577.588, 23491.83, CITY_LS },
{ "ELS1a", 2281.447, -1372.040, 2381.677, -1135.040, 23754.50, CITY_LS },
{ "CALI2", 2137.395, 1703.229, 2437.385, 1783.229, 23999.19, CITY_LV },
{ "IWD4", 1951.660, -1742.310, 2124.656, -1602.310, 24219.43, CITY_LS },
{ "PILL2", 2624.395, 1383.229, 2685.156, 1783.229, 24304.39, CITY_LV },
{ "IWD2", 2124.656, -1742.310, 2222.560, -1494.030, 24307.62, CITY_LS },
{ "WESTP1", -2533.040, 458.411, -2329.310, 578.395, 24444.33, CITY_SF },
{ "SFDWT2", -1871.718, 1176.420, -1620.300, 1274.260, 24598.72, CITY_SF },
{ "COM4", 1583.500, -1722.260, 1758.900, -1577.588, 25375.47, CITY_LS },
{ "ELS1b", 2381.677, -1454.348, 2462.125, -1135.040, 25687.68, CITY_LS },
{ "MAR1", 647.710, -1577.588, 807.921, -1416.250, 25848.12, CITY_LS },
{ "RIH3a", 72.648, -1404.968, 225.164, -1235.067, 25912.61, CITY_LS },
{ "VIN1a", 647.710, -1416.250, 787.460, -1227.280, 26408.55, CITY_LS },
{ "ELS3a", 2222.560, -1628.530, 2421.030, -1494.030, 26694.21, CITY_LS },
{ "ROD4a", 558.098, -1684.650, 647.520, -1384.930, 26801.55, CITY_LS },
{ "ROD2b", 466.221, -1385.067, 647.520, -1235.067, 27194.85, CITY_LS },
{ "REDE2", 1817.390, 2202.760, 2011.937, 2342.830, 27250.21, CITY_LV },
{ "RING", 2162.385, 1783.229, 2437.385, 1883.229, 27500.00, CITY_LV },
{ "IWD5", 1971.660, -1852.869, 2222.560, -1742.310, 27739.24, CITY_LS },
{ "LIND1b", 2089.000, -2235.840, 2201.820, -1989.900, 27746.97, CITY_LS },
{ "SUN1", 952.663, -1130.838, 1096.468, -937.184, 27848.41, CITY_LS },
{ "PRP3", 1848.400, 2553.489, 1938.800, 2863.229, 28000.50, CITY_LV },
{ "VERO4b", 930.221, -2006.780, 1073.218, -1804.208, 28967.19, CITY_LS },
{ "BLUF1b", 1073.218, -2006.780, 1249.619, -1842.270, 29019.73, CITY_LS },
{ "VIN2", 787.460, -1130.838, 952.604, -954.661, 29094.57, CITY_LS },
{ "VIN3", 787.460, -1310.208, 952.663, -1130.838, 29632.46, CITY_LS },
{ "COM2", 1463.900, -1577.588, 1667.958, -1430.869, 29939.18, CITY_LS },
{ "MKT3", 787.460, -1416.250, 1072.660, -1310.208, 30243.17, CITY_LS },
{ "RSW2", 2377.385, 596.348, 2537.385, 788.893, 30807.19, CITY_LV },
{ "JTN2", 2237.395, 2542.550, 2498.208, 2663.166, 31458.21, CITY_LV },
{ "EBE2a", 2632.830, -1668.130, 2747.739, -1393.420, 31566.62, CITY_LS },
{ "LIND2a", 2089.000, -1989.900, 2324.000, -1852.869, 32202.28, CITY_LS },
{ "CHINA", -2274.166, 578.395, -2078.666, 744.169, 32408.81, CITY_SF },
{ "LDOC2", 2324.000, -2145.100, 2703.580, -2059.229, 32594.95, CITY_LS },
{ "EBAY", -1132.817, -768.026, -956.476, -578.117, 33488.74, CITY_COUNTRY },
{ "VISA2", 1817.390, 1703.229, 2027.400, 1863.229, 33601.60, CITY_LV },
{ "OCEAF3", -2994.489, -430.276, -2831.885, -222.589, 33770.73, CITY_SF },
{ "RIH1a", 321.355, -860.619, 687.802, -768.026, 33930.43, CITY_LS },
{ "RIH1b", 321.355, -768.026, 700.794, -674.885, 35341.32, CITY_COUNTRY },
{ "STAR1", 2162.385, 1883.229, 2437.385, 2012.180, 35461.53, CITY_LV },
{ "EBE2b", 2747.739, -1668.130, 2959.350, -1498.619, 35870.40, CITY_LS },
{ "JEF2", 2056.860, -1372.040, 2281.447, -1210.739, 36226.09, CITY_LS },
{ "LDT4", 1463.900, -1290.869, 1724.760, -1150.869, 36520.39, CITY_LS },
{ "LDT5", 1463.900, -1430.869, 1724.760, -1290.869, 36520.39, CITY_LS },
{ "JTS1", 1457.390, 823.228, 2377.385, 863.229, 36800.69, CITY_LV },
{ "ELS4", 2421.030, -1628.530, 2632.830, -1454.348, 36891.75, CITY_LS },
{ "GGC1", 964.390, 1044.687, 1197.390, 1203.218, 36937.72, CITY_LV },
{ "CHC4a", 2747.739, -1120.040, 2959.350, -945.033, 37033.42, CITY_LS },
{ "MUL1b", 737.572, -768.026, 1142.290, -674.885, 37695.83, CITY_COUNTRY },
{ "LDOC3b", 2201.820, -2730.875, 2324.000, -2418.330, 38186.71, CITY_LS },
{ "ELS2", 2462.125, -1454.348, 2581.729, -1135.040, 38190.51, CITY_LS },
{ "GAN1", 2222.560, -1722.328, 2632.830, -1628.530, 38482.49, CITY_LS },
{ "CUNTC2", -2831.885, -430.276, -2646.395, -222.589, 38523.85, CITY_SF },
{ "LIND1a", 1970.619, -2179.250, 2089.000, -1852.869, 38637.30, CITY_LS },
{ "ESPN3", -1982.317, 1274.260, -1524.239, 1358.900, 38771.73, CITY_SF },
{ "HIGH", 1817.390, 1283.229, 2027.390, 1469.229, 39060.00, CITY_LV },
{ "LDOC1b", 2201.820, -2418.330, 2324.000, -2095.000, 39504.44, CITY_LS },
{ "LDM", 1823.078, 596.348, 1997.218, 823.228, 39508.88, CITY_LV },
{ "SUNMA", -2353.166, 2275.790, -2153.166, 2475.790, 40000.00, CITY_DESERTS },
{ "THEA1", -2329.310, 458.411, -1993.280, 578.395, 40318.23, CITY_SF },
{ "ELCO1", 1692.619, -2179.250, 1812.619, -1842.270, 40437.59, CITY_LS },
{ "BFC1", 1375.598, 596.348, 1558.088, 823.228, 41403.32, CITY_LV },
{ "PINK", 1817.390, 1083.229, 2027.390, 1283.229, 42000.00, CITY_LV },
{ "JTW1", 1197.390, 1163.390, 1236.630, 2243.229, 42372.87, CITY_LV },
{ "LFL1b", 2581.729, -1393.420, 2747.739, -1135.040, 42893.66, CITY_LS },
{ "VISA1", 1817.390, 1863.229, 2106.697, 2011.828, 42990.73, CITY_LV },
{ "PRP4", 1938.800, 2624.229, 2121.395, 2861.550, 43333.62, CITY_LV },
{ "VERO1", 851.447, -1804.208, 1046.150, -1577.588, 44123.59, CITY_LS },
{ "LDS", 2749.895, 943.234, 2923.385, 1198.989, 44370.93, CITY_LV },
{ "LDOC3c", 2703.580, -2302.330, 2959.350, -2126.895, 44871.02, CITY_LS },
{ "LIND3", 2324.000, -2059.229, 2541.697, -1852.869, 44923.95, CITY_LS },
{ "THEA2", -2411.218, 265.243, -1993.280, 373.539, 45261.00, CITY_SF },
{ "THALL1", 1323.900, -1842.270, 1701.900, -1722.260, 45363.78, CITY_LS },
{ "MUL2b", 1269.130, -768.026, 1414.067, -452.424, 45742.41, CITY_COUNTRY },
{ "MAR3", 647.710, -1804.208, 851.447, -1577.588, 46170.87, CITY_LS },
{ "BATTP", -2741.070, 1268.410, -2533.040, 1490.468, 46194.73, CITY_SF },
{ "DRAG", 1817.390, 863.231, 2027.390, 1083.229, 46199.57, CITY_LV },
{ "BFLD1", 964.390, 1203.218, 1197.390, 1403.218, 46600.00, CITY_LV },
{ "JTN5", 1534.560, 2433.229, 1848.400, 2583.229, 47075.99, CITY_LV },
{ "YBELL1", 1117.400, 2723.229, 1457.458, 2863.229, 47608.11, CITY_LV },
{ "IWD1", 1812.619, -1602.310, 2124.656, -1449.670, 47629.33, CITY_LS },
{ "REDW1", 1297.468, 2142.860, 1777.390, 2243.229, 48169.24, CITY_LV },
{ "DOH1", -2270.040, -324.114, -1794.920, -222.589, 48236.56, CITY_SF },
{ "TOPFA", 967.382, -450.390, 1176.780, -217.899, 48683.15, CITY_COUNTRY },
{ "BARRA", -926.130, 1398.729, -719.234, 1634.687, 48818.76, CITY_DESERTS },
{ "PIRA", 1817.390, 1469.229, 2027.400, 1703.229, 49142.34, CITY_LV },
{ "CITYS", -2867.850, 277.411, -2593.437, 458.411, 49668.76, CITY_SF },
{ "SFGLF4", -2646.395, -355.493, -2270.040, -222.589, 50019.08, CITY_SF },
{ "STRIP1", 2027.400, 863.229, 2087.385, 1703.229, 50387.38, CITY_LV },
{ "HASH", -2593.437, -222.589, -2411.218, 54.722, 50531.33, CITY_SF },
{ "LAIR2a", 1852.000, -2394.330, 2089.000, -2179.250, 50973.97, CITY_LS },
{ "WWE1", 1098.310, 1726.218, 1197.390, 2243.229, 51225.42, CITY_LV },
{ "SHERR", -789.736, 1659.680, -599.505, 1929.410, 51311.00, CITY_DESERTS },
{ "ELCO2", 1812.619, -2179.250, 1970.619, -1852.869, 51568.19, CITY_LS },
{ "SFDWT3", -1700.010, 744.267, -1580.010, 1176.520, 51870.35, CITY_SF },
{ "VALLE", -936.668, 2611.437, -715.960, 2847.895, 52188.17, CITY_DESERTS },
{ "PAYAS", -354.332, 2580.360, -133.625, 2816.820, 52188.36, CITY_DESERTS },
{ "BINT1", 1166.530, 795.010, 1375.598, 1044.687, 52199.46, CITY_LV },
{ "GAN2", 2222.560, -1852.869, 2632.830, -1722.328, 53557.06, CITY_LS },
{ "REDE1", 1817.390, 2011.828, 2106.697, 2202.760, 55237.96, CITY_LV },
{ "CALI1", 2087.385, 1543.229, 2437.385, 1703.229, 56000.00, CITY_LV },
{ "ROY", 2087.385, 1383.229, 2437.385, 1543.229, 56000.00, CITY_LV },
{ "RIH3b", 72.648, -1235.067, 321.355, -1008.150, 56435.84, CITY_LS },
{ "STAR2", 2437.385, 1783.229, 2685.156, 2012.180, 56727.42, CITY_LV },
{ "MUL2a", 1281.130, -452.424, 1641.130, -290.911, 58144.67, CITY_COUNTRY },
{ "SFDWT1", -1982.317, 744.169, -1871.718, 1274.260, 58627.53, CITY_SF },
{ "KACC", 2498.208, 2626.550, 2749.895, 2861.550, 59146.44, CITY_LV },
{ "HGP", 1777.390, 863.231, 1817.390, 2342.830, 59183.96, CITY_LV },
{ "LDOC3a", 2324.000, -2302.330, 2703.580, -2145.100, 59681.36, CITY_LS },
{ "RIH2", 321.355, -1044.067, 647.557, -860.619, 59841.10, CITY_LS },
{ "RIE", 1558.088, 596.348, 1823.078, 823.234, 60122.51, CITY_LV },
{ "EBE3c", 2632.830, -1852.869, 2959.350, -1668.130, 60320.98, CITY_LS },
{ "BLUEB", 19.607, -404.135, 349.605, -220.136, 60719.30, CITY_COUNTRY },
{ "LST", 2749.895, 1198.989, 2923.385, 1548.989, 60721.49, CITY_LV },
{ "GLN1", 1812.619, -1350.718, 2056.860, -1100.817, 61036.09, CITY_LS },
{ "SFDWT6", -1993.280, 265.243, -1794.920, 578.395, 62116.82, CITY_SF },
{ "REDW3", 1377.390, 2243.229, 1704.588, 2433.229, 62167.62, CITY_LV },
{ "RIH4", 321.355, -1235.067, 647.520, -1044.067, 62297.51, CITY_LS },
{ "GANTB", -2741.447, 1659.680, -2616.395, 2175.145, 64459.92, CITY_DESERTS },
{ "FLINTI", -187.699, -1596.760, 17.062, -1276.598, 65556.68, CITY_COUNTRY },
{ "CHC3", 2281.447, -1135.040, 2632.739, -945.033, 66747.94, CITY_LS },
{ "SRY", 2749.895, 1548.989, 2923.385, 1937.250, 67359.39, CITY_LV },
{ "ISLE", 2011.937, 2202.760, 2237.395, 2508.229, 68870.42, CITY_LV },
{ "CIVI", -2741.070, 458.411, -2533.040, 793.411, 69690.06, CITY_SF },
{ "PLS", 2703.580, -2126.895, 2959.350, -1852.869, 70087.63, CITY_LS },
{ "MKT2", 926.921, -1577.588, 1370.848, -1416.250, 71622.29, CITY_LS },
{ "WESTP2", -2593.437, 54.722, -2411.218, 458.411, 73559.80, CITY_SF },
{ "PINT", 1098.390, 2243.229, 1377.390, 2507.229, 73656.00, CITY_LV },
{ "FINA", -1871.718, 744.169, -1701.300, 1176.420, 73663.34, CITY_SF },
{ "SPIN", 2121.395, 2663.166, 2498.208, 2861.550, 74753.67, CITY_LV },
{ "PILL1", 2437.385, 1383.229, 2624.395, 1783.229, 74804.00, CITY_LV },
{ "BFLD2", 964.390, 1403.218, 1197.390, 1726.218, 75259.00, CITY_LV },
{ "BIGE", -410.019, 1403.338, -137.968, 1681.229, 75600.53, CITY_DESERTS },
{ "DILLI", 580.794, -674.885, 861.085, -404.790, 75705.20, CITY_COUNTRY },
{ "ELQUE", -1645.229, 2498.520, -1372.140, 2777.850, 76281.96, CITY_DESERTS },
{ "ESPN1", -2533.040, 1358.900, -1996.660, 1501.208, 76331.15, CITY_SF },
{ "SFAIR3", -1499.890, -50.096, -1242.979, 249.904, 77073.30, CITY_SF },
{ "MUL3", 1414.067, -768.026, 1667.609, -452.424, 80018.35, CITY_COUNTRY },
{ "EBE1", 2747.739, -1498.619, 2959.350, -1120.040, 80111.50, CITY_LS },
{ "MKT1", 1072.660, -1416.250, 1370.848, -1130.848, 85103.44, CITY_LS },
{ "RSW1", 1997.218, 596.348, 2377.385, 823.228, 86252.28, CITY_LV },
{ "PRP1", 1534.560, 2583.229, 1848.400, 2863.229, 87875.18, CITY_LV },
{ "EASB2", -1794.920, -50.096, -1499.890, 249.904, 88509.00, CITY_SF },
{ "LEAFY", -1166.968, -1856.030, -815.624, -1602.067, 89228.38, CITY_COUNTRY },
{ "LVA1", 1457.390, 863.229, 1777.400, 1143.208, 89596.08, CITY_LV },
{ "PRP2", 1117.400, 2507.229, 1534.560, 2723.229, 90106.57, CITY_LV },
{ "BLUEB1", 104.528, -220.136, 349.605, 152.235, 91259.20, CITY_COUNTRY },
{ "SFDWT5", -2078.666, 578.395, -1499.890, 744.267, 96002.73, CITY_SF },
{ "RSE", 2537.385, 676.549, 2902.350, 943.234, 97330.71, CITY_LV },
{ "SANB1", -2616.395, 1501.208, -1996.660, 1659.680, 98210.67, CITY_SF },
{ "PARA", -2741.070, 793.411, -2533.040, 1268.410, 98814.06, CITY_SF },
{ "CAM", 2087.385, 1203.229, 2640.395, 1383.229, 99541.80, CITY_LV },
{ "OVS", 2162.385, 2012.180, 2685.156, 2202.760, 99629.67, CITY_LV },
{ "JUNIHI", -2533.040, 578.395, -2274.166, 968.369, 100954.14, CITY_SF },
{ "JUNIHO", -2533.040, 968.369, -2274.166, 1358.900, 101098.33, CITY_SF },
{ "ROCE1", 2237.395, 2202.760, 2536.427, 2542.550, 101608.08, CITY_LV },
{ "JTE1", 2685.156, 1055.958, 2749.895, 2626.550, 101678.57, CITY_LV },
{ "VERO4a", 647.710, -2173.290, 930.221, -1804.208, 104269.72, CITY_LS },
{ "SILLY4", -2178.687, -599.882, -1794.920, -324.114, 105830.64, CITY_SF },
{ "ARCO", -901.129, 2221.860, -592.090, 2571.968, 108197.00, CITY_DESERTS },
{ "HAUL", -792.254, -698.554, -452.403, -380.040, 108247.30, CITY_COUNTRY },
{ "DAM", -968.770, 1929.410, -481.126, 2155.260, 110134.39, CITY_DESERTS },
{ "ESPN2", -1996.660, 1358.900, -1524.239, 1592.510, 110362.26, CITY_SF },
{ "ESPE3", -1499.890, 578.395, -1339.890, 1274.260, 111338.39, CITY_SF },
{ "GARC", -2411.218, -222.589, -2173.040, 265.243, 116190.84, CITY_SF },
{ "MONT", 1119.510, 119.526, 1451.400, 493.321, 124058.83, CITY_COUNTRY },
{ "CREE", 2749.895, 1937.250, 2921.620, 2669.790, 125795.50, CITY_LV },
{ "LAIR1", 1249.619, -2394.330, 1852.000, -2179.250, 129560.14, CITY_LS },
{ "SMB2", 72.648, -2173.290, 342.648, -1684.650, 131932.79, CITY_LS },
{ "MULINT", 1463.900, -1150.869, 1812.619, -768.026, 133504.62, CITY_LS },
{ "ANGPI", -2324.937, -2584.290, -1964.218, -2212.110, 134252.37, CITY_COUNTRY },
{ "MEAD", 37.032, 2337.177, 435.988, 2677.895, 135931.50, CITY_DESERTS },
{ "OCTAN", 338.657, 1228.510, 664.307, 1655.050, 138902.76, CITY_DESERTS },
{ "LOT", 2087.385, 943.234, 2623.177, 1203.229, 139303.23, CITY_LV },
{ "REDW2", 1236.630, 1883.109, 1777.390, 2142.860, 140463.00, CITY_LV },
{ "SMB1", 342.648, -2173.290, 647.710, -1684.650, 149065.50, CITY_LS },
{ "BLUF2", 1249.619, -2179.250, 1692.619, -1842.270, 149282.12, CITY_LS },
{ "VAIR1", 1236.630, 1203.280, 1457.369, 1883.109, 150064.78, CITY_LV },
{ "FLINTR", -594.190, -1648.550, -187.699, -1276.598, 151195.15, CITY_COUNTRY },
{ "BLUF1a", 930.221, -2488.416, 1249.619, -2006.780, 153833.57, CITY_LS },
{ "PALO", 2160.218, -149.003, 2576.916, 228.322, 157230.57, CITY_COUNTRY },
{ "LDOC4", 2373.770, -2697.090, 2809.218, -2330.458, 159649.20, CITY_LS },
{ "FARM", -1209.670, -1317.098, -908.161, -787.390, 159711.75, CITY_COUNTRY },
{ "SFAIR5", -1213.910, -50.096, -947.979, 578.395, 167135.26, CITY_COUNTRY },
{ "QUARY", 337.243, 710.840, 860.554, 1031.708, 167913.75, CITY_DESERTS },
{ "WWE", 883.307, 1726.218, 1098.310, 2507.229, 167919.75, CITY_LV },
{ "CALT", -2274.166, 744.169, -1982.317, 1358.900, 179408.62, CITY_SF },
{ "EASB1", -1794.920, 249.904, -1242.979, 578.395, 181307.67, CITY_SF },
{ "DOH2", -2173.040, -222.589, -1794.920, 265.243, 184459.04, CITY_SF },
{ "CARSO", -376.233, 826.325, 123.717, 1220.437, 197036.29, CITY_DESERTS },
{ "SILLY1", -2178.687, -1115.578, -1794.920, -599.882, 197907.07, CITY_SF },
{ "OCEAF2", -2994.489, -222.589, -2593.437, 277.411, 200526.00, CITY_SF },
{ "FERN", 508.187, -139.259, 1306.660, 119.526, 206632.84, CITY_COUNTRY },
{ "SUNNN", -2741.070, 2175.145, -2353.166, 2722.790, 212433.71, CITY_DESERTS },
{ "VAIR2", 1457.369, 1203.280, 1777.390, 1883.109, 217559.54, CITY_LV },
{ "BLUAC", -319.674, -220.136, 104.528, 293.324, 217811.28, CITY_COUNTRY },
{ "BAYV", -2994.489, 458.411, -2741.070, 1339.609, 223312.26, CITY_SF },
{ "REST", -91.583, 1655.050, 421.234, 2123.010, 239977.82, CITY_DESERTS },
{ "NROCK", 2285.370, -768.026, 2770.590, -269.739, 241778.79, CITY_COUNTRY },
{ "LAIR2b", 1382.729, -2730.875, 2201.820, -2394.330, 275660.93, CITY_LS },
{ "HILLP", -2994.489, -811.276, -2178.687, -430.276, 310820.56, CITY_SF },
{ "SANB2", -2616.395, 1659.680, -1996.660, 2175.145, 319451.68, CITY_DESERTS },
{ "SFAIR1", -1794.920, -730.117, -1213.910, -50.096, 395099.00, CITY_SF },
{ "PANOP", -947.979, -304.320, -319.674, 327.071, 396706.12, CITY_COUNTRY },
{ "CREEK", -1820.640, -2643.677, -1226.780, -1771.660, 517855.96, CITY_COUNTRY },
{ "BACKO", -1166.968, -2641.187, -321.743, -1856.030, 663634.31, CITY_COUNTRY }*/
} }
; ;
@ -398,56 +75,244 @@ new
g_gangTurfData [ MAX_TURFS ] [ E_TURF_ZONE_DATA ], g_gangTurfData [ MAX_TURFS ] [ E_TURF_ZONE_DATA ],
Iterator: turfs < MAX_TURFS >, Iterator: turfs < MAX_TURFS >,
g_gangzoneAttacker [ MAX_TURFS ] = { INVALID_GANG_ID, ... }, Float: g_weekAveragePlayers = 0.0,
g_gangzoneAttackCount [ MAX_TURFS ], Float: g_weekSecondsElapsed = 0.0,
g_gangzoneAttackTimeout [ MAX_TURFS ]
g_gangHardpointTurf = INVALID_GANG_TURF,
g_gangHardpointPreviousTurf = INVALID_GANG_TURF,
g_gangHardpointAttacker = INVALID_GANG_ID,
g_gangHardpointMapIcon = -1,
g_gangHardpointCaptureTime [ MAX_GANGS ]
; ;
/* ** Forwards ** */ /* ** Forwards ** */
forward OnPlayerUpdateGangZone( playerid, zoneid ); forward OnPlayerUpdateGangZone( playerid, zoneid );
stock Float: Turf_GetHardpointPrizePool( Float: max_payout = 500000.0 )
{
new
Float: total_payout = ( g_weekAveragePlayers / g_weekSecondsElapsed ) * 10000.0;
return total_payout < max_payout ? total_payout : max_payout;
}
/* ** Hooks ** */ /* ** Hooks ** */
hook OnGameModeInit( ) hook OnGameModeInit( )
{ {
/* ** Gangzone Allocation ** */ /* ** Gangzone Allocation ** */
for ( new i = 0; i < sizeof( g_gangzoneData ); i++ ) { for ( new i = 0; i < sizeof( g_gangzoneData ); i ++ ) {
Turf_Create( g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ], INVALID_GANG_ID, COLOR_GANGZONE ); Turf_Create( g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ], INVALID_GANG_ID, COLOR_GANGZONE );
} }
return 1; return 1;
} }
hook OnServerGameDayEnd( ) hook OnServerTickSecond( )
{ {
// payday for gangs holding turfs new
foreach ( new g : gangs ) hardpoint_turf = g_gangHardpointTurf;
{
new
afk_members, online_members = GetOnlineGangMembers( g, .afk_members = afk_members );
if ( online_members >= TAKEOVER_NEEDED_PEOPLE ) if ( hardpoint_turf == INVALID_GANG_TURF ) {
return Turf_CreateHardpoint( );
}
// accumulate average player count
g_weekAveragePlayers += float( Iter_Count( Player ) );
g_weekSecondsElapsed ++;
// begin auto turf takeover etc
if ( g_gangHardpointAttacker != INVALID_GANG_ID )
{
new total_in_turf = Turf_GetPlayersInTurf( hardpoint_turf );
new attacking_members = GetPlayersInGangZone( hardpoint_turf, g_gangHardpointAttacker );
// no attacking members inside the turf
if ( ! attacking_members )
{ {
new new
profit = 0; new_attacker = INVALID_GANG_ID;
foreach( new zoneid : turfs ) if ( g_gangTurfData[ zoneid ] [ E_OWNER ] != INVALID_GANG_ID && g_gangTurfData[ zoneid ] [ E_OWNER ] == g ) foreach ( new playerid : Player ) if ( GetPlayerGang( playerid ) != INVALID_GANG_ID && IsPlayerInDynamicArea( playerid, g_gangTurfData[ hardpoint_turf ] [ E_AREA ] ) && Turf_IsAbleToTakeover( playerid ) ) {
{ new_attacker = GetPlayerGang( playerid );
// facilities will not pay out respect break;
if ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] == INVALID_GANG_ID ) {
g_gangData[ g ] [ E_RESPECT ] ++;
}
// accumulate profit
profit += Turf_GetProfitability( zoneid, online_members - afk_members );
} }
GiveGangCash( g, profit ); if ( new_attacker != INVALID_GANG_ID ) {
SendClientMessageToGang( g_gangHardpointAttacker, g_gangData[ g_gangHardpointAttacker ] [ E_COLOR ], "[TURF] "COL_WHITE"The territory hardpoint is now being contested by %s!", ReturnGangName( new_attacker ) );
}
if ( profit > 0 ) { Turf_SetHardpointAttacker( new_attacker );
SaveGangData( g ); }
SendClientMessageToGang( g, g_gangData[ g ] [ E_COLOR ], "[GANG] "COL_GOLD"%s"COL_WHITE" has been earned from territories and deposited in the gang bank account.", cash_format( profit ) );
} new
current_attacker = g_gangHardpointAttacker;
// the attacker could be changed from above, so double checking
if ( current_attacker != INVALID_GANG_ID )
{
// add seconds
g_gangHardpointCaptureTime[ current_attacker ] ++;
// get capture time
new total_capture_seconds = Turf_GetTotalCaptureSeconds( );
// alert gang members
foreach ( new playerid : Player ) if ( GetPlayerGang( playerid ) != INVALID_GANG_ID && IsPlayerInDynamicArea( playerid, g_gangTurfData[ hardpoint_turf ] [ E_AREA ] ) && Turf_IsAbleToTakeover( playerid ) )
{
new player_gang = GetPlayerGang( playerid );
// calculate player earnings
new potential_earnings = total_capture_seconds > 0 ? floatround( float( g_gangHardpointCaptureTime[ player_gang ] ) / float( total_capture_seconds ) * Turf_GetHardpointPrizePool( ) ) : 0;
// message the attacker that they gotta attack
if ( player_gang == current_attacker )
{
new
rivals_members = total_in_turf - attacking_members;
if ( rivals_members ) {
ShowPlayerHelpDialog( playerid, 2500, "~b~Defend~w~ from %d enemy gang member%s!~n~~n~Earning potential is ~g~%s", rivals_members, rivals_members == 1 ? ( "" ) : ( "s" ), cash_format( potential_earnings ) );
} else {
ShowPlayerHelpDialog( playerid, 2500, "~g~%s~w~ is in control now %d seconds!~n~~n~Earning potential is ~g~%s", ReturnGangName( current_attacker ), g_gangHardpointCaptureTime[ current_attacker ], cash_format( potential_earnings ) );
}
}
// message the defender
else if ( player_gang != current_attacker ) {
ShowPlayerHelpDialog( playerid, 2500, "~r~Kill~w~ %d %s member%s!~n~~n~Earning potential is ~r~%s", attacking_members, ReturnGangName( current_attacker ), attacking_members == 1 ? ( "" ) : ( "s" ), cash_format( potential_earnings ) );
}
}
}
}
else
{
new
new_attacker = INVALID_GANG_ID;
foreach ( new playerid : Player ) if ( GetPlayerGang( playerid ) != INVALID_GANG_ID && IsPlayerInDynamicArea( playerid, g_gangTurfData[ hardpoint_turf ] [ E_AREA ] ) && Turf_IsAbleToTakeover( playerid ) ) {
new_attacker = GetPlayerGang( playerid );
break;
}
Turf_SetHardpointAttacker( new_attacker );
}
return 1;
}
stock Turf_GetPlayersInTurf( turfid )
{
new
players_accum = 0;
foreach ( new g : gangs ) {
players_accum += GetPlayersInGangZone( turfid, g );
}
return players_accum;
}
stock Turf_CreateHardpoint( )
{
// reset gang accumulated time
for ( new i = 0; i < sizeof ( g_gangHardpointCaptureTime ); i ++ ) {
g_gangHardpointCaptureTime[ i ] = 0;
}
// force a random turf at all times
new
random_turf = INVALID_GANG_TURF;
do {
random_turf = random( sizeof( g_gangzoneData ) );
}
while ( random_turf == g_gangHardpointPreviousTurf );
// allocate new hardpoint
g_gangHardpointTurf = random_turf;
g_gangHardpointAttacker = INVALID_GANG_ID;
DestroyDynamicMapIcon( g_gangHardpointMapIcon );
// update hardpoint textdraw
foreach ( new playerid : Player )
{
if ( g_gangHardpointPreviousTurf != INVALID_GANG_TURF && IsPlayerInDynamicArea( playerid, g_gangTurfData[ g_gangHardpointPreviousTurf ] [ E_AREA ] ) ) {
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, g_gangHardpointPreviousTurf );
}
else if ( g_gangHardpointTurf != INVALID_GANG_TURF && IsPlayerInDynamicArea( playerid, g_gangTurfData[ g_gangHardpointTurf ] [ E_AREA ] ) ) {
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, g_gangHardpointTurf );
} }
} }
// create map icon
new
Float: middle_x, Float: middle_y;
Turf_GetMiddlePos( g_gangHardpointTurf, middle_x, middle_y );
g_gangHardpointMapIcon = CreateDynamicMapIcon( middle_x, middle_y, 0.0, 19, -1, -1, -1, 0, 3000.0, MAPICON_GLOBAL );
Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_gangHardpointMapIcon, E_STREAMER_PLAYER_ID, 0 );
// redraw gangzones
Turf_RedrawGangZonesForAll( );
printf("New Hardpoint" );
return 1;
}
hook OnGangUnload( gangid, bool: deleted )
{
g_gangHardpointCaptureTime[ gangid ] = 0;
return 1;
}
hook OnPlayerLeaveGang( playerid, gangid, reason )
{
HideHardpointIconForPlayer( playerid );
return 1;
}
hook OnPlayerJoinGang( playerid, gangid )
{
ShowHardpointIconForPlayer( playerid );
return 1;
}
hook OnServerGameDayEnd( )
{
new
total_capture_seconds = Turf_GetTotalCaptureSeconds( );
// payout gangs if there is any capable
if ( total_capture_seconds )
{
// payout gangs
foreach ( new g : gangs )
{
new Float: capture_ratio = float( g_gangHardpointCaptureTime[ g ] ) / float( total_capture_seconds );
new earnings = floatround( capture_ratio * Turf_GetHardpointPrizePool( ) );
if ( earnings > 0 )
{
g_gangData[ g ] [ E_RESPECT ] += floatround( capture_ratio * 100.0 ); // give the gang a % of respect out of how much they captured
GiveGangCash( g, earnings );
SaveGangData( g );
SendClientMessageToGang( g, g_gangData[ g ] [ E_COLOR ], "[GANG] "COL_GOLD"%s"COL_WHITE" has been earned from territories and deposited in the gang bank account.", cash_format( earnings ) );
}
}
}
// reset hardpoint
g_gangHardpointPreviousTurf = g_gangHardpointTurf;
g_gangHardpointTurf = INVALID_GANG_TURF;
g_weekAveragePlayers = 0.0;
g_weekSecondsElapsed = 0.0;
return 1;
}
hook OnPlayerSpawn( playerid )
{
Turf_RedrawPlayerGangZones( playerid );
return 1; return 1;
} }
@ -458,11 +323,34 @@ hook OnPlayerEnterDynArea( playerid, areaid )
new new
first_turf = Turf_GetFirstTurf( playerid ); first_turf = Turf_GetFirstTurf( playerid );
// update textdraws
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, first_turf ); CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, first_turf );
} }
return Y_HOOKS_CONTINUE_RETURN_1; return Y_HOOKS_CONTINUE_RETURN_1;
} }
stock Turf_SetHardpointAttacker( gangid )
{
if ( g_gangHardpointAttacker == INVALID_GANG_ID && gangid == INVALID_GANG_ID )
return;
// set current attacker
g_gangHardpointAttacker = gangid;
// alert gang
if ( gangid != INVALID_GANG_ID ) {
SendClientMessageToGang( gangid, g_gangData[ gangid ] [ E_COLOR ], "[TURF] "COL_WHITE"The gang is now contesting the territory hardpoint!" );
}
// update label
foreach ( new playerid : Player ) if ( g_gangHardpointTurf != INVALID_GANG_TURF && IsPlayerInDynamicArea( playerid, g_gangTurfData[ g_gangHardpointTurf ] [ E_AREA ] ) ) {
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, g_gangHardpointTurf );
}
// redraw
Turf_RedrawGangZonesForAll( );
}
hook OnPlayerLeaveDynArea( playerid, areaid ) hook OnPlayerLeaveDynArea( playerid, areaid )
{ {
if ( ! IsPlayerNPC( playerid ) ) if ( ! IsPlayerNPC( playerid ) )
@ -485,94 +373,24 @@ hook OnPlayerLeaveDynArea( playerid, areaid )
return Y_HOOKS_CONTINUE_RETURN_1; return Y_HOOKS_CONTINUE_RETURN_1;
} }
/* ** Commands ** */ public OnPlayerUpdateGangZone( playerid, zoneid )
CMD:takeover( playerid, params[ ] )
{ {
if ( p_GangID[ playerid ] == INVALID_GANG_ID ) if ( ! IsPlayerMovieMode( playerid ) )
return SendError( playerid, "You are not in any gang." );
if ( p_Class[ playerid ] != CLASS_CIVILIAN )
return SendError( playerid, "This is restricted to civilians only." );
if ( GetPlayerInterior( playerid ) != 0 && GetPlayerVirtualWorld( playerid ) != 0 )
return SendError( playerid, "You cannot do this inside interiors." );
if ( IsPlayerJailed( playerid ) || IsPlayerUsingOrbitalCannon( playerid ) )
return SendError( playerid, "You cannot do this at the moment." );
new
g_isAFK = 0,
g_inAir = 0
;
foreach ( new z : Reverse(turfs) )
{ {
if ( IsPlayerInDynamicArea( playerid, g_gangTurfData[ z ] [ E_AREA ] ) ) if ( zoneid == INVALID_GANG_TURF )
{ return PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], "_" );
new gangid = p_GangID[ playerid ];
if ( g_gangTurfData[ z ] [ E_OWNER ] == gangid ) return SendError( playerid, "This turf is already captured by your gang." ); if ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] != INVALID_GANG_ID ) {
if ( g_gangzoneAttacker[ z ] != INVALID_GANG_ID ) return SendError( playerid, "This turf is currently being attacked." ); PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], sprintf( "~p~(FACILITY)~n~~w~~h~%s", ReturnGangName( g_gangTurfData[ zoneid ] [ E_OWNER ] ) ) );
} else {
new opposing_count = GetPlayersInGangZone( z, g_gangTurfData[ z ] [ E_OWNER ] ); // Opposing check if ( g_gangTurfData[ g_gangHardpointTurf ] [ E_ID ] != g_gangTurfData[ zoneid ] [ E_ID ] ) {
// existing gang members PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], "~b~~h~(INACTIVE HARDPOINT)~n~~w~~h~Unchallenged" );
if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && opposing_count ) { } else {
return SendError( playerid, "There are gang members within this turf, kill them!" ); PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], sprintf( "~r~~h~(ACTIVE HARDPOINT)~n~~w~~h~%s", g_gangHardpointAttacker != INVALID_GANG_ID ? ( ReturnGangName( g_gangHardpointAttacker ) ) : ( "Unchallenged" ) ) );
} }
}
new attacking_count = GetPlayersInGangZone( z, gangid, g_isAFK, g_inAir );
if ( attacking_count < TAKEOVER_NEEDED_PEOPLE && ( attacking_count + g_isAFK + g_inAir ) >= TAKEOVER_NEEDED_PEOPLE )
return SendError( playerid, "You cannot start a turf war if gang members are AFK or extremely high above ground." );
//if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && dCount < TAKEOVER_NEEDED_PEOPLE + 1 && ( dCount + g_isAFK + g_inAir ) >= TAKEOVER_NEEDED_PEOPLE + 1 )
// return SendError( playerid, "You need at least %d gang members to start a gang war with another gang.", TAKEOVER_NEEDED_PEOPLE + 1 );
// Facility check
if ( g_gangTurfData[ z ] [ E_FACILITY_GANG ] != INVALID_GANG_ID && Iter_Contains( gangs, g_gangTurfData[ z ] [ E_FACILITY_GANG ] ) )
{
new facility_gang = g_gangTurfData[ z ] [ E_FACILITY_GANG ];
new facility_members = GetOnlineGangMembers( facility_gang );
if ( g_gangTurfData[ z ] [ E_OWNER ] == facility_gang ) {
if ( facility_members < 3 ) {
return SendError( playerid, "This facility requires at least %d of its gang members online for a takeover.", 3 - facility_members );
}
else if ( attacking_count < 3 ) {
return SendError( playerid, "You need at least %d gang members to take over this facility.", 3 - attacking_count );
}
}
}
// Begin takeover
if ( attacking_count >= TAKEOVER_NEEDED_PEOPLE && ! opposing_count )
{
g_gangzoneAttacker[ z ] = gangid;
g_gangzoneAttackCount[ z ] = 0;
GangZoneFlashForAll( g_gangTurfData[ z ] [ E_ID ], setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 ) );
SendClientMessage( playerid, g_gangData[ gangid ] [ E_COLOR ], "[TURF]{FFFFFF} You are now beginning to take over the turf. Stay inside the area with your gang for 60 seconds. Don't die." );
if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID )
{
new
szLocation[ MAX_ZONE_NAME ], Float: min_x, Float: min_y;
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_X, min_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_Y, min_y );
GetZoneFromCoordinates( szLocation, min_x, min_y );
SendClientMessageToGang( g_gangTurfData[ z ] [ E_OWNER ], g_gangData[ g_gangTurfData[ z ] [ E_OWNER ] ] [ E_COLOR ], "[GANG]"COL_WHITE" Our territory is being attacked by "COL_GREY"%s"COL_WHITE" in %s, defend it!", g_gangData[ g_gangzoneAttacker[ z ] ] [ E_NAME ], szLocation );
}
}
else
{
SendError( playerid, "You need at least %d member(s) to take over this turf.", TAKEOVER_NEEDED_PEOPLE );
}
return 1;
}
} }
return SendError( playerid, "You are not in any gangzone." ); return 1;
} }
/* ** Functions ** */ /* ** Functions ** */
@ -623,43 +441,6 @@ stock Turf_GetFirstTurf( playerid )
return -1; return -1;
} }
stock Turf_GetProfitability( zoneid, gang_members, Float: default_pay = 4000.0 )
{
// size adjustments
//if ( g_gangzoneData[ zoneid ] [ E_SIZE ] < TURF_SIZE_SMALL ) // lower than 1st quartile, decrease pay
// default_pay *= 0.75;
// Normal Gang Zones
if ( zoneid < sizeof( g_gangzoneData ) )
{
if ( g_gangzoneData[ zoneid ] [ E_SIZE ] > TURF_SIZE_LARGE ) // higher than 1st quartile, increase pay
default_pay *= 1.25;
// city adjustments
if ( g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_SF )
default_pay *= 1.25;
if ( g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_COUNTRY || g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_DESERTS )
default_pay *= 1.1;
}
// facility 2x
if ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] != INVALID_GANG_ID )
default_pay *= 2;
// get online players
new Float: player_boost = 0.0;
if ( gang_members >= 10 ) player_boost = 1.5;
else if ( gang_members > 1 ) player_boost = 1.0 + float( gang_members - 1 ) * 0.05;
// max boost
default_pay *= player_boost > 1.5 ? 1.5 : player_boost;
// return rounded number
return floatround( default_pay );
}
stock Turf_ResetGangTurfs( gangid ) stock Turf_ResetGangTurfs( gangid )
{ {
foreach ( new z : turfs ) foreach ( new z : turfs )
@ -712,29 +493,109 @@ stock Turf_ShowGangOwners( playerid )
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST, ""COL_WHITE"Gang Turfs", szHugeString, "Close", "" ); return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST, ""COL_WHITE"Gang Turfs", szHugeString, "Close", "" );
} }
stock Turf_RedrawPlayerGangZones( playerid, gangid )
{
foreach ( new x : turfs )
{
// set the new color to the turfs
if ( g_gangTurfData[ x ] [ E_OWNER ] == gangid ) {
g_gangTurfData[ x ] [ E_COLOR ] = setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 );
}
// resume flashing if gang war
if ( g_gangzoneAttacker[ x ] == gangid ) {
GangZoneStopFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 ) );
} else {
GangZoneHideForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], g_gangTurfData[ x ] [ E_COLOR ] );
}
}
return 1;
}
stock Turf_GetCentrePos( zoneid, &Float: X, &Float: Y ) // should return the centre but will do for now stock Turf_GetCentrePos( zoneid, &Float: X, &Float: Y ) // should return the centre but will do for now
{ {
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_X, X ); Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_X, X );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_Y, Y ); Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_Y, Y );
} }
stock GetPlayersInGangZone( z, g )
{
if ( g == INVALID_GANG_ID )
return 0;
new
count = 0;
foreach ( new i : Player ) if ( p_GangID[ i ] == g && IsPlayerInDynamicArea( i, g_gangTurfData[ z ] [ E_AREA ] ) && Turf_IsAbleToTakeover( i ) ) {
count++;
}
return count;
}
stock Turf_IsAbleToTakeover( i ) {
new
Float: Z;
GetPlayerPos( i, Z, Z, Z );
return p_Class[ i ] == CLASS_CIVILIAN && ! p_AntiSpawnKillEnabled{ i } && ! IsPlayerPassive( i ) && GetPlayerState( i ) != PLAYER_STATE_SPECTATING && ! IsPlayerAFK( i ) && Z <= 250.0;
}
stock Turf_RedrawPlayerGangZones( playerid )
{
foreach ( new x : turfs )
{
if ( g_gangHardpointTurf == g_gangTurfData[ x ] [ E_ID ] ) {
if ( g_gangHardpointAttacker != INVALID_GANG_ID ) {
GangZoneStopFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], setAlpha( g_gangData[ g_gangHardpointAttacker ] [ E_COLOR ], 0x80 ) );
} else {
GangZoneHideForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], g_gangHardpointTurf == g_gangTurfData[ x ] [ E_ID ] ? COLOR_HARDPOINT : g_gangTurfData[ x ] [ E_COLOR ] );
}
} else {
GangZoneHideForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], g_gangTurfData[ x ] [ E_COLOR ] );
}
}
if ( GetPlayerClass( playerid ) == CLASS_CIVILIAN && GetPlayerGang( playerid ) != INVALID_GANG_ID ) {
ShowHardpointIconForPlayer( playerid );
} else {
HideHardpointIconForPlayer( playerid );
}
return 1;
}
stock Turf_RedrawGangZonesForAll( )
{
foreach ( new x : turfs )
{
if ( g_gangHardpointTurf == g_gangTurfData[ x ] [ E_ID ] ) {
if ( g_gangHardpointAttacker != INVALID_GANG_ID ) {
GangZoneStopFlashForAll( g_gangTurfData[ x ] [ E_ID ] );
GangZoneFlashForAll( g_gangTurfData[ x ] [ E_ID ], setAlpha( g_gangData[ g_gangHardpointAttacker ] [ E_COLOR ], 0x80 ) );
} else {
GangZoneHideForAll( g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForAll( g_gangTurfData[ x ] [ E_ID ], g_gangHardpointTurf == g_gangTurfData[ x ] [ E_ID ] ? COLOR_HARDPOINT : g_gangTurfData[ x ] [ E_COLOR ] );
}
} else {
GangZoneHideForAll( g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForAll( g_gangTurfData[ x ] [ E_ID ], g_gangTurfData[ x ] [ E_COLOR ] );
}
}
foreach ( new playerid : Player ) {
if ( GetPlayerClass( playerid ) == CLASS_CIVILIAN && GetPlayerGang( playerid ) != INVALID_GANG_ID ) {
ShowHardpointIconForPlayer( playerid );
} else {
HideHardpointIconForPlayer( playerid );
}
}
return 1;
}
stock Turf_GetTotalCaptureSeconds( ) {
new
accum_seconds = 0;
for ( new i = 0; i < sizeof ( g_gangHardpointCaptureTime ); i ++ ) {
accum_seconds += g_gangHardpointCaptureTime[ i ];
}
return accum_seconds;
}
stock Turf_GetMiddlePos( zoneid, &Float: middle_x, &Float: middle_y )
{
new
Float: min_x, Float: min_y, Float: max_x, Float: max_y;
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_X, min_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_Y, min_y );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MAX_X, max_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MAX_Y, max_y );
middle_x = ( min_x + max_x ) / 2.0;
middle_y = ( min_y + max_y ) / 2.0;
}

View File

@ -0,0 +1,740 @@
/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc Pekaj
* Module: cnr\features\gangs\turfs.pwn
* Purpose: turfing module for gangs
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#if defined MAX_FACILITIES
#define MAX_TURFS ( sizeof( g_gangzoneData ) + MAX_FACILITIES )
#else
#define MAX_TURFS ( sizeof( g_gangzoneData ) )
#endif
#define INVALID_GANG_TURF ( -1 )
#define TAKEOVER_NEEDED_PEOPLE ( 1 )
/*
Mean (μ): 61551.012315113
Median: 38190.51
Modes: 36520.39 56000.00
Lowest value: 1561.59
Highest value: 663634.31
Range: 662072.72
Interquartile range: 54438.43
First quartile: 19224.91
Third quartile: 73663.34
Variance (σ2): 5620059337.0135
Standard deviation (σ): 74967.055010941
Quartile deviation: 27219.215
Mean absolute deviation (MAD): 47203.259159645
*/
#define TURF_SIZE_SMALL 19224.91
#define TURF_SIZE_LARGE 73663.34
/* ** Variables ** */
enum e_GANG_ZONE_DATA
{
E_NAME[ 16 ],
Float: E_MIN_X,
Float: E_MIN_Y,
Float: E_MAX_X,
Float: E_MAX_Y,
Float: E_SIZE,
E_CITY
};
new const
g_gangzoneData[ ] [ e_GANG_ZONE_DATA ] =
{
{ "SF-CITY", -2076.0, 1036.5, -1873.0, 1088.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -2014.0, 937.5, -1873.0, 1036.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -2014.0, 829.5, -1886.0, 937.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1873.0, 937.5, -1787.0, 1112.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -2014.0, 719.5, -1886.0, 829.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1886.0, 829.5, -1788.0, 937.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1886.0, 719.5, -1788.0, 829.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1788.0, 829.5, -1723.0, 937.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1723.0, 829.5, -1642.0, 937.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1642.0, 829.5, -1564.0, 937.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1564.0, 828.5, -1421.0, 1015.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1667.0, 720.5, -1563.0, 829.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1788.0, 719.5, -1667.0, 829.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1787.0, 935.5, -1704.0, 1037.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -1787.0, 1037.5, -1704.0, 1112.5, TURF_SIZE_LARGE, CITY_SF },
{ "SF-CITY", -2130.0, 816.5, -2014.0, 1036.5, TURF_SIZE_LARGE, CITY_SF }
/*{ "ELS3c", 2381.677, -1494.030, 2421.030, -1454.348, 1561.60, CITY_LS },
{ "LVA5", 1236.630, 1163.410, 1277.050, 1203.280, 1611.54, CITY_LV },
{ "BINT3", 1277.050, 1044.687, 1315.348, 1087.630, 1644.62, CITY_LV },
{ "SUN3c", 1252.328, -926.999, 1357.000, -910.169, 1761.63, CITY_LS },
{ "LVA4", 1315.348, 1044.687, 1375.598, 1087.630, 2587.31, CITY_LV },
{ "LFL1a", 2581.729, -1454.348, 2632.830, -1393.420, 3113.48, CITY_LS },
{ "LDT1a", 1370.848, -1170.869, 1463.900, -1130.848, 3724.03, CITY_LS },
{ "ESPE1", -1620.300, 1176.520, -1580.010, 1274.260, 3937.94, CITY_SF },
{ "JEF1a", 2185.330, -1210.739, 2281.447, -1154.588, 5397.06, CITY_LS },
{ "MUL7b", 1318.130, -910.169, 1357.000, -768.026, 5525.09, CITY_LS },
{ "JEF3a", 1996.910, -1449.670, 2056.860, -1350.718, 5932.18, CITY_LS },
{ "JTW2", 1236.630, 2142.860, 1297.468, 2243.229, 6106.24, CITY_LV },
{ "JEF3c", 2124.656, -1494.030, 2266.208, -1449.670, 6279.24, CITY_LS },
{ "JTN6", 1848.400, 2478.489, 1938.800, 2553.489, 6780.00, CITY_LV },
{ "ROD4c", 422.678, -1570.197, 466.221, -1406.050, 7147.45, CITY_LS },
{ "LDT1c", 1391.050, -1026.328, 1463.900, -926.999, 7236.11, CITY_LS },
{ "REDW4", 1704.588, 2243.229, 1777.390, 2342.830, 7251.15, CITY_LV },
{ "LMEX1b", 1758.900, -1722.260, 1812.619, -1577.588, 7771.63, CITY_LS },
{ "BINT4", 1375.598, 823.228, 1457.390, 919.447, 7869.94, CITY_LV },
{ "ROD1c", 334.502, -1501.947, 422.678, -1406.050, 8455.81, CITY_LS },
{ "RIH6a", 225.164, -1369.619, 334.502, -1292.067, 8479.38, CITY_LS },
{ "LDT6", 1724.760, -1250.900, 1812.619, -1150.869, 8788.62, CITY_LS },
{ "STRIP4", 2027.400, 1703.229, 2137.395, 1783.229, 8799.59, CITY_LV },
{ "LDT1b", 1378.328, -1130.848, 1463.900, -1026.328, 8943.98, CITY_LS },
{ "BINT2", 1197.390, 1044.687, 1277.050, 1163.390, 9455.88, CITY_LV },
{ "CONF1a", 1073.218, -1842.270, 1323.900, -1804.208, 9541.46, CITY_LS },
{ "SILLY3", -2270.040, -430.276, -2178.687, -324.114, 9698.21, CITY_SF },
{ "MUL5a", 1096.468, -910.169, 1169.130, -768.026, 10328.39, CITY_LS },
{ "YBELL2", 1457.458, 2723.229, 1534.560, 2863.229, 10794.28, CITY_LV },
{ "STRIP3", 2027.400, 1783.229, 2162.385, 1863.229, 10798.79, CITY_LV },
{ "JEF1b", 2056.860, -1210.739, 2185.330, -1126.317, 10845.69, CITY_LS },
{ "MUL5b", 952.604, -937.184, 1096.468, -860.619, 11014.94, CITY_LS },
{ "ALDEA", -1372.140, 2498.520, -1277.588, 2615.350, 11046.51, CITY_DESERTS },
{ "CHC2a", 2126.860, -1126.317, 2185.330, -934.489, 11216.17, CITY_LS },
{ "CHC1a", 1994.328, -1100.817, 2056.860, -920.815, 11255.90, CITY_LS },
{ "RIH5b", 647.557, -954.661, 768.692, -860.619, 11391.77, CITY_LS },
{ "LVA3", 1277.050, 1087.630, 1375.598, 1203.280, 11397.07, CITY_LV },
{ "JTN7", 1377.390, 2433.229, 1534.560, 2507.229, 11630.58, CITY_LV },
{ "LIND2b", 2201.820, -2095.000, 2324.000, -1989.900, 12841.10, CITY_LS },
{ "JTN8", 1704.588, 2342.830, 1848.400, 2433.229, 13000.45, CITY_LV },
{ "SUN3a", 1252.328, -1130.848, 1378.328, -1026.328, 13169.52, CITY_LS },
{ "LMEX1a", 1701.900, -1842.270, 1812.619, -1722.260, 13287.38, CITY_LS },
{ "WESTP3", -2411.218, 373.539, -2253.540, 458.411, 13382.44, CITY_SF },
{ "RIH6b", 225.164, -1292.067, 466.221, -1235.067, 13740.24, CITY_LS },
{ "SUN3b", 1252.328, -1026.328, 1391.050, -926.999, 13779.11, CITY_LS },
{ "ELS3b", 2266.260, -1494.030, 2381.677, -1372.040, 14079.71, CITY_LS },
{ "JTE2", 2623.177, 943.234, 2749.895, 1055.958, 14284.16, CITY_LV },
{ "LIND4c", 2541.697, -1941.400, 2703.580, -1852.869, 14331.66, CITY_LS },
{ "CHC1b", 2056.860, -1126.317, 2126.860, -920.815, 14385.14, CITY_LS },
{ "JTE3", 2625.156, 2202.760, 2685.156, 2442.550, 14387.40, CITY_LV },
{ "ROD1b", 225.164, -1501.947, 334.502, -1369.619, 14468.48, CITY_LS },
{ "JTE4", 2536.427, 2442.550, 2685.156, 2542.550, 14872.90, CITY_LV },
{ "ROD2a", 334.502, -1406.050, 466.221, -1292.067, 15013.73, CITY_LS },
{ "VIN1b", 647.557, -1227.280, 787.460, -1118.280, 15249.42, CITY_LS },
{ "ROD3b", 422.678, -1684.650, 558.098, -1570.197, 15499.22, CITY_LS },
{ "JTN1", 2498.208, 2542.550, 2685.156, 2626.550, 15703.63, CITY_LV },
{ "LDT7", 1724.760, -1430.869, 1812.619, -1250.900, 15811.89, CITY_LS },
{ "ROD1a", 225.164, -1684.650, 312.803, -1501.947, 16011.91, CITY_LS },
{ "JEF3b", 2056.860, -1449.670, 2266.208, -1372.040, 16251.67, CITY_LS },
{ "SUN4", 1096.468, -1130.838, 1252.328, -1026.328, 16288.92, CITY_LS },
{ "VERO2", 1046.150, -1722.260, 1161.520, -1577.588, 16690.80, CITY_LS },
{ "COM1a", 1323.900, -1722.260, 1440.900, -1577.588, 16926.62, CITY_LS },
{ "MUL7a", 1357.000, -926.999, 1463.900, -768.026, 16994.22, CITY_LS },
{ "ROD4b", 466.221, -1570.197, 558.098, -1385.067, 17009.19, CITY_LS },
{ "MUL5c", 911.802, -860.619, 1096.468, -768.026, 17098.78, CITY_LS },
{ "MUL4", 768.692, -954.661, 952.604, -860.619, 17295.44, CITY_LS },
{ "JTS2", 2377.385, 788.893, 2537.385, 897.901, 17441.27, CITY_LV },
{ "IWD3a", 1812.619, -1852.869, 1971.660, -1742.310, 17583.41, CITY_LS },
{ "LDOC1a", 2089.000, -2394.330, 2201.820, -2235.840, 17880.85, CITY_LS },
{ "COM1b", 1370.848, -1577.588, 1463.900, -1384.947, 17925.63, CITY_LS },
{ "JTN3", 2121.395, 2508.229, 2237.395, 2663.166, 17972.69, CITY_LV },
{ "SUN2", 1096.468, -1026.328, 1252.328, -910.169, 18104.53, CITY_LS },
{ "GLN2a", 1812.619, -1449.670, 1996.910, -1350.718, 18235.96, CITY_LS },
{ "SFAIR2", -1242.979, -50.096, -1213.910, 578.395, 18269.58, CITY_SF },
{ "STRIP2", 2106.697, 1863.229, 2162.385, 2202.760, 18907.79, CITY_LV },
{ "LIND4a", 2541.697, -2059.229, 2703.580, -1941.400, 19074.51, CITY_LS },
{ "MAR2", 807.921, -1577.588, 926.921, -1416.250, 19199.22, CITY_LS },
{ "VAIR3", 1457.369, 1143.208, 1777.400, 1203.280, 19224.91, CITY_LV },
{ "IWD3b", 1812.619, -1742.310, 1951.660, -1602.310, 19465.74, CITY_LS },
{ "ESPE2", -1580.010, 1025.979, -1499.890, 1274.260, 19892.27, CITY_SF },
{ "LDT3", 1370.848, -1384.947, 1463.900, -1170.869, 19920.38, CITY_LS },
{ "ROD3a", 312.803, -1684.650, 422.678, -1501.947, 20074.49, CITY_LS },
{ "PER1", 1440.900, -1722.260, 1583.500, -1577.588, 20630.22, CITY_LS },
{ "MUL1a", 687.802, -860.619, 911.802, -768.026, 20740.83, CITY_LS },
{ "GANTB1", -2741.070, 1490.468, -2616.395, 1659.680, 21096.51, CITY_SF },
{ "CHC2b", 2185.330, -1154.588, 2281.447, -934.489, 21155.24, CITY_LS },
{ "MUL6", 1169.130, -910.169, 1318.130, -768.026, 21179.30, CITY_LS },
{ "JTN4", 1938.800, 2508.229, 2121.395, 2624.229, 21181.01, CITY_LV },
{ "COM3", 1667.958, -1577.588, 1812.619, -1430.869, 21224.51, CITY_LS },
{ "ROD5a", 72.648, -1544.170, 225.164, -1404.968, 21230.53, CITY_LS },
{ "ROCE2", 2536.427, 2202.760, 2625.156, 2442.550, 21276.33, CITY_LV },
{ "ROD5b", 72.648, -1684.650, 225.164, -1544.170, 21425.44, CITY_LS },
{ "MKT4", 952.663, -1310.208, 1072.660, -1130.848, 21522.66, CITY_LS },
{ "CHC4b", 2632.739, -1135.040, 2747.739, -945.033, 21850.80, CITY_LS },
{ "MUL1c", 861.085, -674.885, 1156.550, -600.895, 21861.45, CITY_COUNTRY },
{ "THEA3", -2253.540, 373.539, -1993.280, 458.411, 22088.78, CITY_SF },
{ "REDE3", 1848.400, 2342.830, 2011.937, 2478.489, 22185.25, CITY_LV },
{ "SFDWT4", -1580.010, 744.267, -1499.890, 1025.979, 22570.76, CITY_SF },
{ "CONF1b", 1046.150, -1804.208, 1323.900, -1722.260, 22761.05, CITY_LS },
{ "RIH5a", 647.557, -1118.280, 787.460, -954.661, 22890.79, CITY_LS },
{ "OCEAF1", -2994.489, 277.411, -2867.850, 458.411, 22921.64, CITY_SF },
{ "GGC2", 964.390, 930.890, 1166.530, 1044.687, 23002.92, CITY_LV },
{ "GLN1b", 1812.619, -1100.817, 1994.328, -973.380, 23156.44, CITY_LS },
{ "LVA2", 1375.598, 919.447, 1457.369, 1203.280, 23209.30, CITY_LV },
{ "TOM", -405.769, 1712.859, -276.717, 1892.750, 23215.29, CITY_DESERTS },
{ "VERO3", 1161.520, -1722.260, 1323.900, -1577.588, 23491.83, CITY_LS },
{ "ELS1a", 2281.447, -1372.040, 2381.677, -1135.040, 23754.50, CITY_LS },
{ "CALI2", 2137.395, 1703.229, 2437.385, 1783.229, 23999.19, CITY_LV },
{ "IWD4", 1951.660, -1742.310, 2124.656, -1602.310, 24219.43, CITY_LS },
{ "PILL2", 2624.395, 1383.229, 2685.156, 1783.229, 24304.39, CITY_LV },
{ "IWD2", 2124.656, -1742.310, 2222.560, -1494.030, 24307.62, CITY_LS },
{ "WESTP1", -2533.040, 458.411, -2329.310, 578.395, 24444.33, CITY_SF },
{ "SFDWT2", -1871.718, 1176.420, -1620.300, 1274.260, 24598.72, CITY_SF },
{ "COM4", 1583.500, -1722.260, 1758.900, -1577.588, 25375.47, CITY_LS },
{ "ELS1b", 2381.677, -1454.348, 2462.125, -1135.040, 25687.68, CITY_LS },
{ "MAR1", 647.710, -1577.588, 807.921, -1416.250, 25848.12, CITY_LS },
{ "RIH3a", 72.648, -1404.968, 225.164, -1235.067, 25912.61, CITY_LS },
{ "VIN1a", 647.710, -1416.250, 787.460, -1227.280, 26408.55, CITY_LS },
{ "ELS3a", 2222.560, -1628.530, 2421.030, -1494.030, 26694.21, CITY_LS },
{ "ROD4a", 558.098, -1684.650, 647.520, -1384.930, 26801.55, CITY_LS },
{ "ROD2b", 466.221, -1385.067, 647.520, -1235.067, 27194.85, CITY_LS },
{ "REDE2", 1817.390, 2202.760, 2011.937, 2342.830, 27250.21, CITY_LV },
{ "RING", 2162.385, 1783.229, 2437.385, 1883.229, 27500.00, CITY_LV },
{ "IWD5", 1971.660, -1852.869, 2222.560, -1742.310, 27739.24, CITY_LS },
{ "LIND1b", 2089.000, -2235.840, 2201.820, -1989.900, 27746.97, CITY_LS },
{ "SUN1", 952.663, -1130.838, 1096.468, -937.184, 27848.41, CITY_LS },
{ "PRP3", 1848.400, 2553.489, 1938.800, 2863.229, 28000.50, CITY_LV },
{ "VERO4b", 930.221, -2006.780, 1073.218, -1804.208, 28967.19, CITY_LS },
{ "BLUF1b", 1073.218, -2006.780, 1249.619, -1842.270, 29019.73, CITY_LS },
{ "VIN2", 787.460, -1130.838, 952.604, -954.661, 29094.57, CITY_LS },
{ "VIN3", 787.460, -1310.208, 952.663, -1130.838, 29632.46, CITY_LS },
{ "COM2", 1463.900, -1577.588, 1667.958, -1430.869, 29939.18, CITY_LS },
{ "MKT3", 787.460, -1416.250, 1072.660, -1310.208, 30243.17, CITY_LS },
{ "RSW2", 2377.385, 596.348, 2537.385, 788.893, 30807.19, CITY_LV },
{ "JTN2", 2237.395, 2542.550, 2498.208, 2663.166, 31458.21, CITY_LV },
{ "EBE2a", 2632.830, -1668.130, 2747.739, -1393.420, 31566.62, CITY_LS },
{ "LIND2a", 2089.000, -1989.900, 2324.000, -1852.869, 32202.28, CITY_LS },
{ "CHINA", -2274.166, 578.395, -2078.666, 744.169, 32408.81, CITY_SF },
{ "LDOC2", 2324.000, -2145.100, 2703.580, -2059.229, 32594.95, CITY_LS },
{ "EBAY", -1132.817, -768.026, -956.476, -578.117, 33488.74, CITY_COUNTRY },
{ "VISA2", 1817.390, 1703.229, 2027.400, 1863.229, 33601.60, CITY_LV },
{ "OCEAF3", -2994.489, -430.276, -2831.885, -222.589, 33770.73, CITY_SF },
{ "RIH1a", 321.355, -860.619, 687.802, -768.026, 33930.43, CITY_LS },
{ "RIH1b", 321.355, -768.026, 700.794, -674.885, 35341.32, CITY_COUNTRY },
{ "STAR1", 2162.385, 1883.229, 2437.385, 2012.180, 35461.53, CITY_LV },
{ "EBE2b", 2747.739, -1668.130, 2959.350, -1498.619, 35870.40, CITY_LS },
{ "JEF2", 2056.860, -1372.040, 2281.447, -1210.739, 36226.09, CITY_LS },
{ "LDT4", 1463.900, -1290.869, 1724.760, -1150.869, 36520.39, CITY_LS },
{ "LDT5", 1463.900, -1430.869, 1724.760, -1290.869, 36520.39, CITY_LS },
{ "JTS1", 1457.390, 823.228, 2377.385, 863.229, 36800.69, CITY_LV },
{ "ELS4", 2421.030, -1628.530, 2632.830, -1454.348, 36891.75, CITY_LS },
{ "GGC1", 964.390, 1044.687, 1197.390, 1203.218, 36937.72, CITY_LV },
{ "CHC4a", 2747.739, -1120.040, 2959.350, -945.033, 37033.42, CITY_LS },
{ "MUL1b", 737.572, -768.026, 1142.290, -674.885, 37695.83, CITY_COUNTRY },
{ "LDOC3b", 2201.820, -2730.875, 2324.000, -2418.330, 38186.71, CITY_LS },
{ "ELS2", 2462.125, -1454.348, 2581.729, -1135.040, 38190.51, CITY_LS },
{ "GAN1", 2222.560, -1722.328, 2632.830, -1628.530, 38482.49, CITY_LS },
{ "CUNTC2", -2831.885, -430.276, -2646.395, -222.589, 38523.85, CITY_SF },
{ "LIND1a", 1970.619, -2179.250, 2089.000, -1852.869, 38637.30, CITY_LS },
{ "ESPN3", -1982.317, 1274.260, -1524.239, 1358.900, 38771.73, CITY_SF },
{ "HIGH", 1817.390, 1283.229, 2027.390, 1469.229, 39060.00, CITY_LV },
{ "LDOC1b", 2201.820, -2418.330, 2324.000, -2095.000, 39504.44, CITY_LS },
{ "LDM", 1823.078, 596.348, 1997.218, 823.228, 39508.88, CITY_LV },
{ "SUNMA", -2353.166, 2275.790, -2153.166, 2475.790, 40000.00, CITY_DESERTS },
{ "THEA1", -2329.310, 458.411, -1993.280, 578.395, 40318.23, CITY_SF },
{ "ELCO1", 1692.619, -2179.250, 1812.619, -1842.270, 40437.59, CITY_LS },
{ "BFC1", 1375.598, 596.348, 1558.088, 823.228, 41403.32, CITY_LV },
{ "PINK", 1817.390, 1083.229, 2027.390, 1283.229, 42000.00, CITY_LV },
{ "JTW1", 1197.390, 1163.390, 1236.630, 2243.229, 42372.87, CITY_LV },
{ "LFL1b", 2581.729, -1393.420, 2747.739, -1135.040, 42893.66, CITY_LS },
{ "VISA1", 1817.390, 1863.229, 2106.697, 2011.828, 42990.73, CITY_LV },
{ "PRP4", 1938.800, 2624.229, 2121.395, 2861.550, 43333.62, CITY_LV },
{ "VERO1", 851.447, -1804.208, 1046.150, -1577.588, 44123.59, CITY_LS },
{ "LDS", 2749.895, 943.234, 2923.385, 1198.989, 44370.93, CITY_LV },
{ "LDOC3c", 2703.580, -2302.330, 2959.350, -2126.895, 44871.02, CITY_LS },
{ "LIND3", 2324.000, -2059.229, 2541.697, -1852.869, 44923.95, CITY_LS },
{ "THEA2", -2411.218, 265.243, -1993.280, 373.539, 45261.00, CITY_SF },
{ "THALL1", 1323.900, -1842.270, 1701.900, -1722.260, 45363.78, CITY_LS },
{ "MUL2b", 1269.130, -768.026, 1414.067, -452.424, 45742.41, CITY_COUNTRY },
{ "MAR3", 647.710, -1804.208, 851.447, -1577.588, 46170.87, CITY_LS },
{ "BATTP", -2741.070, 1268.410, -2533.040, 1490.468, 46194.73, CITY_SF },
{ "DRAG", 1817.390, 863.231, 2027.390, 1083.229, 46199.57, CITY_LV },
{ "BFLD1", 964.390, 1203.218, 1197.390, 1403.218, 46600.00, CITY_LV },
{ "JTN5", 1534.560, 2433.229, 1848.400, 2583.229, 47075.99, CITY_LV },
{ "YBELL1", 1117.400, 2723.229, 1457.458, 2863.229, 47608.11, CITY_LV },
{ "IWD1", 1812.619, -1602.310, 2124.656, -1449.670, 47629.33, CITY_LS },
{ "REDW1", 1297.468, 2142.860, 1777.390, 2243.229, 48169.24, CITY_LV },
{ "DOH1", -2270.040, -324.114, -1794.920, -222.589, 48236.56, CITY_SF },
{ "TOPFA", 967.382, -450.390, 1176.780, -217.899, 48683.15, CITY_COUNTRY },
{ "BARRA", -926.130, 1398.729, -719.234, 1634.687, 48818.76, CITY_DESERTS },
{ "PIRA", 1817.390, 1469.229, 2027.400, 1703.229, 49142.34, CITY_LV },
{ "CITYS", -2867.850, 277.411, -2593.437, 458.411, 49668.76, CITY_SF },
{ "SFGLF4", -2646.395, -355.493, -2270.040, -222.589, 50019.08, CITY_SF },
{ "STRIP1", 2027.400, 863.229, 2087.385, 1703.229, 50387.38, CITY_LV },
{ "HASH", -2593.437, -222.589, -2411.218, 54.722, 50531.33, CITY_SF },
{ "LAIR2a", 1852.000, -2394.330, 2089.000, -2179.250, 50973.97, CITY_LS },
{ "WWE1", 1098.310, 1726.218, 1197.390, 2243.229, 51225.42, CITY_LV },
{ "SHERR", -789.736, 1659.680, -599.505, 1929.410, 51311.00, CITY_DESERTS },
{ "ELCO2", 1812.619, -2179.250, 1970.619, -1852.869, 51568.19, CITY_LS },
{ "SFDWT3", -1700.010, 744.267, -1580.010, 1176.520, 51870.35, CITY_SF },
{ "VALLE", -936.668, 2611.437, -715.960, 2847.895, 52188.17, CITY_DESERTS },
{ "PAYAS", -354.332, 2580.360, -133.625, 2816.820, 52188.36, CITY_DESERTS },
{ "BINT1", 1166.530, 795.010, 1375.598, 1044.687, 52199.46, CITY_LV },
{ "GAN2", 2222.560, -1852.869, 2632.830, -1722.328, 53557.06, CITY_LS },
{ "REDE1", 1817.390, 2011.828, 2106.697, 2202.760, 55237.96, CITY_LV },
{ "CALI1", 2087.385, 1543.229, 2437.385, 1703.229, 56000.00, CITY_LV },
{ "ROY", 2087.385, 1383.229, 2437.385, 1543.229, 56000.00, CITY_LV },
{ "RIH3b", 72.648, -1235.067, 321.355, -1008.150, 56435.84, CITY_LS },
{ "STAR2", 2437.385, 1783.229, 2685.156, 2012.180, 56727.42, CITY_LV },
{ "MUL2a", 1281.130, -452.424, 1641.130, -290.911, 58144.67, CITY_COUNTRY },
{ "SFDWT1", -1982.317, 744.169, -1871.718, 1274.260, 58627.53, CITY_SF },
{ "KACC", 2498.208, 2626.550, 2749.895, 2861.550, 59146.44, CITY_LV },
{ "HGP", 1777.390, 863.231, 1817.390, 2342.830, 59183.96, CITY_LV },
{ "LDOC3a", 2324.000, -2302.330, 2703.580, -2145.100, 59681.36, CITY_LS },
{ "RIH2", 321.355, -1044.067, 647.557, -860.619, 59841.10, CITY_LS },
{ "RIE", 1558.088, 596.348, 1823.078, 823.234, 60122.51, CITY_LV },
{ "EBE3c", 2632.830, -1852.869, 2959.350, -1668.130, 60320.98, CITY_LS },
{ "BLUEB", 19.607, -404.135, 349.605, -220.136, 60719.30, CITY_COUNTRY },
{ "LST", 2749.895, 1198.989, 2923.385, 1548.989, 60721.49, CITY_LV },
{ "GLN1", 1812.619, -1350.718, 2056.860, -1100.817, 61036.09, CITY_LS },
{ "SFDWT6", -1993.280, 265.243, -1794.920, 578.395, 62116.82, CITY_SF },
{ "REDW3", 1377.390, 2243.229, 1704.588, 2433.229, 62167.62, CITY_LV },
{ "RIH4", 321.355, -1235.067, 647.520, -1044.067, 62297.51, CITY_LS },
{ "GANTB", -2741.447, 1659.680, -2616.395, 2175.145, 64459.92, CITY_DESERTS },
{ "FLINTI", -187.699, -1596.760, 17.062, -1276.598, 65556.68, CITY_COUNTRY },
{ "CHC3", 2281.447, -1135.040, 2632.739, -945.033, 66747.94, CITY_LS },
{ "SRY", 2749.895, 1548.989, 2923.385, 1937.250, 67359.39, CITY_LV },
{ "ISLE", 2011.937, 2202.760, 2237.395, 2508.229, 68870.42, CITY_LV },
{ "CIVI", -2741.070, 458.411, -2533.040, 793.411, 69690.06, CITY_SF },
{ "PLS", 2703.580, -2126.895, 2959.350, -1852.869, 70087.63, CITY_LS },
{ "MKT2", 926.921, -1577.588, 1370.848, -1416.250, 71622.29, CITY_LS },
{ "WESTP2", -2593.437, 54.722, -2411.218, 458.411, 73559.80, CITY_SF },
{ "PINT", 1098.390, 2243.229, 1377.390, 2507.229, 73656.00, CITY_LV },
{ "FINA", -1871.718, 744.169, -1701.300, 1176.420, 73663.34, CITY_SF },
{ "SPIN", 2121.395, 2663.166, 2498.208, 2861.550, 74753.67, CITY_LV },
{ "PILL1", 2437.385, 1383.229, 2624.395, 1783.229, 74804.00, CITY_LV },
{ "BFLD2", 964.390, 1403.218, 1197.390, 1726.218, 75259.00, CITY_LV },
{ "BIGE", -410.019, 1403.338, -137.968, 1681.229, 75600.53, CITY_DESERTS },
{ "DILLI", 580.794, -674.885, 861.085, -404.790, 75705.20, CITY_COUNTRY },
{ "ELQUE", -1645.229, 2498.520, -1372.140, 2777.850, 76281.96, CITY_DESERTS },
{ "ESPN1", -2533.040, 1358.900, -1996.660, 1501.208, 76331.15, CITY_SF },
{ "SFAIR3", -1499.890, -50.096, -1242.979, 249.904, 77073.30, CITY_SF },
{ "MUL3", 1414.067, -768.026, 1667.609, -452.424, 80018.35, CITY_COUNTRY },
{ "EBE1", 2747.739, -1498.619, 2959.350, -1120.040, 80111.50, CITY_LS },
{ "MKT1", 1072.660, -1416.250, 1370.848, -1130.848, 85103.44, CITY_LS },
{ "RSW1", 1997.218, 596.348, 2377.385, 823.228, 86252.28, CITY_LV },
{ "PRP1", 1534.560, 2583.229, 1848.400, 2863.229, 87875.18, CITY_LV },
{ "EASB2", -1794.920, -50.096, -1499.890, 249.904, 88509.00, CITY_SF },
{ "LEAFY", -1166.968, -1856.030, -815.624, -1602.067, 89228.38, CITY_COUNTRY },
{ "LVA1", 1457.390, 863.229, 1777.400, 1143.208, 89596.08, CITY_LV },
{ "PRP2", 1117.400, 2507.229, 1534.560, 2723.229, 90106.57, CITY_LV },
{ "BLUEB1", 104.528, -220.136, 349.605, 152.235, 91259.20, CITY_COUNTRY },
{ "SFDWT5", -2078.666, 578.395, -1499.890, 744.267, 96002.73, CITY_SF },
{ "RSE", 2537.385, 676.549, 2902.350, 943.234, 97330.71, CITY_LV },
{ "SANB1", -2616.395, 1501.208, -1996.660, 1659.680, 98210.67, CITY_SF },
{ "PARA", -2741.070, 793.411, -2533.040, 1268.410, 98814.06, CITY_SF },
{ "CAM", 2087.385, 1203.229, 2640.395, 1383.229, 99541.80, CITY_LV },
{ "OVS", 2162.385, 2012.180, 2685.156, 2202.760, 99629.67, CITY_LV },
{ "JUNIHI", -2533.040, 578.395, -2274.166, 968.369, 100954.14, CITY_SF },
{ "JUNIHO", -2533.040, 968.369, -2274.166, 1358.900, 101098.33, CITY_SF },
{ "ROCE1", 2237.395, 2202.760, 2536.427, 2542.550, 101608.08, CITY_LV },
{ "JTE1", 2685.156, 1055.958, 2749.895, 2626.550, 101678.57, CITY_LV },
{ "VERO4a", 647.710, -2173.290, 930.221, -1804.208, 104269.72, CITY_LS },
{ "SILLY4", -2178.687, -599.882, -1794.920, -324.114, 105830.64, CITY_SF },
{ "ARCO", -901.129, 2221.860, -592.090, 2571.968, 108197.00, CITY_DESERTS },
{ "HAUL", -792.254, -698.554, -452.403, -380.040, 108247.30, CITY_COUNTRY },
{ "DAM", -968.770, 1929.410, -481.126, 2155.260, 110134.39, CITY_DESERTS },
{ "ESPN2", -1996.660, 1358.900, -1524.239, 1592.510, 110362.26, CITY_SF },
{ "ESPE3", -1499.890, 578.395, -1339.890, 1274.260, 111338.39, CITY_SF },
{ "GARC", -2411.218, -222.589, -2173.040, 265.243, 116190.84, CITY_SF },
{ "MONT", 1119.510, 119.526, 1451.400, 493.321, 124058.83, CITY_COUNTRY },
{ "CREE", 2749.895, 1937.250, 2921.620, 2669.790, 125795.50, CITY_LV },
{ "LAIR1", 1249.619, -2394.330, 1852.000, -2179.250, 129560.14, CITY_LS },
{ "SMB2", 72.648, -2173.290, 342.648, -1684.650, 131932.79, CITY_LS },
{ "MULINT", 1463.900, -1150.869, 1812.619, -768.026, 133504.62, CITY_LS },
{ "ANGPI", -2324.937, -2584.290, -1964.218, -2212.110, 134252.37, CITY_COUNTRY },
{ "MEAD", 37.032, 2337.177, 435.988, 2677.895, 135931.50, CITY_DESERTS },
{ "OCTAN", 338.657, 1228.510, 664.307, 1655.050, 138902.76, CITY_DESERTS },
{ "LOT", 2087.385, 943.234, 2623.177, 1203.229, 139303.23, CITY_LV },
{ "REDW2", 1236.630, 1883.109, 1777.390, 2142.860, 140463.00, CITY_LV },
{ "SMB1", 342.648, -2173.290, 647.710, -1684.650, 149065.50, CITY_LS },
{ "BLUF2", 1249.619, -2179.250, 1692.619, -1842.270, 149282.12, CITY_LS },
{ "VAIR1", 1236.630, 1203.280, 1457.369, 1883.109, 150064.78, CITY_LV },
{ "FLINTR", -594.190, -1648.550, -187.699, -1276.598, 151195.15, CITY_COUNTRY },
{ "BLUF1a", 930.221, -2488.416, 1249.619, -2006.780, 153833.57, CITY_LS },
{ "PALO", 2160.218, -149.003, 2576.916, 228.322, 157230.57, CITY_COUNTRY },
{ "LDOC4", 2373.770, -2697.090, 2809.218, -2330.458, 159649.20, CITY_LS },
{ "FARM", -1209.670, -1317.098, -908.161, -787.390, 159711.75, CITY_COUNTRY },
{ "SFAIR5", -1213.910, -50.096, -947.979, 578.395, 167135.26, CITY_COUNTRY },
{ "QUARY", 337.243, 710.840, 860.554, 1031.708, 167913.75, CITY_DESERTS },
{ "WWE", 883.307, 1726.218, 1098.310, 2507.229, 167919.75, CITY_LV },
{ "CALT", -2274.166, 744.169, -1982.317, 1358.900, 179408.62, CITY_SF },
{ "EASB1", -1794.920, 249.904, -1242.979, 578.395, 181307.67, CITY_SF },
{ "DOH2", -2173.040, -222.589, -1794.920, 265.243, 184459.04, CITY_SF },
{ "CARSO", -376.233, 826.325, 123.717, 1220.437, 197036.29, CITY_DESERTS },
{ "SILLY1", -2178.687, -1115.578, -1794.920, -599.882, 197907.07, CITY_SF },
{ "OCEAF2", -2994.489, -222.589, -2593.437, 277.411, 200526.00, CITY_SF },
{ "FERN", 508.187, -139.259, 1306.660, 119.526, 206632.84, CITY_COUNTRY },
{ "SUNNN", -2741.070, 2175.145, -2353.166, 2722.790, 212433.71, CITY_DESERTS },
{ "VAIR2", 1457.369, 1203.280, 1777.390, 1883.109, 217559.54, CITY_LV },
{ "BLUAC", -319.674, -220.136, 104.528, 293.324, 217811.28, CITY_COUNTRY },
{ "BAYV", -2994.489, 458.411, -2741.070, 1339.609, 223312.26, CITY_SF },
{ "REST", -91.583, 1655.050, 421.234, 2123.010, 239977.82, CITY_DESERTS },
{ "NROCK", 2285.370, -768.026, 2770.590, -269.739, 241778.79, CITY_COUNTRY },
{ "LAIR2b", 1382.729, -2730.875, 2201.820, -2394.330, 275660.93, CITY_LS },
{ "HILLP", -2994.489, -811.276, -2178.687, -430.276, 310820.56, CITY_SF },
{ "SANB2", -2616.395, 1659.680, -1996.660, 2175.145, 319451.68, CITY_DESERTS },
{ "SFAIR1", -1794.920, -730.117, -1213.910, -50.096, 395099.00, CITY_SF },
{ "PANOP", -947.979, -304.320, -319.674, 327.071, 396706.12, CITY_COUNTRY },
{ "CREEK", -1820.640, -2643.677, -1226.780, -1771.660, 517855.96, CITY_COUNTRY },
{ "BACKO", -1166.968, -2641.187, -321.743, -1856.030, 663634.31, CITY_COUNTRY }*/
}
;
/* ** Variables ** */
enum E_TURF_ZONE_DATA {
E_ID,
E_OWNER,
E_COLOR,
E_AREA,
E_FACILITY_GANG
};
new
g_gangTurfData [ MAX_TURFS ] [ E_TURF_ZONE_DATA ],
Iterator: turfs < MAX_TURFS >,
g_gangzoneAttacker [ MAX_TURFS ] = { INVALID_GANG_ID, ... },
g_gangzoneAttackCount [ MAX_TURFS ],
g_gangzoneAttackTimeout [ MAX_TURFS ]
;
/* ** Forwards ** */
forward OnPlayerUpdateGangZone( playerid, zoneid );
/* ** Hooks ** */
hook OnGameModeInit( )
{
/* ** Gangzone Allocation ** */
for ( new i = 0; i < sizeof( g_gangzoneData ); i++ ) {
Turf_Create( g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ], INVALID_GANG_ID, COLOR_GANGZONE );
}
return 1;
}
hook OnServerGameDayEnd( )
{
// payday for gangs holding turfs
foreach ( new g : gangs )
{
new
afk_members, online_members = GetOnlineGangMembers( g, .afk_members = afk_members );
if ( online_members >= TAKEOVER_NEEDED_PEOPLE )
{
new
profit = 0;
foreach( new zoneid : turfs ) if ( g_gangTurfData[ zoneid ] [ E_OWNER ] != INVALID_GANG_ID && g_gangTurfData[ zoneid ] [ E_OWNER ] == g )
{
// facilities will not pay out respect
if ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] == INVALID_GANG_ID ) {
g_gangData[ g ] [ E_RESPECT ] ++;
}
// accumulate profit
profit += Turf_GetProfitability( zoneid, online_members - afk_members );
}
GiveGangCash( g, profit );
if ( profit > 0 ) {
SaveGangData( g );
SendClientMessageToGang( g, g_gangData[ g ] [ E_COLOR ], "[GANG] "COL_GOLD"%s"COL_WHITE" has been earned from territories and deposited in the gang bank account.", cash_format( profit ) );
}
}
}
return 1;
}
hook OnPlayerEnterDynArea( playerid, areaid )
{
if ( ! IsPlayerNPC( playerid ) )
{
new
first_turf = Turf_GetFirstTurf( playerid );
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, first_turf );
}
return Y_HOOKS_CONTINUE_RETURN_1;
}
hook OnPlayerLeaveDynArea( playerid, areaid )
{
if ( ! IsPlayerNPC( playerid ) )
{
new
total_areas = GetPlayerNumberDynamicAreas( playerid );
// reduced to another area
if ( total_areas )
{
new
first_turf = Turf_GetFirstTurf( playerid );
CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, first_turf );
}
// if the player is in no areas, then they left
else CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, INVALID_GANG_TURF );
}
return Y_HOOKS_CONTINUE_RETURN_1;
}
/* ** Commands ** */
CMD:takeover( playerid, params[ ] )
{
if ( p_GangID[ playerid ] == INVALID_GANG_ID )
return SendError( playerid, "You are not in any gang." );
if ( p_Class[ playerid ] != CLASS_CIVILIAN )
return SendError( playerid, "This is restricted to civilians only." );
if ( GetPlayerInterior( playerid ) != 0 && GetPlayerVirtualWorld( playerid ) != 0 )
return SendError( playerid, "You cannot do this inside interiors." );
if ( IsPlayerJailed( playerid ) || IsPlayerUsingOrbitalCannon( playerid ) )
return SendError( playerid, "You cannot do this at the moment." );
new
g_isAFK = 0,
g_inAir = 0
;
foreach ( new z : Reverse(turfs) )
{
if ( IsPlayerInDynamicArea( playerid, g_gangTurfData[ z ] [ E_AREA ] ) )
{
new gangid = p_GangID[ playerid ];
if ( g_gangTurfData[ z ] [ E_OWNER ] == gangid ) return SendError( playerid, "This turf is already captured by your gang." );
if ( g_gangzoneAttacker[ z ] != INVALID_GANG_ID ) return SendError( playerid, "This turf is currently being attacked." );
new opposing_count = GetPlayersInGangZone( z, g_gangTurfData[ z ] [ E_OWNER ] ); // Opposing check
// existing gang members
if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && opposing_count ) {
return SendError( playerid, "There are gang members within this turf, kill them!" );
}
new attacking_count = GetPlayersInGangZone( z, gangid, g_isAFK, g_inAir );
if ( attacking_count < TAKEOVER_NEEDED_PEOPLE && ( attacking_count + g_isAFK + g_inAir ) >= TAKEOVER_NEEDED_PEOPLE )
return SendError( playerid, "You cannot start a turf war if gang members are AFK or extremely high above ground." );
//if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && dCount < TAKEOVER_NEEDED_PEOPLE + 1 && ( dCount + g_isAFK + g_inAir ) >= TAKEOVER_NEEDED_PEOPLE + 1 )
// return SendError( playerid, "You need at least %d gang members to start a gang war with another gang.", TAKEOVER_NEEDED_PEOPLE + 1 );
// Facility check
if ( g_gangTurfData[ z ] [ E_FACILITY_GANG ] != INVALID_GANG_ID && Iter_Contains( gangs, g_gangTurfData[ z ] [ E_FACILITY_GANG ] ) )
{
new facility_gang = g_gangTurfData[ z ] [ E_FACILITY_GANG ];
new facility_members = GetOnlineGangMembers( facility_gang );
if ( g_gangTurfData[ z ] [ E_OWNER ] == facility_gang ) {
if ( facility_members < 3 ) {
return SendError( playerid, "This facility requires at least %d of its gang members online for a takeover.", 3 - facility_members );
}
else if ( attacking_count < 3 ) {
return SendError( playerid, "You need at least %d gang members to take over this facility.", 3 - attacking_count );
}
}
}
// Begin takeover
if ( attacking_count >= TAKEOVER_NEEDED_PEOPLE && ! opposing_count )
{
g_gangzoneAttacker[ z ] = gangid;
g_gangzoneAttackCount[ z ] = 0;
GangZoneFlashForAll( g_gangTurfData[ z ] [ E_ID ], setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 ) );
SendClientMessage( playerid, g_gangData[ gangid ] [ E_COLOR ], "[TURF]{FFFFFF} You are now beginning to take over the turf. Stay inside the area with your gang for 60 seconds. Don't die." );
if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID )
{
new
szLocation[ MAX_ZONE_NAME ], Float: min_x, Float: min_y;
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_X, min_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_Y, min_y );
GetZoneFromCoordinates( szLocation, min_x, min_y );
SendClientMessageToGang( g_gangTurfData[ z ] [ E_OWNER ], g_gangData[ g_gangTurfData[ z ] [ E_OWNER ] ] [ E_COLOR ], "[GANG]"COL_WHITE" Our territory is being attacked by "COL_GREY"%s"COL_WHITE" in %s, defend it!", g_gangData[ g_gangzoneAttacker[ z ] ] [ E_NAME ], szLocation );
}
}
else
{
SendError( playerid, "You need at least %d member(s) to take over this turf.", TAKEOVER_NEEDED_PEOPLE );
}
return 1;
}
}
return SendError( playerid, "You are not in any gangzone." );
}
/* ** Functions ** */
stock Turf_Create( Float: min_x, Float: min_y, Float: max_x, Float: max_y, owner_id = INVALID_GANG_ID, color = COLOR_GANGZONE, facility_gang_id = INVALID_GANG_ID )
{
new
id = Iter_Free( turfs );
if ( id != ITER_NONE )
{
// set turf owners
g_gangTurfData[ id ] [ E_OWNER ] = owner_id;
g_gangTurfData[ id ] [ E_COLOR ] = color;
g_gangTurfData[ id ] [ E_FACILITY_GANG ] = facility_gang_id;
// create area
g_gangTurfData[ id ] [ E_ID ] = GangZoneCreate( min_x, min_y, max_x, max_y );
g_gangTurfData[ id ] [ E_AREA ] = CreateDynamicRectangle( min_x, min_y, max_x, max_y, 0, 0 );
// add to iterator
Iter_Add( turfs, id );
}
return id;
}
stock Turf_GetOwner( id ) {
return g_gangTurfData[ id ] [ E_OWNER ];
}
stock Turf_GetFacility( id ) {
return g_gangTurfData[ id ] [ E_FACILITY_GANG ];
}
stock Turf_GetFirstTurf( playerid )
{
new
current_areas[ 4 ];
GetPlayerDynamicAreas( playerid, current_areas );
foreach( new i : Reverse(turfs) )
{
if ( current_areas[ 0 ] == g_gangTurfData[ i ] [ E_AREA ] || current_areas[ 1 ] == g_gangTurfData[ i ] [ E_AREA ] || current_areas[ 2 ] == g_gangTurfData[ i ] [ E_AREA ] || current_areas[ 3 ] == g_gangTurfData[ i ] [ E_AREA ] )
{
return i;
}
}
return -1;
}
stock Turf_GetProfitability( zoneid, gang_members, Float: default_pay = 4000.0 )
{
// size adjustments
//if ( g_gangzoneData[ zoneid ] [ E_SIZE ] < TURF_SIZE_SMALL ) // lower than 1st quartile, decrease pay
// default_pay *= 0.75;
// Normal Gang Zones
if ( zoneid < sizeof( g_gangzoneData ) )
{
if ( g_gangzoneData[ zoneid ] [ E_SIZE ] > TURF_SIZE_LARGE ) // higher than 1st quartile, increase pay
default_pay *= 1.25;
// city adjustments
if ( g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_SF )
default_pay *= 1.25;
if ( g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_COUNTRY || g_gangzoneData[ zoneid ] [ E_CITY ] == CITY_DESERTS )
default_pay *= 1.1;
}
// facility 2x
if ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] != INVALID_GANG_ID )
default_pay *= 2;
// get online players
new Float: player_boost = 0.0;
if ( gang_members >= 10 ) player_boost = 1.5;
else if ( gang_members > 1 ) player_boost = 1.0 + float( gang_members - 1 ) * 0.05;
// max boost
default_pay *= player_boost > 1.5 ? 1.5 : player_boost;
// return rounded number
return floatround( default_pay );
}
stock Turf_ResetGangTurfs( gangid )
{
foreach ( new z : turfs )
{
if ( g_gangTurfData[ z ] [ E_OWNER ] == gangid )
{
new
facility_gang = g_gangTurfData[ z ] [ E_FACILITY_GANG ];
if ( g_gangTurfData[ z ] [ E_FACILITY_GANG ] != INVALID_GANG_ID && Iter_Contains( gangs, g_gangTurfData[ z ] [ E_FACILITY_GANG ] ) )
{
g_gangTurfData[ z ] [ E_COLOR ] = setAlpha( g_gangData[ facility_gang ] [ E_COLOR ], 0x80 );
g_gangTurfData[ z ] [ E_OWNER ] = facility_gang;
GangZoneShowForAll( g_gangTurfData[ z ] [ E_ID ], g_gangTurfData[ z ] [ E_COLOR ] );
}
else
{
g_gangTurfData[ z ] [ E_COLOR ] = COLOR_GANGZONE;
g_gangTurfData[ z ] [ E_OWNER ] = INVALID_GANG_ID;
GangZoneShowForAll( g_gangTurfData[ z ] [ E_ID ], COLOR_GANGZONE );
}
}
}
}
stock Turf_ShowGangOwners( playerid )
{
if ( ! Iter_Count( turfs ) )
return SendError( playerid, "There is currently no trufs on the server." );
szHugeString[ 0 ] = '\0';
foreach( new turfid : turfs )
{
new
szLocation[ MAX_ZONE_NAME ], Float: min_x, Float: min_y;
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ turfid ] [ E_AREA ], E_STREAMER_MIN_X, min_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ turfid ] [ E_AREA ], E_STREAMER_MIN_Y, min_y );
GetZoneFromCoordinates( szLocation, min_x, min_y );
if ( g_gangTurfData[ turfid ][ E_OWNER ] == INVALID_GANG_ID ) {
format( szHugeString, sizeof( szHugeString ), "%s%s\t"COL_GREY"Unoccupied\n", szHugeString, szLocation );
}
else {
format( szHugeString, sizeof( szHugeString ), "%s%s\t{%06x}%s\n", szHugeString, szLocation, g_gangTurfData[ turfid ][ E_COLOR ] >>> 8 , ReturnGangName( g_gangTurfData[ turfid ][ E_OWNER ] ) );
}
}
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST, ""COL_WHITE"Gang Turfs", szHugeString, "Close", "" );
}
stock Turf_RedrawPlayerGangZones( playerid, gangid )
{
foreach ( new x : turfs )
{
// set the new color to the turfs
if ( g_gangTurfData[ x ] [ E_OWNER ] == gangid ) {
g_gangTurfData[ x ] [ E_COLOR ] = setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 );
}
// resume flashing if gang war
if ( g_gangzoneAttacker[ x ] == gangid ) {
GangZoneStopFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneFlashForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], setAlpha( g_gangData[ gangid ] [ E_COLOR ], 0x80 ) );
} else {
GangZoneHideForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] );
GangZoneShowForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ], g_gangTurfData[ x ] [ E_COLOR ] );
}
}
return 1;
}
stock Turf_GetCentrePos( zoneid, &Float: X, &Float: Y ) // should return the centre but will do for now
{
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_X, X );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ zoneid ] [ E_AREA ], E_STREAMER_MIN_Y, Y );
}

View File

@ -84,7 +84,7 @@ hook OnPlayerEnterDynArea( playerid, areaid )
// see if ahead // see if ahead
AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], vehicleid, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 ); AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], vehicleid, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 );
AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], vehicleid, 0.0, -OUTRUN_DIST - 5.0 ); AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], vehicleid, 0.0, OUTRUN_DIST * 2 );
} }
return 1; return 1;
} }
@ -571,6 +571,7 @@ CMD:race( playerid, params[ ] )
// stream to players // stream to players
foreach (new i : Player) if ( p_raceLobbyId[ i ] == raceid ) { foreach (new i : Player) if ( p_raceLobbyId[ i ] == raceid ) {
Streamer_AppendArrayData( STREAMER_TYPE_RACE_CP, g_raceData[ raceid ] [ E_START_CHECKPOINT ], E_STREAMER_PLAYER_ID, i ); Streamer_AppendArrayData( STREAMER_TYPE_RACE_CP, g_raceData[ raceid ] [ E_START_CHECKPOINT ], E_STREAMER_PLAYER_ID, i );
Streamer_Update( i );
} }
// see if racers is 2 // see if racers is 2
@ -689,42 +690,37 @@ function OnRaceCountdown( raceid, time )
if ( time <= 0 ) if ( time <= 0 )
{ {
foreach (new playerid : Player) if ( p_raceLobbyId[ playerid ] == raceid ) // destroy starting checkpoint
{ DestroyDynamicRaceCP( g_raceData[ raceid ] [ E_START_CHECKPOINT ] );
if ( g_raceData[ raceid ] [ E_MODE ] == RACE_OUTRUN ) g_raceData[ raceid ] [ E_CD_TIMER ] = -1;
{
// create sphere ahead of leader
if ( g_raceData[ raceid ] [ E_LOBBY_HOST ] == playerid )
{
new
vehicleid = GetPlayerVehicleID( playerid ), Float: A;
GetVehicleZAngle( vehicleid, A ); if ( g_raceData[ raceid ] [ E_MODE ] == RACE_OUTRUN )
{
new hostid = g_raceData[ raceid ] [ E_LOBBY_HOST ];
new vehicleid = GetPlayerVehicleID( hostid );
// create sphere obj // create sphere obj
g_raceData[ raceid ] [ E_OUTRUN_LEAD ] = playerid; g_raceData[ raceid ] [ E_OUTRUN_LEAD ] = hostid;
g_raceData[ raceid ] [ E_OUTRUN_SPHERE ] = CreateDynamicCircle( 0.0, 0.0, 10.0 ); g_raceData[ raceid ] [ E_OUTRUN_SPHERE ] = CreateDynamicCircle( 0.0, 0.0, 10.0 );
g_raceData[ raceid ] [ E_OUTRUN_OBJECT ] = CreateDynamicObject( 11752, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1, -1, 0 ); g_raceData[ raceid ] [ E_OUTRUN_OBJECT ] = CreateDynamicObject( 11752, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1, -1, .playerid = 0 );
g_raceData[ raceid ] [ E_OUTRUN_TIMER ] = SetTimerEx( "OnRaceOutrun", 250, true, "d", raceid ); g_raceData[ raceid ] [ E_OUTRUN_TIMER ] = SetTimerEx( "OnRaceOutrun", 250, true, "d", raceid );
// attach objects // attach objects
Streamer_RemoveArrayData( STREAMER_TYPE_OBJECT, g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], E_STREAMER_PLAYER_ID, 0 ); Streamer_RemoveArrayData( STREAMER_TYPE_OBJECT, g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], E_STREAMER_PLAYER_ID, 0 );
AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], vehicleid, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 ); AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], vehicleid, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 );
AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], vehicleid, 0.0, -OUTRUN_DIST - 4.0 ); AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], vehicleid, 0.0, OUTRUN_DIST * 2 );
}
foreach ( new playerid : Player ) if ( p_raceLobbyId[ playerid ] == raceid )
{
// show checkpoint for player // show checkpoint for player
Streamer_AppendArrayData( STREAMER_TYPE_OBJECT, g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], E_STREAMER_PLAYER_ID, playerid ); Streamer_AppendArrayData( STREAMER_TYPE_OBJECT, g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], E_STREAMER_PLAYER_ID, playerid );
} Streamer_Update( playerid );
// destroy starting checkpoint // show gametext
DestroyDynamicRaceCP( g_raceData[ raceid ] [ E_START_CHECKPOINT ] ); GameTextForPlayer( playerid, "~g~GO!", 2000, 3 );
PlayerPlaySound( playerid, 1057, 0.0, 0.0, 0.0 );
// show gametext }
GameTextForPlayer( playerid, "~g~GO!", 2000, 3 ); }
PlayerPlaySound( playerid, 1057, 0.0, 0.0, 0.0 );
}
g_raceData[ raceid ] [ E_CD_TIMER ] = -1;
} }
else else
{ {
@ -833,7 +829,7 @@ function OnRaceOutrun( raceid )
// see if ahead // see if ahead
AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], iVehicle, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 ); AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], iVehicle, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 );
AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], iVehicle, 0.0, -OUTRUN_DIST - 4.0 ); AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], iVehicle, 0.0, OUTRUN_DIST * 2 );
} }
} }
} }
@ -959,7 +955,7 @@ stock RemovePlayerFromRace( playerid )
// see if ahead // see if ahead
AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], iVehicle, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 ); AttachDynamicObjectToVehicle( g_raceData[ raceid ] [ E_OUTRUN_OBJECT ], iVehicle, 0.0, OUTRUN_DIST, -15.0, 0.0, 0.0, 0.0 );
AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], iVehicle, 0.0, -OUTRUN_DIST - 4.0 ); AttachDynamicAreaToVehicle( g_raceData[ raceid ] [ E_OUTRUN_SPHERE ], iVehicle, 0.0, OUTRUN_DIST * 2 );
} }
else else
{ {

View File

@ -85,7 +85,7 @@ hook OnScriptInit( )
// ID NAME SYMBOL MAX SHARES IPO_PRICE MAX_PRICE POOL_FACTOR PRICE_FACTOR DESCRIPTION // ID NAME SYMBOL MAX SHARES IPO_PRICE MAX_PRICE POOL_FACTOR PRICE_FACTOR DESCRIPTION
CreateStockMarket( E_STOCK_MINING_COMPANY, "The Mining Company", "MC", 100000.0, 25.0, 500.0, 100000.0, 10.0, "Exporting mined ores" ); CreateStockMarket( E_STOCK_MINING_COMPANY, "The Mining Company", "MC", 100000.0, 25.0, 500.0, 100000.0, 10.0, "Exporting mined ores" );
CreateStockMarket( E_STOCK_AMMUNATION, "Ammu-Nation", "A", 100000.0, 25.0, 250.0, 100000.0, 10.0, "Purchases at Ammu-Nation/Weapon Dealers/Facilities" ); CreateStockMarket( E_STOCK_AMMUNATION, "Ammu-Nation", "A", 100000.0, 25.0, 250.0, 100000.0, 10.0, "Purchases at Ammu-Nation/Weapon Dealers/Facilities" );
CreateStockMarket( E_STOCK_VEHICLE_DEALERSHIP, "Vehicle Dealership", "VD", 100000.0, 25.0, 500.0, 100000.0, 20.0, "Car jacker exports, vehicle and component sales" ); CreateStockMarket( E_STOCK_VEHICLE_DEALERSHIP, "Vehicle Dealership", "VD", 100000.0, 25.0, 750.0, 100000.0, 20.0, "Car jacker exports, vehicle and component sales" );
CreateStockMarket( E_STOCK_SUPA_SAVE, "Supa-Save", "SS", 100000.0, 25.0, 250.0, 100000.0, 10.0, "Purchases at Supa-Save and 24/7" ); CreateStockMarket( E_STOCK_SUPA_SAVE, "Supa-Save", "SS", 100000.0, 25.0, 250.0, 100000.0, 10.0, "Purchases at Supa-Save and 24/7" );
CreateStockMarket( E_STOCK_TRUCKING_COMPANY, "The Trucking Company", "TC", 100000.0, 50.0, 250.0, 100000.0, 20.0, "Completed trucking missions" ); CreateStockMarket( E_STOCK_TRUCKING_COMPANY, "The Trucking Company", "TC", 100000.0, 50.0, 250.0, 100000.0, 20.0, "Completed trucking missions" );
CreateStockMarket( E_STOCK_CLUCKIN_BELL, "Cluckin' Bell", "CB", 100000.0, 50.0, 250.0, 100000.0, 20.0, "Exporting meth bags" ); CreateStockMarket( E_STOCK_CLUCKIN_BELL, "Cluckin' Bell", "CB", 100000.0, 50.0, 250.0, 100000.0, 20.0, "Exporting meth bags" );

View File

@ -23,7 +23,6 @@
#define COL_YELLOW "{FFFF00}" #define COL_YELLOW "{FFFF00}"
#define COL_BLACK "{333333}" #define COL_BLACK "{333333}"
#define COL_BRONZE "{CD7F32}" #define COL_BRONZE "{CD7F32}"
#define COLOR_GANGZONE 0x00000080
#define COLOR_RDMZONES 0x00CC0010 #define COLOR_RDMZONES 0x00CC0010
#define COLOR_GREEN 0x00CC00FF #define COLOR_GREEN 0x00CC00FF
#define COLOR_RED 0xFF0000FF #define COLOR_RED 0xFF0000FF

View File

@ -258,6 +258,7 @@ new
/* ** Forwards ** */ /* ** Forwards ** */
public OnPlayerDriveVehicle( playerid, vehicleid ); public OnPlayerDriveVehicle( playerid, vehicleid );
public OnServerUpdateTimer( ); public OnServerUpdateTimer( );
public OnServerSecondTick( );
public OnHelpHTTPResponse( index, response_code, data[ ] ); public OnHelpHTTPResponse( index, response_code, data[ ] );
public OnRulesHTTPResponse( index, response_code, data[ ] ); public OnRulesHTTPResponse( index, response_code, data[ ] );
public OnTwitterHTTPResponse( index, response_code, data[ ] ); public OnTwitterHTTPResponse( index, response_code, data[ ] );
@ -420,7 +421,7 @@ public OnGameModeInit()
/* ** Timers ** */ /* ** Timers ** */
rl_ServerUpdate = SetTimer( "OnServerUpdateTimer", 960, true ); rl_ServerUpdate = SetTimer( "OnServerUpdateTimer", 960, true );
rl_ZoneUpdate = SetTimer( "ZoneTimer", 980, true ); rl_ZoneUpdate = SetTimer( "OnServerSecondTick", 980, true );
HTTP( 0, HTTP_GET, "files.sfcnr.com/en_rules.txt", "", "OnRulesHTTPResponse" ); HTTP( 0, HTTP_GET, "files.sfcnr.com/en_rules.txt", "", "OnRulesHTTPResponse" );
@ -897,7 +898,7 @@ stock GetGangCapturedTurfs( gangid )
return c; return c;
} }
public ZoneTimer( ) public OnServerSecondTick( )
{ {
new new
iKeys, iUpDownKeys, iLeftRightKeys; iKeys, iUpDownKeys, iLeftRightKeys;
@ -923,138 +924,8 @@ public ZoneTimer( )
} }
} }
// call local function
new CallLocalFunction( "OnServerTickSecond", "" );
oCount = 0;
foreach ( new z : turfs )
{
if ( g_gangzoneAttacker[ z ] != INVALID_GANG_ID )
{
new
attacker_member_count = GetPlayersInGangZone( z, g_gangzoneAttacker[ z ] );
if ( attacker_member_count >= TAKEOVER_NEEDED_PEOPLE )
{
if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID )
oCount = GetPlayersInGangZone( z, g_gangTurfData[ z ] [ E_OWNER ] );
new
attacker_time_required = -10 * ( attacker_member_count - TAKEOVER_NEEDED_PEOPLE ) + ( g_gangTurfData[ z ] [ E_FACILITY_GANG ] == INVALID_GANG_ID ? 60 : 120 );
// minimum of 20 seconds
if ( attacker_time_required < 20 )
attacker_time_required = 20;
if ( g_gangzoneAttackCount[ z ] < attacker_time_required && oCount == 0 )
{
foreach ( new i : Player ) if ( p_Class[ i ] != CLASS_POLICE && p_GangID[ i ] == g_gangzoneAttacker[ z ] && IsPlayerInDynamicArea( i, g_gangTurfData[ z ] [ E_AREA ] ) ) {
if ( p_WantedLevel[ i ] < 2 ) GivePlayerWantedLevel( i, 2 - p_WantedLevel[ i ] );
ShowPlayerHelpDialog( i, 1500, "~r~Control~w~ the area for %d seconds!", attacker_time_required - g_gangzoneAttackCount[ z ] );
}
g_gangzoneAttackCount[ z ] ++;
g_gangzoneAttackTimeout[ z ] = 0;
continue;
}
else if ( g_gangzoneAttackCount[ z ] >= attacker_time_required )
{
static szLocation[ MAX_ZONE_NAME ], szCity[ MAX_ZONE_NAME ];
new earned_money = 0;
new owner_gang = g_gangTurfData[ z ] [ E_OWNER ];
new attacker_gang = g_gangzoneAttacker[ z ];
new Float: min_x, Float: min_y;
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_X, min_x );
Streamer_GetFloatData( STREAMER_TYPE_AREA, g_gangTurfData[ z ] [ E_AREA ], E_STREAMER_MIN_Y, min_y );
Get2DCity ( szCity, min_x, min_y );
GetZoneFromCoordinates ( szLocation, min_x, min_y );
GangZoneStopFlashForAll ( g_gangTurfData[ z ] [ E_ID ] );
GangZoneShowForAll ( g_gangTurfData[ z ] [ E_ID ], setAlpha( g_gangData[ g_gangzoneAttacker[ z ] ] [ E_COLOR ], 0x80 ) );
g_gangTurfData[ z ] [ E_COLOR ] = setAlpha( g_gangData[ g_gangzoneAttacker[ z ] ] [ E_COLOR ], 0x80 );
g_gangTurfData[ z ] [ E_OWNER ] = g_gangzoneAttacker[ z ];
g_gangzoneAttacker [ z ] = INVALID_GANG_ID;
g_gangzoneAttackCount [ z ] = 0;
g_gangzoneAttackTimeout [ z ] = 0;
// Money Grub
if ( Iter_Contains( gangs, owner_gang ) )
{
new afk_opmembers, online_opmembers = GetOnlineGangMembers( owner_gang, .afk_members = afk_opmembers );
new zone_money = Turf_GetProfitability( z, online_opmembers - afk_opmembers );
if ( g_gangData[ owner_gang ] [ E_BANK ] > zone_money )
{
// deduct from gang bank and give to op, take 10% as fee
g_gangData[ owner_gang ] [ E_BANK ] -= zone_money;
SaveGangData( owner_gang );
earned_money = floatround( float( zone_money ) * 0.9 );
g_gangData[ attacker_gang ] [ E_BANK ] += earned_money;
}
// credit respect
g_gangData[ attacker_gang ] [ E_RESPECT ] ++;
SaveGangData( attacker_gang );
}
// Alert gang
if ( earned_money ) {
SendClientMessageToGang ( attacker_gang, g_gangData[ attacker_gang ] [ E_COLOR ], "[GANG]{FFFFFF} We have captured a turf near %s in %s and earned "COL_GOLD"%s"COL_WHITE"!", szLocation, szCity, cash_format( earned_money ) );
} else {
SendClientMessageToGang ( attacker_gang, g_gangData[ attacker_gang ] [ E_COLOR ], "[GANG]{FFFFFF} We have captured a turf near %s in %s!", szLocation, szCity );
}
// Give Gangmembers XP & Wanted
foreach(new d : Player)
{
new in_area = IsPlayerInDynamicArea( d, g_gangTurfData[ z ] [ E_AREA ] );
if ( in_area )
PlayerTextDrawSetString( d, g_ZoneOwnerTD[ d ], sprintf( "~r~~h~(%s)~n~~w~~h~%s", g_gangTurfData[ z ] [ E_FACILITY_GANG ] != INVALID_GANG_ID ? ( "FACILITY" ) : ( "TERRITORY" ), ReturnGangName( attacker_gang ) ) );
if ( IsPlayerSpawned( d ) && ! IsPlayerAFK( d ) && p_Class[ d ] == CLASS_CIVILIAN && p_GangID[ d ] == attacker_gang && ! IsPlayerInPaintBall( d ) ) {
if ( in_area ) {
GivePlayerScore( d, 2 );
GivePlayerWantedLevel( d, 6 );
}
PlayerPlaySound( d, 36205, 0.0, 0.0, 0.0 );
}
}
}
else if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && oCount > 0 ) {
foreach ( new i : Player ) if ( p_GangID[ i ] != INVALID_GANG_ID && IsPlayerInDynamicArea( i, g_gangTurfData[ z ] [ E_AREA ] ) ) {
// message the attacker that they gotta attack
if ( p_GangID[ i ] == g_gangzoneAttacker[ z ] ) {
ShowPlayerHelpDialog( i, 1500, "~r~Kill~w~ the %d gang member%s in the area!", oCount, oCount == 1 ? ( "" ) : ( "s" ) );
}
// message the defender
else if ( p_GangID[ i ] == g_gangTurfData[ z ] [ E_OWNER ] ) {
ShowPlayerHelpDialog( i, 1500, "~b~Defend~w~ the area from the %d enemy gang member%s!", attacker_member_count, attacker_member_count == 1 ? ( "" ) : ( "s" ) );
}
}
}
}
else
{
if ( ! g_gangzoneAttackTimeout[ z ] ) {
g_gangzoneAttackTimeout[ z ] = g_iTime + 10;
SendClientMessageToGang( g_gangzoneAttacker[ z ], g_gangData[ g_gangzoneAttacker[ z ] ] [ E_COLOR ], "[GANG]{FFFFFF} You have 10 seconds to get back in the area until the turf war is stopped!" );
}
else if ( g_iTime >= g_gangzoneAttackTimeout[ z ] )
{
g_gangzoneAttackCount[ z ] = 0;
g_gangzoneAttackTimeout[ z ] = 0;
GangZoneStopFlashForAll( g_gangTurfData[ z ] [ E_ID ] );
g_gangzoneAttacker[ z ] = INVALID_GANG_ID;
}
}
}
}
// Looping every 1000 MS // Looping every 1000 MS
foreach ( new playerid : Player ) foreach ( new playerid : Player )
@ -1117,19 +988,6 @@ public ZoneTimer( )
return 1; return 1;
} }
public OnPlayerUpdateGangZone( playerid, zoneid )
{
if ( ! p_inMovieMode{ playerid } )
{
if ( zoneid == INVALID_GANG_TURF )
return PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], "_" );
// if ( p_GangID[ playerid ] != INVALID_GANG_ID && g_gangTurfData[ zoneid ] [ E_OWNER ] == INVALID_GANG_ID ) ShowPlayerHelpDialog( playerid, 2000, "You can take over this turf by typing ~g~/takeover" );
PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], sprintf( "~r~~h~(%s)~n~~w~~h~%s", g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] != INVALID_GANG_ID ? ( "FACILITY" ) : ( "TERRITORY" ), ReturnGangName( g_gangTurfData[ zoneid ] [ E_OWNER ] ) ) );
}
return 1;
}
public OnRulesHTTPResponse( index, response_code, data[ ] ) public OnRulesHTTPResponse( index, response_code, data[ ] )
{ {
if ( response_code == 200 ) if ( response_code == 200 )
@ -1680,17 +1538,6 @@ public OnPlayerSpawn( playerid )
if ( p_MoneyBag{ playerid } && p_Class[ playerid ] != CLASS_POLICE ) // SetPlayerAttachedObject( playerid, 1, 1550, 1, 0.131999, -0.140999, 0.053999, 11.299997, 65.599906, 173.900054, 0.652000, 0.573000, 0.594000 ); if ( p_MoneyBag{ playerid } && p_Class[ playerid ] != CLASS_POLICE ) // SetPlayerAttachedObject( playerid, 1, 1550, 1, 0.131999, -0.140999, 0.053999, 11.299997, 65.599906, 173.900054, 0.652000, 0.573000, 0.594000 );
RemovePlayerAttachedObject( playerid, 1 ), SetPlayerAttachedObject( playerid, 1, 1210, 7, 0.302650, -0.002469, -0.193321, 296.124053, 270.396881, 8.941717, 1.000000, 1.000000, 1.000000 ); RemovePlayerAttachedObject( playerid, 1 ), SetPlayerAttachedObject( playerid, 1, 1210, 7, 0.302650, -0.002469, -0.193321, 296.124053, 270.396881, 8.941717, 1.000000, 1.000000, 1.000000 );
// Gang Zones
foreach( new zoneid : turfs )
{
// resume flashing if gang war
if ( g_gangzoneAttacker[ zoneid ] != INVALID_GANG_ID && Iter_Contains( gangs, g_gangzoneAttacker[ zoneid ] ) ) {
GangZoneFlashForPlayer( playerid, g_gangTurfData[ zoneid ] [ E_ID ], setAlpha( g_gangData[ g_gangzoneAttacker[ zoneid ] ] [ E_COLOR ], 0x80 ) );
} else {
GangZoneShowForPlayer( playerid, g_gangTurfData[ zoneid ] [ E_ID ], g_gangTurfData[ zoneid ] [ E_COLOR ] );
}
}
// VIP Skin // VIP Skin
if ( IsPlayerSettingToggled( playerid, SETTING_VIPSKIN ) && p_VIPLevel[ playerid ] ) if ( IsPlayerSettingToggled( playerid, SETTING_VIPSKIN ) && p_VIPLevel[ playerid ] )
SetPlayerSkin( playerid, p_LastSkin[ playerid ] ); SetPlayerSkin( playerid, p_LastSkin[ playerid ] );
@ -11089,34 +10936,6 @@ stock IsPlayerInArea3D( playerid, Float: minx, Float: maxx, Float: miny, Float:
stock IsPointInArea( Float: X, Float: Y, Float: Z, Float: minx, Float: maxx, Float: miny, Float: maxy, Float: minz, Float: maxz ) stock IsPointInArea( Float: X, Float: Y, Float: Z, Float: minx, Float: maxx, Float: miny, Float: maxy, Float: minz, Float: maxz )
return ( X > minx && X < maxx && Y > miny && Y < maxy && Z > minz && Z < maxz ); return ( X > minx && X < maxx && Y > miny && Y < maxy && Z > minz && Z < maxz );
stock GetPlayersInGangZone( z, g, &is_afk = 0, &in_air = 0 )
{
if ( g == INVALID_GANG_ID )
return 0;
new count = 0;
new Float: Z;
foreach ( new i : Player ) if ( p_Class[ i ] == CLASS_CIVILIAN && p_GangID[ i ] == g && IsPlayerInDynamicArea( i, g_gangTurfData[ z ] [ E_AREA ] ) )
{
if ( ! p_AntiSpawnKillEnabled{ i } && ! IsPlayerPassive( i ) && GetPlayerState( i ) != PLAYER_STATE_SPECTATING )
{
if ( IsPlayerAFK( i ) )
{
is_afk++;
continue;
}
if ( GetPlayerPos( i, Z, Z, Z ) && Z >= 300.0 )
{
in_air++;
continue;
}
count++;
}
}
return count;
}
stock HexToInt(string[]) // By DracoBlue stock HexToInt(string[]) // By DracoBlue
{ {
if ( isnull( string ) ) if ( isnull( string ) )