diff --git a/gamemodes/irresistible/cnr/features/gangs/turfs.pwn b/gamemodes/irresistible/cnr/features/gangs/turfs.pwn index dfd450e..f4b4e8c 100644 --- a/gamemodes/irresistible/cnr/features/gangs/turfs.pwn +++ b/gamemodes/irresistible/cnr/features/gangs/turfs.pwn @@ -1,8 +1,8 @@ /* * Irresistible Gaming (c) 2018 * Developed by Lorenc - * Module: - * Purpose: + * Module: cnr\features\gangs\turfs.pwn + * Purpose: turfing module for gangs */ /* ** Includes ** */ @@ -15,11 +15,12 @@ #define MAX_TURFS ( sizeof( g_gangzoneData ) ) #endif -#define INVALID_GANG_TURF ( -1 ) -#define TAKEOVER_NEEDED_PEOPLE ( 1 ) - #define COLOR_GANGZONE 0x00000080 +#define INVALID_GANG_TURF ( -1 ) + +#define TAKEOVER_NEEDED_PEOPLE ( 1 ) + /* Mean (μ): 61551.012315113 Median: 38190.51 @@ -97,7 +98,7 @@ new forward OnPlayerUpdateGangZone( playerid, zoneid ); /* ** Hooks ** */ -hook OnScriptInit( ) +hook OnGameModeInit( ) { /* ** Gangzone Allocation ** */ for ( new i = 0; i < sizeof( g_gangzoneData ); i++ ) { @@ -106,170 +107,12 @@ hook OnScriptInit( ) 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 online_members = GetOnlineGangMembers( g ); - - 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 ); - } - - 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( ) +hook OnServerUpdate( ) { new oCount = 0; - foreach( new z : turfs ) + foreach ( new z : turfs ) { if ( g_gangzoneAttacker[ z ] != INVALID_GANG_ID ) { @@ -303,7 +146,7 @@ hook OnServerTickSecond( ) static szLocation[ MAX_ZONE_NAME ], szCity[ MAX_ZONE_NAME ]; new earned_money = 0; - //new owner_gang = g_gangTurfData[ z ] [ E_OWNER ]; + new owner_gang = g_gangTurfData[ z ] [ E_OWNER ]; new attacker_gang = g_gangzoneAttacker[ z ]; new Float: min_x, Float: min_y; @@ -324,13 +167,20 @@ hook OnServerTickSecond( ) g_gangzoneAttackTimeout [ z ] = 0; // Money Grub - if ( Iter_Contains( gangs, attacker_gang ) ) + if ( Iter_Contains( gangs, owner_gang ) ) { - new online_opmembers = GetOnlineGangMembers( attacker_gang ); - new zone_money = Turf_GetProfitability( z, online_opmembers ); + new afk_opmembers, online_opmembers = GetOnlineGangMembers( owner_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 ); + 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 ] ++; @@ -390,126 +240,111 @@ hook OnServerTickSecond( ) } } } - 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 ) +hook OnServerGameDayEnd( ) { - new - id = Iter_Free( turfs ); - - if ( id != ITER_NONE ) + // payday for gangs holding turfs + foreach ( new g : gangs ) { - // 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; + new + afk_members, online_members = GetOnlineGangMembers( g, .afk_members = afk_members ); - // 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 ] ) + printf("Online %d/%d",online_members,afk_members); + if ( online_members >= TAKEOVER_NEEDED_PEOPLE ) { - return i; + 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; + return 1; } -stock Turf_GetProfitability( zoneid, gang_members, Float: default_pay = 750.0 ) +hook OnPlayerEnterDynArea( playerid, areaid ) { - // 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 ( ! IsPlayerNPC( playerid ) ) { - if ( GetPlayerState( i ) != PLAYER_STATE_SPECTATING ) + new + first_turf = Turf_GetFirstTurf( playerid ); + + if ( ! IsPlayerMovieMode( playerid ) ) { - if ( IsPlayerAFK( i ) ) - { - is_afk++; - continue; - } - if ( GetPlayerPos( i, Z, Z, Z ) && Z >= 300.0 ) - { - in_air++; - continue; - } - count++; + if ( first_turf == INVALID_GANG_TURF ) + return PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], "_" ); + + // if ( p_GangID[ playerid ] != INVALID_GANG_ID && g_gangTurfData[ first_turf ] [ 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[ first_turf ] [ E_FACILITY_GANG ] != INVALID_GANG_ID ? ( "FACILITY" ) : ( "TERRITORY" ), ReturnGangName( g_gangTurfData[ first_turf ] [ E_OWNER ] ) ) ); } } - return count; + return Y_HOOKS_CONTINUE_RETURN_1; +} + +hook OnPlayerSpawn( playerid ) +{ + // 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 ] ); + } + } + return 1; +} + +hook OnPlayerUnloadTextdraws( playerid ) +{ + PlayerTextDrawHide( playerid, g_ZoneOwnerTD[ playerid ] ); + return 1; +} + +hook OnPlayerLoadTextdraws( playerid ) +{ + PlayerTextDrawShow( playerid, g_ZoneOwnerTD[ playerid ] ); + 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 ** */ @@ -524,9 +359,6 @@ CMD:takeover( playerid, params[ ] ) 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." ); @@ -545,6 +377,7 @@ CMD:takeover( playerid, params[ ] ) 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!" ); @@ -581,8 +414,18 @@ CMD:takeover( playerid, params[ ] ) 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 ] ); + + 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 @@ -593,4 +436,208 @@ CMD:takeover( playerid, params[ ] ) } } return SendError( playerid, "You are not in any gangzone." ); -} \ No newline at end of file +} + +/* ** 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 ); +} + +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 ( ! IsPlayerSpawnProtected( 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; +} diff --git a/gamemodes/irresistible/cnr/features/gangs/turfs_old.pwn b/gamemodes/irresistible/cnr/features/gangs/turfs_old.pwn deleted file mode 100644 index da62057..0000000 --- a/gamemodes/irresistible/cnr/features/gangs/turfs_old.pwn +++ /dev/null @@ -1,648 +0,0 @@ -/* - * Irresistible Gaming (c) 2018 - * Developed by Lorenc - * Module: cnr\features\gangs\turfs.pwn - * Purpose: turfing module for gangs - */ - -/* ** Includes ** */ -#include < YSI\y_hooks > - -/* ** Gang Zone Numbers ** */ -#define GANGZONE_DEFAULT_BORDER_SIZE 2.0 // default thickness of borders -#define GANGZONE_DEFAULT_NUMBER_SIZE 0.6 // default thickness of numbers -#include < gangzones > - -/* ** 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 -#define COLOR_HARDPOINT 0xFF000080 - -/* ** Macros ** */ -#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 ** */ -enum e_GANG_ZONE_DATA -{ - Float: E_MIN_X, - Float: E_MIN_Y, - Float: E_MAX_X, - Float: E_MAX_Y, - E_CITY -}; - -static const - g_gangzoneData[ ] [ e_GANG_ZONE_DATA ] = - { - { -2076.0, 1036.5, -1873.0, 1088.5, CITY_SF }, - { -2014.0, 937.5, -1873.0, 1036.5, CITY_SF }, - { -2014.0, 829.5, -1886.0, 937.5, CITY_SF }, - { -1873.0, 937.5, -1787.0, 1112.5, CITY_SF }, - { -2014.0, 719.5, -1886.0, 829.5, CITY_SF }, - { -1886.0, 829.5, -1788.0, 937.5, CITY_SF }, - { -1886.0, 719.5, -1788.0, 829.5, CITY_SF }, - { -1788.0, 829.5, -1723.0, 937.5, CITY_SF }, - { -1723.0, 829.5, -1642.0, 937.5, CITY_SF }, - { -1642.0, 829.5, -1564.0, 937.5, CITY_SF }, - { -1564.0, 828.5, -1421.0, 1015.5, CITY_SF }, - { -1667.0, 720.5, -1563.0, 829.5, CITY_SF }, - { -1788.0, 719.5, -1667.0, 829.5, CITY_SF }, - { -1787.0, 935.5, -1704.0, 1037.5, CITY_SF }, - { -1787.0, 1037.5, -1704.0, 1112.5, CITY_SF }, - { -2130.0, 816.5, -2014.0, 1036.5, 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 >, - Iterator: gangzoneturfs < MAX_TURFS >, - - Float: g_weekAveragePlayers = 0.0, - Float: g_weekSecondsElapsed = 0.0, - - g_gangHardpointRotation = -1, - g_gangHardpointTurf = INVALID_GANG_TURF, - g_gangHardpointPreviousTurf = INVALID_GANG_TURF, - g_gangHardpointAttacker = INVALID_GANG_ID, - g_gangHardpointMapIcon = -1, - - g_gangHardpointCaptureTime [ MAX_GANGS ] - -; - -/* ** Forwards ** */ -forward OnPlayerUpdateGangZone( playerid, zoneid ); - -stock Float: Turf_GetHardpointPrizePool( Float: max_payout = 500000.0 ) -{ - new - Float: total_payout = ( g_weekAveragePlayers / g_weekSecondsElapsed ) * 7500.0; - - return total_payout < max_payout ? total_payout : max_payout; -} - -/* ** Hooks ** */ -hook OnGameModeInit( ) -{ - // Gangzone Allocation - for ( new i = 0; i < sizeof( g_gangzoneData ); i ++ ) { - new turfid = 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, .bordersize = GANGZONE_DEFAULT_BORDER_SIZE, .numbersize = GANGZONE_DEFAULT_NUMBER_SIZE ); - Iter_Add( gangzoneturfs, turfid ); - } - - // Reset Iterator - g_gangHardpointRotation = Iter_Last( gangzoneturfs ); - return 1; -} - -hook OnServerTickSecond( ) -{ - new - hardpoint_turf = g_gangHardpointTurf; - - 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_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; - } - - 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 ) ); - } - - Turf_SetHardpointAttacker( new_attacker ); - } - - 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 for %s!~n~~n~Earning potential is ~g~%s", ReturnGangName( current_attacker ), TimeConvert( 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; - } - - // fixed zone rotation - new current_rotation = g_gangHardpointRotation; - - // reset rotation - if ( current_rotation >= Iter_Last( gangzoneturfs ) ) { - g_gangHardpointRotation = Iter_First( gangzoneturfs ); - } - // get next in rotation - else { - g_gangHardpointRotation = Iter_Next( gangzoneturfs, current_rotation ); - } - - // allocate new hardpoint - g_gangHardpointTurf = g_gangHardpointRotation; - 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, .worldid = 0, .interiorid = 0, .playerid = 0, .streamdistance = 3000.0, .style = MAPICON_GLOBAL ); - Streamer_RemoveArrayData( STREAMER_TYPE_MAP_ICON, g_gangHardpointMapIcon, E_STREAMER_PLAYER_ID, 0 ); - - // redraw gangzones - Turf_RedrawGangZonesForAll( ); - 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 ); - - foreach ( new p : Player ) if ( GetPlayerGang( p ) == g ) { - PlayerPlaySound( p, 36205, 0.0, 0.0, 0.0 ); - } - - 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 ) ); - } - } - } - - // get previous turf - new previous_turf = Iter_Prev( gangzoneturfs, g_gangHardpointTurf ); - - if ( previous_turf >= Iter_Last( gangzoneturfs ) ) { - previous_turf = INVALID_GANG_TURF; - } - - // reset hardpoint - g_gangHardpointPreviousTurf = previous_turf; - g_gangHardpointTurf = INVALID_GANG_TURF; - g_weekAveragePlayers = 0.0; - g_weekSecondsElapsed = 0.0; - return 1; -} - -hook OnPlayerSpawn( playerid ) -{ - Turf_RedrawPlayerGangZones( playerid ); - return 1; -} - -hook OnPlayerEnterDynArea( playerid, areaid ) -{ - if ( ! IsPlayerNPC( playerid ) ) - { - new - first_turf = Turf_GetFirstTurf( playerid ); - - // update textdraws - CallLocalFunction( "OnPlayerUpdateGangZone", "dd", playerid, first_turf ); - } - 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 ) -{ - 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 ( g_gangTurfData[ zoneid ] [ E_FACILITY_GANG ] != INVALID_GANG_ID ) { - PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], sprintf( "~p~(FACILITY)~n~~w~~h~%s", ReturnGangName( g_gangTurfData[ zoneid ] [ E_OWNER ] ) ) ); - } else { - if ( g_gangTurfData[ g_gangHardpointTurf ] [ E_ID ] != g_gangTurfData[ zoneid ] [ E_ID ] ) { - PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], "~b~~h~(INACTIVE HARDPOINT)~n~~w~~h~Unchallenged" ); - } else { - DisablePlayerSpawnProtection( playerid ); - PlayerTextDrawSetString( playerid, g_ZoneOwnerTD[ playerid ], sprintf( "~r~~h~(ACTIVE HARDPOINT)~n~~w~~h~%s", g_gangHardpointAttacker != INVALID_GANG_ID ? ( ReturnGangName( g_gangHardpointAttacker ) ) : ( "Unchallenged" ) ) ); - } - } - } - 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, Float: bordersize = GANGZONE_DEFAULT_BORDER_SIZE, Float: numbersize = 0.0 ) -{ - 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, .bordersize = bordersize, .numbersize = numbersize ); - 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_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_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 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 && ! IsPlayerSpawnProtected( i ) && ! IsPlayerAdminOnDuty( i ) && GetPlayerState( i ) != PLAYER_STATE_SPECTATING && ! IsPlayerAFK( i ) && Z <= 250.0; -} - -stock Turf_HideAllGangZones( playerid ) -{ - foreach ( new x : turfs ) - { - GangZoneHideForPlayer( playerid, g_gangTurfData[ x ] [ E_ID ] ); - } - return 1; -} - -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; -} - -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; -} \ No newline at end of file