2009-04-09 18:30:14 +02:00
/**
* ====================
* Zombie : Reloaded
* File : restriction . inc
* Author : Greyscale
* ====================
*/
/**
2009-04-10 01:08:51 +02:00
* Array to store restricted weapon names .
2009-04-12 08:04:00 +02:00
*/
2009-04-09 18:30:14 +02:00
new Handle : gRestrictedWeapons = INVALID_HANDLE ;
/**
2009-04-10 01:08:51 +02:00
* Array to store keyvalue data .
2009-04-12 08:04:00 +02:00
*/
2009-04-09 18:30:14 +02:00
new Handle : kvWeaponGroups = INVALID_HANDLE ;
/**
* Array that stores the " HookID " to be later unhooked on player disconnect .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 06:00:58 +02:00
new gCanUseHookID [ MAXPLAYERS + 1 ];
2009-04-09 18:30:14 +02:00
/**
2009-04-10 01:08:51 +02:00
* Query results returned when ( un ) restricting a weapon .
2009-04-12 08:04:00 +02:00
*/
2009-04-09 18:30:14 +02:00
enum WpnRestrictQuery
{
2009-04-10 01:08:51 +02:00
Successful_Weapon , /** Weapon (un)restrict query was successful. */
Successful_Group , /** Group (un)restrict query was successful. */
2009-04-12 08:04:00 +02:00
Failed_Weapon , /** Weapon (un)restrict was unsuccessful */
Failed_Group , /** Group (un)restrict was unsuccessful */
2009-04-09 18:30:14 +02:00
Invalid , /** Weapon/Group invalid */
}
/**
2009-04-10 01:08:51 +02:00
* Initialize data and hook commands .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
RestrictInit ()
2009-04-09 18:30:14 +02:00
{
// Initialize weapon restrict array
gRestrictedWeapons = CreateArray ( 32 , 0 );
// Hook buy command
2009-04-13 20:33:13 +02:00
RegConsoleCmd ( " buy " , RestrictBuyHook );
2009-04-09 18:30:14 +02:00
}
/**
2009-04-14 04:58:05 +02:00
* Clears weapon restrict data
*/
RestrictClearData ()
2009-04-09 18:30:14 +02:00
{
// Clear restricted weapons
RestrictWeaponUnrestrictAll ();
// Load weapon group data
if ( kvWeaponGroups != INVALID_HANDLE )
{
CloseHandle ( kvWeaponGroups );
}
kvWeaponGroups = CreateKeyValues ( " weapongroups " );
2009-04-14 04:58:05 +02:00
}
/**
* Loads weapon data from file .
*/
RestrictOnMapStart ()
{
// Restrict default restrictions (set in weapons.txt)
RestrictDefaultRestrictions ();
2009-04-09 18:30:14 +02:00
decl String : path [ PLATFORM_MAX_PATH ];
2009-04-12 08:04:00 +02:00
BuildPath ( Path_SM , path , sizeof ( path ), " configs/zr/weapons/weapongroups.txt " );
2009-04-09 18:30:14 +02:00
2009-04-12 08:04:00 +02:00
// If file isn't found, stop plugin
2009-04-09 18:30:14 +02:00
if ( ! FileToKeyValues ( kvWeaponGroups , path ))
{
2009-04-14 04:58:05 +02:00
if ( LogFlagCheck ( LOG_CORE_EVENTS , LOG_MODULE_WEAPONS ))
{
ZR_LogMessageFormatted ( - 1 , " Weapons " , " Config Validation " , " Missing file weapongroups.txt. " , LOG_FORMAT_TYPE_FULL );
}
return ;
2009-04-09 18:30:14 +02:00
}
2009-04-12 08:04:00 +02:00
2009-04-13 20:33:13 +02:00
RestrictValidateWeaponGroups ();
}
2009-04-14 01:29:24 +02:00
/**
* Restrict default restrictions ( set in weapons . txt )
*/
RestrictDefaultRestrictions ()
{
KvRewind ( kvWeapons );
if ( KvGotoFirstSubKey ( kvWeapons ))
{
decl String : weapon [ WEAPONS_MAX_LENGTH ];
2009-04-14 04:58:05 +02:00
decl String : display [ WEAPONS_MAX_LENGTH ];
2009-04-14 01:29:24 +02:00
do
{
KvGetSectionName ( kvWeapons , weapon , sizeof ( weapon ));
// If weapon is defaulted to restricted, then restrict weapon
2009-04-14 04:58:05 +02:00
decl String : restrict [ 8 ];
KvGetString ( kvWeapons , " restrict " , restrict , sizeof ( restrict ), " no " );
if ( ConfigSettingToBool ( restrict ))
2009-04-14 01:29:24 +02:00
{
new WpnRestrictQuery : output = RestrictRestrict ( weapon , display );
RestrictPrintRestrictOutput ( 0 , output , display , true );
2009-04-14 04:58:05 +02:00
// Function calls above screwed with the keyvalue stack, so we have to set it back
// to where it was before those calls
KvRewind ( kvWeapons );
KvJumpToKey ( kvWeapons , weapon );
2009-04-14 01:29:24 +02:00
}
} while ( KvGotoNextKey ( kvWeapons ));
}
}
/**
* Validate weapon group options
*/
2009-04-13 20:33:13 +02:00
RestrictValidateWeaponGroups ()
{
2009-04-14 04:58:05 +02:00
// If log flag check fails, don't log
if ( ! LogFlagCheck ( LOG_CORE_EVENTS , LOG_MODULE_WEAPONS ))
{
return ;
}
2009-04-12 08:04:00 +02:00
KvRewind ( kvWeaponGroups );
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
2009-04-14 04:58:05 +02:00
decl String : weapongroup [ WEAPONS_MAX_LENGTH ];
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-12 08:04:00 +02:00
do
{
2009-04-14 04:58:05 +02:00
KvGetSectionName ( kvWeaponGroups , weapongroup , sizeof ( weapongroup ));
2009-04-12 08:04:00 +02:00
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
do
{
KvGetSectionName ( kvWeaponGroups , groupweapon , sizeof ( groupweapon ));
if ( ! WeaponsIsValidWeapon ( groupweapon ))
{
2009-04-14 04:58:05 +02:00
ZR_LogMessageFormatted ( - 1 , " Weapon Restrict " , " Config Validation " , " Invalid weapon \" %s \" in group \" %s \" configured in weapongroups.txt. " , LOG_FORMAT_TYPE_ERROR , groupweapon , weapongroup );
2009-04-12 08:04:00 +02:00
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
KvGoBack ( kvWeaponGroups );
}
2009-04-14 04:58:05 +02:00
else
{
ZR_LogMessageFormatted ( - 1 , " Weapon Restrict " , " Config Validation " , " No weapons listed in weapon group \" %s \" in weapongroups.txt. " , LOG_FORMAT_TYPE_ERROR , weapongroup );
}
2009-04-12 08:04:00 +02:00
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
2009-04-09 18:30:14 +02:00
}
/**
2009-04-10 01:08:51 +02:00
* Clears restricted weapon array .
2009-04-12 08:04:00 +02:00
*/
2009-04-09 18:30:14 +02:00
RestrictWeaponUnrestrictAll ()
{
ClearArray ( gRestrictedWeapons );
}
/**
2009-04-10 01:08:51 +02:00
* Hook Weapon_CanUse function on a client .
2009-04-09 18:30:14 +02:00
*
2009-04-10 01:08:51 +02:00
* @ param client The client index .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
RestrictClientInit ( client )
2009-04-09 18:30:14 +02:00
{
2009-04-13 20:33:13 +02:00
gCanUseHookID [ client ] = Hacks_Hook ( client , HACKS_HTYPE_WEAPON_CANUSE , RestrictCanUse , false );
2009-04-09 18:30:14 +02:00
}
/**
2009-04-10 01:08:51 +02:00
* Unhook Weapon_CanUse function on a client .
2009-04-09 18:30:14 +02:00
*
2009-04-10 01:08:51 +02:00
* @ param client The client index .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
RestrictOnClientDisconnect ( client )
2009-04-09 18:30:14 +02:00
{
Hacks_Unhook ( gCanUseHookID [ client ]);
}
/**
* Command callback function for the " buy " command
2009-04-10 01:08:51 +02:00
* Used to block use of this command under certain conditions .
2009-04-09 18:30:14 +02:00
*
* @ param client The client index .
2009-04-10 01:08:51 +02:00
* @ param argc Argument count .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
public Action : RestrictBuyHook ( client , argc )
2009-04-09 18:30:14 +02:00
{
// If plugin is disabled then stop
new bool : enabled = GetConVarBool ( gCvars [ CVAR_ENABLE ]);
if ( ! enabled )
{
// Allow command
return Plugin_Continue ;
}
// If player is a zombie then block command
if ( IsPlayerZombie ( client ))
{
ZR_PrintToChat ( client , " Zombie cant use weapon " );
// Block command
return Plugin_Handled ;
}
decl String : weapon [ 64 ];
GetCmdArg ( 1 , weapon , sizeof ( weapon ));
ReplaceString ( weapon , sizeof ( weapon ), " weapon_ " , " " );
// Check if the weapon is restricted, if so then block command
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponRestricted ( weapon ))
2009-04-09 18:30:14 +02:00
{
ZR_PrintToChat ( client , " Weapon is restricted " , weapon );
// Block command
return Plugin_Handled ;
}
// Allow command
return Plugin_Continue ;
}
/**
2009-04-10 01:08:51 +02:00
* Restricts a weapon .
2009-04-09 18:30:14 +02:00
*
* @ param weapon The weapon / group name .
2009-04-14 04:58:05 +02:00
* @ param display String set to the name set in weapons . txt
* Set to the value of 'weapon' if invalid
2009-04-09 18:30:14 +02:00
* @ return Successful_Weapon : The call successfully restricted a weapon .
* Successful_Group : The call successfully restricted a weapon group .
2009-04-12 08:04:00 +02:00
* Failed_Weapon : The call failed to restrict a weapon .
* Failed_Group : The call failed to restrict a weapon group .
2009-04-10 01:08:51 +02:00
* Invalid : The call was unsuccessful due to invalid weapon .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 23:55:02 +02:00
WpnRestrictQuery : RestrictRestrict ( const String : weapon [], String : display [] = " " )
2009-04-09 18:30:14 +02:00
{
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponGroup ( weapon ))
2009-04-09 18:30:14 +02:00
{
2009-04-13 20:33:13 +02:00
if ( RestrictIsGroupRestricted ( weapon ))
{
return Failed_Group ;
}
2009-04-09 18:30:14 +02:00
KvRewind ( kvWeaponGroups );
KvJumpToKey ( kvWeaponGroups , weapon );
2009-04-13 20:33:13 +02:00
KvGetSectionName ( kvWeaponGroups , display , WEAPONS_MAX_LENGTH );
2009-04-09 18:30:14 +02:00
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
2009-04-13 20:33:13 +02:00
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
do
{
KvGetSectionName ( kvWeaponGroups , groupweapon , sizeof ( groupweapon ));
2009-04-12 08:04:00 +02:00
// If weapon is invalid, then skip
if ( ! WeaponsIsValidWeapon ( groupweapon ))
{
continue ;
}
2009-04-13 20:33:13 +02:00
if ( ! RestrictIsWeaponRestricted ( groupweapon ))
2009-04-09 18:30:14 +02:00
{
PushArrayString ( gRestrictedWeapons , groupweapon );
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
return Successful_Group ;
}
2009-04-12 08:04:00 +02:00
if ( ! WeaponsIsValidWeapon ( weapon ))
2009-04-09 18:30:14 +02:00
{
2009-04-14 04:58:05 +02:00
strcopy ( display , WEAPONS_MAX_LENGTH , weapon );
2009-04-12 08:04:00 +02:00
return Invalid ;
2009-04-09 18:30:14 +02:00
}
2009-04-14 04:58:05 +02:00
WeaponGetDisplayName ( weapon , display );
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponRestricted ( weapon ))
2009-04-12 08:04:00 +02:00
{
return Failed_Weapon ;
}
2009-04-13 20:33:13 +02:00
PushArrayString ( gRestrictedWeapons , display );
2009-04-12 08:04:00 +02:00
2009-04-09 18:30:14 +02:00
return Successful_Weapon ;
}
/**
2009-04-10 01:08:51 +02:00
* Unrestricts a weapon .
2009-04-09 18:30:14 +02:00
*
* @ param weapon The weapon / group name .
2009-04-14 04:58:05 +02:00
* @ param display String set to the name set in weapons . txt
* Set to the value of 'weapon' if invalid
2009-04-09 18:30:14 +02:00
* @ return Successful_Weapon : The call successfully restricted a weapon .
* Successful_Group : The call successfully restricted a weapon group .
2009-04-12 08:04:00 +02:00
* Failed_Weapon : The call failed to restrict a weapon .
* Failed_Group : The call failed to restrict a weapon group .
* Invalid : The call was unsuccessful due to invalid weapon .
*/
2009-04-13 23:55:02 +02:00
WpnRestrictQuery : RestrictUnrestrict ( const String : weapon [], String : display [] = " " )
2009-04-09 18:30:14 +02:00
{
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponGroup ( weapon ))
2009-04-09 18:30:14 +02:00
{
2009-04-13 23:55:02 +02:00
if ( RestrictIsGroupUnrestricted ( weapon ))
{
return Failed_Group ;
}
2009-04-09 18:30:14 +02:00
KvRewind ( kvWeaponGroups );
KvJumpToKey ( kvWeaponGroups , weapon );
2009-04-13 20:33:13 +02:00
KvGetSectionName ( kvWeaponGroups , display , WEAPONS_MAX_LENGTH );
2009-04-09 18:30:14 +02:00
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
2009-04-12 08:04:00 +02:00
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
do
{
KvGetSectionName ( kvWeaponGroups , groupweapon , sizeof ( groupweapon ));
2009-04-12 08:04:00 +02:00
// If weapon is invalid, then skip
if ( ! WeaponsIsValidWeapon ( groupweapon ))
{
continue ;
}
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponRestricted ( groupweapon ))
2009-04-09 18:30:14 +02:00
{
2009-04-13 20:33:13 +02:00
new weaponindex = RestrictGetIndex ( groupweapon );
2009-04-09 18:30:14 +02:00
if ( weaponindex > - 1 )
{
RemoveFromArray ( gRestrictedWeapons , weaponindex );
}
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
return Successful_Group ;
}
2009-04-12 08:04:00 +02:00
if ( ! WeaponsIsValidWeapon ( weapon ))
2009-04-09 18:30:14 +02:00
{
2009-04-14 04:58:05 +02:00
strcopy ( display , WEAPONS_MAX_LENGTH , weapon );
2009-04-12 08:04:00 +02:00
return Invalid ;
2009-04-09 18:30:14 +02:00
}
2009-04-14 04:58:05 +02:00
WeaponGetDisplayName ( weapon , display );
2009-04-13 20:33:13 +02:00
if ( ! RestrictIsWeaponRestricted ( weapon ))
2009-04-12 08:04:00 +02:00
{
return Failed_Weapon ;
}
2009-04-13 20:33:13 +02:00
new weaponindex = RestrictGetIndex ( display );
2009-04-12 08:04:00 +02:00
if ( weaponindex > - 1 )
{
RemoveFromArray ( gRestrictedWeapons , weaponindex );
}
return Successful_Weapon ;
2009-04-09 18:30:14 +02:00
}
2009-04-13 23:55:02 +02:00
/**
* Prints text to server or client based off the output it RestrictRestrict () .
* @ param client The client index .
* @ param output The output of RestrictRestrict () .
* @ param weapon The weapon client is trying to restrict .
* @ param cmd True if printing output in reply to a client command .
*/
2009-04-14 01:29:24 +02:00
RestrictPrintRestrictOutput ( client , WpnRestrictQuery : output , const String : weapon [], bool : reply )
2009-04-13 23:55:02 +02:00
{
switch ( output )
2009-04-14 04:58:05 +02:00
{
2009-04-13 23:55:02 +02:00
case Successful_Weapon :
{
ZR_PrintToChat ( 0 , " Restrict weapon " , weapon );
2009-04-14 04:58:05 +02:00
if ( LogFlagCheck ( LOG_GAME_EVENTS , LOG_MODULE_WEAPONS ))
{
ZR_LogMessageFormatted ( client , " Weapon Restrict " , " Restrict " , " \" %L \" restricted weapon: \" %s \" . " , LOG_FORMAT_TYPE_FULL , client , weapon );
}
2009-04-13 23:55:02 +02:00
}
case Successful_Group :
{
decl String : weaponlist [ 128 ];
RestrictGetGroupWeapons ( weapon , weaponlist , sizeof ( weaponlist ), " , " );
ZR_PrintToChat ( 0 , " Restrict custom weapon group " , weapon , weaponlist );
2009-04-14 04:58:05 +02:00
if ( LogFlagCheck ( LOG_GAME_EVENTS , LOG_MODULE_WEAPONS ))
{
ZR_LogMessageFormatted ( client , " Weapon Restrict " , " Restrict " , " \" %L \" restricted weapon group: \" %s \" . " , LOG_FORMAT_TYPE_FULL , client , weapon );
}
2009-04-13 23:55:02 +02:00
}
case Failed_Weapon :
{
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Restrict weapon failed " , weapon );
}
else
{
ZR_PrintToChat ( client , " Restrict weapon failed " , weapon );
}
}
case Failed_Group :
{
decl String : weaponlist [ 128 ];
RestrictGetGroupWeapons ( weapon , weaponlist , sizeof ( weaponlist ), " , " );
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Restrict custom weapon group failed " , weapon , weaponlist );
}
else
{
ZR_PrintToChat ( client , " Restrict custom weapon group failed " , weapon , weaponlist );
}
}
case Invalid :
{
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Weapon invalid " , weapon );
}
else
{
ZR_PrintToChat ( client , " Weapon invalid " , weapon );
}
}
}
}
/**
* Prints text to server or client based off the output it RestrictUnrestrict () .
* @ param client The client index .
* @ param output The output of RestrictUnrestrict () .
* @ param weapon The weapon client is trying to unrestrict .
* @ param cmd True if printing output in reply to a client command .
*/
2009-04-14 01:29:24 +02:00
RestrictPrintUnrestrictOutput ( client , WpnRestrictQuery : output , const String : weapon [], bool : reply )
2009-04-13 23:55:02 +02:00
{
switch ( output )
{
case Successful_Weapon :
{
ZR_PrintToChat ( 0 , " Unrestrict weapon " , weapon );
2009-04-14 04:58:05 +02:00
if ( LogFlagCheck ( LOG_GAME_EVENTS , LOG_MODULE_WEAPONS ))
{
ZR_LogMessageFormatted ( client , " Weapon Restrict " , " Unrestrict " , " \" %L \" unrestricted weapon: \" %s \" . " , LOG_FORMAT_TYPE_FULL , client , weapon );
}
2009-04-13 23:55:02 +02:00
}
case Successful_Group :
{
decl String : weaponlist [ 128 ];
RestrictGetGroupWeapons ( weapon , weaponlist , sizeof ( weaponlist ), " , " );
ZR_PrintToChat ( 0 , " Unrestrict custom weapon group " , weapon , weaponlist );
2009-04-14 04:58:05 +02:00
if ( LogFlagCheck ( LOG_GAME_EVENTS , LOG_MODULE_WEAPONS ))
{
ZR_LogMessageFormatted ( client , " Weapon Restrict " , " Unrestrict " , " \" %L \" unrestricted weapon group: \" %s \" . " , LOG_FORMAT_TYPE_FULL , client , weapon );
}
2009-04-13 23:55:02 +02:00
}
case Failed_Weapon :
{
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Unrestrict weapon failed " , weapon );
}
else
{
ZR_PrintToChat ( client , " Unrestrict weapon failed " , weapon );
}
}
case Failed_Group :
{
decl String : weaponlist [ 128 ];
RestrictGetGroupWeapons ( weapon , weaponlist , sizeof ( weaponlist ), " , " );
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Unrestrict custom weapon group failed " , weapon , weaponlist );
}
else
{
ZR_PrintToChat ( client , " Unrestrict custom weapon group failed " , weapon , weaponlist );
}
}
case Invalid :
{
2009-04-14 01:29:24 +02:00
if ( reply )
2009-04-13 23:55:02 +02:00
{
ZR_ReplyToCommand ( client , " Weapon invalid " , weapon );
}
else
{
ZR_PrintToChat ( client , " Weapon invalid " , weapon );
}
}
}
}
2009-04-09 18:30:14 +02:00
/**
* Checks if a weapon is restricted .
*
* @ param weapon The weapon name .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
bool : RestrictIsWeaponRestricted ( const String : weapon [])
2009-04-09 18:30:14 +02:00
{
2009-04-14 04:58:05 +02:00
decl String : restrictedweapon [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
new size = GetArraySize ( gRestrictedWeapons );
for ( new x = 0 ; x < size ; x ++ )
{
GetArrayString ( gRestrictedWeapons , x , restrictedweapon , sizeof ( restrictedweapon ));
if ( StrEqual ( weapon , restrictedweapon , false ))
{
return true ;
}
}
return false ;
}
2009-04-13 20:33:13 +02:00
/**
2009-04-13 22:00:37 +02:00
* Checks if a weapon group is completely restricted .
2009-04-13 20:33:13 +02:00
*
* @ param weapongroup The weapon group name .
*/
bool : RestrictIsGroupRestricted ( const String : weapongroup [])
{
KvRewind ( kvWeaponGroups );
if ( KvJumpToKey ( kvWeaponGroups , weapongroup ))
{
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-13 23:55:02 +02:00
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
2009-04-13 20:33:13 +02:00
{
2009-04-13 23:55:02 +02:00
do
2009-04-13 20:33:13 +02:00
{
2009-04-13 23:55:02 +02:00
KvGetSectionName ( kvWeaponGroups , groupweapon , WEAPONS_MAX_LENGTH );
// Return false is a weapon isn't restricted, but only if the weapon is valid (we ignore invalid ones)
if ( WeaponsIsValidWeapon ( groupweapon ) && ! RestrictIsWeaponRestricted ( groupweapon ))
{
return false ;
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
return true ;
}
2009-04-13 20:33:13 +02:00
}
return false ;
}
2009-04-13 22:00:37 +02:00
/**
* Checks if a weapon group is completely unrestricted .
*
* @ param weapongroup The weapon group name .
*/
bool : RestrictIsGroupUnrestricted ( const String : weapongroup [])
{
KvRewind ( kvWeaponGroups );
if ( KvJumpToKey ( kvWeaponGroups , weapongroup ))
{
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-13 23:55:02 +02:00
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
2009-04-13 22:00:37 +02:00
{
2009-04-13 23:55:02 +02:00
do
2009-04-13 22:00:37 +02:00
{
2009-04-13 23:55:02 +02:00
KvGetSectionName ( kvWeaponGroups , groupweapon , WEAPONS_MAX_LENGTH );
// Return false if a weapon is restricted
if ( RestrictIsWeaponRestricted ( groupweapon ))
{
return false ;
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
return true ;
}
2009-04-13 22:00:37 +02:00
}
return false ;
}
/**
* Checks if a weapon group is partially restricted .
*
* @ param weapongroup The weapon group name .
*/
bool : RestrictIsPartialRestricted ( const String : weapongroup [])
{
return ( ! RestrictIsGroupRestricted ( weapongroup ) && ! RestrictIsGroupUnrestricted ( weapongroup ));
}
2009-04-09 18:30:14 +02:00
/**
* Returns the array index of the restricted weapon .
*
* @ param weapon The weapon name .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
RestrictGetIndex ( const String : weapon [])
2009-04-09 18:30:14 +02:00
{
2009-04-14 04:58:05 +02:00
decl String : restrictedweapon [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
new size = GetArraySize ( gRestrictedWeapons );
for ( new x = 0 ; x < size ; x ++ )
{
GetArrayString ( gRestrictedWeapons , x , restrictedweapon , sizeof ( restrictedweapon ));
if ( StrEqual ( weapon , restrictedweapon , false ))
{
return x ;
}
}
return - 1 ;
}
/**
* Checks if the provided name is a custom group .
*
* @ param groupname Name of the group to check .
* @ return True if it ' s a group , false if not .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
bool : RestrictIsWeaponGroup ( const String : groupname [])
2009-04-09 18:30:14 +02:00
{
// Reset the traversal stack
KvRewind ( kvWeaponGroups );
// Returns true if groupname is listed in the custom groups file
return KvJumpToKey ( kvWeaponGroups , groupname );
}
2009-04-13 20:33:13 +02:00
/**
* Creates an array of all listed weapon groups in weapongroups . txt .
* @ param arrayWeaponGroups The handle of the array , don ' t forget to call CloseHandle
* on it when finished !
* @ return The size of the array .
*/
RestrictCreateGroupArray ( & Handle : arrayWeaponGroups , maxlen = WEAPONS_MAX_LENGTH )
{
arrayWeaponGroups = CreateArray ( maxlen );
new count = 0 ;
KvRewind ( kvWeaponGroups );
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
decl String : weapongroup [ maxlen ];
do
{
KvGetSectionName ( kvWeaponGroups , weapongroup , maxlen );
PushArrayString ( arrayWeaponGroups , weapongroup );
count ++ ;
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
return count ;
}
2009-04-13 23:55:02 +02:00
/**
* Creates an array of all weapons listed in a custom weapon group .
* @ param arrayWeaponGroups The handle of the array , don ' t forget to call CloseHandle
* on it when finished !
* @ return The size of the array .
*/
RestrictCreateGroupWeaponsArray ( & Handle : arrayGroupWeapons , const String : weapongroup [], maxlen = WEAPONS_MAX_LENGTH )
{
arrayGroupWeapons = CreateArray ( maxlen );
new count = 0 ;
KvRewind ( kvWeaponGroups );
if ( KvJumpToKey ( kvWeaponGroups , weapongroup ))
{
decl String : groupweapon [ maxlen ];
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
do
{
KvGetSectionName ( kvWeaponGroups , groupweapon , maxlen );
// If the weapon is invalid, then stop
if ( ! WeaponsIsValidWeapon ( groupweapon ))
{
continue ;
}
PushArrayString ( arrayGroupWeapons , groupweapon );
count ++ ;
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
}
return count ;
}
2009-04-09 18:30:14 +02:00
/**
* Returns a string of all weapons in a custom weapon group separated
* by the provided character .
*
* @ param groupname Name of the group to get weapon list from .
* @ param weaponlist Variable to store weapon list string in .
* @ param maxlen Maximum length of the weapon list , the rest is truncated .
* @ param separator Separator character between weapon names .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
RestrictGetGroupWeapons ( const String : groupname [], String : weaponlist [], maxlen , const String : separator [])
2009-04-09 18:30:14 +02:00
{
KvRewind ( kvWeaponGroups );
KvJumpToKey ( kvWeaponGroups , groupname );
if ( KvGotoFirstSubKey ( kvWeaponGroups ))
{
2009-04-12 08:04:00 +02:00
decl String : groupweapon [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
strcopy ( weaponlist , maxlen , " " );
do
{
KvGetSectionName ( kvWeaponGroups , groupweapon , sizeof ( groupweapon ));
2009-04-12 08:04:00 +02:00
// If weapon is invalid, then skip
if ( ! WeaponsIsValidWeapon ( groupweapon ))
{
continue ;
}
2009-04-09 18:30:14 +02:00
if ( ! weaponlist [ 0 ])
{
strcopy ( weaponlist , maxlen , groupweapon );
}
else
{
Format ( weaponlist , maxlen , " %s%s%s " , weaponlist , separator , groupweapon );
}
} while ( KvGotoNextKey ( kvWeaponGroups ));
}
}
/**
* Hook callback , called when a player is trying to pick up a weapon .
* @ param client The client index .
* @ param weapon The weapon index .
* @ return 0 to block weapon pickup , Hacks_Continue to allow .
2009-04-12 08:04:00 +02:00
*/
2009-04-13 20:33:13 +02:00
public RestrictCanUse ( client , weapon , dummy1 , dummy2 , dummy3 , dummy4 )
2009-04-09 18:30:14 +02:00
{
// If plugin is disabled then stop
new bool : enabled = GetConVarBool ( gCvars [ CVAR_ENABLE ]);
if ( ! enabled )
{
return Hacks_Continue ;
}
2009-04-12 08:04:00 +02:00
new String : weaponname [ WEAPONS_MAX_LENGTH ];
2009-04-09 18:30:14 +02:00
GetEdictClassname ( weapon , weaponname , sizeof ( weaponname ));
// Strip "weapon_" from entity name
ReplaceString ( weaponname , sizeof ( weaponname ), " weapon_ " , " " );
// If the weapon is restricted then prevent pickup
2009-04-13 20:33:13 +02:00
if ( RestrictIsWeaponRestricted ( weaponname ))
2009-04-09 18:30:14 +02:00
{
return 0 ;
}
// If the player is a zombie and the weapon isn't a knife then prevent pickup
if ( IsPlayerZombie ( client ) && ! StrEqual ( weaponname , " knife " ))
{
return 0 ;
}
return Hacks_Continue ;
}