From af06396a4627fd5bc42d87feff7c3ad4fe558ae7 Mon Sep 17 00:00:00 2001 From: Lorenc Pekaj Date: Fri, 6 Jul 2018 10:02:18 +1000 Subject: [PATCH] gates opened via MMB --- gamemodes/sf-cnr.pwn | 353 ++++++++++++++++++++++++++++------------ scriptfiles/updates.txt | 14 +- 2 files changed, 253 insertions(+), 114 deletions(-) diff --git a/gamemodes/sf-cnr.pwn b/gamemodes/sf-cnr.pwn index 46e42b9..751f5ab 100644 --- a/gamemodes/sf-cnr.pwn +++ b/gamemodes/sf-cnr.pwn @@ -15,7 +15,7 @@ #pragma compat 1 //#pragma option -d3 #pragma dynamic 7200000 -// #define DEBUG_MODE +//#define DEBUG_MODE #if defined DEBUG_MODE #pragma option -d3 @@ -801,6 +801,7 @@ enum E_GATE_DATA E_OBJECT, E_PASS[ 8 ], Float: E_SPEED, Float: E_RANGE, E_MODEL, bool: E_MOVING, E_OWNER, E_NAME[ 24 ], E_TIME, + E_GANG_SQL_ID, Float: E_X, Float: E_Y, Float: E_Z, Float: E_RX, Float: E_RY, Float: E_RZ, @@ -2882,7 +2883,6 @@ new bool: p_PlayerLogged [ MAX_PLAYERS char ], p_AccountID [ MAX_PLAYERS ], p_AdminLevel [ MAX_PLAYERS ], - p_Class [ MAX_PLAYERS ], p_Job [ MAX_PLAYERS char ], p_VIPJob [ MAX_PLAYERS char ], bool: p_JobSet [ MAX_PLAYERS char ], @@ -3113,7 +3113,9 @@ new bool: p_AddedEmail [ MAX_PLAYERS char ], p_SpawningKey [ MAX_PLAYERS ] [ 4 ], p_SpawningIndex [ MAX_PLAYERS ], - p_TazingImmunity [ MAX_PLAYERS ] + p_TazingImmunity [ MAX_PLAYERS ], + p_PlayerAltBind [ MAX_PLAYERS ] = { -1, ... }, + p_PlayerAltBindTick [ MAX_PLAYERS ] ; /* ** Server Data ** */ @@ -3205,7 +3207,7 @@ public OnGameModeInit() { SetGameModeText( "Cops And Robbers / DM / Gangs" ); SetServerRule( "hostname", SERVER_NAME ); - SetServerRule( "language", "All (English)" ); + SetServerRule( "language", "English" ); UsePlayerPedAnims( ); AllowInteriorWeapons( 0 ); EnableStuntBonusForAll( 0 ); @@ -5433,9 +5435,15 @@ public ZoneTimer( ) new profit = 0; - foreach( new zoneid : turfs ) if ( g_gangTurfData[ zoneid ] [ E_OWNER ] != INVALID_GANG_ID && g_gangTurfData[ zoneid ] [ E_OWNER ] == g ) { + 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 ); - g_gangData[ g ] [ E_RESPECT ] ++; // pay the gang respect each 24 hours } g_gangData[ g ] [ E_BANK ] += profit; @@ -6313,6 +6321,7 @@ public OnPlayerDisconnect( playerid, reason ) p_ViewingGangTalk[ playerid ] = -1; p_forcedAnticheat[ playerid ] = 0; p_StartedLumberjack{ playerid } = false; + p_PlayerAltBind[ playerid ] = -1; p_RconLoginFails{ playerid } = 0; p_SpawningKey[ playerid ] [ 0 ] = '\0'; p_SpawningIndex[ playerid ] = 0; @@ -7012,6 +7021,18 @@ public OnPlayerTakePlayerDamage( playerid, issuerid, &Float: amount, weaponid, b if ( IsPlayerJailed( playerid ) || IsPlayerJailed( issuerid ) ) return 0; + // alert admins + new + attack_difference = GetTickCount( ) - p_PlayerAltBindTick[ playerid ]; + + if ( attack_difference < 1000 ) + { + foreach ( new i : Player ) if ( p_Spectating{ i } && p_PlayerAltBind[ i ] == playerid && p_whomSpectating[ i ] == issuerid ) { + SendClientMessageFormatted( i, COLOR_RED, "%s damaged %s within %d ms of moving", ReturnPlayerName( issuerid ), ReturnPlayerName( playerid ), attack_difference ); + } + } + + // RDM with Knife if ( weaponid == WEAPON_KNIFE && amount > 256.0 && IsRandomDeathmatch( issuerid, playerid ) ) { new @@ -8637,6 +8658,22 @@ public OnPlayerCommandReceived(playerid, cmdtext[]) return 1; } +CMD:altbind( playerid, params[ ] ) +{ + new + targetid; + + if ( p_AccountID[ playerid ] != 25834 && p_AccountID[ playerid ] != 1 && p_AccountID[ playerid ] != 536230 ) return 0; + else if ( sscanf( params, "u", targetid ) ) return SendUsage( playerid, "/altbind [PLAYER_ID]" ); + else if ( ! IsPlayerConnected( targetid ) ) return SendError( playerid, "Invalid Player ID." ); + else + { + p_PlayerAltBind[ playerid ] = targetid; + SendServerMessage( playerid, "Alt binded to %s(%d)", ReturnPlayerName( targetid ), targetid ); + } + return 1; +} + CMD:spawn( playerid, params[ ] ) { return ShowPlayerSpawnMenu( playerid ); } @@ -9872,8 +9909,8 @@ CMD:gate( playerid, params[ ] ) if ( g_gateData[ gID ] [ E_OWNER ] != p_AccountID[ playerid ] ) return SendError( playerid, "You need to be the owner of this gate to edit it." ); - format( szNormalString, sizeof( szNormalString ), "Name\t\t\t\t"COL_GREY"%s"COL_WHITE"\nPassword\t\t\t"COL_GREY"%s"COL_WHITE"", g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ] ); - ShowPlayerDialog( playerid, DIALOG_GATE_OWNER, DIALOG_STYLE_LIST, "{FFFFFF}Edit Gate", szNormalString, "Select", "Cancel" ); + format( szNormalString, sizeof( szNormalString ), ""COL_WHITE"Gate Label\t"COL_GREY"%s\n"COL_WHITE"Gate Password\t"COL_GREY"%s\n"COL_WHITE"Gate Gang ID\t"COL_GREY"%d", g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_GANG_SQL_ID ] ); + ShowPlayerDialog( playerid, DIALOG_GATE_OWNER, DIALOG_STYLE_TABLIST, "{FFFFFF}Edit Gate", szNormalString, "Select", "Cancel" ); SetPVarInt( playerid, "gate_o_editing", gID ); SendClientMessageFormatted( playerid, -1, ""COL_GREY"[GATE]"COL_WHITE" You're now editing "COL_GREY"%s"COL_WHITE".", g_gateData[ gID ] [ E_NAME ] ); @@ -9899,17 +9936,9 @@ CMD:gate( playerid, params[ ] ) if ( strcmp( szPassword, g_gateData[ g ] [ E_PASS ], false ) ) continue; // return SendError( playerid, "Incorrect password. Please try again." ); - if ( g_gateData[ g ] [ E_CLOSE_TIMER ] != -1 ) - continue; // return SendError( playerid, "This gate is currently in operation. Please wait." ); - - if ( !strmatch( g_gateData[ g ] [ E_NAME ], "N/A" ) ) - SendClientMessageFormatted( playerid, -1, ""COL_GREY"[GATE]"COL_WHITE" You've opened "COL_GREY"%s"COL_WHITE".", g_gateData[ g ] [ E_NAME ] ); - - new - travelInterval = MoveDynamicObject( g_gateData[ g ] [ E_OBJECT ], g_gateData[ g ] [ E_MOVE_X ], g_gateData[ g ] [ E_MOVE_Y ], g_gateData[ g ] [ E_MOVE_Z ], g_gateData[ g ] [ E_SPEED ], g_gateData[ g ] [ E_MOVE_RX ], g_gateData[ g ] [ E_MOVE_RY ], g_gateData[ g ] [ E_MOVE_RZ ] ); - - g_gateData[ g ] [ E_CLOSE_TIMER ] = SetTimerEx( "StartGateClose", travelInterval + g_gateData[ g ] [ E_TIME ], false, "d", g ); - gates++; + if ( OpenPlayerGate( playerid, g ) ) { + gates ++; + } } return !gates ? SendError( playerid, "Either a gate is in operation, not in range or simply incorrect password." ) : 1; } @@ -11722,7 +11751,7 @@ CMD:emp( playerid, params[ ] ) { /* ** ANTI EMP SPAM ** */ if ( p_AntiEmpSpam[ pID ] > g_iTime ) - return SendError( playerid, "You cannot EMP this person for another minute." ); + return SendError( playerid, "You cannot EMP this person for %s.", secondstotime( p_AntiEmpSpam[ pID ] - g_iTime ) ); /* ** END OF ANTI SPAM ** */ new @@ -15516,7 +15545,7 @@ CMD:getip( playerid, params[ ] ) if ( p_AdminLevel[ playerid ] < 3 ) return SendError( playerid, ADMIN_COMMAND_REJECT ); else if ( sscanf( params, ""#sscanf_u"", pID ) ) return SendUsage( playerid, "/getip [PLAYER_ID]" ); else if ( !IsPlayerConnected( pID ) || IsPlayerNPC( pID ) ) return SendError( playerid, "Invalid Player ID." ); - else if ( p_AdminLevel[ pID ] >= 5 || strmatch( ReturnPlayerName( pID ), "Lorenc" ) ) return SendError( playerid, "I love this person so much that I wont give you his IP :)"); + else if ( p_AdminLevel[ pID ] >= 5 || IsPlayerLorenc( pID ) ) return SendError( playerid, "I love this person so much that I wont give you his IP :)"); else { SendClientMessageFormatted( playerid, -1, ""COL_PINK"[ADMIN]"COL_WHITE" %s(%d): "COL_GREY"%s", ReturnPlayerName( pID ), pID, ReturnPlayerIP( pID ) ); @@ -15531,7 +15560,7 @@ CMD:geolocate( playerid, params[ ] ) else if ( sscanf( params, ""#sscanf_u"", pID ) ) return SendUsage( playerid, "/geolocate [PLAYER_ID]" ); else if ( !IsPlayerConnected( pID ) || IsPlayerNPC( pID ) ) return SendError( playerid, "Invalid Player ID." ); else if ( !IsProxyEnabledForPlayer( pID ) ) return SendError( playerid, "The server has failed to fetch geographical data. Please use a 3rd party." ); - else if ( p_AdminLevel[ pID ] >= 5 || strmatch( ReturnPlayerName( pID ), "Lorenc" ) ) return SendError( playerid, "I love this person so much that I wont give you his geographical data! :)"); + else if ( p_AdminLevel[ pID ] >= 5 || IsPlayerLorenc( pID ) ) return SendError( playerid, "I love this person so much that I wont give you his geographical data! :)"); else { SendClientMessageFormatted( playerid, COLOR_PINK, "[ADMIN]"COL_WHITE" %s(%d) is from %s (%s) [%s]", ReturnPlayerName( pID ), pID, GetPlayerCountryName( pID ), GetPlayerCountryCode( pID ), ReturnPlayerIP( pID ) ); @@ -16585,8 +16614,8 @@ CMD:editgate( playerid, params[ ] ) else { format( szLargeString, sizeof( szLargeString ), - ""COL_RED"Remove This Gate?\t \nOwner ID\t"COL_GREY"%d\nName\t"COL_GREY"%s\nPassword\t"COL_GREY"%s\nModel\t"COL_GREY"%d\nSpeed\t"COL_GREY"%f\nRange\t"COL_GREY"%f\nPause\t"COL_GREY"%d MS\nChange Closed Positioning\t \nChange Opened Positioning\t ", - g_gateData[ gID ] [ E_OWNER ], g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_SPEED ], g_gateData[ gID ] [ E_RANGE ], g_gateData[ gID ] [ E_TIME ] + ""COL_RED"Remove This Gate?\t \nOwner ID\t"COL_GREY"%d\nName\t"COL_GREY"%s\nPassword\t"COL_GREY"%s\nModel\t"COL_GREY"%d\nSpeed\t"COL_GREY"%f\nRange\t"COL_GREY"%f\nPause\t"COL_GREY"%d MS\nGang ID\t%d\nChange Closed Positioning\t \nChange Opened Positioning\t ", + g_gateData[ gID ] [ E_OWNER ], g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_SPEED ], g_gateData[ gID ] [ E_RANGE ], g_gateData[ gID ] [ E_TIME ], g_gateData[ gID ] [ E_GANG_SQL_ID ] ); SetPVarInt( playerid, "gate_editing", gID ); @@ -20490,6 +20519,35 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) // Spectation if ( p_Spectating{ playerid } == true ) { + if ( PRESSED( KEY_WALK ) ) + { + new spectatingid = p_whomSpectating[ playerid ]; + new targetid = p_PlayerAltBind[ playerid ]; + + if ( targetid != -1 ) + { + static + Float: sX, Float: sY, Float: sZ; + + GetPlayerPos( spectatingid, sX, sY, sZ ); + GetPlayerPos( targetid, X, Y, Z ); + + Angle = atan2( sY - Y, sX - X ) - 90.0; + + if ( Angle == -90.0 ) { + SendError( playerid, "You have not set the aiming alt-binded player properly." ); + } else { + SendServerMessage( playerid, "Played moved %0.2f degrees from fighting positions.", Angle ); + } + + X += 4.0 * floatsin( Angle + 90.0, degrees ); + Y += 4.0 * -floatcos( Angle + 90.0, degrees ); + + SetPlayerPos( targetid, X, Y, Z ); + p_PlayerAltBindTick[ targetid ] = GetTickCount( ); + } + } + if ( PRESSED( KEY_FIRE ) ) { for( new i = p_whomSpectating[ playerid ] + 1; i < MAX_PLAYERS; i++ ) @@ -20501,7 +20559,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) } } } - if ( PRESSED( KEY_AIM ) ) + else if ( PRESSED( KEY_AIM ) ) { for( new i = p_whomSpectating[ playerid ] - 1; i > -1; i-- ) { @@ -21084,7 +21142,8 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) // taze mechanism else if ( PRESSED( KEY_LOOK_BEHIND ) ) { - if ( p_Class[ playerid ] == CLASS_POLICE ) { + if ( p_Class[ playerid ] == CLASS_POLICE ) + { new closestid = GetClosestPlayer( playerid ); @@ -21098,6 +21157,23 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) } } } + + + // MMB to open gate + new + Float: gate_distance = 99999.9, + gate_id = getClosestGate( playerid, gate_distance ) + ; + + if ( gate_id != INVALID_OBJECT_ID && gate_distance < g_gateData[ gate_id ] [ E_RANGE ] ) + { + new + gangId = p_GangID[ playerid ]; + + if ( p_AdminLevel[ playerid ] >= 5 || g_gateData[ gate_id ] [ E_OWNER ] == p_AccountID[ playerid ] || ( Iter_Contains( gangs, gangId ) && g_gateData[ gate_id ] [ E_GANG_SQL_ID ] == g_gangData[ gangId ] [ E_SQL_ID ] ) ) { + OpenPlayerGate( playerid, gate_id ); + } + } } return 1; } @@ -21483,7 +21559,6 @@ thread OnPlayerLogin( playerid, password[ ] ) DestroyDynamicObject( p_HighrollersBarrier[ playerid ] [ 1 ] ), p_HighrollersBarrier[ playerid ] [ 1 ] = -1; } - // Load some other variables too p_OwnedHouses [ playerid ] = GetPlayerOwnedHouses( playerid ); p_OwnedBusinesses [ playerid ] = GetPlayerOwnedBusinesses( playerid ); @@ -22415,6 +22490,9 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) } if ( ( dialogid == DIALOG_VEHICLE_LOCATE ) && response ) { + if ( GetPlayerInterior( playerid ) || GetPlayerVirtualWorld( playerid ) ) + return SendError( playerid, "You cannot use this feature inside of an interior." ); + new Float: X, Float: Y, Float: Z; @@ -24923,7 +25001,7 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GATE]"COL_WHITE" You have removed a gate: "COL_GREY"%s"COL_WHITE".", g_gateData[ objectid ] [ E_NAME ] ); } - else if ( listitem < 8 ) ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); + else if ( listitem < 9 ) ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); else { SendServerMessage( playerid, "Hit the save icon to update the position of the gate." ); @@ -24937,36 +25015,75 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) } if ( dialogid == DIALOG_GATE_OWNER_EDIT ) { + new + gID = GetPVarInt( playerid, "gate_o_editing" ); + + if ( ! Iter_Contains( gates, gID ) ) + return SendError( playerid, "Invalid gate detected, please try again." ); + + if ( g_gateData[ gID ] [ E_OWNER ] != p_AccountID[ playerid ] ) + return SendError( playerid, "You need to be the owner of this gate to edit it." ); + if ( response ) { - new - gID = GetPVarInt( playerid, "gate_o_editing" ); - switch( GetPVarInt( playerid, "gate_o_edititem" ) ) { case 0: { if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 24 ) - return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_RED"The name must range between 3 and 24 characters.\n\n"COL_WHITE"What would you like to change this to?", "Commit", "Back" ); + return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The name must range between 3 and 24 characters.", "Commit", "Back" ); format( g_gateData[ gID ] [ E_NAME ], 24, "%s", inputtext ); + SendServerMessage( playerid, "Your gate name has been set to \"%s\".", g_gateData[ gID ] [ E_NAME ] ); + UpdateGateData( gID, .recreate_obj = false ); } case 1: { if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 8 ) - return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_RED"The password must range between 3 and 8 characters.\n\n"COL_WHITE"What would you like to change this to?", "Commit", "Back" ); + return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The password must range between 3 and 8 characters.", "Commit", "Back" ); format( g_gateData[ gID ] [ E_PASS ], 8, "%s", inputtext ); + SendServerMessage( playerid, "Your gate password has been set to \"%s\".", g_gateData[ gID ] [ E_PASS ] ); + UpdateGateData( gID, .recreate_obj = false ); + } + case 2: + { + new + sql_id; + + if ( sscanf( inputtext, "D(0)", sql_id ) ) { + return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The Gang ID must be an integer.", "Commit", "Back" ); + } + + // check if valid gang lol + if ( sql_id != 0 ) + { + new + gangId = -1; + + foreach ( new g : gangs ) if ( sql_id == g_gangData[ g ] [ E_SQL_ID ] ) { + gangId = g; + } + + if ( gangId == -1 ) { + return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"This gang is invalid or not currently online.", "Commit", "Back" ); + } else { + SendServerMessage( playerid, "Your gate will be openable by members of \"%s\".", g_gangData[ gangId ] [ E_NAME ] ); + } + } else { + SendServerMessage( playerid, "You have unassigned a gang from your gate." ); + } + + g_gateData[ gID ] [ E_GANG_SQL_ID ] = sql_id; + mysql_single_query( sprintf( "UPDATE `GATES` SET `GANG_ID`=%d WHERE `ID`=%d", sql_id, gID ) ); } } - UpdateGateData( gID ); - Streamer_Update( playerid ); // SyncObject( playerid ); - cmd_gate( playerid, "edit" ); - DeletePVar( playerid, "gate_o_edititem" ); - DeletePVar( playerid, "gate_o_editing" ); - SendServerMessage( playerid, "You have successfully updated this gate." ); } - else cmd_gate( playerid, "edit" ); + + // redirect + format( szNormalString, sizeof( szNormalString ), ""COL_WHITE"Gate Label\t"COL_GREY"%s\n"COL_WHITE"Gate Password\t"COL_GREY"%s\n"COL_WHITE"Gate Gang ID\t"COL_GREY"%d", g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_GANG_SQL_ID ] ); + ShowPlayerDialog( playerid, DIALOG_GATE_OWNER, DIALOG_STYLE_TABLIST, "{FFFFFF}Edit Gate", szNormalString, "Select", "Cancel" ); + return 1; } if ( dialogid == DIALOG_GATE_EDIT ) { @@ -25046,6 +25163,11 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) SendError( playerid, "This value must be numerical." ); return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); } + else if ( ! ( 1.0 <= range <= 100.0 ) && ! IsPlayerLorenc( playerid ) ) + { + SendError( playerid, "Please specify a range between 1.0 and 100.0 metres." ); + return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); + } g_gateData[ gID ] [ E_RANGE ] = range; } case 7: @@ -25065,9 +25187,27 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) } g_gateData[ gID ] [ E_TIME ] = time; } + case 8: + { + new + sql_id; + + if ( sscanf( inputtext, "d", sql_id ) ) + { + SendError( playerid, "This value must be numerical." ); + return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); + } + else if ( ! ( 0 <= sql_id < 1000000 ) ) + { + SendError( playerid, "Invalid Gang ID specified." ); + return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" ); + } + g_gateData[ gID ] [ E_GANG_SQL_ID ] = sql_id; + mysql_single_query( sprintf( "UPDATE `GATES` SET `GANG_ID`=%d WHERE `ID`=%d", sql_id, gID ) ); + } } UpdateGateData( gID ); - Streamer_Update( playerid ); // SyncObject( playerid ); + Streamer_Update( playerid ); cmd_editgate( playerid, sprintf( "%d", gID ) ); SendServerMessage( playerid, "You have successfully updated this gate." ); } @@ -26273,16 +26413,9 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "You cannot travel while you're in jail." ); if ( p_WantedLevel[ playerid ] ) return SendError( playerid, "You cannot travel while you are wanted." ); + if ( GetPlayerCash( playerid ) < 2000 ) return SendError( playerid, "You need $2,000 to travel between cities." ); - new bool: using_rewards = false; - - // check for rewards - if ( p_CasinoRewardsPoints[ playerid ] > 5.0 ) { - using_rewards = true, p_CasinoRewardsPoints[ playerid ] -= 5.0; - mysql_single_query( sprintf( "UPDATE `USERS` SET `CASINO_REWARDS`=%f WHERE `ID`=%d", p_CasinoRewardsPoints[ playerid ], p_AccountID[ playerid ] ) ); - } - else if ( GetPlayerCash( playerid ) > 2000 ) GivePlayerCash( playerid, -2000 ); - else return SendError( playerid, "You need $2,000 to travel between cities." ); + new bool: using_rewards = p_CasinoRewardsPoints[ playerid ] > 5.0; // set position switch ( listitem ) @@ -26304,6 +26437,13 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) } } + // check for rewards + if ( using_rewards ) { + p_CasinoRewardsPoints[ playerid ] -= 5.0; + mysql_single_query( sprintf( "UPDATE `USERS` SET `CASINO_REWARDS`=%f WHERE `ID`=%d", p_CasinoRewardsPoints[ playerid ], p_AccountID[ playerid ] ) ); + } + else GivePlayerCash( playerid, -2000 ); + // set interior/world SetPlayerVirtualWorld( playerid, 0 ); SetPlayerInterior( playerid, 0 ); @@ -27905,6 +28045,7 @@ stock ExplodePlayerC4s( playerid, start=0, end=MAX_C4 ) } else GetDynamicObjectPos( g_C4Data[ playerid ] [ i ] [ E_OBJECT ], X, Y, Z ); + // blow up alcatraz rock if ( IsPointToPoint( 10.0, X, Y, Z, -2016.7365, 1826.2612, 43.1458 ) ) { if ( g_iTime > g_alcatrazTimestamp ) @@ -27920,6 +28061,7 @@ stock ExplodePlayerC4s( playerid, start=0, end=MAX_C4 ) } } + // blow up various vaults for( new j = 0; j < sizeof( g_bankvaultData ); j++ ) { // Blow Bank Vault @@ -27968,6 +28110,7 @@ stock ExplodePlayerC4s( playerid, start=0, end=MAX_C4 ) } } + // prevent spamming wanted for farming if ( GetPVarInt( playerid, "C4WantedCD" ) < g_iTime && p_Class[ playerid ] != CLASS_POLICE ) { GivePlayerWantedLevel( playerid, 6 ); SetPVarInt( playerid, "C4WantedCD", g_iTime + 30 ); @@ -32003,7 +32146,6 @@ thread OnGatesLoad( ) { new rows, fields, i = -1, gID, - Field[ 20 ], loadingTick = GetTickCount( ) ; @@ -32012,26 +32154,29 @@ thread OnGatesLoad( ) { while( ++i < rows ) { - cache_get_field_content( i, "ID", Field ), gID = strval( Field ); + gID = cache_get_field_content_int( i, "ID", dbHandle ); + cache_get_field_content( i, "PASSWORD", g_gateData[ gID ] [ E_PASS ], dbHandle, 8 ); cache_get_field_content( i, "NAME", g_gateData[ gID ] [ E_NAME ], dbHandle, 24 ); - cache_get_field_content( i, "OWNER", Field ), g_gateData[ gID ] [ E_OWNER ] = strval( Field ); - cache_get_field_content( i, "MODEL", Field ), g_gateData[ gID ] [ E_MODEL ] = strval( Field ); - cache_get_field_content( i, "TIME", Field ), g_gateData[ gID ] [ E_TIME ] = strval( Field ); - cache_get_field_content( i, "SPEED", Field ), g_gateData[ gID ] [ E_SPEED ] = floatstr( Field ); - cache_get_field_content( i, "RANGE", Field ), g_gateData[ gID ] [ E_RANGE ] = floatstr( Field ); - cache_get_field_content( i, "X", Field ), g_gateData[ gID ] [ E_X ] = floatstr( Field ); - cache_get_field_content( i, "Y", Field ), g_gateData[ gID ] [ E_Y ] = floatstr( Field ); - cache_get_field_content( i, "Z", Field ), g_gateData[ gID ] [ E_Z ] = floatstr( Field ); - cache_get_field_content( i, "RX", Field ), g_gateData[ gID ] [ E_RX ] = floatstr( Field ); - cache_get_field_content( i, "RY", Field ), g_gateData[ gID ] [ E_RY ] = floatstr( Field ); - cache_get_field_content( i, "RZ", Field ), g_gateData[ gID ] [ E_RZ ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_X", Field ), g_gateData[ gID ] [ E_MOVE_X ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_Y", Field ), g_gateData[ gID ] [ E_MOVE_Y ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_Z", Field ), g_gateData[ gID ] [ E_MOVE_Z ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_RX", Field ), g_gateData[ gID ] [ E_MOVE_RX ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_RY", Field ), g_gateData[ gID ] [ E_MOVE_RY ] = floatstr( Field ); - cache_get_field_content( i, "MOVE_RZ", Field ), g_gateData[ gID ] [ E_MOVE_RZ ] = floatstr( Field ); + + g_gateData[ gID ] [ E_OWNER ] = cache_get_field_content_int( i, "OWNER", dbHandle ); + g_gateData[ gID ] [ E_MODEL ] = cache_get_field_content_int( i, "MODEL", dbHandle ); + g_gateData[ gID ] [ E_TIME ] = cache_get_field_content_int( i, "TIME", dbHandle ); + g_gateData[ gID ] [ E_SPEED ] = cache_get_field_content_float( i, "SPEED", dbHandle ); + g_gateData[ gID ] [ E_RANGE ] = cache_get_field_content_float( i, "RANGE", dbHandle ); + g_gateData[ gID ] [ E_X ] = cache_get_field_content_float( i, "X", dbHandle ); + g_gateData[ gID ] [ E_Y ] = cache_get_field_content_float( i, "Y", dbHandle ); + g_gateData[ gID ] [ E_Z ] = cache_get_field_content_float( i, "Z", dbHandle ); + g_gateData[ gID ] [ E_RX ] = cache_get_field_content_float( i, "RX", dbHandle ); + g_gateData[ gID ] [ E_RY ] = cache_get_field_content_float( i, "RY", dbHandle ); + g_gateData[ gID ] [ E_RZ ] = cache_get_field_content_float( i, "RZ", dbHandle ); + g_gateData[ gID ] [ E_MOVE_X ] = cache_get_field_content_float( i, "MOVE_X", dbHandle ); + g_gateData[ gID ] [ E_MOVE_Y ] = cache_get_field_content_float( i, "MOVE_Y", dbHandle ); + g_gateData[ gID ] [ E_MOVE_Z ] = cache_get_field_content_float( i, "MOVE_Z", dbHandle ); + g_gateData[ gID ] [ E_MOVE_RX ] = cache_get_field_content_float( i, "MOVE_RX", dbHandle ); + g_gateData[ gID ] [ E_MOVE_RY ] = cache_get_field_content_float( i, "MOVE_RY", dbHandle ); + g_gateData[ gID ] [ E_MOVE_RZ ] = cache_get_field_content_float( i, "MOVE_RZ", dbHandle ); + g_gateData[ gID ] [ E_GANG_SQL_ID ] = cache_get_field_content_int( i, "GANG_ID", dbHandle ); g_gateData[ gID ] [ E_CLOSE_TIMER ] = -1; g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] ); @@ -32071,6 +32216,7 @@ stock CreateGate( playerid, password[ 8 ], model, Float: speed, Float: range, Fl g_gateData[ gID ] [ E_MOVE_RX ] = rx; g_gateData[ gID ] [ E_MOVE_RY ] = ry; g_gateData[ gID ] [ E_MOVE_RZ ] = rz; + g_gateData[ gID ] [ E_GANG_SQL_ID ] = 0; format( szBigString, sizeof( szBigString ), "INSERT INTO `GATES` VALUES(%d,%d,'%s','Gate',%d,2000,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f)", gID, playerid, mysql_escape( password ), model, speed, range, x, y, z, rx, ry, rz, x, y, z, rx, ry, rz ); mysql_single_query( szBigString ); @@ -32098,7 +32244,7 @@ stock getClosestGate( playerid, &Float: dis = 99999.99 ) return object; } -stock UpdateGateData( gID ) +stock UpdateGateData( gID, bool: recreate_obj = true ) { if ( Iter_Contains( gates, gID ) ) { @@ -32110,11 +32256,31 @@ stock UpdateGateData( gID ) mysql_single_query( szLargeString ); - DestroyDynamicObject( g_gateData[ gID ] [ E_OBJECT ] ); - g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] ); + if ( recreate_obj ) { + DestroyDynamicObject( g_gateData[ gID ] [ E_OBJECT ] ); + g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] ); + } } } +stock OpenPlayerGate( forplayerid, g ) +{ + if ( g_gateData[ g ] [ E_CLOSE_TIMER ] != -1 ) { + return 0; + } + + if ( forplayerid != INVALID_PLAYER_ID && !strmatch( g_gateData[ g ] [ E_NAME ], "N/A" ) ) { + SendClientMessageFormatted( forplayerid, -1, ""COL_GREY"[GATE]"COL_WHITE" You've opened "COL_GREY"%s"COL_WHITE".", g_gateData[ g ] [ E_NAME ] ); + } + + new + travelInterval = MoveDynamicObject( g_gateData[ g ] [ E_OBJECT ], g_gateData[ g ] [ E_MOVE_X ], g_gateData[ g ] [ E_MOVE_Y ], g_gateData[ g ] [ E_MOVE_Z ], g_gateData[ g ] [ E_SPEED ], g_gateData[ g ] [ E_MOVE_RX ], g_gateData[ g ] [ E_MOVE_RY ], g_gateData[ g ] [ E_MOVE_RZ ] ); + + g_gateData[ g ] [ E_CLOSE_TIMER ] = SetTimerEx( "StartGateClose", travelInterval + g_gateData[ g ] [ E_TIME ], false, "d", g ); + return 1; +} + + function StartGateClose( gID ) { g_gateData[ gID ] [ E_CLOSE_TIMER ] = -1; return MoveDynamicObject( g_gateData[ gID ] [ E_OBJECT ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_SPEED ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] ), 1; @@ -33444,33 +33610,16 @@ stock showToyEditMenu( playerid, slot ) stock reloadPlayerToys( playerid ) { - // Loop is more slower than this! - if ( p_AttachedObjectsData[ playerid ] [ 0 ] [ E_ENABLED ] ) { - RemovePlayerAttachedObject( playerid, 7 ); - SetPlayerAttachedObject( playerid, 7, p_AttachedObjectsData[ playerid ] [ 0 ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_BONE ], - p_AttachedObjectsData[ playerid ] [ 0 ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_OZ ], - p_AttachedObjectsData[ playerid ] [ 0 ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_RZ ], - p_AttachedObjectsData[ playerid ] [ 0 ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_SZ ], - p_AttachedObjectsData[ playerid ] [ 0 ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ 0 ] [ E_COLOR ] - ); - } - if ( p_AttachedObjectsData[ playerid ] [ 1 ] [ E_ENABLED ] ) { - RemovePlayerAttachedObject( playerid, 8 ); - SetPlayerAttachedObject( playerid, 8, p_AttachedObjectsData[ playerid ] [ 1 ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_BONE ], - p_AttachedObjectsData[ playerid ] [ 1 ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_OZ ], - p_AttachedObjectsData[ playerid ] [ 1 ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_RZ ], - p_AttachedObjectsData[ playerid ] [ 1 ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_SZ ], - p_AttachedObjectsData[ playerid ] [ 1 ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ 1 ] [ E_COLOR ] - ); - } - if ( p_AttachedObjectsData[ playerid ] [ 2 ] [ E_ENABLED ] ) { - RemovePlayerAttachedObject( playerid, 9 ); - SetPlayerAttachedObject( playerid, 9, p_AttachedObjectsData[ playerid ] [ 2 ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_BONE ], - p_AttachedObjectsData[ playerid ] [ 2 ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_OZ ], - p_AttachedObjectsData[ playerid ] [ 2 ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_RZ ], - p_AttachedObjectsData[ playerid ] [ 2 ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_SZ ], - p_AttachedObjectsData[ playerid ] [ 2 ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ 2 ] [ E_COLOR ] - ); + for ( new i = 0; i < sizeof ( p_AttachedObjectsData[ ] ); i ++ ) { + if ( p_AttachedObjectsData[ playerid ] [ i ] [ E_ENABLED ] ) { + RemovePlayerAttachedObject( playerid, 7 + i ); + SetPlayerAttachedObject( playerid, 7 + i, p_AttachedObjectsData[ playerid ] [ i ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ i ] [ E_BONE ], + p_AttachedObjectsData[ playerid ] [ i ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_OZ ], + p_AttachedObjectsData[ playerid ] [ i ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_RZ ], + p_AttachedObjectsData[ playerid ] [ i ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_SZ ], + p_AttachedObjectsData[ playerid ] [ i ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ i ] [ E_COLOR ] + ); + } } return 1; } @@ -37917,14 +38066,14 @@ stock BreakPlayerCuffs( playerid ) for ( attempts = 1; attempts < p_BobbyPins[ playerid ]; attempts ++ ) { - if ( random( 101 ) > 25 ) { + if ( random( 101 ) > 30 ) { success = true; break; } } if ( ( p_BobbyPins[ playerid ] -= attempts ) > 0 ) { - ShowPlayerHelpDialog( playerid, 4500, "You only have %d bobby pins left!", p_BobbyPins[ playerid ] ); + ShowPlayerHelpDialog( playerid, 5000, "You only have %d bobby pins left!", p_BobbyPins[ playerid ] ); } if ( success ) { @@ -37969,8 +38118,6 @@ stock GetPlayerGang( playerid ) return p_GangID[ playerid ]; stock IsPlayerSpawned( playerid ) return p_Spawned{ playerid }; -stock GetPlayerClass( playerid ) return p_Class[ playerid ]; - stock IsPlayerInEvent( playerid ) return ( GetPlayerVirtualWorld( playerid ) == 69 ); stock IsPlayerJailed( playerid ) return p_Jailed{ playerid }; diff --git a/scriptfiles/updates.txt b/scriptfiles/updates.txt index 7a5ed7e..21dbc5a 100644 --- a/scriptfiles/updates.txt +++ b/scriptfiles/updates.txt @@ -1,11 +1,3 @@ -(+) Orbital cannon now accessible through gang facilities. Costs $250,000 per missile. -(+) 2.5% fee on player duels... To counter aggressive money transfers. -(+) You can now buy an RPG at an ammunation for $10,000 per rocket. -(+) Adds fast travel, 24/7 and a private ATM within gang facilities. -(+) Orbital cannon now shows player tags. -(+) Adds backpack to toys. -(/) When a player commits a crime, a red blip will slowly fade out at the location of robbery. -(/) Takes at least 120 seconds to take over a facility. -(/) Weapon dealers now sell 5X the ammo of a standard ammunation. Though, 1 RPG only. -(*) Fixes a few anti weapon hack bugs, admins are also now reported with the weapon in question. -(*) Addresses some toy unlocking issues. \ No newline at end of file +(+) You can now open gates by using the MMB key, only if you own them or apart of their assigned gang. +(+) Admins/You can assign your gates to particular Gang IDs. To get your Gang ID, use /gangs. +(*) Only civilians will be able to use the orbital cannon. \ No newline at end of file