add /moneybags ... player can create >25k announced money bags around the map. passive players cannot see pickups ... only their own money drops

This commit is contained in:
Lorenc Pekaj 2018-10-15 16:15:18 +11:00
parent 08474974bf
commit c5a62d5eaa

View File

@ -57,8 +57,6 @@ hook OnPlayerDeath( playerid, killerid, reason )
if ( IsPlayerConnected( killerid ) && ! IsPlayerNPC( killerid ) ) if ( IsPlayerConnected( killerid ) && ! IsPlayerNPC( killerid ) )
{ {
for ( new slotid = 0; slotid < 13; slotid++ ) for ( new slotid = 0; slotid < 13; slotid++ )
{ {
new new
@ -110,7 +108,7 @@ hook OnPlayerDeath( playerid, killerid, reason )
// reduce player money // reduce player money
GivePlayerCash( playerid, -player_money ); GivePlayerCash( playerid, -player_money );
CreateWeaponPickup( WEAPON_MONEY, player_money, 0, X + fRandomEx( 0.5, 3.0 ), Y + fRandomEx( 0.5, 3.0 ), Z, expire_time ); CreateWeaponPickup( WEAPON_MONEY, player_money, 0, X + fRandomEx( 0.5, 3.0 ), Y + fRandomEx( 0.5, 3.0 ), Z, expire_time, .include_player = playerid );
} }
return 1; return 1;
} }
@ -172,8 +170,22 @@ hook OnPlayerPickUpDynPickup( playerid, pickupid )
dropped_money = g_weaponDropData[ dropid ] [ E_AMMO ]; dropped_money = g_weaponDropData[ dropid ] [ E_AMMO ];
GivePlayerCash( playerid, dropped_money ); GivePlayerCash( playerid, dropped_money );
if ( ! g_weaponDropData[ dropid ] [ E_EXPIRE_TIMESTAMP ] && dropped_money )
{
new
szLocation[ MAX_ZONE_NAME ], szCity[ MAX_ZONE_NAME ];
if ( GetPlayerLocation( playerid, szCity, szLocation ) ) {
SendClientMessageToAllFormatted( -1, ""COL_GREEN"[MONEY BAG]"COL_WHITE" %s(%d) has picked up a %s money bag near %s in %s!", ReturnPlayerName( playerid ), playerid, cash_format( dropped_money ), szLocation, szCity );
} else {
SendServerMessage( playerid, "You have found "COL_GOLD"%s"COL_WHITE" on the ground.", cash_format( dropped_money ) ); SendServerMessage( playerid, "You have found "COL_GOLD"%s"COL_WHITE" on the ground.", cash_format( dropped_money ) );
} }
} else {
SendServerMessage( playerid, "You have found "COL_GOLD"%s"COL_WHITE" on the ground.", cash_format( dropped_money ) );
}
}
else else
{ {
new new
@ -223,10 +235,10 @@ CMD:dropmoney( playerid, params[ ] )
money; money;
if ( sscanf( params, "d", money ) ) return SendUsage( playerid, "/dropmoney [AMOUNT]" ); if ( sscanf( params, "d", money ) ) return SendUsage( playerid, "/dropmoney [AMOUNT]" );
else if ( money < 10000 ) return SendError( playerid, "The minimum amount you can drop is $10,000." ); else if ( money < 25000 ) return SendError( playerid, "The minimum amount you can drop is $25,000." );
else if ( money > GetPlayerCash( playerid ) ) return SendError( playerid, "You do not have this much money on you." ); else if ( money > GetPlayerCash( playerid ) ) return SendError( playerid, "You do not have this much money on you." );
else if ( GetPlayerVIPLevel( playerid ) < VIP_REGULAR ) return SendError( playerid, "You need to be V.I.P to use this, to become one visit "COL_GREY"donate.sfcnr.com" ); else if ( GetPlayerVIPLevel( playerid ) < VIP_REGULAR ) return SendError( playerid, "You need to be V.I.P to use this, to become one visit "COL_GREY"donate.sfcnr.com" );
else if ( GetPVarInt( playerid, "dropmoney_cooldown" ) > GetServerTime( ) ) return SendError( playerid, "You must wait %d seconds before using this command again.", GetPVarInt( playerid, "dropmoney_cooldown" ) - GetServerTime( ) ); else if ( p_PlayerPickupDelay[ playerid ] > GetServerTime( ) ) return SendError( playerid, "You must wait %d seconds before using this command again.", p_PlayerPickupDelay[ playerid ] - GetServerTime( ) );
else else
{ {
new new
@ -234,19 +246,56 @@ CMD:dropmoney( playerid, params[ ] )
GetPlayerPos( playerid, X, Y, Z ); GetPlayerPos( playerid, X, Y, Z );
if ( CreateWeaponPickup( WEAPON_MONEY, money, 0, X, Y, Z, GetServerTime( ) + 300 ) != ITER_NONE ) { if ( CreateWeaponPickup( WEAPON_MONEY, money, 0, X, Y, Z, 0, .nonpassive_only = false ) != ITER_NONE )
p_PlayerPickupDelay[ playerid ] = GetServerTime( ) + 4; {
SendServerMessage( playerid, "You have dropped a %s money bag. It will expire in five minutes.", cash_format( money ) ); new
szLocation[ MAX_ZONE_NAME ], szCity[ MAX_ZONE_NAME ];
if ( ! GetPlayerLocation( playerid, szCity, szLocation ) )
return SendError( playerid, "You cannot place a money bag in this location." );
SendClientMessageToAllFormatted( -1, ""COL_GREEN"[MONEY BAG]"COL_WHITE" %s(%d) has dropped a %s money bag near %s in %s!", ReturnPlayerName( playerid ), playerid, cash_format( money ), szLocation, szCity );
p_PlayerPickupDelay[ playerid ] = GetServerTime( ) + 5;
GivePlayerCash( playerid, -money ); GivePlayerCash( playerid, -money );
Streamer_Update( playerid ); Streamer_Update( playerid );
SetPVarInt( playerid, "dropmoney_cooldown", GetServerTime( ) + 10 ); }
} else { else
{
SendError( playerid, "Failed to create a money bag. Try again in a little bit." ); SendError( playerid, "Failed to create a money bag. Try again in a little bit." );
} }
} }
return 1; return 1;
} }
CMD:moneybags( playerid, params[ ] )
{
new Float: X, Float: Y, Float: Z;
new szLocation[ MAX_ZONE_NAME ], szCity[ MAX_ZONE_NAME ];
new bool: has_results = false;
szLargeString = ""COL_WHITE"Amount\t"COL_WHITE"Location\n";
foreach ( new dropid : weapondrop ) if ( g_weaponDropData[ dropid ] [ E_WEAPON_ID ] == WEAPON_MONEY ) {
Streamer_GetFloatData( STREAMER_TYPE_PICKUP, g_weaponDropData[ dropid ] [ E_PICKUP ], E_STREAMER_X, X );
Streamer_GetFloatData( STREAMER_TYPE_PICKUP, g_weaponDropData[ dropid ] [ E_PICKUP ], E_STREAMER_Y, Y );
Streamer_GetFloatData( STREAMER_TYPE_PICKUP, g_weaponDropData[ dropid ] [ E_PICKUP ], E_STREAMER_Z, Z );
Get2DCity( szCity, X, Y, Z );
GetZoneFromCoordinates( szLocation, X, Y, Z );
format( szLargeString, sizeof( szLargeString ), "%s"COL_GOLD"%s\t%s, %s\n", szLargeString, cash_format( g_weaponDropData[ dropid ] [ E_AMMO ] ), szLocation, szCity );
has_results = true;
}
if ( has_results ) {
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST_HEADERS, "Money Bag Locations", szLargeString, "Close", "" ), 1;
} else {
return SendError( playerid, "There are no more money bags to show." );
}
}
CMD:disposeweapon( playerid, params[ ] ) return cmd_dropweapon( playerid, params ); CMD:disposeweapon( playerid, params[ ] ) return cmd_dropweapon( playerid, params );
CMD:dw( playerid, params[ ] ) return cmd_dropweapon( playerid, params ); CMD:dw( playerid, params[ ] ) return cmd_dropweapon( playerid, params );
CMD:dropweapon( playerid, params[ ] ) { CMD:dropweapon( playerid, params[ ] ) {
@ -277,7 +326,7 @@ CMD:dropweapon( playerid, params[ ] ) {
new new
Float: X, Float: Y, Float: Z; Float: X, Float: Y, Float: Z;
if ( GetPlayerPos( playerid, X, Y, Z ) && CreateWeaponPickup( iWeapon, iAmmo, iSlot, X + fRandomEx( 0.5, 3.0 ), Y + fRandomEx( 0.5, 3.0 ), Z, GetServerTime( ) + 120 ) != ITER_NONE ) { if ( GetPlayerPos( playerid, X, Y, Z ) && CreateWeaponPickup( iWeapon, iAmmo, iSlot, X + fRandomEx( 0.5, 3.0 ), Y + fRandomEx( 0.5, 3.0 ), Z, GetServerTime( ) + 120, .nonpassive_only = false ) != ITER_NONE ) {
p_PlayerPickupDelay[ playerid ] = GetServerTime( ) + 3; p_PlayerPickupDelay[ playerid ] = GetServerTime( ) + 3;
} }
} }
@ -297,7 +346,7 @@ CMD:dropweapon( playerid, params[ ] ) {
} }
/* ** Functions ** */ /* ** Functions ** */
stock CreateWeaponPickup( weaponid, ammo, slotid, Float: X, Float: Y, Float: Z, expire_time ) { stock CreateWeaponPickup( weaponid, ammo, slotid, Float: X, Float: Y, Float: Z, expire_time, bool: nonpassive_only = true, include_player = -1 ) {
new handle = Iter_Free( weapondrop ); new handle = Iter_Free( weapondrop );
@ -319,11 +368,27 @@ stock CreateWeaponPickup( weaponid, ammo, slotid, Float: X, Float: Y, Float: Z,
default: modelid = GetWeaponModel( weaponid ); default: modelid = GetWeaponModel( weaponid );
} }
g_weaponDropData[ handle ] [ E_PICKUP ] = CreateDynamicPickup( modelid, 1, X, Y, Z );
g_weaponDropData[ handle ] [ E_EXPIRE_TIMESTAMP ] = expire_time; g_weaponDropData[ handle ] [ E_EXPIRE_TIMESTAMP ] = expire_time;
g_weaponDropData[ handle ] [ E_WEAPON_ID ] = weaponid; g_weaponDropData[ handle ] [ E_WEAPON_ID ] = weaponid;
g_weaponDropData[ handle ] [ E_AMMO ] = ammo; g_weaponDropData[ handle ] [ E_AMMO ] = ammo;
g_weaponDropData[ handle ] [ E_SLOT_ID ] = slotid; g_weaponDropData[ handle ] [ E_SLOT_ID ] = slotid;
// create pickup, but for specific group
g_weaponDropData[ handle ] [ E_PICKUP ] = CreateDynamicPickup( modelid, 1, X, Y, Z, .playerid = 0 );
// reset players in map icon/cp
Streamer_RemoveArrayData( STREAMER_TYPE_PICKUP, g_weaponDropData[ handle ] [ E_PICKUP ], E_STREAMER_PLAYER_ID, 0 );
// stream to non-passive players
foreach ( new i : Player )
{
if ( include_player != i && nonpassive_only && IsPlayerPassive( i ) )
continue;
Streamer_AppendArrayData( STREAMER_TYPE_PICKUP, g_weaponDropData[ handle ] [ E_PICKUP ], E_STREAMER_PLAYER_ID, i );
}
// add to iterator
Iter_Add( weapondrop, handle ); Iter_Add( weapondrop, handle );
} }
else else