/* -------------------------------------------------------------------------------- - iWeapons 1.0.2 ( Advanced weapon control ) - Author: Iggy - Special Thanks To Aelfred AKA Englander. Owner Of BionixGaming. - And Thanks To Everyone In The BionixGaming Community. -------------------------------------------------------------------------------- Credits: ( alphabetical order ) Y_Less - foreach / y_ini ZeeX - zcmd Also Obviously - The SA-MP Development Team. Last but not least - Anyone who uses this script :) -------------------------------------------------------------------------------- Changelog : v1.0.2 (first update) - Fixed bugs with banned weapons not being saved to the file correctly. - Added /banallweapons command - Banned driveby weapons are now saved to file, and loaded to vars when the script is loaded. - Null checks added on commands that expect params. - y_ini reading functions modified. As per z3ros suggestion. - /bandb now disarms everyone in a vehicle, as soon as this command is used. -------------------------------------------------------------------------------- */ #include #include #include #include #define ERROR_RED (0xFF6666AA) #define MESSAGE_COLOR (0x99FF00AA) #define HELP_COLOR (0x00FF00AA) #define MAX_TEAM_KILLS (3) #define WC_DEFAULT_UPDATE_TIME (10000) #define MAX_BANNED_WEAPONID (46) #define NO_PERMISSION();\ SendClientMessage(playerid, ERROR_RED, "| iWeapons |: You do not have permission to use that command."); #define IWEAPON_DIALOG_MAIN (4891) enum IWEAPON_DATA { bool:wc_BannedWeapons[MAX_BANNED_WEAPONID], bool:wc_VehicleWeapons[MAX_BANNED_WEAPONID], bool:wc_pDriveByBanned[MAX_PLAYERS], bool:wc_DriveByBanned, //bool:wc_TeamKills } new wc_iWeaponData[IWEAPON_DATA]; new wc_UpdateTime = WC_DEFAULT_UPDATE_TIME; new wc_UpdateID; //forward(s) wc_Update(); public OnFilterScriptInit() { if(fexist("iWeaponConfig.ini")) INI_Load("iWeaponConfig.ini"); else { new INI:iweps = INI_Open("iWeaponConfig.ini"); for ( new i = 1; i < 44; i++ ) { new str[ 9 ]; format( str, 9, "weapon%d", i ); INI_WriteBool(iweps, str, false); } INI_Close(iweps); } if(fexist("iVehicleWeaponCfg.ini")) INI_Load("iVehicleWeaponCfg.ini"); else { new INI:iweps = INI_Open("iVehicleWeaponCfg.ini"); for ( new i = 1; i < 44; i++ ) { new str[ 9 ]; format( str, 9, "weapon%d", i ); INI_WriteBool(iweps, str, false); } INI_Close(iweps); } print("\n-----------------------------------------"); print(" iWeapons - weapon control Unit 1.0.2 Loaded"); print("-----------------------------------------\n"); wc_UpdateID = SetTimer("wc_Update", wc_UpdateTime, true); return 1; } public OnFilterScriptExit() { print("\n-----------------------------------------"); print(" iWeapons - weapon control Unit 1.0.2 Unloaded"); print("-----------------------------------------\n"); return 1; } public wc_Update() { foreach(Player, playerid) { if(wc_iWeaponData[ wc_BannedWeapons ][ GetPlayerWeapon(playerid) ] == true) { ResetPlayerWeapons(playerid); SendClientMessage(playerid, 0xFFFFFFAA, "| iWeapons |: {FF6666}You have been disarmed for having banned weapons."); continue; } } } public OnPlayerDisconnect(playerid, reason) { wc_iWeaponData[ wc_pDriveByBanned ][ playerid ] = false; return 1; } public OnPlayerDeath(playerid, killerid, reason) {/* if(wc_iWeaponData[ wc_TeamKills ] == true) { if(GetPlayerTeam(playerid) == GetPlayerTeam(killerid)) { SetPVarInt(killerid, "TeamKills", GetPVarInt(killerid, "TeamKills") + 1); switch( GetPVarInt(killerid, "TeamKills") ) { case MAX_TEAM_KILLS: { SetPlayerHealth(killerid, -999999); SendClientMessage(killerid, ERROR_RED, "You have been killed for excessive team kills."); DeletePVar(killerid, "TeamKills"); return 1; } } } }*/ return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { if(newstate == PLAYER_STATE_DRIVER && wc_iWeaponData[ wc_DriveByBanned ] || wc_iWeaponData[ wc_pDriveByBanned ][ playerid ]) return SetPlayerArmedWeapon(playerid, 0); else if(newstate == PLAYER_STATE_PASSENGER) { new bool:count, vid = GetPlayerVehicleID(playerid); foreach(Player, i) { if(i == playerid)continue; if(IsPlayerInVehicle(i, vid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) { count = true; break; } } if(!count) { RemovePlayerFromVehicle(playerid); SendClientMessage(playerid, ERROR_RED, "ERROR: There must be a driver for you to be a passenger"); return 1; } if(wc_iWeaponData[ wc_pDriveByBanned ][ playerid ]) return SetPlayerArmedWeapon(playerid, 0); if(wc_iWeaponData[ wc_DriveByBanned ]) return SetPlayerArmedWeapon(playerid, 0); if(wc_iWeaponData[ wc_VehicleWeapons ][ GetPlayerWeapon(playerid) ]) return SetPlayerArmedWeapon(playerid, 0); } return 1; } COMMAND:weaponhelp(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { SendClientMessage(playerid, 0xFFFF00AA, "----------------------------- {FF6666}iWeapon Commands {FFFF00}-----------------------------"); SendClientMessage(playerid, HELP_COLOR, "/bandb. /unbandb. /banplayerdb[playername/id]. /unbanplayerdb[playername/id]"); SendClientMessage(playerid, HELP_COLOR, "/banweapon[weaponname/id]. /unbanweapon[weaponname/id]"); SendClientMessage(playerid, HELP_COLOR, "/bandbwep[weaponname/id], /bandbwep[weaponname/id]"); SendClientMessage(playerid, HELP_COLOR, "/weaponupdate[seconds]. This will change the update time."); SendClientMessage(playerid, HELP_COLOR, "/banallweapons. or /baw"); } return 1; } COMMAND:banweapon(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /banweapon [weaponname/id]"); new weaponid; if( isnumeric( params ) ) { weaponid = strval( params ); if(IsValidWeaponId( weaponid )) { new str[64], weapon[32]; GetWeaponName(weaponid, weapon, 32); format(str, sizeof(str), "| iWeapons |: You have banned %s.", weapon); wc_iWeaponData[ wc_BannedWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, sizeof(str), "| SERVER |: %ss have been banned.", weapon); SendClientMessageToAll(0xFFFFFFAA, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iWeaponConfig.ini"); INI_WriteBool(iweps, str, true); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } else { weaponid = GetWeaponIDFromName(params); if(IsValidWeaponId( weaponid )) { new str[64], weapon[32]; GetWeaponName(weaponid, weapon, 32); format(str, sizeof(str), "| iWeapons |: You have banned %s.", weapon); wc_iWeaponData[ wc_BannedWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, sizeof(str), "| SERVER |: %ss have been banned.", weapon); SendClientMessageToAll(0xFFFFFFAA, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iWeaponConfig.ini"); INI_WriteBool(iweps, str, true); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } } return 1; } COMMAND:unbanweapon(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /unbanweapon [weaponname/id]"); new weaponid; if(isnumeric( params )) { weaponid = strval( params ); if(IsValidWeaponId( weaponid )) { new str[64], weapon[32]; GetWeaponName(weaponid, weapon, 32); format(str, sizeof(str), "| iWeapons |: You have unbanned %s.", weapon); wc_iWeaponData[ wc_BannedWeapons ][ weaponid ] = false; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, sizeof(str), "| SERVER |: %s have been banned.", weapon); SendClientMessageToAll(0xFFFFFFAA, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iWeaponConfig.ini"); INI_WriteBool(iweps, str, false); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } else { weaponid = GetWeaponIDFromName(params); if(IsValidWeaponId( weaponid )) { new str[64], weapon[32]; GetWeaponName(weaponid, weapon, 32); format(str, sizeof(str), "| iWeapons |: You have unbanned %s.", weapon); wc_iWeaponData[ wc_BannedWeapons ][ weaponid ] = false; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, sizeof(str), "| SERVER |: %s have been banned.", weapon); SendClientMessageToAll(0xFFFFFFAA, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iWeaponConfig.ini"); INI_WriteBool(iweps, str, false); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } } return 1; } COMMAND:banallweapons(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { new INI:iweps = INI_Open("iWeaponConfig.ini"); for ( new i = 1; i < 44; i++ ) { new str[ 9 ]; format( str, 9, "weapon%d", i ); INI_WriteBool(iweps, str, true); wc_iWeaponData[ wc_BannedWeapons ] [ i ] = true; } INI_Close(iweps); } return 1; } COMMAND:baw(playerid, params[]) { return cmd_banallweapons(playerid, params); } COMMAND:disarmserver(playerid, params[]) { return 1; } COMMAND:bandb(playerid, params[]) { if(!IsPlayerAdmin(playerid)) NO_PERMISSION(); else { wc_iWeaponData[ wc_DriveByBanned ] = true; SendClientMessage(playerid, MESSAGE_COLOR, "| iWeapons |: You have disabled drivebys."); SendClientMessageToAll(0xFFFFFFAA, "| SERVER |: Drivebys have been {FF6666}disabled"); foreach(Player, i) if(IsPlayerInAnyVehicle(i)) SetPlayerArmedWeapon(playerid, 0); } return 1; } COMMAND:unbandb(playerid, params[]) { if(!IsPlayerAdmin(playerid)) NO_PERMISSION(); else { wc_iWeaponData[ wc_DriveByBanned ] = false; SendClientMessage(playerid, MESSAGE_COLOR, "| iWeapons |: You have enabled drivebys."); SendClientMessageToAll(0xFFFFFFAA, "| SERVER |: Drivebys have been {00FF00}enabled"); } return 1; } COMMAND:bandbweapon(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /bandbweapon [weaponname/id]"); new weaponid; if(isnumeric( params )) { weaponid = strval( params ); if(IsValidWeaponId( weaponid )) { new str[64]; GetWeaponName(weaponid, str, 32); format(str, sizeof(str), "| iWeapons |: You have banned driveby weapon: %s.", str); wc_iWeaponData[ wc_VehicleWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iVehicleWeaponCfg.ini"); INI_WriteBool(iweps, str, true); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } else { weaponid = GetWeaponIDFromName(params); if(weaponid != -1) { new str[64]; format(str, sizeof(str), "| iWeapons |: You have banned driveby weapon: %s.", params); wc_iWeaponData[ wc_VehicleWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iVehicleWeaponCfg.ini"); INI_WriteBool(iweps, str, true); INI_Close(iweps); } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon."); } } return 1; } COMMAND:bandbwep(playerid, params[]) { return cmd_bandbweapon(playerid, params); } COMMAND:unbandbweapon(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /unbandbweapon [weaponname/id]"); new weaponid; if(isnumeric( params )) { weaponid = strval( params ); if(IsValidWeaponId( weaponid )) { new str[64]; GetWeaponName(weaponid, str, 32); format(str, sizeof(str), "| iWeapons |: You have banned driveby weapon: %s.", str); wc_iWeaponData[ wc_VehicleWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iVehicleWeaponCfg.ini"); INI_WriteBool(iweps, str, false); INI_Close(iweps); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } else { weaponid = GetWeaponIDFromName(params); if(IsValidWeaponId( weaponid )) { new str[64]; format(str, sizeof(str), "| iWeapons |: You have banned driveby weapon: %s.", params); wc_iWeaponData[ wc_VehicleWeapons ][ weaponid ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); format(str, 9, "weapon%d", weaponid); new INI:iweps = INI_Open("iVehicleWeaponCfg.ini"); INI_WriteBool(iweps, str, false); INI_Close(iweps); } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Invalid Weapon Id."); } } return 1; } COMMAND:unbandbwep(playerid, params[]) { return cmd_unbandbweapon(playerid, params); } COMMAND:banplayerdb(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /banplayerdb [name/id]"); new id; if(isnumeric( params )) { id = strval( params ); if(id != INVALID_PLAYER_ID) { new str[64]; format(str, sizeof( str ), "| iWeapons |: You have disabled %s from doing drivebys", playername(id)); wc_iWeaponData[ wc_pDriveByBanned ][ id ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); SendClientMessage(id, 0xFFFFFFAA, "| SERVER |: You have been disabled from doing drivebys"); if(IsPlayerInAnyVehicle(id)) SetPlayerArmedWeapon(id, 0); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons |: Player not found."); } else { id = INVALID_PLAYER_ID; foreach(Player, i) { if(playerid == i)continue; if(!strcmp(params, playername(i), true)) { id = i; break; } } if( id != INVALID_PLAYER_ID ) { new str[64]; format(str, sizeof( str ), "| iWeapons |: You have disabled %s from doing drivebys", playername(id)); wc_iWeaponData[ wc_pDriveByBanned ][ id ] = true; SendClientMessage(playerid, MESSAGE_COLOR, str); SendClientMessage(id, 0xFFFFFFAA, "| SERVER |: You have been disabled from doing drivebys"); if(IsPlayerInAnyVehicle(id)) SetPlayerArmedWeapon(id, 0); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons |: Player not found."); } } return 1; } COMMAND:unbanplayerdb(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /unbanplayerdb [name/id]"); new id; if(isnumeric( params )) { id = strval( params ); if(id != INVALID_PLAYER_ID) { new str[64]; format(str, sizeof( str ), "| iWeapons |: You have enabled %s's drivebys", playername(id)); wc_iWeaponData[ wc_pDriveByBanned ][ id ] = false; SendClientMessage(playerid, MESSAGE_COLOR, str); SendClientMessage(id, 0xFFFFFFAA, "| SERVER |: You can now driveby"); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons |: Player not found."); } else { id = INVALID_PLAYER_ID; foreach(Player, i) { if(playerid == i)continue; if(!strcmp(params, playername(i), true)) { id = i; break; } } if( id != INVALID_PLAYER_ID ) { new str[64]; format(str, sizeof( str ), "| iWeapons |: You have enabled %s's drivebys", playername(id)); wc_iWeaponData[ wc_pDriveByBanned ][ id ] = false; SendClientMessage(playerid, MESSAGE_COLOR, str); SendClientMessage(id, 0xFFFFFFAA, "| SERVER |: You can now driveby"); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons |: Player not found."); } } return 1; } COMMAND:weaponupdate(playerid, params[]) { if(!IsPlayerAdmin( playerid )) NO_PERMISSION(); else { if( isnull( params ) ) return SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Usage /weaponupdate [time]. Time is in seconds."); if(isnumeric( params )) { new newtime = strval( params ); if(newtime > 0 && newtime < ( 120*60 )) { new str[64]; KillTimer(wc_UpdateID); wc_UpdateID = SetTimer("wc_Update", newtime, true); wc_Update(); format(str, sizeof( str ), "| iWeapons |: You have set the new iWeapon update time to once every %d seconds", newtime); SendClientMessage(playerid, MESSAGE_COLOR, str); return 1; } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Number must be between 2 and 120. (seconds)"); } else SendClientMessage(playerid, ERROR_RED, "| iWeapons | ERROR: Expected value is a number. (2 - 120)"); } return 1; } stock GetWeaponIDFromName(WeaponName[]) { if(strfind("molotov",WeaponName,true)!=-1) return 18; for(new i; i <= 46; i++) { switch( i ) { case 0,19,20,21,44,45: continue; default: { new name[32]; GetWeaponName(i,name,32); if(strfind(name,WeaponName,true) != -1) return i; } } } return -1; } IsValidWeaponId(weaponid) { if(weaponid>45||weaponid<1||weaponid==0||weaponid==19 ||weaponid==20||weaponid==21||weaponid==44||weaponid==45) return 0; else return 1; } playername(playerid) { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, MAX_PLAYER_NAME); return pName; } INI:iVehicleWeaponCfg[](name[], value[]) { for ( new i = 1; i < 44; i++ ) { new str[ 9 ]; format( str, 9, "weapon%d", i ); INI_Bool( str, wc_iWeaponData[ wc_VehicleWeapons ] [ i ]); } return 0; } INI:iWeaponConfig[](name[], value[]) { for ( new i = 1; i < 44; i++ ) { new str[ 9 ]; format( str, 9, "weapon%d", i ); INI_Bool( str, wc_iWeaponData[ wc_BannedWeapons ] [ i ]); } return 0; }