sfcnr/gamemodes/irresistible/cnr/features/roadblocks.pwn

211 lines
6.6 KiB
Plaintext
Raw Permalink Normal View History

2018-10-10 03:35:08 +00:00
/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc
* Module: cnr\features\roadblocks.pwn
* Purpose: roadblocks system for police
2018-10-10 03:35:08 +00:00
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#define MAX_ROADBLOCKS ( 32 )
/* ** Variables ** */
enum E_ROADBLOCK_DATA
{
E_OBJECT_ID, Text3D: E_LABEL, E_CREATOR,
Float: E_X, Float: E_Y, Float: E_Z
};
enum E_ROADBLOCK_OBJ_DATA
{
E_NAME[ 17 ], E_MODEL, Float: E_OFFSET
};
static stock
g_roadblockData [ MAX_ROADBLOCKS ] [ E_ROADBLOCK_DATA ],
Iterator: roadblocks < MAX_ROADBLOCKS >,
g_roadblockObjectData [ ] [ E_ROADBLOCK_OBJ_DATA ] =
{
{ "Small Roadblock", 1459, 0.2 },
{ "Medium Roadblock", 978, 0.5 },
{ "Big Roadblock", 981, 0.2 },
{ "Detour Sign", 1425, 0.6 },
{ "Will Be Sign", 3265, 0.9 },
{ "Line Closed Sign", 3091, 0.5 }
}
;
/* ** Hooks ** */
hook OnPlayerDisconnect( playerid, reason )
{
ClearPlayerRoadblocks( playerid, .distance_check = false );
return 1;
}
#if defined AC_INCLUDED
hook OnPlayerDeathEx( playerid, killerid, reason, Float: damage, bodypart )
#else
hook OnPlayerDeath( playerid, killerid, reason )
#endif
{
ClearPlayerRoadblocks( playerid, .distance_check = false );
return 1;
}
hook OnPlayerUpdateEx( playerid )
{
if ( IsPlayerSpawned( playerid ) && GetPlayerClass( playerid ) == CLASS_POLICE ) {
ClearPlayerRoadblocks( playerid );
}
return 1;
}
/* ** Commands ** */
CMD:drball( playerid, params[ ] )
{
if ( ! p_inFBI{ playerid } && ! p_AdminLevel[ playerid ] )
return SendError( playerid, "You are not in the FBI." );
new
removed = 0;
foreach ( new handle : roadblocks )
{
if ( ! p_AdminLevel[ playerid ] && g_roadblockData[ handle ] [ E_CREATOR ] != playerid )
continue;
new
cur = handle;
destroyRoadBlockStrip( handle, .remove_iter = false );
Iter_SafeRemove( roadblocks, cur, handle );
removed ++;
}
if ( removed ) {
return SendServerMessage( playerid, "You have removed all your roadblocks." );
} else {
return SendError( playerid, "There are no roadblocks to remove by you." );
}
}
CMD:drb( playerid, params[ ] )
{
new
rbID
;
if ( !p_inFBI{ playerid } ) return SendError( playerid, "You are not in the FBI." );
else if ( GetPlayerScore( playerid ) < 250 ) return SendError( playerid, "You need at least 250 score to use this feature." );
else if ( sscanf( params, "d", rbID ) ) return SendUsage( playerid, "/drb [ROADBLOCK_ID]" );
else if ( rbID < 0 || rbID > MAX_ROADBLOCKS ) return SendError( playerid, "Invalid road block ID." );
else if ( Iter_Contains( roadblocks, rbID ) ) return SendError( playerid, "Invalid road block ID." );
else if ( g_roadblockData[ rbID ] [ E_CREATOR ] != playerid ) return SendError( playerid, "You have not created this spike strip." );
else
{
destroyRoadBlockStrip( rbID, .remove_iter = true );
SendServerMessage( playerid, "You have succesfully destroyed a road block." );
}
return 1;
}
CMD:crb( playerid, params[ ] )
{
new
iRoadBlock;
if ( GetPlayerInterior( playerid ) != 0 || GetPlayerVirtualWorld( playerid ) != 0 ) return SendError( playerid, "You cannot use this command inside buildings." );
else if ( IsPlayerKidnapped( playerid ) ) return SendError( playerid, "You are kidnapped, you cannot do this." );
else if ( IsPlayerTied( playerid ) ) return SendError( playerid, "You are tied, you cannot do this." );
else if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "You are jailed, you cannot do this." );
else if ( !p_inFBI{ playerid } ) return SendError( playerid, "You are not in the FBI." );
else if ( IsPlayerInAnyVehicle( playerid ) ) return SendError( playerid, "You cannot use this command while in a vehicle." );
else if ( IsPlayerInWater( playerid ) ) return SendError( playerid, "You cannot use this command since you're in water." );
else if ( isnull( params ) ) return SendUsage( playerid, "/crb [SMALL/MEDIUM/BIG/CONE/DETOUR/WILL BE SIGN/LINE CLOSED]" );
else
{
for( iRoadBlock = 0; iRoadBlock < sizeof( g_roadblockObjectData ); iRoadBlock++ )
if ( strfind( g_roadblockObjectData[ iRoadBlock ] [ E_NAME ], params, true ) != -1 )
break;
if ( iRoadBlock >= sizeof( g_roadblockObjectData ) )
return SendError( playerid, "You have typed in an invalid roadblock." );
new
iTmp = createRoadBlockStrip( playerid, iRoadBlock );
if ( iTmp != -1 )
SendServerMessage( playerid, "You have succesfully placed a "COL_GREY"%s"COL_WHITE".", g_roadblockObjectData[ iRoadBlock ] [ E_NAME ] );
else
SendError( playerid, "Failed to place a road block due to a unexpected error." );
}
return 1;
}
/* ** Functions ** */
stock destroyRoadBlockStrip( rbid, bool: remove_iter = false )
{
if ( ! Iter_Contains( roadblocks, rbid ) )
return 0;
DestroyDynamicObject( g_roadblockData[ rbid ] [ E_OBJECT_ID ] );
DestroyDynamic3DTextLabel( g_roadblockData[ rbid ] [ E_LABEL ] );
g_roadblockData[ rbid ] [ E_LABEL ] = Text3D: INVALID_3DTEXT_ID;
g_roadblockData[ rbid ] [ E_OBJECT_ID ] = INVALID_OBJECT_ID;
if ( remove_iter ) Iter_Remove( roadblocks, rbid );
return 1;
}
stock createRoadBlockStrip( playerid, type )
{
new
ID = Iter_Free( roadblocks ),
Float: X, Float: Y, Float: Z, Float: Degree
;
if ( ID != ITER_NONE )
{
GetXYInFrontOfPlayer( playerid, X, Y, Z, 2.0 );
GetPlayerFacingAngle( playerid, Degree );
g_roadblockData[ ID ] [ E_CREATOR ] = playerid;
g_roadblockData[ ID ] [ E_X ] = X;
g_roadblockData[ ID ] [ E_Y ] = Y;
g_roadblockData[ ID ] [ E_Z ] = Z;
DestroyDynamicObject( g_roadblockData[ ID ] [ E_OBJECT_ID ] );
DestroyDynamic3DTextLabel( g_roadblockData[ ID ] [ E_LABEL ] );
g_roadblockData[ ID ] [ E_OBJECT_ID ] = CreateDynamicObject( g_roadblockObjectData[ type ] [ E_MODEL ], X, Y, Z - g_roadblockObjectData[ type ] [ E_OFFSET ], 0, 0, Degree + 180.0 );
g_roadblockData[ ID ] [ E_LABEL ] = CreateDynamic3DTextLabel( sprintf( "%s(%d)\n"COL_GREY"Placed by %s!", g_roadblockObjectData[ type ] [ E_NAME ], ID, ReturnPlayerName( playerid ) ), COLOR_GOLD, X, Y, Z, 20.0 );
Streamer_Update( playerid );
Iter_Add( roadblocks, ID );
}
return ID;
}
stock ClearPlayerRoadblocks( playerid, bool: distance_check = true )
{
// remove roadblocks
foreach ( new handle : roadblocks ) if ( g_roadblockData[ handle ] [ E_CREATOR ] == playerid )
{
if ( distance_check && GetPlayerDistanceFromPoint( playerid, g_roadblockData[ handle ] [ E_X ], g_roadblockData[ handle ] [ E_Y ], g_roadblockData[ handle ] [ E_Z ] ) < 100.0 ) {
continue;
}
new
cur = handle;
destroyRoadBlockStrip( handle, .remove_iter = false );
Iter_SafeRemove( roadblocks, cur, handle );
}
return 1;
}