Code:
/*
.___ .__ _____ _____
__| _/____ ___________ ______ ____ |__|/ ____\/ ____\___________
/ __ |/ _ \ / _ \_ __ \ ______ / ___// \| \ __\\ __\/ __ \_ __ \
/ /_/ ( <_> | <_> ) | \/ /_____/ \___ \| | \ || | | | \ ___/| | \/
\____ |\____/ \____/|__| /____ >___| /__||__| |__| \___ >__|
\/ \/ \/ \/
version 1.0 by Skipper
*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <cstrike>
#define PLUGIN "door-sniffer"
#define VERSION "1.0"
#define AUTHOR "Skipper"
new is = 1
new w_sprite
new bool:g_doors_ready
new g_doors_max
new g_doors[40]
new g_playercandef[33][2]
new Float:g_pos[33][3]
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("door_defuse", "1")
register_cvar("door_defusecost", "800")
register_cvar("door_defusetime", "6")
register_cvar("door_defuseteam", "ALL")
register_cvar("door_showsprite", "1")
register_cvar("door_defuseiconyellow", "1")
register_forward(FM_EmitSound, "forward_emitsound")
register_clcmd("say /buydef","give_def")
register_clcmd("defuser","give_def")
set_task(5.0, "loadworld")
set_task(0.2, "def", 0, "", 0, "b")
}
public plugin_modules()
{
require_module("fakemeta")
require_module("engine")
require_module("cstrike")
}
public plugin_precache() {
precache_sound("lockpickbeginn.wav")
precache_sound("lockpickready.wav")
precache_sound("lockpickbuying.wav")
w_sprite = precache_model("sprites/lockpick.spr")
}
public give_def(id){
new defteam[4]
new p_team[12]
get_user_team(id, p_team, 11)
get_cvar_string("door_defuseteam", defteam, 11)
if(equal(defteam, "ALL") || equal(defteam, "CT") && equal(p_team, "CT") || equal(defteam, "T") && equal(p_team, "TERRORIST")){
if(get_cvar_num("door_defuse") == 1 && g_doors_ready == true){
if(is_user_alive(id)){
if(cs_get_user_defuse(id) == 0){
new defusecolor = get_cvar_num("door_defuseiconyellow")
new cost = get_cvar_num("door_defusecost")
if(cs_get_user_money(id) >= cost) {
cs_set_user_money(id, cs_get_user_money(id)-cost, 1)
client_cmd(id, "spk sound/lockpickbuying")
if(defusecolor == 1){
cs_set_user_defuse(id, 1, 245, 245, 0)
} else {
cs_set_user_defuse(id, 1, 0, 160, 0)
}
} else {
client_print(id, print_chat, "[DEF] You don't have enought money.")
}
} else {
client_print(id, print_chat, "[DEF] You already have one.")
}
} else {
client_print(id, print_chat, "[DEF] You can't buy something when you're dead.")
}
} else {
client_print(id, print_chat, "[DEF] The plugin is turned of or not ready.")
}
} else {
client_print(id, print_chat, "[DEF] You're not allowed to buy a defusekit.")
}
return PLUGIN_HANDLED
}
public defuseit(id) {
if(g_playercandef[id][0] == 1){
new give[2]
give[0] = g_playercandef[id][1]
give[1] = id
defuse(id, 6)
client_cmd(id, "spk sound/lockpickbeginn")
entity_get_vector(id, EV_VEC_origin, g_pos[id])
set_task(0.1, "doeshedef", 101, give, 2, "b")
set_task(6.0, "open_door_silent", 100, give, 2)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public loadworld() {
while(is != 0) {
is = find_ent_by_class ( is, "func_door_rotating" )
g_doors[g_doors_max] = is
g_doors_ready = true
if(is != 0) {
g_doors_max++
}
}
if(g_doors[0] == 0 && g_doors_ready == true) {
pause("a")
}
}
public def() {
if(get_cvar_num("door_defuse") == 1){
for(new id=1; id <= 32; id++) {
if(is_user_connected (id) == 1){
if(cs_get_user_defuse(id) == 1){
rangetest(id)
}
}
}
} else {
for(new id=1; id <= 32; id++) {
if(is_user_connected (id) == 1){
if(cs_get_user_defuse(id) == 1){
cs_set_user_defuse(id, 1, 0, 160, 0, "defuser", 0)
}
}
}
}
}
public rangetest(id) {
new range[2]
new defusecolor = get_cvar_num("door_defuseiconyellow")
for(new i=0;i<g_doors_max;i++) {
if(i==0) {
range[0] = floatround(entity_range (id, g_doors[i]))
range[1] = g_doors[i]
} else {
new temprange [2]
temprange[0] = floatround(entity_range (id, g_doors[i]))
temprange[1] = g_doors[i]
if (range[0] > temprange[0]) {
range[0] = temprange[0]
range[1] = temprange[1]
}
}
}
if(range[0] <= 70){
if(defusecolor == 1){
cs_set_user_defuse(id, 1, 255, 255, 0, "defuser", 1)
} else {
cs_set_user_defuse(id, 1, 0, 160, 0, "defuser", 1)
}
g_playercandef[id][0] = 1
g_playercandef[id][1] = range[1]
} else {
if(defusecolor == 1){
cs_set_user_defuse(id, 1, 255, 255, 0, "defuser", 0)
} else {
cs_set_user_defuse(id, 1, 0, 160, 0, "defuser", 0)
}
g_playercandef[id][0] = 0
g_playercandef[id][1] = range[1]
}
}
public defuse (id, bartime) {
message_begin(MSG_ONE, get_user_msgid("BarTime"), {0,0,0}, id)
write_byte(bartime)
write_byte(0)
message_end()
if(get_cvar_num("door_showsprite") == 1){
if(bartime != 0) {
message_begin(MSG_ALL,SVC_TEMPENTITY)
write_byte(124)
write_byte(id)
write_coord(40)
write_short(w_sprite)
write_short(65)
message_end()
} else {
message_begin(MSG_ALL,SVC_TEMPENTITY)
write_byte(125)
write_byte(id)
message_end()
}
}
}
public doeshedef(give[]) {
if(!is_user_alive(give[1])){
remove_task (100)
remove_task (101)
defuse(give[1], 0)
}
if(!(entity_get_int(give[1], EV_INT_button) & IN_USE)) {
remove_task (100)
remove_task (101)
defuse(give[1], 0)
}
new Float:currentpos[3]
entity_get_vector(give[1], EV_VEC_origin, currentpos)
for (new i = 0; i < 3; i++) {
if (currentpos[i] != g_pos[give[1]][i]) {
remove_task (100)
remove_task (101)
defuse(give[1], 0)
}
}
}
public open_door_silent(give[]) {
client_cmd(give[1], "spk sound/lockpickready")
entity_set_int(give[0], EV_INT_iuser1, 1)
fake_touch(give[0], give[1])
remove_task (101)
set_task(8.0,"door_loud", 0, give, 2)
}
public door_loud(give[]) {
entity_set_int(give[0], EV_INT_iuser1, 0)
}
public forward_emitsound(const ent, const lol, const sound[]) {
if (ent < 1) {
return FMRES_IGNORED
}
if (ent >= 1 && ent <= 32) {
if (equal(sound, "common/wpn_denyselect.wav"))
return defuseit(ent)
}
new classname[32]
entity_get_string(ent, EV_SZ_classname, classname, 31)
if (equal(classname, "func_door_rotating") && entity_get_int(ent, EV_INT_iuser1) == 1) {
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}