diff --git a/gamemodes/sf-cnr.pwn b/gamemodes/sf-cnr.pwn index 3cd2335..b7310a7 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 @@ -142,7 +142,7 @@ new bool: False = false; #define CreateBillboard(%0,%1,%2,%3,%4) SetDynamicObjectMaterialText(CreateDynamicObject(7246,%1,%2,%3,0,0,%4),0,(%0),120,"Arial",24,0,-1,-16777216,1) /* ** Configuration ** */ -#define FILE_BUILD "v11.25.80" +#define FILE_BUILD "v11.30.90" #define SERVER_NAME "San Fierro Cops And Robbers (0.3.7)" #define SERVER_WEBSITE "www.irresistiblegaming.com" #define SERVER_IP "192.169.82.202:7777" @@ -207,23 +207,6 @@ enum E_DONATION_DATA #define JOB_DIRTY_MECHANIC ( 7 ) #define JOB_BURGLAR ( 8 ) -/* ** Class ID's ** */ -static const CLASS_NAMES [ ] [ ] = { "Civilian", "Police", "FBI", "Army", "CIA", "Paramedic", "Fireman" }; -static const CLASS_COLORS [ ] = { 0xC0C0C0FF, 0x3E7EFFFF, 0x0035FFFF, 0x954BFFFF, 0x191970FF, 0x4DFF4DFF, 0xA83434FF }; - -static CLASS_CIVILIAN_RANGE [ 2 ]; -static CLASS_POLICE_RANGE [ 2 ]; -static CLASS_FBI_RANGE [ 2 ]; -static CLASS_CIA_RANGE [ 2 ]; -static CLASS_FIRE_RANGE [ 2 ]; -static CLASS_MEDIC_RANGE [ 2 ]; -static CLASS_ARMY_RANGE; - -#define CLASS_CIVILIAN ( 0 ) -#define CLASS_POLICE ( 1 ) -#define CLASS_FIREMAN ( 2 ) -#define CLASS_MEDIC ( 3 ) - /* ** Checkpoints ** */ #define ALL_CHECKPOINTS ( 40 ) @@ -1310,7 +1293,7 @@ new bool: p_isMining [ MAX_PLAYERS char ], g_orePrices [ ] = { 675, 900, 600, 2750, 3000, 3500, 4000, 2200, 2300, 1200 }, - g_oreMiningTime [ ] = { 200, 280, 160, 680, 720, 760, 800, 640, 656, 400 }, + g_oreMiningTime [ ] = { 2000, 2800, 1600, 6800, 7200, 7600, 8000, 6400, 6560, 4000 }, g_oreQuanities [ ] = { 8, 8, 8, 8, 5, 3, 3, 5, 5, 6 }, // Iterator @@ -1999,24 +1982,24 @@ new enum E_SHOP_DATA { bool: E_SAVABLE, E_NAME[ 24 ], E_USAGE[ 32 ], - E_LIMIT, E_PRICE + E_LIMIT, E_PRICE, E_ID }; new g_shopItemData[ ] [ E_SHOP_DATA ] = { - { true , "Drain Cleaner", "Caustic Soda", LIMIT_CS, 150 }, // 0 - { true , "Stone Cleaner", "Muriatic Acid", LIMIT_MU, 250 }, // 1 - { true , "Gas Tank", "Hydrogen Chloride", LIMIT_HCL, 300 }, // 2 - { false, "Chastity Belt", "Preventation of Aids", LIMIT_ONE, 500 }, // 3 - { false, "Secure Wallet", "Less Being Robbed Chance", LIMIT_ONE, 600 }, // 4 - { true , "Scissors", "/cuttie", LIMIT_SCISSORS, 750 }, // 5 - { true , "Bobby Pin", "Automatically break cuffs", LIMIT_PINS, 1200 }, // 6 [1000] -makecopgreatagain - { false, "Money Case", "Increases Robbing Amount", LIMIT_ONE, 1500 }, // 7 [1250] - { true , "Rope", "/tie", LIMIT_ROPES, 1750 }, // 8 [1500] - { true , "Aluminium Foil", "Deflects EMP", LIMIT_FOIL, 1750 }, // 9 - { true , "Thermal Drill", "Halves Safe Cracking Time", LIMIT_ONE, 5000 }, // 10 - { true , "Metal Melter", "/breakout", LIMIT_MELTER, 7500 } // 11 + { true , "Drain Cleaner", "Caustic Soda", LIMIT_CS, 150, 1 }, // 0 + { true , "Stone Cleaner", "Muriatic Acid", LIMIT_MU, 250, 2 }, // 1 + { true , "Gas Tank", "Hydrogen Chloride", LIMIT_HCL, 300, 3 }, // 2 + { false, "Chastity Belt", "Protection from aids", LIMIT_ONE, 500, 4 }, // 3 + { false, "Secure Wallet", "Protection from robberies", LIMIT_ONE, 600, 5 }, // 4 + { true , "Scissors", "Automatically cut ties", LIMIT_SCISSORS, 1000, 6 }, // 5 + { true , "Rope", "/tie", LIMIT_ROPES, 1500, 7 }, // 8 [1500] + { true , "Bobby Pin", "Automatically break cuffs", LIMIT_PINS, 2500, 8 }, // 6 [1000] -makecopgreatagain + { true , "Aluminium Foil", "Automatically deflect EMP", LIMIT_FOIL, 2500, 9 }, // 9 + { false, "Money Case", "Increases robbing amount", LIMIT_ONE, 3000, 10 }, // 7 [1250] + { true , "Thermal Drill", "Halves safe cracking time", LIMIT_ONE, 5000, 11 }, // 10 + { true , "Metal Melter", "/breakout", LIMIT_MELTER, 7500, 12 } // 11 } ; @@ -2150,7 +2133,7 @@ new /* ** Jail System ** */ #define JAIL_SECONDS_MULTIPLIER ( 5 ) -#define ALCATRAZ_REQUIRED_TIME ( 300 ) +#define ALCATRAZ_REQUIRED_TIME ( 150 ) #define ALCATRAZ_TIME_PAUSE ( 5 ) #define ALCATRAZ_TIME_WANTED ( 600 ) @@ -3275,6 +3258,7 @@ public OnGameModeInit() AddServerVariable( "proxyban", "0", GLOBAL_VARTYPE_INT ); AddServerVariable( "hitman_budget", "0", GLOBAL_VARTYPE_INT ); AddServerVariable( "connectsong", "http://files.irresistiblegaming.com/game_sounds/Stevie%20Wonder%20-%20Skeletons.mp3", GLOBAL_VARTYPE_STRING ); + AddServerVariable( "discordurl", "http://irresistiblegaming.com", GLOBAL_VARTYPE_STRING ); /* ** CIVILIAN ** */ CLASS_CIVILIAN_RANGE[ 0 ] = AddPlayerClass( 119, default_X, default_Y, default_Z, default_Angle, 0, 0, 0, 0, 0, 0 ); // 0 @@ -5331,7 +5315,7 @@ public OnServerUpdate( ) cur = gangid; printf("Removed Gang From Cache Gang Id %d Since No Ppl", g_gangData[ gangid ] [ E_SQL_ID ] ); - DestroyGang( gangid, .soft_delete = true, .iter_remove = false ); + DestroyGang( gangid, true, .iter_remove = false ); Iter_SafeRemove( gangs, cur, gangid ); } else g_gangData[ gangid ] [ E_SOFT_DELETE_TS ] = 0; @@ -6930,7 +6914,7 @@ public OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, Float:fX, Float:f return 0; // Anti Random Deathmatch - if ( IsRandomDeathmatch( playerid, iDriver ) && !IsPlayerInPaintBall( playerid ) && !IsPlayerInEvent( playerid ) ) + if ( IsRandomDeathmatch( playerid, iDriver ) && ! IsPlayerInPaintBall( playerid ) && ! IsPlayerInEvent( playerid ) && ! IsPlayerDueling( playerid ) ) return 0; if ( p_WantedLevel[ playerid ] <= 2 && p_Class[ playerid ] != CLASS_POLICE && p_Class[ iDriver ] == CLASS_POLICE && GetPVarInt( playerid, "ShotCopWantedCD" ) < g_iTime ) @@ -6948,7 +6932,7 @@ public OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, Float:fX, Float:f stock CreateExplosiveBullet( playerid ) { - if ( IsPlayerInCasino( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerInEvent( playerid ) ) + if ( IsPlayerInCasino( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerInEvent( playerid ) || IsPlayerDueling( playerid ) ) return; if ( GetPVarInt( playerid, "explosive_rounds" ) == 1 && p_ExplosiveBullets[ playerid ] > 0 ) @@ -7129,7 +7113,7 @@ public OnPlayerTakePlayerDamage( playerid, issuerid, &Float: amount, weaponid, b return 0; // Anti RDM and gang member damage - if ( ! IsPlayerInEvent( playerid ) && ! IsPlayerInPaintBall( playerid ) && ! IsPlayerBoxing( playerid ) ) + if ( ! IsPlayerInEvent( playerid ) && ! IsPlayerInPaintBall( playerid ) && ! IsPlayerBoxing( playerid ) && ! IsPlayerDueling( playerid ) ) { if ( IsPlayerInPlayerGang( issuerid, playerid ) ) return ShowPlayerHelpDialog( issuerid, 2000, "You cannot damage your homies!" ), 0; @@ -7420,32 +7404,14 @@ public OnPlayerDeath( playerid, killerid, reason ) } /* ** Tax And Medical Fees ** */ - - // check if player has any money if ( GetPlayerTotalCash( playerid ) > 0 ) { - new medical_fees = p_inPaintBall{ playerid } ? 0 : 100; + new medical_fees = ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) || IsPlayerInEvent( playerid ) ) ? 0 : 100; if ( medical_fees ) { ShowPlayerHelpDialog( playerid, 5000, sprintf( "~w~You have paid ~r~%s~w~ in medical fees", number_format( medical_fees ) ) ); GivePlayerCash( playerid, -medical_fees ); } - - /*if ( ( p_Uptime[ playerid ] > p_TaxTime[ playerid ] && p_inPaintBall{ playerid } != true ) && player_tax > 0 ) - { - GivePlayerCash( playerid, -player_tax ); - - // save to database - p_TaxTime[ playerid ] = ( p_TaxTime[ playerid ] > p_Uptime[ playerid ] ? p_TaxTime[ playerid ] : p_Uptime[ playerid ] ) + 1800; - mysql_single_query( sprintf( "UPDATE `USERS` SET `TAX_TIME`=%d WHERE `ID`=%d", p_TaxTime[ playerid ], p_AccountID[ playerid ] ) ); - - // event bank - if ( player_tax > 10000 ) UpdateServerVariable( "eventbank", GetGVarInt( "eventbank" ) + floatround( float( player_tax ) * 0.10 ), 0.0, "", GLOBAL_VARTYPE_INT ); - - // format string - if ( strlen( szTaxable ) ) format( szTaxable, sizeof( szTaxable ), "%s and ~r~%s~w~ in tax", szTaxable, number_format( player_tax ) ); - else format( szTaxable, sizeof( szTaxable ), "~w~You have paid ~r~%s~w~ in tax", number_format( player_tax ) ); - }*/ } /* ** End Of Tax And Medical Fees ** */ @@ -10098,7 +10064,7 @@ CMD:robitems( playerid, params[ ] ) if ( IsPlayerCuffed( playerid ) ) return SendError( playerid, "You cannot use this command since you're cuffed." ); if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You cannot use this command since you're tied." ); if ( IsPlayerKidnapped( playerid ) ) return SendError( playerid, "You cannot use this command since you're kidnapped." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside an arena." ); if ( IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You cannot use this command inside a vehicle." ); if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); @@ -10182,7 +10148,7 @@ CMD:bruteforce( playerid, params[ ] ) g_houseData[ i ] [ E_BEING_CRACKED ] = true; p_HouseCrackingPW[ playerid ] = i; SetPVarInt( playerid, "last_bruteforce", g_iTime + 30 ); - ShowProgressBar( playerid, "Brute Forcing Password", PROGRESS_BRUTEFORCE, 500, COLOR_BLUE ); + ShowProgressBar( playerid, "Brute Forcing Password", PROGRESS_BRUTEFORCE, 5000, COLOR_BLUE ); return 1; } } @@ -10262,7 +10228,7 @@ CMD:burglar( playerid, params[ ] ) g_businessData[ handle ] [ E_BEING_CRACKED ] = true; SetPVarInt( playerid, "crackpw_biz", handle ); SetPVarInt( playerid, "crackpw_cool", g_iTime + 40 ); - ShowProgressBar( playerid, "Cracking Password", PROGRESS_CRACKING_BIZ, 750, COLOR_WHITE ); + ShowProgressBar( playerid, "Cracking Password", PROGRESS_CRACKING_BIZ, 7500, COLOR_WHITE ); return 1; } } @@ -10289,7 +10255,7 @@ CMD:burglar( playerid, params[ ] ) g_houseData[ i ] [ E_BEING_CRACKED ] = true; p_HouseCrackingPW[ playerid ] = i; SetPVarInt( playerid, "crackpw_cool", g_iTime + 40 ); - ShowProgressBar( playerid, "Cracking Password", PROGRESS_CRACKING, 750, COLOR_WHITE ); + ShowProgressBar( playerid, "Cracking Password", PROGRESS_CRACKING, 7500, COLOR_WHITE ); return 1; } } @@ -10480,7 +10446,7 @@ CMD:ransom( playerid, params[ ] ) if ( !IsPlayerTied( victimid ) ) return SendError( playerid, "This player must be tied in order to create a ransom." ); if ( IsPlayerCuffed( playerid ) ) return SendError( playerid, "You cannot use this command while you're cuffed." ); if ( IsPlayerTazed( playerid ) ) return SendError( playerid, "You cannot use this command while you're tazed." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside an arena." ); SendClientMessageFormatted( victimid, -1, ""COL_RED"[RANSOM]{FFFFFF} You have been offered a ransom of "COL_GOLD"%s"COL_WHITE" for your release. Use /ransompay to pay the ransom.", number_format( amount ) ); SendClientMessageFormatted( playerid, -1, ""COL_GREEN"[RANSOM]{FFFFFF} You have offered a ransom to %s(%d) of "COL_GOLD"%s"COL_WHITE".", ReturnPlayerName( victimid ), victimid, number_format( amount ) ); @@ -11340,7 +11306,8 @@ CMD:weed( playerid, params[ ] ) if ( p_Class[ playerid ] != CLASS_CIVILIAN ) return SendError( playerid, "You are not a civilian." ); - if ( IsPlayerTied( playerid ) || IsPlayerTazed( playerid ) || IsPlayerCuffed( playerid ) || IsPlayerJailed( playerid ) || IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command at the moment." ); + if ( IsPlayerTied( playerid ) || IsPlayerTazed( playerid ) || IsPlayerCuffed( playerid ) || IsPlayerJailed( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) + return SendError( playerid, "You cannot use this command at the moment." ); if ( isnull( params ) ) return SendUsage( playerid, "/weed [COLLECT/SELL/BUY/USE]" ); else if ( strmatch( params, "collect" ) ) @@ -11412,7 +11379,7 @@ CMD:weed( playerid, params[ ] ) ; if ( GetPlayerCash( playerid ) < iCost ) return SendError( playerid, "You need %s to buy %d grams of weed.", number_format( iCost ), iGrams ); - else if ( IsPlayerInPaintBall( dealerid ) ) return SendError( playerid, "Your dealer cannot deal while he's in paintball." ); + else if ( IsPlayerInPaintBall( dealerid ) || IsPlayerDueling( dealerid ) ) return SendError( playerid, "Your dealer cannot deal in an arena." ); else if ( p_Class[ dealerid ] != CLASS_CIVILIAN ) return p_WeedDealer[ playerid ] = INVALID_PLAYER_ID, SendError( playerid, "This deal has ended, the dealer is not a civilian." ); else if ( !JobEquals( dealerid, JOB_DRUG_DEALER ) ) return SendError( playerid, "Your dealer no longer does drugs." ); else if ( !p_WeedGrams[ dealerid ] ) return p_WeedDealer[ playerid ] = INVALID_PLAYER_ID, SendError( playerid, "Your dealer doesn't have any more weed." ); @@ -12114,7 +12081,7 @@ CMD:viewguns( playerid, params[ ] ) if ( !IsPlayerConnected( p_WeaponDealer[ playerid ] ) ) return p_WeaponDealer[ playerid ] = INVALID_PLAYER_ID, SendError( playerid, "Your weapon dealer isn't available." ); else if ( g_iTime > p_WeaponDealTick[ playerid ] ) return SendError( playerid, "Your last weapon deal has expired." ); - else if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You can't buy weapons in paintball." ); + else if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You can't buy weapons in an arena." ); else { p_WeaponDealing{ playerid } = true; @@ -12139,7 +12106,7 @@ CMD:sellgun( playerid, params[ ] ) else if ( p_WeaponDealing{ pID } == true ) return SendError( playerid, "This player is currently busy." ); else if ( p_Jailed{ playerid } ) return SendError( playerid, "You cannot sell weapons while you're in jail." ); else if ( p_Jailed{ pID } ) return SendError( playerid, "This player is jailed, you cannot sell weapons to him." ); - else if ( IsPlayerInPaintBall( pID ) ) return SendError( playerid, "You can't sell weapons in paintball." ); + else if ( IsPlayerInPaintBall( pID ) || IsPlayerDueling( pID ) ) return SendError( playerid, "You can't sell weapons in an arena." ); else if ( IsPlayerInEvent( playerid ) ) return SendError( playerid, "You cannot use this command since you're in an event." ); else if ( GetDistanceBetweenPlayers( playerid, pID ) < 5.0 ) { @@ -12240,7 +12207,8 @@ CMD:bail( playerid, params[ ] ) else if ( GetPVarInt( pID, "bail_antispam" ) > g_iTime ) return SendError( playerid, "You must wait 10 seconds before offering a bail to this player." ); else { - equa = 25 * p_JailTime[ pID ]; + equa = 30 * p_JailTime[ pID ]; + if ( p_JailTime[ pID ] >= ALCATRAZ_TIME_WANTED ) equa *= 2; p_BailOfferer[ pID ] = playerid; p_BailTimestamp[ pID ] = g_iTime + 120; SetPVarInt( pID, "bail_antispam", g_iTime + 1 ); @@ -12253,8 +12221,11 @@ CMD:bail( playerid, params[ ] ) CMD:acceptbail( playerid, params[ ] ) { new - equa = 25 * p_JailTime[ playerid ] - ; + equa = 30 * p_JailTime[ playerid ]; + + if ( p_JailTime[ playerid ] >= ALCATRAZ_TIME_WANTED ) + equa *= 2; + if ( GetPlayerCash( playerid ) < equa ) return p_BailOfferer[ playerid ] = INVALID_PLAYER_ID, SendError( playerid, "You don't have enough to be bailed." ); else if ( IsPlayerAdminJailed( playerid ) ) return p_BailOfferer[ playerid ] = INVALID_PLAYER_ID, SendError( playerid, "You have been admin jailed, therefore disallowing this." ); else if ( !IsPlayerJailed( playerid ) ) return SendError( playerid, "You're not jailed!" ); @@ -12337,7 +12308,7 @@ CMD:bj( playerid, params[ ] ) else if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "You cannot offer blowjobs in jail." ); else if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); else if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); - else if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You don't know how to give oral sex in paintball." ); + else if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command at an arena." ); else if ( GetDistanceBetweenPlayers( playerid, pID ) < 4.0 ) { if ( IsPlayerJailed( pID ) ) return SendError( playerid, "This player is jailed. He may be paused." ); @@ -13538,7 +13509,7 @@ CMD:kidnap( playerid, params[ ] ) if ( IsPlayerKidnapped( victimid ) ) return SendError( playerid, "This player is already kidnapped!" ); if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command at an arena." ); if ( IsPlayerJailed( victimid ) ) return SendError( playerid, "This player is jailed. He may be paused." ); if ( p_KidnapImmunity[ victimid ] > g_iTime ) return SendError( playerid, "This player cannot be kidnapped for another %s.", secondstotime( p_KidnapImmunity[ victimid ] - g_iTime ) ); if ( PutPlayerInEmptyVehicleSeat( p_LastVehicle[ playerid ], victimid ) == -1 ) return SendError( playerid, "Failed to place the player inside a full of player vehicle." ); @@ -13604,7 +13575,7 @@ CMD:tie( playerid, params[ ] ) if ( IsPlayerCuffed( victimid ) ) return SendError( playerid, "The person you're trying to tie is cuffed." ); if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command at an arena." ); if ( IsPlayerAdminOnDuty( victimid ) ) return SendError( playerid, "You cannot use this command on admins that are on duty." ); if ( IsPlayerJailed( victimid ) ) return SendError( playerid, "This player is jailed. He may be paused." ); if ( IsPlayerLoadingObjects( victimid ) ) return SendError( playerid, "This player is in a object-loading state." ); @@ -13955,7 +13926,7 @@ CMD:rob( playerid, params[ ] ) if ( IsPlayerCuffed( playerid ) ) return SendError( playerid, "You cannot use this command since you're cuffed." ); if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You cannot use this command since you're tied." ); if ( IsPlayerKidnapped( playerid ) ) return SendError( playerid, "You cannot use this command since you're kidnapped." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside an arena." ); if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); if ( IsPlayerAdminOnDuty( victimid ) ) return SendError( playerid, "You cannot use this command on admins that are on duty." ); @@ -14024,7 +13995,7 @@ CMD:rape( playerid, params[ ] ) if ( IsPlayerCuffed( playerid ) ) return SendError( playerid, "You cannot use this command since you're cuffed." ); if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You cannot use this command since you're tied." ); if ( IsPlayerKidnapped( playerid ) ) return SendError( playerid, "You cannot use this command since you're kidnapped." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside the paintball arena." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command since you're inside an arena." ); if ( p_Jailed{ playerid } == true ) return SendError( playerid, "You cannot rape in jail." ); if ( IsPlayerGettingBlowed( playerid ) ) return SendError( playerid, "You cannot use this command since you're getting blowed." ); if ( IsPlayerBlowingCock( playerid ) ) return SendError( playerid, "You cannot use this command since you're giving oral sex." ); @@ -14097,7 +14068,7 @@ CMD:c4( playerid, params[ ] ) if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You cannot use this command since you're tied." ); if ( IsPlayerKidnapped( playerid ) ) return SendError( playerid, "You cannot use this command since you're kidnapped." ); if ( IsPlayerInCasino( playerid ) ) return SendError( playerid, "You cannot use this command since you're in a casino." ); - if ( IsPlayerInPaintBall( playerid ) ) return SendError( playerid, "You cannot use this command since you're in paintball." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) ) return SendError( playerid, "You cannot use this command since you're in an arena." ); if ( p_C4Amount[ playerid ] < 1 ) return SendError( playerid, "You don't have any C4's" ); #if ENABLED_SECURE_TRUCK == true @@ -14500,15 +14471,12 @@ CMD:gang( playerid, params[ ] ) else if ( gID < 0 || gID >= MAX_GANGS ) return SendError( playerid, "Invalid Gang ID." ); else if ( !Iter_Contains( gangs, gID ) ) return SendError( playerid, "Invalid Gang ID." ); else if ( p_gangInvited[ playerid ] [ gID ] == false ) return SendError( playerid, "You haven't been invited to this gang." ); - else if ( hasTickcountPassed( p_gangInviteTick[ playerid ], 120000 ) ) return p_gangInvited[ playerid ] [ gID ] = false, SendError( playerid, "This invite has expired, each invite only lasts for 2 minutes." ); + else if ( g_iTime > p_gangInviteTick[ playerid ] ) return p_gangInvited[ playerid ] [ gID ] = false, SendError( playerid, "This invite has expired, each invite only lasts for 2 minutes." ); else if ( p_GangID[ playerid ] != INVALID_GANG_ID ) return SendError( playerid, "You are already inside a gang." ); else { - p_GangID[ playerid ] = gID; p_gangInvited[ playerid ] [ gID ] = false; - if ( p_WantedLevel[ playerid ] < 1 ) SetPlayerColor( playerid, g_gangData[ gID ] [ E_COLOR ] ); - mysql_single_query( sprintf( "UPDATE `USERS` SET `GANG_ID`=%d WHERE `ID`=%d", g_gangData[ gID ] [ E_SQL_ID ], p_AccountID[ playerid ] ) ); - SendClientMessageToGang( gID, g_gangData[ p_GangID[ playerid ] ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) has joined the gang.", ReturnPlayerName( playerid ), playerid ); + SetPlayerGang( playerid, gID ); } return 1; } @@ -14532,7 +14500,7 @@ CMD:gang( playerid, params[ ] ) return SendError( playerid, "You are not the gang leader." ); p_gangInvited[ pID ] [ p_GangID[ playerid ] ] = true; - p_gangInviteTick[ pID ] = GetTickCount( ); + p_gangInviteTick[ pID ] = g_iTime + 120; GameTextForPlayer( pID, sprintf( "~n~~y~~h~/gang join %d", p_GangID[ playerid ] ), 2000, 4 ); format( szNormalString, sizeof( szNormalString ), "[GANG]{FFFFFF} %s(%d) has invited you to join %s, to join type \"/gang join %d\"", ReturnPlayerName( playerid ), playerid, g_gangData[ p_GangID[ playerid ] ] [ E_NAME ], p_GangID[ playerid ] ); SendClientMessage( pID, g_gangData[ p_GangID[ playerid ] ] [ E_COLOR ], szNormalString ); @@ -14576,7 +14544,7 @@ CMD:gang( playerid, params[ ] ) gangid = p_GangID[ playerid ]; if ( gangid == INVALID_GANG_ID ) return SendError( playerid, "You are not inside any gang." ); - else if ( !IsPlayerGangLeader( playerid, gangid ) ) return SendError( playerid, "You are not the gang leader." ); + else if ( ! IsPlayerGangLeader( playerid, gangid ) ) return SendError( playerid, "You are not a gang leader." ); else { // Reset all gang invites @@ -14638,7 +14606,7 @@ CMD:acmds( playerid, params[ ] ) SendClientMessage( playerid, COLOR_WHITE, " LEVEL 4: /addnote, /removenote" ); SendClientMessage( playerid, COLOR_WHITE, " LEVEL 5: /createhouse, /destroyhouse, /respawnallv, /achangename, /toggleviewpm, /unban(ip)" ); SendClientMessage( playerid, COLOR_WHITE, " LEVEL 5: /createcar, /destroycar, /stripcarmods, /createbribe, /destroybribe, /doublexp, /(h/v)adminsell" ); - SendClientMessage( playerid, COLOR_WHITE, " LEVEL 5: /autovehrespawn, /megaban, /acunban, /creategate, /editgate, /connectsong" ); + SendClientMessage( playerid, COLOR_WHITE, " LEVEL 5: /autovehrespawn, /megaban, /acunban, /creategate, /editgate, /connectsong, /discordurl" ); SendClientMessage( playerid, COLOR_WHITE, " LEVEL 5: /creategarage, /destroygarage, /check" ); if ( p_AdminLevel[ playerid ] > 5 ) { @@ -16334,7 +16302,7 @@ CMD:circleall( playerid, params[ ] ) continue; } - if ( IsPlayerInPaintBall( i ) ) { + if ( IsPlayerInPaintBall( i ) || IsPlayerDueling( i ) ) { SendServerMessage( i, "As you're in paintball, you have not been teleported to the event/mass teleportation." ); continue; } @@ -16620,6 +16588,22 @@ CMD:connectsong( playerid, params[ ] ) return 1; } +CMD:discordurl( playerid, params[ ] ) +{ + new + szURL[ 128 ]; + + if ( p_AdminLevel[ playerid ] < 5 ) return SendError( playerid, ADMIN_COMMAND_REJECT ); + else if ( sscanf( params, "s[128]", szURL ) ) return SendUsage( playerid, "/discordurl [DISCORD_URL]" ); + else + { + SaveToAdminLogFormatted( playerid, 0, "updated discord url to %s", szURL ); + SendGlobalMessage( -1, ""COL_PINK"[ADMIN]"COL_WHITE" %s(%d) has set the discord url to: "COL_GREY"%s", ReturnPlayerName( playerid ), playerid, szURL ); + UpdateServerVariable( "discordurl", 0, 0.0, szURL, GLOBAL_VARTYPE_STRING ); + } + return 1; +} + CMD:creategate( playerid, params[ ] ) { new @@ -17312,23 +17296,33 @@ CMD:destroyentrance( playerid, params[ ] ) CMD:setgangleader( playerid, params[ ] ) { new - gID, pID; + sqlid, pID; if ( p_AdminLevel[ playerid ] < 6 ) return SendError( playerid, ADMIN_COMMAND_REJECT ); - else if ( sscanf( params, "d" #sscanf_u, gID, pID ) ) return SendUsage( playerid, "/setgangleader [GANG_ID] [PLAYER_ID]" ); - else if ( gID < 0 || gID > MAX_GANGS ) return SendError( playerid, "Invalid Gang ID." ); - else if ( !Iter_Contains( gangs, gID ) ) return SendError( playerid, "Invalid Gang ID." ); + else if ( sscanf( params, "d" #sscanf_u, sqlid, pID ) ) return SendUsage( playerid, "/setgangleader [GANG_ID] [PLAYER_ID]" ); + //else if ( !Iter_Contains( gangs, gID ) ) return SendError( playerid, "Invalid Gang ID." ); else if ( !IsPlayerConnected( pID ) || IsPlayerNPC( pID ) ) return SendError( playerid, "Invalid Player ID." ); // else if ( p_GangID[ pID ] != gID ) return SendError( playerid, "This player isn't in this gang." ); else { - p_GangID[ pID ] = gID; - g_gangData[ gID ] [ E_LEADER ] = p_AccountID[ pID ]; + new + gid = -1; - SaveToAdminLogFormatted( playerid, gID, "setgangleader to %s (acc id %d)", ReturnPlayerName( pID ), p_AccountID[ pID ] ); - SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GANG]"COL_WHITE" %s(%d) is now the leader of %s.", ReturnPlayerName( pID ), pID, g_gangData[ gID ] [ E_NAME ] ); - SendClientMessageToGang( gID, g_gangData[ gID ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) is the new gang leader, forcefully by %s.", ReturnPlayerName( pID ), pID, ReturnPlayerName( playerid ) ); - SaveGangData( gID ); + foreach ( new g : gangs ) if ( g_gangData[ g ] [ E_SQL_ID ] == sqlid ) { + gid = g; + break; + } + + if ( ! Iter_Contains( gangs, gid ) ) + return SendError( playerid, "Invalid Gang ID." ); + + SetPlayerGang( pID, gid ); + g_gangData[ gid ] [ E_LEADER ] = p_AccountID[ pID ]; + + SaveToAdminLogFormatted( playerid, gid, "setgangleader to %s (acc id %d)", ReturnPlayerName( pID ), p_AccountID[ pID ] ); + SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GANG]"COL_WHITE" %s(%d) is now the leader of %s.", ReturnPlayerName( pID ), pID, g_gangData[ gid ] [ E_NAME ] ); + SendClientMessageToGang( gid, g_gangData[ gid ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) is the new gang leader, forcefully by %s.", ReturnPlayerName( pID ), pID, ReturnPlayerName( playerid ) ); + SaveGangData( gid ); } return 1; } @@ -17707,7 +17701,7 @@ CMD:destroygang( playerid, params[ ] ) { AddAdminLogLineFormatted( "%s(%d) has deleted a gang", ReturnPlayerName( playerid ), playerid ); SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GANG]"COL_WHITE" You have destroyed \"%s\" which was the ID of %d.", g_gangData[ gID ] [ E_NAME ], gID ); - DestroyGang( gID ); + DestroyGang( gID, false ); } return 1; } @@ -18920,8 +18914,11 @@ public OnPlayerDriveVehicle(playerid, vehicleid) ShowPlayerHelpDialog( playerid, 6000, "You can export this vehicle at the docks for around ~g~%s~w~~h~.~n~~n~~r~Damaging the vehicle will further decrease the value.", number_format( iVehiclePrice ) ); } - if ( IsPlayerInPoliceCar( playerid ) && p_Class[ playerid ] != CLASS_POLICE && p_LastDrovenPoliceVeh[ playerid ] != vehicleid && GetPVarInt( playerid, "entercopcar_ts" ) < time && !g_buyableVehicle{ vehicleid } ) - SetPVarInt( playerid, "entercopcar_ts", time + 30 ), GivePlayerWantedLevel( playerid, 2 ); + if ( IsPlayerInPoliceCar( playerid ) && p_Class[ playerid ] != CLASS_POLICE && p_LastDrovenPoliceVeh[ playerid ] != vehicleid && GetPVarInt( playerid, "entercopcar_ts" ) < time && !g_buyableVehicle{ vehicleid } ) { + if ( ! IsWeaponInAnySlot( playerid, 26 ) && ! IsWeaponInAnySlot( playerid, 27 ) ) GivePlayerWeapon( playerid, 25, 25 ); // free shotgun + SetPVarInt( playerid, "entercopcar_ts", time + 30 ); + GivePlayerWantedLevel( playerid, 2 ); + } if ( model == 498 && p_Class[ playerid ] != CLASS_POLICE ) { @@ -18948,7 +18945,7 @@ public OnPlayerDriveVehicle(playerid, vehicleid) { new num_ores = GetGVarInt( sprintf( "mine_%d_ores", vehicleid ) ); - printf( "Ores stored %d for %d", num_ores, sprintf( "mine_%d_ores", vehicleid ) ) ; + // printf( "Ores stored %d for %d", num_ores, sprintf( "mine_%d_ores", vehicleid ) ) ; if ( num_ores > 0 ) { @@ -19141,6 +19138,9 @@ public OnPlayerEnterDynamicCP(playerid, checkpointid) if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You can't do anything as you are tied." ); + if ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) || IsPlayerInEvent( playerid ) ) + return SendError( playerid, "You can't do anything as you are in an event." ); + /* ** Dropoff check ** new bDropoff = false; @@ -20810,7 +20810,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) if ( GetDynamicObjectPos( objectid, X, Y, Z ) ) { if ( IsPlayerAimingAt( playerid, X, Y, Z, fAimDistance ) ) - ApplyAnimation( playerid, "CARRY", "liftup105", 4.0, 1, 0, 0, 1, 0 ), ShowProgressBar( playerid, "Taking Meth", PROGRESS_GRAB_METH, 300, 0x87CEEBFF ); + ApplyAnimation( playerid, "CARRY", "liftup105", 4.0, 1, 0, 0, 1, 0 ), ShowProgressBar( playerid, "Taking Meth", PROGRESS_GRAB_METH, 3000, 0x87CEEBFF ); } } else @@ -20824,7 +20824,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) SetPVarInt( playerid, "pouring_chemical", CHEMICAL_CS ); ApplyAnimation( playerid, "CARRY", "putdwn105", 4.0, 1, 0, 0, 1, 0 ); - ShowProgressBar( playerid, "Pouring Caustic Soda", PROGRESS_CHEMICAL, 250, 0x3E7EFFFF ); + ShowProgressBar( playerid, "Pouring Caustic Soda", PROGRESS_CHEMICAL, 2500, 0x3E7EFFFF ); } else if ( IsPlayerAimingAt( playerid, 2083.282958, 1234.025024, 415.028009, fAimDistance ) ) { @@ -20833,7 +20833,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) SetPVarInt( playerid, "pouring_chemical", CHEMICAL_HLC ); ApplyAnimation( playerid, "CARRY", "putdwn105", 4.0, 1, 0, 0, 1, 0 ); - ShowProgressBar( playerid, "Pouring Hydrogen Chloride", PROGRESS_CHEMICAL, 250, 0xEE9911FF ); + ShowProgressBar( playerid, "Pouring Hydrogen Chloride", PROGRESS_CHEMICAL, 2500, 0xEE9911FF ); } else if ( IsPlayerAimingAt( playerid, 2083.638916, 1233.254028, 415.020996, fAimDistance ) ) { @@ -20842,7 +20842,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) SetPVarInt( playerid, "pouring_chemical", CHEMICAL_MU ); ApplyAnimation( playerid, "CARRY", "putdwn105", 4.0, 1, 0, 0, 1, 0 ); - ShowProgressBar( playerid, "Pouring Muriatic Acid", PROGRESS_CHEMICAL, 250, 0xFF0000FF ); + ShowProgressBar( playerid, "Pouring Muriatic Acid", PROGRESS_CHEMICAL, 2500, 0xFF0000FF ); } } } @@ -21106,7 +21106,7 @@ public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) //SetPlayerPos( playerid, fX, fY, Z ); g_secureTruckData[ E_BEING_ROBBED ] = true; ApplyAnimation( playerid, "CARRY", "liftup105", 4.0, 1, 0, 0, 1, 0 ); - ShowProgressBar( playerid, "Robbing Truck", PROGRESS_ROBTRUCK, 350, COLOR_GOLD ); + ShowProgressBar( playerid, "Robbing Truck", PROGRESS_ROBTRUCK, 4000, COLOR_GOLD ); } return 1; } @@ -22607,8 +22607,14 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if ( x == listitem ) { + new curr_gang = p_GangID[ playerid ]; + new curr_gang_sql = 0; + + if ( Iter_Contains( gangs, curr_gang ) ) + curr_gang_sql = g_gangData[ curr_gang ] [ E_SQL_ID ]; + SetPVarInt( playerid, "viewing_gang_sql", g_sortedGangData[ g ] [ E_SQL_ID ] ); - ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", "View Statistics\nView Gang Members", "Select", "Back" ); + ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", sprintf( "%sJoin Gang\nView Statistics\nView Gang Members", curr_gang_sql != g_sortedGangData[ g ] [ E_SQL_ID ] && ! g_sortedGangData[ g ] [ E_INVITE_ONLY ] ? ( COL_WHITE ) : ( COL_BLACK ) ), "Select", "Back" ); break; } x ++; @@ -22632,14 +22638,30 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) switch( listitem ) { - case 0: // View statistics + case 0: // Join gang + { + if ( p_Class[ playerid ] != CLASS_CIVILIAN ) { + SendError( playerid, "You must be a civilian to switch gangs." ); + } else if ( p_GangID[ playerid ] == g ) { + SendError( playerid, "You are already in this gang." ); + } else if ( IsGangPrivate( g ) ) { + SendError( playerid, "You can no longer join this gang as it is private." ); + } else if ( ! SetPlayerGang( playerid, g ) ) { + SendError( playerid, "You can no longer join this gang." ); + } + ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", sprintf( "%sJoin Gang\nView Statistics\nView Gang Members", p_GangID[ playerid ] != g && ! g_gangData[ g ] [ E_INVITE_ONLY ] ? ( COL_WHITE ) : ( COL_BLACK ) ), "Select", "Back" ); + } + + case 1: // View statistics { new iPlayers = GetOnlineGangMembers( g ); + SetPVarInt( playerid, "gang_members_id", g ); format( szLargeString, 350, ""COL_GREY"Gang ID:"COL_WHITE" %d\n"COL_GREY"Online Members:"COL_WHITE" %d\n"COL_GREY"Score:"COL_WHITE" %d\n"COL_GREY"Kills:"COL_WHITE" %d\n"COL_GREY"Deaths:"COL_WHITE" %d\n"COL_GREY"K/D Ratio:"COL_WHITE" %0.2f\n", g_gangData[ g ] [ E_SQL_ID ], iPlayers, g_gangData[ g ] [ E_SCORE ], g_gangData[ g ] [ E_KILLS ], g_gangData[ g ] [ E_DEATHS ], floatdiv( g_gangData[ g ] [ E_KILLS ], g_gangData[ g ] [ E_DEATHS ] ) ); format( szLargeString, 350, "%s"COL_GREY"Bank:"COL_WHITE" %s\n"COL_GREY"Zones Captured:"COL_WHITE" %d", szLargeString, number_format( g_gangData[ g ] [ E_BANK ] ), GetGangCapturedTurfs( g ) ); ShowPlayerDialog( playerid, DIALOG_GANG_LIST_RESPONSE, DIALOG_STYLE_MSGBOX, "{FFFFFF}Gang Statistics", szLargeString, "Close", "Back" ); } - case 1: + + case 2: { // View gang members mysql_tquery( dbHandle, @@ -22651,7 +22673,12 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) return 1; } if ( dialogid == DIALOG_GANG_LIST_RESPONSE ) { - return ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", "View Statistics\nView Gang Members", "Select", "Back" ); + new g = GetPVarInt( playerid, "gang_members_id" ); + + if ( ! Iter_Contains( gangs, g ) ) + return SendError( playerid, "Could not find gang. Try again." ); + + return ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", sprintf( "%sJoin Gang\nView Statistics\nView Gang Members", p_GangID[ playerid ] != g && ! g_gangData[ g ] [ E_INVITE_ONLY ] ? ( COL_WHITE ) : ( COL_BLACK ) ), "Select", "Back" ); } if ( dialogid == DIALOG_GANG_LIST_MEMBERS ) { @@ -22663,7 +22690,7 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) return SendError( playerid, "Could not find gang. Try again." ); if ( ! response && page == 0 ) - return ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", "View Statistics\nView Gang Members", "Select", "Back" ); + return ShowPlayerDialog( playerid, DIALOG_GANG_LIST_OPTIONS, DIALOG_STYLE_LIST, "{FFFFFF}Gang Options", sprintf( "%sJoin Gang\nView Statistics\nView Gang Members", p_GangID[ playerid ] != g && ! g_gangData[ g ] [ E_INVITE_ONLY ] ? ( COL_WHITE ) : ( COL_BLACK ) ), "Select", "Back" ); if ( members_shown < 20 && response ) return 1; @@ -22833,10 +22860,10 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) // shop limits if ( g_shopItemData[ i ] [ E_LIMIT ] == LIMIT_ONE ) { - if ( i == 10 ) { + if ( g_shopItemData[ i ] [ E_ID ] == 11 ) { if ( p_drillStrength[ playerid ] == MAX_DRILL_STRENGTH ) return SendError( playerid, "You have already purchased this item." ); p_drillStrength[ playerid ] = MAX_DRILL_STRENGTH; - } else if ( i == 7 ) { + } else if ( g_shopItemData[ i ] [ E_ID ] == 10 ) { if ( p_MoneyBag{ playerid } == true ) return SendError( playerid, "You have already purchased this item." ); if ( p_Class[ playerid ] != CLASS_POLICE ) SetPlayerAttachedObject( playerid, 1, 1210, 7, 0.302650, -0.002469, -0.193321, 296.124053, 270.396881, 8.941717, 1.000000, 1.000000, 1.000000 ); p_MoneyBag{ playerid } = true; @@ -22884,47 +22911,43 @@ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) if ( ( dialogid == DIALOG_SHOP_MENU ) && response ) { if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "You cannot use this while you're in jail." ); - if ( !listitem ) return cmd_shop( playerid, "" ); // Array index out of bounds fix - new - i = listitem - 1; - - if ( g_shopItemData[ i ] [ E_LIMIT ] == LIMIT_ONE ) + if ( g_shopItemData[ listitem ] [ E_LIMIT ] == LIMIT_ONE ) { cmd_shop( playerid, "" ); - if ( GetPlayerCash( playerid ) < g_shopItemData[ i ] [ E_PRICE ] ) return SendError( playerid, "You don't have enough money for this item." ); + if ( GetPlayerCash( playerid ) < g_shopItemData[ listitem ] [ E_PRICE ] ) return SendError( playerid, "You don't have enough money for this item." ); - switch( i ) + switch( g_shopItemData[ listitem ] [ E_ID ] ) { - case 3: + case 4: { if ( p_AidsVaccine{ playerid } == true ) return SendError( playerid, "You have already purchased this item." ); p_AidsVaccine{ playerid } = true; } - case 4: + case 5: { if ( p_SecureWallet{ playerid } == true ) return SendError( playerid, "You have already purchased this item." ); p_SecureWallet{ playerid } = true; } - case 7: + case 10: { if ( p_MoneyBag{ playerid } == true ) return SendError( playerid, "You have already purchased this item." ); if ( p_Class[ playerid ] != CLASS_POLICE ) SetPlayerAttachedObject( playerid, 1, 1210, 7, 0.302650, -0.002469, -0.193321, 296.124053, 270.396881, 8.941717, 1.000000, 1.000000, 1.000000 ); p_MoneyBag{ playerid } = true; } - case 10: + case 11: { if ( p_drillStrength[ playerid ] == MAX_DRILL_STRENGTH ) return SendError( playerid, "You have already purchased this item." ); p_drillStrength[ playerid ] = MAX_DRILL_STRENGTH; } } - GivePlayerCash( playerid, -( g_shopItemData[ i ] [ E_PRICE ] ) ); - SendServerMessage( playerid, "You have bought a "COL_GREY"%s"COL_WHITE" for "COL_GOLD"%s"COL_WHITE".", g_shopItemData[ i ] [ E_NAME ], number_format( g_shopItemData[ i ] [ E_PRICE ] ) ); + GivePlayerCash( playerid, -( g_shopItemData[ listitem ] [ E_PRICE ] ) ); + SendServerMessage( playerid, "You have bought a "COL_GREY"%s"COL_WHITE" for "COL_GOLD"%s"COL_WHITE".", g_shopItemData[ listitem ] [ E_NAME ], number_format( g_shopItemData[ listitem ] [ E_PRICE ] ) ); } else { - SetPVarInt( playerid, "shop_item", i ); + SetPVarInt( playerid, "shop_item", listitem ); ShowPlayerDialog( playerid, DIALOG_SHOP_AMOUNT, DIALOG_STYLE_LIST, "{FFFFFF}Shop Items - Buy Quantity", "Buy 1\nBuy 5\nBuy Max", "Select", "Back" ); } } @@ -26770,7 +26793,7 @@ stock SetPlayerPosToPrison( playerid ) SetTimerEx ( "ope_Unfreeze", 5000, false, "d", playerid ); p_inAlcatraz { playerid } = false; - if ( p_JailTime[ playerid ] > ALCATRAZ_REQUIRED_TIME ) + if ( p_JailTime[ playerid ] >= ALCATRAZ_REQUIRED_TIME ) { iRandom = random( sizeof( alctrazSpawnPoints ) ); SetPlayerPos ( playerid, alctrazSpawnPoints[ iRandom ][ 0 ], alctrazSpawnPoints[ iRandom ][ 1 ], alctrazSpawnPoints[ iRandom ][ 2 ] + loadingHeight ); @@ -27896,7 +27919,7 @@ stock DestroyAllPlayerC4s( playerid, bool: resetc4 = false ) stock ExplodePlayerC4s( playerid, start=0, end=MAX_C4 ) { - if ( IsPlayerInEvent( playerid ) || IsPlayerInPaintBall( playerid ) || p_Class[ playerid ] == CLASS_POLICE ) + if ( IsPlayerInEvent( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) || p_Class[ playerid ] == CLASS_POLICE ) return 0; new @@ -28911,7 +28934,7 @@ stock AttachToRobberySafe( robberyid, playerid, type ) offsetY = -1.4 * floatcos( -( rotation + 170 ), degrees ); g_robberyData[ robberyid ] [ E_DRILL_EFFECT ] = CreateDynamicObject( 18718, fX + offsetX, fY + offsetY, fZ, 90, 0, rotation, g_robberyData[ robberyid ] [ E_WORLD ] ); - g_robberyData[ robberyid ] [ E_ROBTIMER ] = SetTimerEx( "onSafeBust", 15000, false, "dddd", playerid, robberyid, type, 0 ); + g_robberyData[ robberyid ] [ E_ROBTIMER ] = SetTimerEx( "onSafeBust", 7500, false, "dddd", playerid, robberyid, type, 0 ); p_drillStrength[ playerid ] -= 10; Streamer_Update( playerid ); @@ -30161,7 +30184,7 @@ stock InformGangConnectMessage( playerid, gangid ) return 1; } -stock DestroyGang( gangid, bool: soft_delete = false, bool: iter_remove = true ) +stock DestroyGang( gangid, bool: soft_delete, bool: iter_remove = true ) { if ( !Iter_Contains( gangs, gangid ) ) return; @@ -30330,7 +30353,7 @@ stock RemovePlayerFromGang( playerid, E_GANG_LEAVE_REASON: reason = GANG_LEAVE_U SendClientMessage( playerid, g_gangData[ gangid ] [ E_COLOR ], "[GANG]{FFFFFF} There was nobody online that could be a leader for this gang therefore it has been deleted from the server." ); // Destroy gang internally - DestroyGang( gangid ); + DestroyGang( gangid, false ); return 1; } } @@ -31396,13 +31419,15 @@ stock ShowProgressBar( playerid, title[ ], pID, update = 1000, color, params = 0 if ( !IsPlayerConnected( playerid ) ) return 0; + new time_interval = floatround( float( update ) / ( ( 388.0 - 249.0 ) / 13.0 ) ); + if ( p_ProgressStarted{ playerid } ) { StopProgressBar( playerid ); p_CancelProgress{ playerid } = true; // Cancel. //SendClientMessageFormatted( playerid, COLOR_PINK, "RESTARTING PROGRESS %d (params [OLD:%d,NEW:%d]", pID, GetPVarInt( playerid, "progress_lastparams" ), params ); CallLocalFunction( "OnPlayerProgressUpdate", "ddd", playerid, GetPVarInt( playerid, "progress_lastid" ), GetPVarInt( playerid, "progress_lastparams" ) ); - return ShowProgressBar( playerid, title, pID, update, color, params ), 1; + return ShowProgressBar( playerid, title, pID, time_interval, color, params ), 1; } if ( p_ProgressUpdateTimer[ playerid ] != 0xFFFF ) { @@ -31432,7 +31457,7 @@ stock ShowProgressBar( playerid, title[ ], pID, update = 1000, color, params = 0 SetPVarInt( playerid, "progress_lastid", pID ); KillTimer( p_ProgressUpdateTimer[ playerid ] ); - p_ProgressUpdateTimer[ playerid ] = SetTimerEx( "ProgressBar_Update", update, false, "dddd", playerid, pID, update, params ); + p_ProgressUpdateTimer[ playerid ] = SetTimerEx( "ProgressBar_Update", time_interval, false, "dddd", playerid, pID, time_interval, params ); return 1; } @@ -32447,7 +32472,7 @@ function handlePlayerRobbery( playerid, newkeys, oldkeys ) g_robberyData[ robberyid ] [ E_STATE ] = STATE_PICKED; //SendClientMessageFormatted( playerid, COLOR_RED, "beginning - robbery %d", robberyid ); - ShowProgressBar( playerid, "Picking Safe", PROGRESS_SAFEPICK, 1500, COLOR_RED, robberyid ); + ShowProgressBar( playerid, "Picking Safe", PROGRESS_SAFEPICK, 10000, COLOR_RED, robberyid ); } } } @@ -32471,7 +32496,7 @@ function handlePlayerRobbery( playerid, newkeys, oldkeys ) g_robberyData[ robberyid ] [ E_STATE ] = STATE_ROBBED; - ShowProgressBar( playerid, "Robbing Safe", PROGRESS_ROBBING, 250, COLOR_YELLOW, robberyid ); + ShowProgressBar( playerid, "Robbing Safe", PROGRESS_ROBBING, 2500, COLOR_YELLOW, robberyid ); } } } @@ -32481,40 +32506,40 @@ function handlePlayerRobbery( playerid, newkeys, oldkeys ) stock GetShopItemVariable( playerid, id ) { - switch( id ) + switch( g_shopItemData[ id ] [ E_ID ] ) { - case 0: return p_CausticSoda { playerid }; - case 1: return p_MuriaticAcid { playerid }; - case 2: return p_HydrogenChloride { playerid }; - case 3: return p_AidsVaccine { playerid }; - case 4: return p_SecureWallet { playerid }; - case 5: return p_Scissors [ playerid ]; - case 6: return p_BobbyPins [ playerid ]; - case 7: return p_MoneyBag { playerid }; - case 8: return p_Ropes [ playerid ]; + case 1: return p_CausticSoda { playerid }; + case 2: return p_MuriaticAcid { playerid }; + case 3: return p_HydrogenChloride { playerid }; + case 4: return p_AidsVaccine { playerid }; + case 5: return p_SecureWallet { playerid }; + case 6: return p_Scissors [ playerid ]; + case 8: return p_BobbyPins [ playerid ]; + case 10: return p_MoneyBag { playerid }; + case 7: return p_Ropes [ playerid ]; case 9: return p_AntiEMP [ playerid ]; - case 10: return p_drillStrength [ playerid ]; - case 11: return p_MetalMelter [ playerid ]; + case 11: return p_drillStrength [ playerid ]; + case 12: return p_MetalMelter [ playerid ]; } return 0; } stock SetShopItemVariable( playerid, id, value ) { - switch( id ) + switch( g_shopItemData[ id ] [ E_ID ] ) { - case 0: return p_CausticSoda { playerid } = value; - case 1: return p_MuriaticAcid { playerid } = value; - case 2: return p_HydrogenChloride { playerid } = value; - case 3: return p_AidsVaccine { playerid } = !!value; - case 4: return p_SecureWallet { playerid } = !!value; - case 5: return p_Scissors [ playerid ] = value; - case 6: return p_BobbyPins [ playerid ] = value; - case 7: return p_MoneyBag { playerid } = !!value; - case 8: return p_Ropes [ playerid ] = value; + case 1: return p_CausticSoda { playerid } = value; + case 2: return p_MuriaticAcid { playerid } = value; + case 3: return p_HydrogenChloride { playerid } = value; + case 4: return p_AidsVaccine { playerid } = !!value; + case 5: return p_SecureWallet { playerid } = !!value; + case 6: return p_Scissors [ playerid ] = value; + case 8: return p_BobbyPins [ playerid ] = value; + case 10: return p_MoneyBag { playerid } = !!value; + case 7: return p_Ropes [ playerid ] = value; case 9: return p_AntiEMP [ playerid ] = value; - case 10: return p_drillStrength [ playerid ] = value; - case 11: return p_MetalMelter [ playerid ] = value; + case 11: return p_drillStrength [ playerid ] = value; + case 12: return p_MetalMelter [ playerid ] = value; } return 0; } @@ -32525,11 +32550,12 @@ stock ShowPlayerShopMenu( playerid ) if ( szString[ 0 ] == '\0' ) { - strcat( szString, ""COL_GREY"\t\tThe grey coloured options are non-savable.\n" ); - for( new i; i < sizeof( g_shopItemData ); i++ ) - format( szString, sizeof( szString ), "%s"COL_GOLD"%s%s\t\t%s "COL_ORANGE"(%s)\n", szString, number_format( g_shopItemData[ i ] [ E_PRICE ] ), g_shopItemData[ i ] [ E_SAVABLE ] ? ( COL_WHITE ) : ( COL_GREY ), g_shopItemData[ i ] [ E_NAME ], g_shopItemData[ i ] [ E_USAGE ] ); + strcat( szString, " \t"COL_GREY"Grey options do not save!\t \n" ); + for( new i; i < sizeof( g_shopItemData ); i++ ) { + format( szString, sizeof( szString ), "%s%s%s\t"COL_ORANGE"%s\t"COL_GOLD"%s\n", szString, g_shopItemData[ i ] [ E_SAVABLE ] ? ( COL_WHITE ) : ( COL_GREY ), g_shopItemData[ i ] [ E_NAME ], g_shopItemData[ i ] [ E_USAGE ], number_format( g_shopItemData[ i ] [ E_PRICE ] ) ); + } } - return ShowPlayerDialog( playerid, DIALOG_SHOP_MENU, DIALOG_STYLE_LIST, "{FFFFFF}Shop Items", szString, "Select", "Cancel" ); + return ShowPlayerDialog( playerid, DIALOG_SHOP_MENU, DIALOG_STYLE_TABLIST_HEADERS, "{FFFFFF}Shop Items", szString, "Select", "Cancel" ); } #if ENABLED_EASTER_EGG == true @@ -35256,7 +35282,7 @@ stock CreateEntrance( name[ ], Float: X, Float: Y, Float: Z, Float: lX, Float: l g_entranceData[ ID ] [ E_CUSTOM ] = custom; g_entranceData[ ID ] [ E_VIP ] = viponly; g_entranceData[ ID ] [ E_SAVED ] = savedId != 0; - g_entranceData[ ID ] [ E_ENTER ] = CreateDynamicCP( X, Y, Z, 1.5, -1, -1 ); + g_entranceData[ ID ] [ E_ENTER ] = CreateDynamicCP( X, Y, Z, 1.5 ); g_entranceData[ ID ] [ E_EXIT ] = CreateDynamicCP( lX, lY, lZ, 1.0, world, interior ); g_entranceData[ ID ] [ E_ENTER_LABEL ] = CreateDynamic3DTextLabel( name, COLOR_GOLD, X, Y, Z, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1 ); g_entranceData[ ID ] [ E_EXIT_LABEL ] = CreateDynamic3DTextLabel( "[EXIT]", COLOR_GOLD, lX, lY, lZ, 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, world, interior ); @@ -37343,6 +37369,13 @@ public OnVehicleStreamOut(vehicleid, forplayerid) return 1; } +public OnVehicleSirenStateChange(playerid, vehicleid, newstate) +{ + if(newstate) GameTextForPlayer(playerid, "~W~Siren ~G~on", 1000, 3); + else GameTextForPlayer(playerid, "~W~Siren ~r~off", 1000, 3); + return 1; +} + stock randomExcept( except[ ], len = sizeof( except ) ) { new @@ -37942,7 +37975,7 @@ stock BreakPlayerCuffs( playerid ) for ( attempts = 1; attempts < p_BobbyPins[ playerid ]; attempts ++ ) { - if ( random( 101 ) > 20 ) { + if ( random( 101 ) > 25 ) { success = true; break; } @@ -37992,6 +38025,8 @@ 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/pawno/include/irresistible/cnr/classes.inc b/pawno/include/irresistible/cnr/classes.inc new file mode 100644 index 0000000..2dd4d37 --- /dev/null +++ b/pawno/include/irresistible/cnr/classes.inc @@ -0,0 +1,31 @@ +/* + * Irresistible Gaming (c) 2018 + * Developed by Lorenc Pekaj + * Module: + * Purpose: + */ + +/* ** Includes ** */ +#include < YSI\y_hooks > + +/* ** Definitions ** */ +#define CLASS_CIVILIAN ( 0 ) +#define CLASS_POLICE ( 1 ) +#define CLASS_FIREMAN ( 2 ) +#define CLASS_MEDIC ( 3 ) + +/* ** Variables ** */ +stock const CLASS_NAMES [ ] [ ] = { "Civilian", "Police", "FBI", "Army", "CIA", "Paramedic", "Fireman" }; +stock const CLASS_COLORS [ ] = { 0xC0C0C0FF, 0x3E7EFFFF, 0x0035FFFF, 0x954BFFFF, 0x191970FF, 0x4DFF4DFF, 0xA83434FF }; + +stock CLASS_CIVILIAN_RANGE [ 2 ]; +stock CLASS_POLICE_RANGE [ 2 ]; +stock CLASS_FBI_RANGE [ 2 ]; +stock CLASS_CIA_RANGE [ 2 ]; +stock CLASS_FIRE_RANGE [ 2 ]; +stock CLASS_MEDIC_RANGE [ 2 ]; +stock CLASS_ARMY_RANGE; + +/* ** Hooks ** */ + +/* ** Functions ** */ diff --git a/pawno/include/irresistible/cnr/static/server_objects.inc b/pawno/include/irresistible/cnr/static/server_objects.inc index df2794a..54ce3b6 100644 --- a/pawno/include/irresistible/cnr/static/server_objects.inc +++ b/pawno/include/irresistible/cnr/static/server_objects.inc @@ -41,8 +41,6 @@ stock initializeServerObjects( ) SetDynamicObjectMaterialText( CreateDynamicObject( 19328, 229.054992, 87.705001, 1605.713989, 0.000000, 0.000000, 90.000000, .priority = 9999, .streamdistance = -1.0 ), 0, "5'", 140, "arial", 40, 1, -16777216, 0, 1 ); SetDynamicObjectMaterialText( CreateDynamicObject( 19328, 229.054992, 87.705001, 1605.364013, 0.000000, 0.000000, 90.000000, .priority = 9999, .streamdistance = -1.0 ), 0, "4'", 140, "arial", 40, 1, -16777216, 0, 1 ); SetDynamicObjectMaterialText( CreateDynamicObject( 19328, 229.054992, 87.705001, 1605.014038, 0.000000, 0.000000, 90.000000, .priority = 9999, .streamdistance = -1.0 ), 0, "3'", 140, "arial", 40, 1, -16777216, 0, 1 ); - SetDynamicObjectMaterialText( CreateDynamicObject( 19861, 235.143997, 86.369003, 1608.019042, 0.000000, 0.000000, 90.000000, .priority = 9999, .streamdistance = -1.0 ), 0, "Irresistible Gaming", 130, "IMPACT", 40, 1, -1, 0, 1 ); - SetDynamicObjectMaterialText( CreateDynamicObject( 19861, 235.143997, 88.598999, 1008.018981, 0.000000, 0.000000, 90.000000, .priority = 9999, .streamdistance = -1.0 ), 0, "Presents", 130, "IMPACT", 40, 1, -15019521, 0, 1 ); tmpVariable = CreateDynamicObject( 18066, 229.000000, 86.862998, 1006.598999, -8.199999, 0.000000, -90.000000, .priority = 9999, .streamdistance = -1.0 ); SetDynamicObjectMaterialText( tmpVariable, 0, "SF-CNR", 130, "IMPACT", 70, 0, -16777216, 0, 1 ); SetDynamicObjectMaterialText( tmpVariable, 1, "SF-CNR", 130, "IMPACT", 70, 0, -16777216, 0, 1 ); @@ -5284,4 +5282,18 @@ stock initializeServerObjects( ) CreateDynamicObject( 8168, -2126.154052, 1839.961059, 44.222999, 0.000000, 0.000000, 64.500000, -1, -1, -1 ); CreateDynamicObject( 16327, -1983.401977, 1835.933959, 41.668998, 0.000000, 0.000000, 33.200000, -1, -1, -1 ); SetDynamicObjectMaterial( CreateDynamicObject( 10610, -2087.221923, 1745.951049, 52.969001, 0.000000, 0.000000, -167.699996, -1, -1, -1 ), 1, 13008, "sw_block01", "sw_brewbrick01", -47 ); + + // Duel Arena + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 243.059402, 34.840320, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 260.958953, 34.840320, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 247.239334, 34.840320, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 256.799194, 34.840320, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 252.469284, 33.310489, 0.000000, 90.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2237.906250, 251.399551, 33.310497, 0.000000, 90.000000, -90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 243.059005, 34.840000, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 260.959014, 34.840000, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 247.238998, 34.840000, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 256.799011, 34.840000, 0.000000, 0.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 252.468994, 33.310001, 0.000000, 90.000000, 90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); + SetDynamicObjectMaterial( CreateDynamicObject( 970, -2160.705810, 251.399993, 33.310001, 0.000000, 90.000000, -90.000000, -1, -1, -1 ), 1, 8463, "vgseland", "tiadbuddhagold", 0 ); } diff --git a/pawno/include/irresistible/cnr/static/server_vehicles.inc b/pawno/include/irresistible/cnr/static/server_vehicles.inc index f8cc3d7..70c97d6 100644 --- a/pawno/include/irresistible/cnr/static/server_vehicles.inc +++ b/pawno/include/irresistible/cnr/static/server_vehicles.inc @@ -73,10 +73,10 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 451, -1948.4327, 259.4215, 40.7537, 90.2297,-1, -1 ); AddStaticVehicle( 560, -1948.6011, 270.5544, 40.7557, 89.5258,-1, -1 ); AddStaticVehicle( 522, -1958.7181, 284.7439, 35.0383, 89.6859, -1, -1 ); - AddStaticVehicle( 523, -1632.8020, 693.0043, -5.6691, 178.5878, -1, -1 ); // bike - AddStaticVehicle( 523, -1628.7476, 691.9350, -5.6750, 178.9919, -1, -1 ); // bike - AddStaticVehicle( 523, -1624.6371, 692.5163, -5.6706, 177.4267, -1, -1 ); // bike - AddStaticVehicle( 523, -1639.2153, 677.9714, -5.6698, 267.5138, -1, -1 ); // bike + AddStaticVehicleEx( 523, -1632.8020, 693.0043, -5.6691, 178.5878, -1, -1, 240, 1 ); // bike + AddStaticVehicleEx( 523, -1628.7476, 691.9350, -5.6750, 178.9919, -1, -1, 240, 1 ); // bike + AddStaticVehicleEx( 523, -1624.6371, 692.5163, -5.6706, 177.4267, -1, -1, 240, 1 ); // bike + AddStaticVehicleEx( 523, -1639.2153, 677.9714, -5.6698, 267.5138, -1, -1, 240, 1 ); // bike AddStaticVehicle( 409, -1761.315551, 948.717651, 24.542177, 270.145507, -1, -1 ); AddStaticVehicle( 409, -1751.036743, 948.624694, 24.545349, 269.743530, -1, -1 ); AddStaticVehicle( 419, -1721.243041, 1024.336914, 44.930568, 179.862380, -1, -1 ); @@ -121,28 +121,28 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 563, -1224.193359, -10.034203, 14.869047, 223.632965, -1, -1 ); AddStaticVehicle( 411, -1238.649780, 50.157535, 13.858886, 225.435058, -1, -1 ); AddStaticVehicle( 522, -1241.090942, 63.254283, 13.680734, 44.845169, -1, -1 ); - AddStaticVehicle( 597, -1634.655029, 651.717651, 6.954792, 180.744827, -1, -1 ); + AddStaticVehicleEx( 597, -1634.655029, 651.717651, 6.954792, 180.744827, -1, -1, 240, 1 ); AddStaticVehicle( 497, -1682.705566, 705.820434, 30.778402, 90.953826, -1, -1 ); - AddStaticVehicle( 597, -1628.393066, 651.402587, 6.955638, 180.243911, -1, -1 ); - AddStaticVehicle( 599, -1605.980468, 673.470397, 7.004289, 359.804168, -1, -1 ); - AddStaticVehicle( 599, -1622.564697, 651.868591, 7.011684, 179.736801, -1, -1 ); - AddStaticVehicle( 597, -1588.096191, 673.365234, 6.967492, 181.395446, -1, -1 ); - AddStaticVehicle( 597, -1638.799072, 669.865722, -5.473012, 271.574432, -1, -1 ); - AddStaticVehicle( 490, -1593.463378, 652.134216, 7.328125, 179.483932, -1, -1 ); - AddStaticVehicle( 490, -1573.315185, 714.311035, -5.114497, 90.767662, -1, -1 ); - AddStaticVehicle( 523, -1581.339721, 651.516662, 6.754875, 178.385192, -1, -1 ); - AddStaticVehicle( 490, -1573.189697, 710.383300, -5.109126, 90.951103, -1, -1 ); - AddStaticVehicle( 490, -1573.369628, 718.350891, -5.112838, 90.308105, -1, -1 ); - AddStaticVehicle( 490, -1573.344970, 722.408874, -5.101937, 89.986015, -1, -1 ); - AddStaticVehicle( 597, -1599.425537, 651.635131, 6.955260, 179.753692, -1, -1 ); - AddStaticVehicle( 597, -1600.034179, 673.572998, 6.955664, 179.452468, -1, -1 ); - AddStaticVehicle( 599, -1608.404052, 749.665588, -5.483358, 180.558486, -1, -1 ); - AddStaticVehicle( 597, -1592.268554, 749.485046, -5.458203, 180.428436, -1, -1 ); - AddStaticVehicle( 523, -1587.842163, 652.095092, 6.759408, 178.621475, -1, -1 ); - AddStaticVehicle( 597, -1588.109008, 749.206848, -5.453563, 179.088058, -1, -1 ); - AddStaticVehicle( 597, -1623.630126, 653.686889, -5.467598, 90.219757, -1, -1 ); - AddStaticVehicle( 597, -1608.399780, 691.931091, -5.474505, 178.864059, -1, -1 ); - AddStaticVehicle( 597, -1604.237792, 691.864318, -5.474511, 179.452468, -1, -1 ); + AddStaticVehicleEx( 597, -1628.393066, 651.402587, 6.955638, 180.243911, -1, -1, 240, 1 ); + AddStaticVehicleEx( 599, -1605.980468, 673.470397, 7.004289, 359.804168, -1, -1, 240, 1 ); + AddStaticVehicleEx( 599, -1622.564697, 651.868591, 7.011684, 179.736801, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1588.096191, 673.365234, 6.967492, 181.395446, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1638.799072, 669.865722, -5.473012, 271.574432, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -1593.463378, 652.134216, 7.328125, 179.483932, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -1573.315185, 714.311035, -5.114497, 90.767662, -1, -1, 240, 1 ); + AddStaticVehicleEx( 523, -1581.339721, 651.516662, 6.754875, 178.385192, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -1573.189697, 710.383300, -5.109126, 90.951103, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -1573.369628, 718.350891, -5.112838, 90.308105, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -1573.344970, 722.408874, -5.101937, 89.986015, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1599.425537, 651.635131, 6.955260, 179.753692, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1600.034179, 673.572998, 6.955664, 179.452468, -1, -1, 240, 1 ); + AddStaticVehicleEx( 599, -1608.404052, 749.665588, -5.483358, 180.558486, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1592.268554, 749.485046, -5.458203, 180.428436, -1, -1, 240, 1 ); + AddStaticVehicleEx( 523, -1587.842163, 652.095092, 6.759408, 178.621475, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1588.109008, 749.206848, -5.453563, 179.088058, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1623.630126, 653.686889, -5.467598, 90.219757, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1608.399780, 691.931091, -5.474505, 178.864059, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1604.237792, 691.864318, -5.474511, 179.452468, -1, -1, 240, 1 ); AddStaticVehicle( 522, -1988.993896, 276.198394, 34.730239, 88.500068, -1, -1 ); AddStaticVehicle( 562, -1988.137084, 272.130798, 34.834060, 86.101821, -1, -1 ); AddStaticVehicle( 551, -1988.711914, 266.039215, 34.984287, 85.890213, -1, -1 ); @@ -159,9 +159,9 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 420, -1987.848510, 127.692680, 27.321910, 179.017303, -1, -1 ); AddStaticVehicle( 420, -1987.973144, 136.860809, 27.320096, 179.292922, -1, -1 ); AddStaticVehicle( 420, -1987.935058, 146.220901, 27.318489, 179.912628, -1, -1 ); - AddStaticVehicle( 407, -2020.862182, 92.391830, 28.212734, 270.747222, -1, -1 ); - AddStaticVehicle( 407, -2021.090209, 84.388374, 28.211555, 272.550659, -1, -1 ); - AddStaticVehicle( 407, -2021.336914, 75.096138, 28.340208, 266.854492, -1, -1 ); + AddStaticVehicleEx( 407, -2020.862182, 92.391830, 28.212734, 270.747222, -1, -1, 240, 1 ); + AddStaticVehicleEx( 407, -2021.090209, 84.388374, 28.211555, 272.550659, -1, -1, 240, 1 ); + AddStaticVehicleEx( 407, -2021.336914, 75.096138, 28.340208, 266.854492, -1, -1, 240, 1 ); AddStaticVehicle( 500, -2072.625244, -83.834503, 35.268192, 1.753221, -1, -1 ); AddStaticVehicle( 542, -2077.063476, -84.163566, 34.907493, 180.048461, -1, -1 ); AddStaticVehicle( 552, -2085.609375, -84.111206, 34.853775, 359.194885, -1, -1 ); @@ -221,9 +221,9 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 540, -1938.452270, 585.384521, 34.987651, 181.753128, -1, -1 ); AddStaticVehicle( 507, -1950.444458, 585.361511, 34.944633, 180.327789, -1, -1 ); AddStaticVehicle( 426, -1956.463867, 585.220092, 34.860263, 180.290328, -1, -1 ); - AddStaticVehicle( 416, -2642.078125, 619.112121, 14.573535, 271.431579, -1, -1 ); - AddStaticVehicle( 416, -2654.931884, 618.950622, 14.602631, 270.186126, -1, -1 ); - AddStaticVehicle( 416, -2667.000976, 618.934326, 14.602670, 269.187713, -1, -1 ); + AddStaticVehicleEx( 416, -2642.078125, 619.112121, 14.573535, 271.431579, -1, -1, 240, 1 ); + AddStaticVehicleEx( 416, -2654.931884, 618.950622, 14.602631, 270.186126, -1, -1, 240, 1 ); + AddStaticVehicleEx( 416, -2667.000976, 618.934326, 14.602670, 269.187713, -1, -1, 240, 1 ); AddStaticVehicle( 489, -1944.315307, 585.099792, 35.272480, 181.346389, -1, -1 ); AddStaticVehicle( 466, -1929.262451, 585.444763, 34.863761, 180.077941, -1, -1 ); AddStaticVehicle( 436, -2589.145507, 632.634765, 14.222237, 91.133293, -1, -1 ); @@ -238,9 +238,9 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 522, -1988.700683, 301.183624, 34.739818, 89.835449, -1, -1 ); AddStaticVehicle( 579, -1987.592651, 304.252044, 35.113090, 90.826240, -1, -1 ); AddStaticVehicle( 489, -1987.468261, 307.747619, 35.318893, 88.531921, -1, -1 ); - AddStaticVehicle( 427, -2425.466600, 517.913500, 30.060900, 39.323000, -1, -1 ); - AddStaticVehicle( 427, -2418.693100, 524.879800, 30.052500, 50.924200, -1, -1 ); - AddStaticVehicle( 427, -2414.424600, 531.775100, 30.058900, 67.949200, -1, -1 ); + AddStaticVehicleEx( 427, -2425.466600, 517.913500, 30.060900, 39.323000, -1, -1, 240, 1 ); + AddStaticVehicleEx( 427, -2418.693100, 524.879800, 30.052500, 50.924200, -1, -1, 240, 1 ); + AddStaticVehicleEx( 427, -2414.424600, 531.775100, 30.058900, 67.949200, -1, -1, 240, 1 ); AddStaticVehicle( 436, -2407.771728, 741.556030, 34.789478, 179.035964, -1, -1 ); AddStaticVehicle( 500, -1495.943969, 909.862731, 7.295326, 88.267486, -1, -1 ); AddStaticVehicle( 426, -2438.312988, 741.672363, 34.758396, 0.843255, -1, -1 ); @@ -343,16 +343,16 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 448, -1725.480834, 1348.823730, 6.645854, 44.740573, -1, -1 ); AddStaticVehicle( 448, -1723.338012, 1346.764282, 6.639358, 45.113075, -1, -1 ); AddStaticVehicle( 507, -1981.614868, 723.168579, 45.193714, 90.283843, -1, -1 ); - AddStaticVehicle( 597, -1613.486938, 723.111877, 13.112130, 270.161437, -1, -1 ); - AddStaticVehicle( 597, -1605.637451, 723.047180, 11.689531, 271.323242, -1, -1 ); - AddStaticVehicle( 597, -1598.496826, 723.047546, 10.402059, 271.118011, -1, -1 ); + AddStaticVehicleEx( 597, -1613.486938, 723.111877, 13.112130, 270.161437, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1605.637451, 723.047180, 11.689531, 271.323242, -1, -1, 240, 1 ); + AddStaticVehicleEx( 597, -1598.496826, 723.047546, 10.402059, 271.118011, -1, -1, 240, 1 ); AddStaticVehicle( 420, -1434.731300, -287.197100, 13.849400, 58.069100, -1, -1 ); AddStaticVehicle( 420, -1426.684700, -292.856400, 13.852800, 52.118700, -1, -1 ); AddStaticVehicle( 420, -1418.511100, -299.492100, 13.851900, 50.274500, -1, -1 ); - AddStaticVehicle( 490, -2421.776900, 521.2598000, 30.059200, 45.953800, -1, -1 ); - AddStaticVehicle( 490, -2429.633100, 515.3820000, 30.058000, 35.755600, -1, -1 ); - AddStaticVehicle( 490, -2416.954100, 528.7039000, 30.061600, 57.636800, -1, -1 ); - AddStaticVehicle( 490, -2413.490700, 535.6552000, 30.056100, 74.905500, -1, -1 ); + AddStaticVehicleEx( 490, -2421.776900, 521.2598000, 30.059200, 45.953800, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -2429.633100, 515.3820000, 30.058000, 35.755600, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -2416.954100, 528.7039000, 30.061600, 57.636800, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, -2413.490700, 535.6552000, 30.056100, 74.905500, -1, -1, 240, 1 ); AddStaticVehicle( 90, -2413.672600, 540.0665000, 30.056500, 88.940900, -1, -1 ); AddStaticVehicle( 455, -2330.853500, -113.908400, 35.933000, 90.571800, -1, -1 ); AddStaticVehicle( 455, -2406.731400, -102.701300, 35.759000, 0.0000000, -1, -1 ); @@ -408,6 +408,11 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 473,-2132.7664, 1689.1938, -0.2510, 145.6282, -1 , -1 ); // alca dinghy AddStaticVehicle( 473,-2124.7256, 1680.1863, -0.3078, 211.8767, -1 , -1 ); // alca dinghy AddStaticVehicle( 473,-2147.2537, 1693.4557, -0.2553, 220.9750, -1 , -1 ); // alca dinghy + AddStaticVehicle( 463, -2591.6646, 52.5053, 3.8765, 64.5699, 131, 131 ); // The Lost + AddStaticVehicle( 463, -2591.6646, 56.4805, 3.8767, 70.3625, 131, 131 ); // The Lost + AddStaticVehicle( 463, -2591.6646, 65.5400, 3.8730, 59.8191, 131, 131 ); // The Lost + AddStaticVehicle( 463, -2591.6646, 69.2684, 3.8739, 61.5998, 131, 131 ); // The Lost + AddStaticVehicle( 482, -2584.8413, 73.6874, 4.8535, 90.9373, 131, 131 ); // The Lost // Vehicle Dealership tmpVariable = AddStaticVehicle( 494, -1867.3900, -621.3196, 1007.0273, 130.5349, -1, -1 ); // DL1 @@ -442,11 +447,11 @@ static stock InitializeServerVehicles( ) AddStaticVehicle(409,2154.7104000,2114.5317000,10.4871000,359.8813000,-1,-1); //Stretch AddStaticVehicle(438,2120.2798000,2196.3962000,10.6147000,179.3108000,-1,-1); //Cabbie AddStaticVehicle(420,2155.1626000,2198.9038000,10.4499000,358.3196000,-1,-1); //Taxi - AddStaticVehicle(598,2251.7229000,2459.5588000,10.5645000,180.6259000,-1,-1); //Police Car (LVPD) - AddStaticVehicle(596,2260.4204000,2443.8567000,10.5575000,1.4549000,-1,-1); //Police Car (LSPD) - AddStaticVehicle(599,2269.1033000,2459.7290000,11.0146000,0.2515000,-1,-1); //Police Ranger - AddStaticVehicle(598,2282.7312000,2477.2422000,10.5895000,180.8693000,-1,-1); //Police Car (LVPD) - AddStaticVehicle(598,2291.1853000,2460.7002000,10.5670000,179.9081000,-1,-1); //Police Car (LVPD) + AddStaticVehicleEx(598,2251.7229000,2459.5588000,10.5645000,180.6259000,-1,-1,120,1); //Police Car (LVPD) + AddStaticVehicleEx(596,2260.4204000,2443.8567000,10.5575000,1.4549000,-1,-1,120,1); //Police Car (LSPD) + AddStaticVehicleEx(599,2269.1033000,2459.7290000,11.0146000,0.2515000,-1,-1,120,1); //Police Ranger + AddStaticVehicleEx(598,2282.7312000,2477.2422000,10.5895000,180.8693000,-1,-1,120,1); //Police Car (LVPD) + AddStaticVehicleEx(598,2291.1853000,2460.7002000,10.5670000,179.9081000,-1,-1,120,1); //Police Car (LVPD) AddStaticVehicle(541,2485.1333000,2521.3452000,10.4662000,88.7150000,-1,-1); //Bullet AddStaticVehicle(402,2476.7112000,2530.8640000,10.8589000,178.9217000,-1,-1); //Buffalo AddStaticVehicle(589,2449.9436000,2547.5051000,10.4985000,0.3426000,-1,-1); //Club @@ -554,7 +559,7 @@ static stock InitializeServerVehicles( ) AddStaticVehicle(417,365.4065000,2538.5208000,16.7058000,187.1385000,-1,-1); //Leviathan AddStaticVehicle(476,325.3628000,2544.8782000,17.5199000,178.5531000,-1,-1); //Rustler AddStaticVehicle(442,-355.5031000,2217.1929000,42.3131000,88.6629000,-1,-1); //Romero - AddStaticVehicle(599,-425.3501000,2245.0830000,42.6119000,178.1508000,-1,-1); //Police Ranger + AddStaticVehicleEx(599,-425.3501000,2245.0830000,42.6119000,178.1508000,-1,-1,120,1); //Police Ranger AddStaticVehicle(468,-442.9234000,2222.9109000,42.0205000,178.1901000,-1,-1); //Sanchez AddStaticVehicle(568,-389.2245000,2199.0442000,42.2916000,96.6088000,-1,-1); //Bandito AddStaticVehicle(454,-484.9109000,2188.9893000,40.7976000,180.1955000,-1,-1); //Tropic @@ -573,9 +578,9 @@ static stock InitializeServerVehicles( ) AddStaticVehicle(403,-1299.7213000,2708.8484000,50.6682000,4.5200000,-1,-1); //Linerunner AddStaticVehicle(463,-1273.1742000,2707.7610000,49.6029000,29.4728000,-1,-1); //Freeway AddStaticVehicle(468,-1267.1531000,2710.2527000,49.7391000,29.2539000,-1,-1); //Sanchez - AddStaticVehicle(599,-1400.4454000,2637.5820000,55.8724000,90.1155000,-1,-1); //Police Ranger + AddStaticVehicleEx(599,-1400.4454000,2637.5820000,55.8724000,90.1155000,-1,-1,120,1); //Police Ranger AddStaticVehicle(523,-1400.0012000,2628.5425000,55.3484000,91.3032000,-1,-1); //HPV1000 - AddStaticVehicle(598,-1400.4594000,2656.5981000,55.4359000,89.6264000,-1,-1); //Police Car (LVPD) + AddStaticVehicleEx(598,-1400.4594000,2656.5981000,55.4359000,89.6264000,-1,-1,120,1); //Police Car (LVPD) AddStaticVehicle(411,-1501.2905000,2647.4238000,55.3804000,0.6860000,-1,-1); //Infernus AddStaticVehicle(543,-1562.9995000,2695.2251000,55.5954000,179.5001000,-1,-1); //Sadler AddStaticVehicle(466,-1519.7347000,2690.4072000,55.4753000,248.3675000,-1,-1); //Glendale @@ -618,9 +623,9 @@ static stock InitializeServerVehicles( ) AddStaticVehicle(561,-77.4508000,1077.0004000,19.5558000,179.1996000,-1,-1); //Stratum AddStaticVehicle(466,-72.6212000,970.4161000,19.5206000,10.7515000,-1,-1); //Glendale AddStaticVehicle(402,-149.3938000,926.7260000,19.6191000,283.0578000,-1,-1); //Buffalo - AddStaticVehicle(598,-227.0211000,994.4134000,19.2985000,87.5296000,-1,-1); //Police Car (LVPD) + AddStaticVehicleEx(598,-227.0211000,994.4134000,19.2985000,87.5296000,-1,-1,120,1); //Police Car (LVPD) AddStaticVehicle(523,-216.6211000,987.3325000,19.0092000,178.9684000,-1,-1); //HPV1000 - AddStaticVehicle(599,-210.5997000,999.2169000,19.8594000,91.0179000,-1,-1); //Police Ranger + AddStaticVehicleEx(599,-210.5997000,999.2169000,19.8594000,91.0179000,-1,-1,120,1); //Police Ranger AddStaticVehicle(427,-226.7878000,999.7707000,19.7320000,90.7007000,-1,-1); //Enforcer AddStaticVehicle(416,-322.1475000,1058.2961000,19.8910000,359.9510000,-1,-1); //Ambulance AddStaticVehicle(560,-304.8201000,1023.8888000,19.2983000,269.5181000,-1,-1); //Sultan @@ -864,7 +869,7 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 477, -2206.064941, -2298.992675, 30.381359, 317.453613, -1, -1 ); AddStaticVehicle( 478, -2092.571044, -2244.076171, 30.758443, 138.650314, -1, -1 ); AddStaticVehicle( 478, -2102.175537, -2233.910400, 30.620101, 137.604217, -1, -1 ); - AddStaticVehicle( 416, -2203.672607, -2315.558593, 30.774448, 318.517517, -1, -1 ); + AddStaticVehicleEx( 416, -2203.672607, -2315.558593, 30.774448, 318.517517, -1, -1, 240, 1 ); AddStaticVehicle( 463, -2200.244628, -2262.725341, 30.093130, 231.325180, -1, -1 ); AddStaticVehicle( 468, -2208.998046, -2254.527343, 30.348510, 234.874664, -1, -1 ); AddStaticVehicle( 491, -2097.414062, -2239.713623, 30.384279, 139.849884, -1, -1 ); @@ -904,7 +909,7 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 400, 708.170715, -458.336486, 16.428236, 270.448425, -1, -1 ); AddStaticVehicle( 596, 614.293029, -597.008972, 16.953319, 270.690643, -1, -1 ); AddStaticVehicle( 496, 695.270690, -470.103607, 16.051948, 89.780700, -1, -1 ); - AddStaticVehicle( 523, 613.086364, -601.207336, 16.801979, 268.153198, -1, -1 ); + AddStaticVehicleEx( 523, 613.086364, -601.207336, 16.801979, 268.153198, -1, -1, 240, 1 ); AddStaticVehicle( 482, 708.286315, -464.582580, 16.444482, 269.546966, -1, -1 ); AddStaticVehicle( 463, 668.084472, -461.430145, 15.875892, 271.467498, -1, -1 ); AddStaticVehicle( 468, 668.161926, -470.812652, 16.004730, 268.505920, -1, -1 ); @@ -956,38 +961,38 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 402, 2263.363769, -128.744888, 27.300945, 359.765106, -1, -1 ); AddStaticVehicle( 519, 1889.941040, -2624.590820, 14.468383, 359.124145, -1, -1 ); AddStaticVehicle( 412, 2483.606933, -1655.894653, 13.162011, 90.518936, -1, -1 ); - AddStaticVehicle( 490, 1595.528808, -1709.573974, 6.019586, 359.722351, -1, -1 ); + AddStaticVehicleEx( 490, 1595.528808, -1709.573974, 6.019586, 359.722351, -1, -1, 240, 1 ); AddStaticVehicle( 593, 1822.176513, -2624.553222, 14.024420, 359.080780, -1, -1 ); AddStaticVehicle( 596, 1587.685302, -1710.722900, 5.612419, 358.663818, -1, -1 ); AddStaticVehicle( 519, 1753.972167, -2624.416992, 14.451003, 358.653961, -1, -1 ); AddStaticVehicle( 596, 1534.687377, -1645.483276, 5.612185, 0.414491, -1, -1 ); AddStaticVehicle( 476, 1682.415649, -2627.942626, 14.254081, 359.942840, -1, -1 ); - AddStaticVehicle( 490, 1544.408813, -1651.068603, 6.018870, 269.377441, -1, -1 ); + AddStaticVehicleEx( 490, 1544.408813, -1651.068603, 6.018870, 269.377441, -1, -1, 240, 1 ); AddStaticVehicle( 476, 1617.713745, -2629.208007, 14.210683, 359.764465, -1, -1 ); AddStaticVehicle( 596, 1544.830932, -1663.129516, 5.612981, 270.946533, -1, -1 ); AddStaticVehicle( 592, 1727.063598, -2441.779296, 14.818604, 178.650726, -1, -1 ); AddStaticVehicle( 475, 2473.250976, -1701.073974, 13.326033, 359.534210, -1, -1 ); - AddStaticVehicle( 427, 1564.478271, -1709.771728, 6.022296, 0.756405, -1, -1 ); - AddStaticVehicle( 490, 1600.590820, -1700.051025, 6.018587, 89.825813, -1, -1 ); + AddStaticVehicleEx( 427, 1564.478271, -1709.771728, 6.022296, 0.756405, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, 1600.590820, -1700.051025, 6.018587, 89.825813, -1, -1, 240, 1 ); AddStaticVehicle( 466, 2425.057617, -1643.590332, 13.239023, 180.256881, -1, -1 ); - AddStaticVehicle( 523, 1583.572143, -1711.615600, 5.459059, 0.000000, -1, -1 ); + AddStaticVehicleEx( 523, 1583.572143, -1711.615600, 5.459059, 0.000000, -1, -1, 240, 1 ); AddStaticVehicle( 592, 1643.698364, -2440.519775, 14.738221, 179.799713, -1, -1 ); - AddStaticVehicle( 523, 1574.387939, -1711.133911, 5.456938, 358.523590, -1, -1 ); - AddStaticVehicle( 490, 1544.154907, -1672.142333, 6.018477, 270.745086, -1, -1 ); + AddStaticVehicleEx( 523, 1574.387939, -1711.133911, 5.456938, 358.523590, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, 1544.154907, -1672.142333, 6.018477, 270.745086, -1, -1, 240, 1 ); AddStaticVehicle( 463, 2393.229248, -1672.942260, 13.443512, 1.111629, -1, -1 ); AddStaticVehicle( 511, 1561.888183, -2433.221435, 14.793487, 178.950912, -1, -1 ); - AddStaticVehicle( 523, 1544.224731, -1676.214843, 5.460846, 271.672546, -1, -1 ); + AddStaticVehicleEx( 523, 1544.224731, -1676.214843, 5.460846, 271.672546, -1, -1, 240, 1 ); AddStaticVehicle( 553, 2113.452636, -2433.913574, 14.884115, 180.220001, -1, -1 ); - AddStaticVehicle( 523, 1530.682617, -1645.039306, 5.454162, 0.739458, -1, -1 ); + AddStaticVehicleEx( 523, 1530.682617, -1645.039306, 5.454162, 0.739458, -1, -1, 240, 1 ); AddStaticVehicle( 487, 1878.442504, -2291.966552, 13.741863, 217.845825, -1, -1 ); AddStaticVehicle( 487, 1873.612670, -2272.690917, 13.796875, 218.001693, -1, -1 ); AddStaticVehicle( 476, 1994.173339, -2314.371337, 14.255472, 87.359558, -1, -1 ); AddStaticVehicle( 489, 2327.266601, -1695.732055, 13.560116, 270.449462, -1, -1 ); AddStaticVehicle( 522, 2319.294189, -1716.158813, 13.114595, 178.366027, -1, -1 ); AddStaticVehicle( 511, 1988.648437, -2382.414794, 14.919784, 90.287071, -1, -1 ); - AddStaticVehicle( 416, 1181.588623, -1338.645141, 13.850830, 270.317108, -1, -1 ); + AddStaticVehicleEx( 416, 1181.588623, -1338.645141, 13.850830, 270.317108, -1, -1, 240, 1 ); AddStaticVehicle( 593, 1994.743774, -2249.075195, 14.024641, 90.583992, -1, -1 ); - AddStaticVehicle( 416, 1180.428344, -1308.683837, 13.854464, 270.323547, -1, -1 ); + AddStaticVehicleEx( 416, 1180.428344, -1308.683837, 13.854464, 270.323547, -1, -1, 240, 1 ); AddStaticVehicle( 477, 2370.705810, -1769.415161, 13.300166, 359.807189, -1, -1 ); AddStaticVehicle( 485, 1952.454467, -2194.001953, 13.208797, 272.028930, -1, -1 ); AddStaticVehicle( 485, 2007.971923, -2290.384277, 13.214349, 271.826904, -1, -1 ); @@ -1004,7 +1009,7 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 401, 1560.078857, -2247.684570, 13.326823, 270.335632, -1, -1 ); AddStaticVehicle( 420, 1802.577880, -1919.975463, 13.171360, 89.673576, -1, -1 ); AddStaticVehicle( 522, 1536.365722, -2361.407470, 13.123092, 176.805435, -1, -1 ); - AddStaticVehicle( 416, 2000.616699, -1413.943725, 17.141201, 181.085311, -1, -1 ); + AddStaticVehicleEx( 416, 2000.616699, -1413.943725, 17.141201, 181.085311, -1, -1, 240, 1 ); AddStaticVehicle( 420, 1560.197021, -2260.885253, 13.326300, 89.747123, -1, -1 ); AddStaticVehicle( 462, 1539.459838, -2360.896240, 13.153014, 179.940643, -1, -1 ); AddStaticVehicle( 481, 1969.338745, -1445.854858, 13.038166, 358.897064, -1, -1 ); @@ -1013,10 +1018,10 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 549, 1977.699707, -1995.669555, 13.251157, 359.826965, -1, -1 ); AddStaticVehicle( 475, 1984.205932, -1995.592407, 13.354595, 179.333389, -1, -1 ); AddStaticVehicle( 463, 2271.170898, -1635.195678, 14.865265, 181.999954, -1, -1 ); - AddStaticVehicle( 416, 2037.245483, -1423.851928, 17.141618, 180.235870, -1, -1 ); + AddStaticVehicleEx( 416, 2037.245483, -1423.851928, 17.141618, 180.235870, -1, -1, 240, 1 ); AddStaticVehicle( 481, 1886.441650, -1396.874389, 13.077710, 276.836578, -1, -1 ); AddStaticVehicle( 481, 1885.028686, -1399.674072, 13.003782, 246.756225, -1, -1 ); - AddStaticVehicle( 407, 1750.186767, -1456.032836, 13.782455, 269.653381, -1, -1 ); + AddStaticVehicleEx( 407, 1750.186767, -1456.032836, 13.782455, 269.653381, -1, -1, 240, 1 ); AddStaticVehicle( 437, 1172.751464, -1796.699829, 13.531793, 179.339721, -1, -1 ); AddStaticVehicle( 437, 1182.211669, -1796.061645, 13.555741, 0.158258, -1, -1 ); AddStaticVehicle( 596, 1535.697387, -1667.963500, 13.103236, 179.848037, -1, -1 ); @@ -1265,10 +1270,10 @@ static stock InitializeServerVehicles( ) AddStaticVehicle( 429, 2676.494140, -1821.889160, 9.055012, 309.538818, -1, -1 ); AddStaticVehicle( 415, 2657.932373, -1702.095825, 9.091567, 89.390357, -1, -1 ); AddStaticVehicle( 522, 2691.825439, -1672.806274, 9.041232, 1.062990, -1, -1 ); - AddStaticVehicle( 490, 1512.243400, -1477.832000, 9.626500, 1.627700, -1, -1 ); - AddStaticVehicle( 427, 1517.129900, -1476.416300, 9.539900, 357.5721, -1, -1 ); - AddStaticVehicle( 490, 1521.418700, -1477.628300, 9.611000, 359.2550, -1, -1 ); - AddStaticVehicle( 427, 1525.687600, -1476.441400, 9.609600, 357.8114, -1, -1 ); + AddStaticVehicleEx( 490, 1512.243400, -1477.832000, 9.626500, 1.627700, -1, -1, 240, 1 ); + AddStaticVehicleEx( 427, 1517.129900, -1476.416300, 9.539900, 357.5721, -1, -1, 240, 1 ); + AddStaticVehicleEx( 490, 1521.418700, -1477.628300, 9.611000, 359.2550, -1, -1, 240, 1 ); + AddStaticVehicleEx( 427, 1525.687600, -1476.441400, 9.609600, 357.8114, -1, -1, 240, 1 ); AddStaticVehicle( 492, 2508.360800, -1671.674400, 13.16180 ,347.7810, -1, -1 ); // Army Base LS diff --git a/pawno/include/irresistible/features/duel.inc b/pawno/include/irresistible/features/duel.inc new file mode 100644 index 0000000..39996a3 --- /dev/null +++ b/pawno/include/irresistible/features/duel.inc @@ -0,0 +1,570 @@ +/* + * Irresistible Gaming (c) 2018 + * Developed by Stev + * Module: duel.pwn + * Purpose: player dueling system +*/ + +/* ** Debug ** */ + +// Added class detection for civilains - ShowPlayerDuelMenu(playerid) + + +// #define GivePlayerCash GivePlayerMoney +// #define GetPlayerCash GetPlayerMoney + +/* ** Definitions ** */ +#define COL_DUEL "{B74AFF}" +#define DIALOG_DUEL 7360 +#define DIALOG_DUEL_PLAYER 7361 +#define DIALOG_DUEL_LOCATION 7362 +#define DIALOG_DUEL_WEAPON 7363 +#define DIALOG_DUEL_WAGER 7364 +#define DIALOG_DUEL_WEAPON_TWO 7365 +#define DIALOG_DUEL_HEALTH 7366 +#define DIALOG_DUEL_ARMOUR 7367 + +/* ** Variables ** */ +enum duelData +{ + duelPlayer, + duelWeapon[2], + duelBet, + Float: duelArmour, + Float: duelHealth, + duelCountdown, + duelTimer, + duelLocation, +}; + +enum locationData +{ + locationName[19], + Float:locationPosOne[3], + Float:locationPosTwo[3], +}; + +static const Float: duel_coordinates[3] = {-2226.1938, 251.9206, 35.3203}; + +new + weaponList [] = {0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34}, + LocationInfo [][locationData] = + { + {"Santa Maria Beach", {369.75770, -1831.576, 7.67190}, {369.65890, -1871.215, 7.67190}}, + {"Greenglass College", {1078.0353, 1084.4989, 10.8359}, {1095.4019, 1064.7239, 10.8359}}, + {"Baseball Arena", {1393.0995, 2177.4585, 9.75780}, {1377.7881, 2195.4214, 9.75780}}, + {"The Visage", {1960.4512, 1907.6881, 130.937}, {1969.4047, 1923.2622, 130.937}}, + {" Mount Chilliad", {-2318.471, -1632.880, 483.703}, {-2329.174, -1604.657, 483.760}}, + {"The Farm", {-1044.856, -996.8120, 129.218}, {-1125.599, -996.7523, 129.218}}, + {"Tennis Courts", {755.93790, -1280.710, 13.5565}, {755.93960, -1238.688, 13.5516}}, + {"Underwater World", {520.59600, -2125.663, -28.257}, {517.96600, -2093.610, -28.257}}, + {"Grove Street", {2476.4580, -1668.631, 13.3249}, {2501.1560, -1667.655, 13.3559}}, + {"Ocean Docks", {2683.5440, -2485.137, 13.5425}, {2683.8470, -2433.726, 13.5553}} + }, + duelInfo [MAX_PLAYERS][duelData], + + bool: p_playerDueling [MAX_PLAYERS char], + p_duelInvitation [MAX_PLAYERS][MAX_PLAYERS], + + g_DuelCheckpoint = -1 +; + +/* ** Hooks ** */ +hook OnGameModeInit() +{ + CreateDynamicMapIcon(duel_coordinates[0], duel_coordinates[1], duel_coordinates[2], 23, 0, -1, -1, -1, 750.0); + g_DuelCheckpoint = CreateDynamicCP(duel_coordinates[0], duel_coordinates[1], duel_coordinates[2], 1.5, 0, 0, -1); + CreateDynamic3DTextLabel(""COL_GOLD"[DUEL PLAYER]", -1, duel_coordinates[0], duel_coordinates[1], duel_coordinates[2], 25.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, 0, -1); + return 1; +} + +hook OnPlayerConnect(playerid) +{ + p_playerDueling{playerid} = false; + duelInfo[playerid][duelPlayer] = INVALID_PLAYER_ID; + duelInfo[playerid][duelWeapon][0] = 0; + duelInfo[playerid][duelWeapon][1] = 0; + duelInfo[playerid][duelHealth] = 100.0; + duelInfo[playerid][duelArmour] = 100.0; + duelInfo[playerid][duelBet] = 0; + return 1; +} + +hook OnPlayerDisconnect(playerid, reason) +{ + forfeitPlayerDuel(playerid); + return 1; +} + +#if defined AC_INCLUDED +hook OnPlayerDeathEx(playerid, killerid, reason, Float: damage, bodypart) +#else +hook OnPlayerDeath(playerid, killerid, reason) +#endif +{ + forfeitPlayerDuel(playerid); + return 1; +} + +hook SetPlayerRandomSpawn(playerid) +{ + if (IsPlayerDueling(playerid)) + { + // teleport back to pb + SetPlayerPos(playerid, duel_coordinates[0], duel_coordinates[1], duel_coordinates[2]); + SetPlayerInterior(playerid, 0); + SetPlayerVirtualWorld(playerid, 0); + + // reset duel variables + p_playerDueling{playerid} = false; + duelInfo[playerid][duelPlayer] = INVALID_PLAYER_ID; + return Y_HOOKS_BREAK_RETURN_1; + } + return 1; +} + +hook OnPlayerEnterDynamicCP(playerid, checkpointid) +{ + if (checkpointid == g_DuelCheckpoint) + { + ShowPlayerDuelMenu(playerid); + return 1; + } + return 1; +} + +hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) +{ + if (dialogid == DIALOG_DUEL && response) + { + switch (listitem) + { + case 0: ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{C0C0C0}Note: You can enter partially their names.", "Select", "Back"); + + case 1: ShowPlayerDialog(playerid, DIALOG_DUEL_HEALTH, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Health", "{FFFFFF}Enter the amount of health you will begin with:\n\n{C0C0C0}Note: The default health is 100.0.", "Select", "Back"); + + case 2: ShowPlayerDialog(playerid, DIALOG_DUEL_ARMOUR, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Armour", "{FFFFFF}Enter the amount of armour you will begin with:\n\n{C0C0C0}Note: The default armour is 100.0.", "Select", "Back"); + + case 3: + { + new weaponid = duelInfo[playerid][duelWeapon][0]; + + erase(szBigString); + + for (new i = 0; i < sizeof(weaponList); i ++) { + format(szBigString, sizeof(szBigString), "%s%s%s\n", szBigString, (weaponid == weaponList[i] ? (COL_GREY) : (COL_WHITE)), ReturnWeaponName(weaponList[i])); + } + + ShowPlayerDialog(playerid, DIALOG_DUEL_WEAPON, DIALOG_STYLE_LIST, "{FFFFFF}Duel Settings - Change Primary Weapon", szBigString, "Select", "Back"); + } + + case 4: + { + new weaponid = duelInfo[playerid][duelWeapon][1]; + + erase(szBigString); + + for (new i = 0; i < sizeof(weaponList); i ++) { + format(szBigString, sizeof(szBigString), "%s%s%s\n", szBigString, (weaponid == weaponList[i] ? (COL_GREY) : (COL_WHITE)), ReturnWeaponName(weaponList[i])); + } + + ShowPlayerDialog(playerid, DIALOG_DUEL_WEAPON_TWO, DIALOG_STYLE_LIST, "{FFFFFF}Duel Settings - Change Secondary Weapon", szBigString, "Select", "Back"); + } + + case 5: + { + new index = duelInfo[playerid][duelLocation]; + + erase(szBigString); + + for (new i = 0; i < sizeof(LocationInfo); i ++) { + format(szBigString, sizeof(szBigString), "%s%s%s\n", szBigString, (index == i ? (COL_GREY) : (COL_WHITE)), LocationInfo[i][locationName]); + } + + ShowPlayerDialog(playerid, DIALOG_DUEL_LOCATION, DIALOG_STYLE_LIST, "{FFFFFF}Duel Settings - Change Location", szBigString, "Select", "Back"); + } + + case 6: ShowPlayerDialog(playerid, DIALOG_DUEL_WAGER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Set A Wager", "{FFFFFF}Please enter the wager for this duel:", "Select", "Back"); + + case 7: + { + new targetid = duelInfo[playerid][duelPlayer]; + + if (!IsPlayerConnected(targetid)) { + SendError(playerid, "You haven't selected anyone to duel!"); + return ShowPlayerDuelMenu(playerid); + } + + p_duelInvitation[playerid][targetid] = gettime() + 60; + ShowPlayerHelpDialog(targetid, 10000, "%s wants to duel!~n~~n~~y~Location: ~w~%s~n~~y~Weapon: ~w~%s and %s~n~~y~Wager: ~w~%s", ReturnPlayerName(playerid), LocationInfo[duelInfo[playerid][duelLocation]][locationName], ReturnWeaponName(duelInfo[playerid][duelWeapon][0]), ReturnWeaponName(duelInfo[playerid][duelWeapon][1]), number_format(duelInfo[playerid][duelBet])); + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have sent a duel invitation to %s for "COL_GOLD"%s"COL_WHITE".", ReturnPlayerName(targetid), number_format(duelInfo[playerid][duelBet])); + SendClientMessageFormatted(targetid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You are invited to duel %s for "COL_GOLD"%s"COL_WHITE", use \"/duel accept %d\".", ReturnPlayerName(playerid), number_format(duelInfo[playerid][duelBet]), playerid); + } + } + return 1; + } + + else if (dialogid == DIALOG_DUEL_PLAYER) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + new targetid; + + if (sscanf(inputtext, "u", targetid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{C0C0C0}Note: You can enter partially their names.", "Select", "Back"); + + if (targetid == playerid) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}You can't invite yourself to duel!", "Select", "Back"); + + if (targetid == INVALID_PLAYER_ID || !IsPlayerConnected(targetid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}Player is not connected!", "Select", "Back"); + + if (IsPlayerDueling(playerid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}You are already in a duel!", "Select", "Back"); + + if (IsPlayerDueling(targetid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}This player is already in a duel!", "Select", "Back"); + + if (GetPlayerWantedLevel(targetid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}You can't duel this person right now, they are wanted", "Select", "Back"); + + if (GetDistanceBetweenPlayers(playerid, targetid) > 25.0) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}The player you wish to duel is not near you.", "Select", "Back"); + + if (IsPlayerJailed(targetid)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_PLAYER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Select a player", "{FFFFFF}Please type the name of the player you wish to duel:\n\n{FF0000}You can't duel this person right now, they are currently in jail.", "Select", "Back"); + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have selected {C0C0C0}%s {FFFFFF}as your opponent.", ReturnPlayerName(targetid)); + + duelInfo[playerid][duelPlayer] = targetid; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_LOCATION) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + if (duelInfo[playerid][duelLocation] == listitem) + { + SendError(playerid, "You have already selected this location!"); + return ShowPlayerDuelMenu(playerid); + } + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed the duel location to {C0C0C0}%s{FFFFFF}.", LocationInfo[listitem][locationName]); + + duelInfo[playerid][duelLocation] = listitem; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_WEAPON) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + if (duelInfo[playerid][duelWeapon][0] == weaponList[listitem]) + { + SendError(playerid, "You have already selected this weapon!"); + return ShowPlayerDuelMenu(playerid); + } + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed Primary Weapon to {C0C0C0}%s{FFFFFF}.", ReturnWeaponName(weaponList[listitem])); + duelInfo[playerid][duelWeapon][0] = weaponList[listitem]; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_WEAPON_TWO) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + if (duelInfo[playerid][duelWeapon][1] == weaponList[listitem]) + { + SendError(playerid, "You have already selected this weapon!"); + return ShowPlayerDuelMenu(playerid); + } + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed Secondary Weapon to {C0C0C0}%s{FFFFFF}.", ReturnWeaponName(weaponList[listitem])); + duelInfo[playerid][duelWeapon][1] = weaponList[listitem]; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_HEALTH) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + new Float:health; + + if (sscanf(inputtext, "f", health)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_HEALTH, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Health", "{FFFFFF}Enter the amount of health you will begin with:\n\n{C0C0C0}Note: The default health is 100.0.", "Select", "Back"); + + if (!(1.0 <= health <= 100.0)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_HEALTH, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Health", "{FFFFFF}Enter the amount of health you will begin with:\n\n{FF0000}The amount you have entered is a invalid amount, 1 to 100 only!", "Select", "Back"); + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed Health to {C0C0C0}%0.2f%%{FFFFFF}.", health); + duelInfo[playerid][duelHealth] = health; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_ARMOUR) + { + if (!response) + return ShowPlayerDuelMenu(playerid); + + new Float:armour; + + if (sscanf(inputtext, "f", armour)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_ARMOUR, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Armour", "{FFFFFF}Enter the amount of armour you will begin with:\n\n{C0C0C0}Note: The default armour is 100.0.", "Select", "Back"); + + if (!(0.0 <= armour <= 100.0)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_ARMOUR, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Armour", "{FFFFFF}Enter the amount of armour you will begin with:\n\n{FF0000}The amount you have entered is a invalid amount, 0 to 100 only!", "Select", "Back"); + + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed Armour to {C0C0C0}%0.2f%%{FFFFFF}.", armour); + duelInfo[playerid][duelArmour] = armour; + ShowPlayerDuelMenu(playerid); + return 1; + } + + else if (dialogid == DIALOG_DUEL_WAGER) + { + if (IsPlayerDueling(playerid)) // prevent spawning money + return SendError(playerid, "You cannot use this at the moment."); + + if (!response) + return ShowPlayerDuelMenu(playerid); + + new amount; + + if (sscanf(inputtext, "d", amount)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_WAGER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Set A Wager", "{FFFFFF}Please enter the wager for this duel:", "Select", "Back"); + + if (!(0 <= amount < 10000000)) + return ShowPlayerDialog(playerid, DIALOG_DUEL_WAGER, DIALOG_STYLE_INPUT, "{FFFFFF}Duel Settings - Set A Wager", "{FFFFFF}Please enter the wager for this duel:\n\n{FF0000}Wagers must be between $0 and $10,000,000.", "Select", "Back"); + + duelInfo[playerid][duelBet] = amount; + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have changed the wager to %s.", number_format(duelInfo[playerid][duelBet])); + ShowPlayerDuelMenu(playerid); + return 1; + } + return 1; +} + +/* ** Commands ** */ +CMD:duel(playerid, params[]) +{ + if (!strcmp(params, "accept", false, 6)) + { + new + targetid; + + if (sscanf(params[7], "u", targetid)) + return SendUsage(playerid, "/duel accept [PLAYER_ID]"); + + if (!IsPlayerConnected(targetid)) + return SendError(playerid, "You do not have any duel invitations to accept."); + + if (gettime() > p_duelInvitation[targetid][playerid]) + return SendError(playerid, "You have not been invited by %s to duel or it has expired."); + + if (IsPlayerDueling(playerid)) + return SendError(playerid, "You cannot accept this invite as you are currently dueling."); + + if (GetDistanceBetweenPlayers(playerid, targetid) > 25.0) + return SendError(playerid, "You must be within 25.0 meters of your opponent!"); + + new waged_amount = duelInfo[targetid][duelBet]; + + if (duelInfo[targetid][duelBet] != 0) + { + if (GetPlayerCash(targetid) < waged_amount) + { + SendClientMessageFormatted(targetid, -1, ""COL_DUEL"[DUEL]{FFFFFF} %s has accepted but you don't have money to wage (%s).", ReturnPlayerName(playerid), number_format(waged_amount)); + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have accepted %s's duel invitation but they don't have money.", ReturnPlayerName(targetid)); + return 1; + } + else if (GetPlayerCash(playerid) < waged_amount) + { + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} %s requires you to wage %s.", ReturnPlayerName(targetid), number_format(waged_amount)); + SendClientMessageFormatted(targetid, -1, ""COL_DUEL"[DUEL]{FFFFFF} %s has accepted the duel invitation but they don't have money to wage.", ReturnPlayerName(playerid)); + return 1; + } + else + { + GivePlayerCash(playerid, -waged_amount); + GivePlayerCash(targetid, -waged_amount); + } + } + + SendClientMessageFormatted(targetid, -1, ""COL_DUEL"[DUEL]{FFFFFF} %s has accepted your duel invitation.", ReturnPlayerName(playerid)); + SendClientMessageFormatted(playerid, -1, ""COL_DUEL"[DUEL]{FFFFFF} You have accepted %s's duel invitation.", ReturnPlayerName(targetid)); + + p_playerDueling{targetid} = true; + p_playerDueling{playerid} = true; + + duelInfo[targetid][duelPlayer] = playerid; + duelInfo[playerid][duelPlayer] = targetid; + duelInfo[playerid][duelBet] = duelInfo[targetid][duelBet]; + + new id = duelInfo[targetid][duelLocation]; + + ResetPlayerWeapons(targetid); + RemovePlayerFromVehicle(targetid); + SetPlayerArmour(targetid, duelInfo[targetid][duelArmour]); + SetPlayerHealth(targetid, duelInfo[targetid][duelHealth]); + SetPlayerVirtualWorld(targetid, targetid + 1); + SetPlayerPos(targetid, LocationInfo[id][locationPosTwo][0], LocationInfo[id][locationPosTwo][1], LocationInfo[id][locationPosTwo][2]); + + ResetPlayerWeapons(playerid); + RemovePlayerFromVehicle(playerid); + SetPlayerArmour(playerid, duelInfo[targetid][duelArmour]); + SetPlayerHealth(playerid, duelInfo[targetid][duelHealth]); + SetPlayerVirtualWorld(playerid, targetid + 1); + SetPlayerPos(playerid, LocationInfo[id][locationPosOne][0], LocationInfo[id][locationPosOne][1], LocationInfo[id][locationPosOne][2]); + + // freeze + TogglePlayerControllable(playerid, 0); + TogglePlayerControllable(targetid, 0); + + // start countdown + duelInfo[targetid][duelCountdown] = 10; + duelInfo[targetid][duelTimer] = SetTimerEx("DuelTimer", 960, true, "d", targetid); + + // give weapon + GivePlayerWeapon(playerid, duelInfo[targetid][duelWeapon][0], 5000); + GivePlayerWeapon(targetid, duelInfo[targetid][duelWeapon][0], 5000); + GivePlayerWeapon(playerid, duelInfo[targetid][duelWeapon][1], 5000); + GivePlayerWeapon(targetid, duelInfo[targetid][duelWeapon][1], 5000); + + // clear invites for safety + for (new i = 0; i < MAX_PLAYERS; i ++) { + p_duelInvitation[playerid][i] = 0; + p_duelInvitation[targetid][i] = 0; + } + return 1; + } + else if (strmatch(params, "cancel")) + { + if (ClearDuelInvites(playerid)) + { + return SendServerMessage(playerid, "You have cancelled every duel offer that you have made."); + } + else + { + return SendError(playerid, "You have not made any duel offers recently."); + } + } + return SendUsage(playerid, "/duel [ACCEPT/CANCEL]"); +} + +/* ** Functions ** */ +static stock ClearDuelInvites(playerid) +{ + new current_time = gettime(); + new count = 0; + + for (new i = 0; i < MAX_PLAYERS; i ++) + { + if (p_duelInvitation[playerid][i] != 0 && current_time > p_duelInvitation[playerid][i]) + { + p_duelInvitation[playerid][i] = 0; + count ++; + } + } + return count; +} + +stock IsPlayerDueling(playerid) { + return p_playerDueling{playerid}; +} + +stock ShowPlayerDuelMenu(playerid) +{ + if (GetPlayerClass(playerid) != CLASS_CIVILIAN) + return SendError(playerid, "You can only use this feature whist being a civilian."); + + if (GetPlayerWantedLevel(playerid)) + return SendError(playerid, "You cannot duel whilst having a wanted level."); + + format(szBigString, sizeof(szBigString), + "Player\t{C0C0C0}%s\nHealth\t{C0C0C0}%.2f%%\nArmour\t{C0C0C0}%.2f%%\nPrimary Weapon\t{C0C0C0}%s\nSecondary Weapon\t{C0C0C0}%s\nLocation\t{C0C0C0}%s\nWager\t{C0C0C0}%s\n"COL_GOLD"Send Invite\t"COL_GOLD">>>", + (!IsPlayerConnected(duelInfo[playerid][duelPlayer]) ? (""COL_RED"N/A") : (ReturnPlayerName(duelInfo[playerid][duelPlayer]))), + duelInfo[playerid][duelHealth], + duelInfo[playerid][duelArmour], + ReturnWeaponName(duelInfo[playerid][duelWeapon][0]), + ReturnWeaponName(duelInfo[playerid][duelWeapon][1]), + LocationInfo[duelInfo[playerid][duelLocation]][locationName], + number_format(duelInfo[playerid][duelBet]) + ); + ShowPlayerDialog(playerid, DIALOG_DUEL, DIALOG_STYLE_TABLIST, "{FFFFFF}Duel Settings", szBigString, "Select", "Cancel"); + return 1; +} + +static stock forfeitPlayerDuel(playerid) +{ + if (!IsPlayerDueling(playerid)) + return 0; + + ClearDuelInvites(playerid); + + new + winnerid = duelInfo[playerid][duelPlayer]; + + if (!IsPlayerConnected(winnerid) || !IsPlayerDueling(winnerid)) + return 0; + + // begin wager info + new + amount_waged = duelInfo[playerid][duelBet]; + + SpawnPlayer(winnerid); + ClearDuelInvites(winnerid); + p_playerDueling{playerid} = false; + + if (0 < amount_waged < 10000000) { + new winning_prize = floatround(float(amount_waged) * 1.9); // We take 5% of the total pot + GivePlayerCash(winnerid, winning_prize); + SendClientMessageToAllFormatted( -1, ""COL_DUEL"[DUEL]{FFFFFF} %s(%d) has won the duel against %s(%d) for %s!", ReturnPlayerName(winnerid), winnerid, ReturnPlayerName(playerid), playerid, number_format(winning_prize)); + } else { + SendClientMessageToAllFormatted( -1, ""COL_DUEL"[DUEL]{FFFFFF} %s(%d) has won the duel against %s(%d)!", ReturnPlayerName(winnerid), winnerid, ReturnPlayerName(playerid), playerid); + } + return 1; +} + +function DuelTimer(targetid) +{ + new + playerid = duelInfo[targetid][duelPlayer]; + + duelInfo[targetid][duelCountdown] --; + + if (duelInfo[targetid][duelCountdown] <= 0) + { + GameTextForPlayer(targetid, "~g~~h~FIGHT!", 1500, 4); + GameTextForPlayer(playerid, "~g~~h~FIGHT!", 1500, 4); + + PlayerPlaySound(targetid, 1057, 0.0, 0.0, 0.0); + PlayerPlaySound(playerid, 1057, 0.0, 0.0, 0.0); + + TogglePlayerControllable(playerid, 1); + TogglePlayerControllable(targetid, 1); + + KillTimer(duelInfo[targetid][duelTimer]); + } + else + { + format(szSmallString, sizeof(szSmallString), "~w~%d", duelInfo[targetid][duelCountdown]); + GameTextForPlayer(targetid, szSmallString, 1500, 4); + GameTextForPlayer(playerid, szSmallString, 1500, 4); + + PlayerPlaySound(targetid, 1056, 0.0, 0.0, 0.0); + PlayerPlaySound(playerid, 1056, 0.0, 0.0, 0.0); + } + return 1; +} diff --git a/pawno/include/irresistible/features/gangs/facilities.inc b/pawno/include/irresistible/features/gangs/facilities.inc index 0d37462..b28bbe9 100644 --- a/pawno/include/irresistible/features/gangs/facilities.inc +++ b/pawno/include/irresistible/features/gangs/facilities.inc @@ -97,6 +97,7 @@ hook OnPlayerEnterDynamicCP( playerid, checkpointid ) // begin entrance pauseToLoad( playerid ); + SetPVarInt( playerid, "in_facility", facility ); UpdatePlayerEntranceExitTick( playerid ); SetPlayerPos( playerid, g_gangFacilityInterior[ int_type ] [ E_X ], g_gangFacilityInterior[ int_type ] [ E_Y ], g_gangFacilityInterior[ int_type ] [ E_Z ] ); SetPlayerVirtualWorld( playerid, g_gangFacilities[ facility ] [ E_WORLD ] ); @@ -129,21 +130,23 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] ) { if ( dialogid == DIALOG_GANG_JOIN && response ) { - if ( p_GangID[ playerid ] != -1 ) + if ( p_GangID[ playerid ] != -1 ) { return SendServerMessage( playerid, "You are already in a gang." ); + } new joining_gang = GetPVarInt( playerid, "gang_facility_join" ); - if ( ! Iter_Contains( gangs, joining_gang ) || IsGangPrivate( joining_gang ) ) - return SendError( playerid, "You can no longer join this gang." ); + if ( IsGangPrivate( joining_gang ) ) { + return SendError( playerid, "You can no longer join this gang as it is private." ); + } - p_GangID[ playerid ] = joining_gang; - if ( GetPlayerWantedLevel( playerid ) < 1 ) SetPlayerColor( playerid, g_gangData[ joining_gang ] [ E_COLOR ] ); - mysql_single_query( sprintf( "UPDATE `USERS` SET `GANG_ID`=%d WHERE `ID`=%d", g_gangData[ joining_gang ] [ E_SQL_ID ], GetPlayerAccountID( playerid ) ) ); - SendClientMessageToGang( joining_gang, g_gangData[ joining_gang ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) has joined the gang.", ReturnPlayerName( playerid ), playerid ); + if ( ! SetPlayerGang( playerid, joining_gang ) ) { + SendError( playerid, "You can no longer join this gang." ); + } return 1; } + else if ( dialogid == DIALOG_FACILITY_AMMU && response ) { new player_gang = GetPlayerGang( playerid ); @@ -156,19 +159,25 @@ hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] ) SetPVarInt( playerid, "facility_weapon_cat", listitem ); RedirectAmmunation( playerid, listitem, "{FFFFFF}Gang Facility - Purchase Weapons", DIALOG_FACILITY_AMMU_BUY, discount ); } + else if ( dialogid == DIALOG_FACILITY_AMMU_BUY ) { if ( response ) { - new player_gang = GetPlayerGang( playerid ); + new facility = GetPVarInt( playerid, "in_facility" ); - if ( ! Iter_Contains( gangs, player_gang ) ) return SendError( playerid, "You are not in any gang." ); + if ( ! Iter_Contains( gangfacilities, facility ) ) + return SendError( playerid, "Cannot identify current gang facility. Please enter facility again." ); + + new facility_gangid = Turf_GetFacility( g_gangFacilities[ facility ] [ E_TURF_ID ] ); + + if ( ! Iter_Contains( gangs, facility_gangid ) ) return SendError( playerid, "You are not in any gang." ); if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "You cannot buy weapons in jail." ); if ( IsPlayerInEvent( playerid ) ) return SendError( playerid, "You cannot buy weapons in an event." ); if ( GetPlayerState( playerid ) == PLAYER_STATE_WASTED || !IsPlayerSpawned( playerid ) ) return SendError( playerid, "You are unable to purchase any weapons at this time." ); new gun_category = GetPVarInt( playerid, "facility_weapon_cat" ); - new Float: gun_discount = ( FACILITY_AMMU_RESPECT - float( g_gangData[ player_gang ] [ E_RESPECT ] ) ) / FACILITY_AMMU_RESPECT; + new Float: gun_discount = ( FACILITY_AMMU_RESPECT - float( g_gangData[ facility_gangid ] [ E_RESPECT ] ) ) / FACILITY_AMMU_RESPECT; // make sure player doesnt get credited money lol if ( gun_discount < 0.0 ) { diff --git a/pawno/include/irresistible/features/gangs/gangs.inc b/pawno/include/irresistible/features/gangs/gangs.inc index 8882be6..bac29f4 100644 --- a/pawno/include/irresistible/features/gangs/gangs.inc +++ b/pawno/include/irresistible/features/gangs/gangs.inc @@ -63,7 +63,25 @@ hook OnGameModeInit( ) // mysql_single_query( "UPDATE `USERS` SET `GANG_ID`=-1 WHERE UNIX_TIMESTAMP()-`USERS`.`LASTLOGGED` > 1209600" ); // Remove gangs with a non existant gang leader / unmatched player gang id to gang leader id - mysql_single_query( "DELETE g FROM GANGS g LEFT JOIN USERS u ON g.LEADER = u.ID WHERE u.GANG_ID != g.ID OR u.ID IS NULL" ); + mysql_single_query( "DELETE g FROM GANGS g LEFT JOIN USERS u ON g.LEADER = u.ID WHERE (u.GANG_ID != g.ID OR u.ID IS NULL) AND g.LEADER >= 0" ); #endif return 1; } + +/* ** Functions ** */ +stock SetPlayerGang( playerid, joining_gang ) +{ + if ( ! Iter_Contains( gangs, joining_gang ) ) + return 0; + + // remove from existing gang + if ( p_GangID[ playerid ] != INVALID_GANG_ID ) { + RemovePlayerFromGang( playerid, GANG_LEAVE_QUIT ); + } + + p_GangID[ playerid ] = joining_gang; + if ( GetPlayerWantedLevel( playerid ) < 1 ) SetPlayerColor( playerid, g_gangData[ joining_gang ] [ E_COLOR ] ); + mysql_single_query( sprintf( "UPDATE `USERS` SET `GANG_ID`=%d WHERE `ID`=%d", g_gangData[ joining_gang ] [ E_SQL_ID ], GetPlayerAccountID( playerid ) ) ); + SendClientMessageToGang( joining_gang, g_gangData[ joining_gang ] [ E_COLOR ], "[GANG]{FFFFFF} %s(%d) has joined the gang.", ReturnPlayerName( playerid ), playerid ); + return 1; +} diff --git a/pawno/include/irresistible/features/weapon_drop.inc b/pawno/include/irresistible/features/weapon_drop.inc index 203e824..fb6fc24 100644 --- a/pawno/include/irresistible/features/weapon_drop.inc +++ b/pawno/include/irresistible/features/weapon_drop.inc @@ -54,7 +54,7 @@ hook OnPlayerDeath( playerid, killerid, reason ) if ( IsPlayerConnected( killerid ) ) { - if ( IsPlayerJailed( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerInEvent( playerid ) ) + if ( IsPlayerJailed( playerid ) || IsPlayerInPaintBall( playerid ) || IsPlayerInEvent( playerid ) || IsPlayerDueling( playerid ) ) return 1; new diff --git a/pawno/include/irresistible/main.inc b/pawno/include/irresistible/main.inc index e039e32..e2c218f 100644 --- a/pawno/include/irresistible/main.inc +++ b/pawno/include/irresistible/main.inc @@ -24,6 +24,7 @@ #include < irresistible\gta\weapon_data > // cnr configuration +#include < irresistible\cnr\classes > #include < irresistible\cnr\cities > #include < irresistible\cnr\dialog_ids > #include < irresistible\cnr\vip > @@ -35,6 +36,7 @@ #include < irresistible\features\furniture > #include < irresistible\features\weapon_drop > #include < irresistible\features\ammunation > +#include < irresistible\features\duel > // #include < irresistible\features\pilot > // #include < irresistible\features\fishing > // #include < irresistible\features\vote > diff --git a/scriptfiles/updates.txt b/scriptfiles/updates.txt index 6b51d07..2fdc42b 100644 --- a/scriptfiles/updates.txt +++ b/scriptfiles/updates.txt @@ -1,17 +1,8 @@ -(+) Private ammunation added for gang facilities. Higher the respect, cheaper the weapons/gear. -(+) You can now access the inside of a gang facility so long as you're in the gang / own the facility's turf. -(+) New Alcatraz Map thanks to Gal. You can now mine ores at the Alcatraz prison also. -(+) You can now edit your toy color through toys. -(+) Public gangs can now be joined by anyone simply by accessing their facility's checkpoint. -(+) There are now pages to the list of gang members shown. -(*) Fixes issue with many toys not being able to be selected. -(-) /breakcuff command removed. Breaking cuffs are now automatically done, as soon as you are cuffed. -(-) /detain command removed. The feature was rather abused than used. -(-) /cuttie command removed. Cutting ties are now automatically done, as soon as you are tied. -(/) /taze, /cuff, /ar no longer require id parameters. Can use MMB as a bind. -(/) Breaking cuffs will keep repeating until it successfully breaks cuffs. -(/) If you break your cuffs you will have 6 seconds of immunity to taze/cuff/arrest. -(/) Players are now tazed half a second shorter. -(/) /hitlist now can be accessed by all classes. -(/) Break cuff has an 80% success rate. -(/) Safe loot increased by 20%. +(+) Adds a 1v1 duel arena behind paintball, where you can wage money against eachother. Thanks Stev. +(+) Adds /discordurl for level 5 admins to update the sfcnr.com/discord redirect. +(+) You now get a Shotgun with 25 ammo when you enter a police car. +(+) You can now join public gangs through /gangs. +(/) Wanted levels over 30 will place you in Alcatraz Prison. +(/) Price of supa save items have been generally increased. +(/) Speed of robberies has been increased. +(/) Bail is doubled if you are in Alcatraz.