sfcnr/gamemodes/irresistible/cnr/features/robbery/atms.pwn
2019-02-03 10:13:39 +01:00

259 lines
9.9 KiB
Plaintext

/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc
* Module: cnr\features\robbery\atms.pwn
* Purpose: robbable ATM system which can also be used for banking
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#if defined MAX_FACILITIES
#define MAX_ATMS ( 48 + MAX_FACILITIES )
#else
#define MAX_ATMS ( 48 )
#endif
/* ** Variables ** */
enum E_ATM_DATA
{
E_CHECKPOINT, Float: E_HEALTH, E_TIMESTAMP,
E_OBJECT, Text3D: E_LABEL, bool: E_DISABLED,
E_PICKUP, E_LOOT, E_WORLD
};
static stock
g_atmData [ MAX_ATMS ] [ E_ATM_DATA ],
Iterator: atms < MAX_ATMS >
;
/* ** Hooks ** */
hook OnScriptInit( )
{
// San Fierro
CreateATM( -1938.123291, 883.547668, 38.087814, 270.000000 );
CreateATM( -2408.914794, 720.656738, 34.751876, 180.000000 );
CreateATM( -1980.711669, 122.112731, 27.267499, 90.000000 );
CreateATM( -2647.664306, -22.565168, 5.7128110, 180.000000 );
CreateATM( -1917.654418, 558.118347, 34.743148, 270.000000 );
CreateATM( -2635.699951, 631.200012, 14.079999, 180.000000 );
CreateATM( -2636.040000, 208.560000, 3.8800000, 360.000000 );
CreateATM( -2512.100000, 2340.74000, 4.5799990, 180.000000 );
CreateATM( -2525.250000, -624.97000, 132.41000, 360.000000 );
// Las Venturas
CreateATM( 2544.055175, 2242.881835, 10.471873, 180.000000 );
CreateATM( 2110.729736, 2061.529052, 10.500308, 180.000000 );
CreateATM( 2233.845703, 957.4488520, 10.470303, 90.0000000 );
CreateATM( 2413.644287, 1114.202758, 10.452508, -90.000000 );
CreateATM( 1900.780151, 1102.897583, 10.459669, 180.000000 );
CreateATM( 2349.165283, 1543.896972, 10.469670, 180.000000 );
CreateATM( 2845.597412, 1286.504272, 11.030617, 0.00000000 );
CreateATM( 1879.681396, 722.8941040, 10.440302, 180.000000 );
CreateATM( 997.7407220, 2086.763427, 10.459657, -90.000000 );
CreateATM( 1480.238769, 2206.801025, 10.663430, -90.000000 );
CreateATM( 1677.719604, 2756.413330, 10.459667, -90.000000 );
CreateATM( -16.0785670, 1221.418579, 19.012741, -90.000000 );
CreateATM( -792.090637, 2744.119140, 45.490905, 180.000000 );
CreateATM( -1505.61242, 2622.352050, 55.470737, -90.000000 );
CreateATM( -1952.57629, 2388.553466, 49.139991, 20.0000000 );
CreateATM( -856.524902, 1528.208496, 22.238605, -90.000000 );
// Los Santos
CreateATM( 2234.733398, 51.345561000, 26.134365, 0.000000, 0.0 );
CreateATM( 1381.069213, 259.56204200, 19.156929, 157.0000, 0.0 );
CreateATM( 255.4551690, -197.5846250, 1.2381240, -90.0000, 0.0 );
CreateATM( 661.3598020, -555.1714470, 15.965932, -90.0000, 0.0 );
CreateATM( -2177.50292, -2435.006591, 30.214990, 52.00000, 0.0 );
CreateATM( 1367.251464, -1284.611938, 13.156874, -90.6000, 0.0 );
CreateATM( 1928.592651, -1771.088012, 13.172806, 90.00000, 0.0 );
CreateATM( 2323.767333, -1644.993896, 14.442724, 0.000000, 0.0 );
CreateATM( 2043.748779, -1416.704711, 16.810766, -90.0000, 0.0 );
CreateATM( 2387.751464, -1981.961669, 13.156866, -180.000, 0.0 );
CreateATM( 1494.450195, -1768.979492, 18.365745, -90.0000, 0.0 );
CreateATM( 1051.627075, -1026.406616, 31.661567, 0.000000, 0.0 );
CreateATM( 816.8725580, -1356.521240, 13.156099, -180.000, 0.0 );
CreateATM( 1808.732177, -1567.267822, 13.063967, 37.00000, 0.0 );
CreateATM( 2412.541259, -1492.666992, 23.628126, -180.000, 0.0 );
CreateATM( 2431.131347, -1219.477539, 25.022165, 0.000000, 0.0 );
// Casinos
CreateATM( 1985.135253, 1003.277404, 994.097290, 0.000 ); // 4 Drags
CreateATM( 1986.635253, 1032.391113, 994.097290, 180.0 ); // 4 Drags
CreateATM( 2230.132324, 1647.986816, 1007.97900, -90.0 ); // Caligs
CreateATM( 2241.676269, 1649.486816, 1007.97900, 90.00 ); // Caligs
return 1;
}
hook OnServerUpdate( )
{
foreach ( new i : atms ) if ( g_atmData[ i ] [ E_DISABLED ] && g_iTime > g_atmData[ i ] [ E_TIMESTAMP ] ) {
UpdateDynamic3DTextLabelText( g_atmData[ i ] [ E_LABEL ], COLOR_GOLD, "[ATM]\n"COL_GREY"100%" );
DestroyDynamicPickup( g_atmData[ i ] [ E_PICKUP ] ), g_atmData[ i ] [ E_PICKUP ] = -1;
g_atmData[ i ] [ E_LOOT ] = 0, g_atmData[ i ] [ E_DISABLED ] = false, g_atmData[ i ] [ E_HEALTH ] = 100.0;
Streamer_SetIntData( STREAMER_TYPE_OBJECT, g_atmData[ i ] [ E_OBJECT ], E_STREAMER_MODEL_ID, 19324 );
}
return 1;
}
hook OnPlayerShootDynObject( playerid, weaponid, objectid, Float: x, Float: y, Float: z )
{
new
Float: X, Float: Y, Float: Z, Float: rZ,
modelid = Streamer_GetIntData( STREAMER_TYPE_OBJECT, objectid, E_STREAMER_MODEL_ID )
;
if ( modelid == 19324 )
{
if ( GetPlayerClass( playerid ) == CLASS_POLICE )
return 1; // Prevent police from damaging atms
new Float: Damage = GetWeaponDamageFromDistance( weaponid, GetPlayerDistanceFromPoint( playerid, x, y, z ) );
new player_world = GetPlayerVirtualWorld( playerid );
foreach ( new i : atms ) {
if ( g_atmData[ i ] [ E_WORLD ] != -1 && g_atmData[ i ] [ E_WORLD ] != player_world ) continue;
if ( g_atmData[ i ] [ E_OBJECT ] == objectid && !g_atmData[ i ] [ E_DISABLED ] )
{
if ( GetDynamicObjectPos( objectid, X, Y, Z ) && IsPointToPoint( 1.0, X + x, Y + y, Z + z, X, Y, Z ) ) {
new
Float: atmDamage = floatdiv( Damage, 4 );
if ( ( g_atmData[ i ] [ E_HEALTH ] -= atmDamage ) > 0.0 ) {
format( szNormalString, 24, "[ATM]\n"COL_GREY"%0.0f%%", g_atmData[ i ] [ E_HEALTH ] );
UpdateDynamic3DTextLabelText( g_atmData[ i ] [ E_LABEL ], COLOR_GOLD, szNormalString );
} else {
UpdateDynamic3DTextLabelText( g_atmData[ i ] [ E_LABEL ], COLOR_GOLD, "[ATM]\n"COL_RED"Disabled" );
Streamer_SetIntData( STREAMER_TYPE_OBJECT, g_atmData[ i ] [ E_OBJECT ], E_STREAMER_MODEL_ID, 2943 );
g_atmData[ i ] [ E_TIMESTAMP ] = g_iTime + 240;
g_atmData[ i ] [ E_DISABLED ] = true;
if ( random( 101 ) <= 20 ) {
new
szLocation[ MAX_ZONE_NAME ];
GetPlayerPos ( playerid, X, Y, Z );
GetZoneFromCoordinates ( szLocation, X, Y, Z );
CreateCrimeReport( playerid );
SendClientMessageToCops( -1, ""COL_BLUE"[ROBBERY]"COL_WHITE" %s has failed robbing an ATM near %s, suspect is armed and dangerous.", ReturnPlayerName( playerid ), szLocation );
SendServerMessage( playerid, "There seems to be no money in the ATM that you have breached." );
} else {
GetDynamicObjectRot( objectid, rZ, rZ, rZ );
g_atmData[ i ] [ E_PICKUP ] = CreateDynamicPickup( 1550, 1, X + 1.0 * -floatsin( -rZ, degrees ), Y + 1.0 * -floatcos( -rZ, degrees ), Z + 0.33, .worldid = g_atmData[ i ] [ E_WORLD ] );
g_atmData[ i ] [ E_LOOT ] = RandomEx( 320, 750 );
if ( IsPlayerConnected( playerid ) && p_MoneyBag{ playerid } == true ) {
new extra_loot = floatround( float( g_atmData[ i ] [ E_LOOT ] ) * ROBBERY_MONEYCASE_BONUS );
g_atmData[ i ] [ E_LOOT ] = extra_loot;
}
SendServerMessage( playerid, "You've breached an ATM! Rob the money that has been dispensed for quick pocket change!" );
}
}
break;
}
}
}
}
return 1;
}
hook OnPlayerEnterDynamicCP( playerid, checkpointid )
{
if ( ! IsPlayerInAnyVehicle( playerid ) )
{
foreach ( new i : atms ) if ( checkpointid == g_atmData[ i ] [ E_CHECKPOINT ] ) {
if ( g_atmData[ i ] [ E_DISABLED ] ) {
return SendError( playerid, "This ATM has recently been robbed and cannot be accessed for now." );
} else {
return ShowPlayerBankMenuDialog( playerid );
}
}
}
return 1;
}
hook OnPlayerPickUpDynPickup( playerid, pickupid )
{
static
Float: X, Float: Y, Float: Z;
// Money bag from atms
if ( GetPlayerClass( playerid ) != CLASS_POLICE )
{
foreach ( new i : atms ) if ( g_atmData[ i ] [ E_DISABLED ] )
{
if ( g_atmData[ i ] [ E_PICKUP ] == pickupid && pickupid != -1 )
{
new
szCity[ MAX_ZONE_NAME ], szLocation[ MAX_ZONE_NAME ], iLoot = g_atmData[ i ] [ E_LOOT ];
SplitPlayerCashForGang( playerid, iLoot );
ach_HandlePlayerRobbery( playerid );
DestroyDynamicPickup( g_atmData[ i ] [ E_PICKUP ] );
g_atmData[ i ] [ E_PICKUP ] = -1;
g_atmData[ i ] [ E_LOOT ] = 0;
GivePlayerWantedLevel( playerid, 4 );
GivePlayerScore( playerid, 1 );
GivePlayerExperience( playerid, E_ROBBERY, 0.67 );
GetPlayerPos ( playerid, X, Y, Z );
Get2DCity ( szCity, X, Y, Z );
GetZoneFromCoordinates ( szLocation, X, Y, Z );
SendClientMessageToCops( -1, ""COL_BLUE"[ROBBERY]"COL_WHITE" %s(%d) has robbed "COL_GOLD"%s"COL_WHITE" from an ATM near %s in %s!", ReturnPlayerName( playerid ), playerid, cash_format( iLoot ), szLocation, szCity );
return SendServerMessage( playerid, "You have successfully taken "COL_GOLD"%s"COL_WHITE" dispensed from the ATM.", cash_format( iLoot ) );
}
}
}
return 1;
}
/* ** Functions ** */
stock CreateATM( Float: X, Float: Y, Float: Z, Float: rX, Float: offset = 180.0, world = -1 )
{
new ID = Iter_Free( atms );
if ( ID != ITER_NONE )
{
rX = rX - offset;
new
Float: nX = X + 1.0 * -floatsin( -rX, degrees ),
Float: nY = Y + 1.0 * -floatcos( -rX, degrees )
;
Iter_Add( atms, ID );
g_atmData[ ID ] [ E_HEALTH ] = 100.0;
g_atmData[ ID ] [ E_CHECKPOINT ] = CreateDynamicCP( nX, nY, Z, 1.0, .worldid = world );
g_atmData[ ID ] [ E_OBJECT ] = CreateDynamicObject( 19324, X, Y, Z, 0.0, 0.0, rX, .priority = 2, .worldid = world );
g_atmData[ ID ] [ E_LABEL ] = CreateDynamic3DTextLabel( "[ATM]\n"COL_GREY"100%", COLOR_GOLD, nX, nY, Z, 20.0, .worldid = world );
g_atmData[ ID ] [ E_WORLD ] = world;
}
return ID;
}
stock GetClosestATM( playerid ){
new closest = -1, Float: closestDist = 8000.00, Float: distance, Float: pX, Float: pY, Float: pZ, Float: oX, Float: oY, Float: oZ;
for(new i = 0; i < MAX_ATMS; i++){
GetATMPos( i, oX, oY, oZ );
GetPlayerPos( playerid, pX, pY, pZ );
distance = floatsqroot( ( (pX - oX) * (pX - oX) ) + ( (pY - oY) * (pY - oY) + ( (pZ - oZ) * (pZ - oZ) ) ) );
if( closestDist > distance ){
closestDist = distance;
closest = i;
}
}
return closest;
}
stock GetATMPos( atmID, &Float: X, &Float: Y, &Float: Z ) {
return GetDynamicObjectPos( g_atmData[ atmID ] [ E_OBJECT ], X, Y, Z );
}