/* * Irresistible Gaming (c) 2018 * Developed by Lorenc * Module: * Purpose: */ /* ** 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 ) #define COLOR_GANGZONE 0x00000080 /* 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 } } ; /* ** 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 OnScriptInit( ) { /* ** 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 OnGangUnload( gangid, bool: deleted ) { // Empty out the turfs 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 ); } } } return 1; } hook OnPlayerGangChangeColor( 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; } hook OnPlayerSpawn( playerid ) { 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 ] ); } } 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; } public OnPlayerUpdateGangZone( playerid, zoneid ) { if ( ! IsPlayerMovieMode( 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, 10000, "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" ), g_gangTurfData[ zoneid ] [ E_OWNER ] == -1 ? ( "Uncaptured" ) : ( ReturnGangName( g_gangTurfData[ zoneid ] [ E_OWNER ] ) ) ) ); } return 1; } hook OnServerGameDayEnd( ) { 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 ); } if ( profit > 0 ) { GiveGangCash( g, profit ); 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 ) ); } foreach( new p : Player ) { if ( IsPlayerAdmin( p ) ) { format( szNormalString, sizeof( szNormalString ), "Gang ID: %i - Online Active Members: %i - Profit: %i", g, online_members, profit ); SendClientMessage( p, -1, szNormalString ); } } } } return 1; } hook OnServerTickSecond( ) { new 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, attacker_gang ) ) { new afk_opmembers, online_opmembers = GetOnlineGangMembers( attacker_gang, .afk_members = afk_opmembers ); new zone_money = Turf_GetProfitability( z, online_opmembers - afk_opmembers ); earned_money = floatround( float( zone_money ) * 0.5 ); GiveGangCash( attacker_gang, 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; } } } } return 1; } /* ** 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_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 ); } 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 = 750.0 ) { // size adjustments if ( g_gangzoneData[ zoneid ] [ E_SIZE ] < TURF_SIZE_SMALL ) // lower than 1st quartile, decrease pay default_pay *= 0.75; 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; // handle online active players boost new Float: player_boost = 0.06 * float( gang_members ) + 0.75; default_pay *= player_boost > 1.35 ? 1.35 : player_boost; // return rounded number return floatround( default_pay ); } stock GetGangCapturedTurfs( gangid ) { new z, c; foreach ( z : turfs ) if ( g_gangTurfData[ z ] [ E_OWNER ] != INVALID_GANG_ID && g_gangTurfData[ z ] [ E_OWNER ] == gangid ) { c++; } return c; } 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 ( 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; } /* ** 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 ( IsPlayerAdminOnDuty( playerid ) ) return SendError( playerid, "You can't capture while on duty!" ); 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 ) { SendClientMessageToGang( g_gangTurfData[ z ] [ E_OWNER ], g_gangData[ g_gangTurfData[ z ] [ E_OWNER ] ] [ E_COLOR ], "[GANG]{FFFFFF} Our territory is being attacked by "COL_GREY"%s"COL_WHITE", defend it!", g_gangData[ g_gangzoneAttacker[ z ] ] [ E_NAME ] ); } } 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." ); }