Код:
#include <amxmisc>
#include <engine>
#include <hamsandwich>
#include <biohazard>
#include <colorchat>
#pragma semicolon 1
#pragma ctrlchar '\'
#define ADMIN_HOOK ADMIN_LEVEL_F
#define MAX_CLIENTS 32
#define DURATION_TIME 5 //время в секундах, через которое автоматически отпуститься хук
#define TASK_ON_TIME 0.1
new g_PlayerAimOrigin[MAX_CLIENTS + 1][3];
new g_nPlayerUseCount[MAX_CLIENTS + 1];
enum UTILS_DATA
{
CVAR_HOOK_COUNT,
HOOK_SPRITE,
Float: TIMER
};
new g_UTILS[UTILS_DATA];
new const szChatPrefix[] = "Hook"; //префикс заключенный в квадртаные скобки
public plugin_init()
{
register_plugin("Cs_Hook","1.0", "Sulky");
RegisterHam(Ham_Spawn, "player", "fwPlayerSpawn_Post", .Post = true);
register_clcmd("+hook","hook_on");
register_clcmd("-hook","hook_off");
g_UTILS[CVAR_HOOK_COUNT] = register_cvar( "hook_count", "15");
}
public plugin_precache()
{
precache_sound("hook/hook.wav");
g_UTILS[HOOK_SPRITE] = precache_model("sprites/hook/hook.spr");
}
public fwPlayerSpawn_Post(id)
if(is_user_alive(id))
g_nPlayerUseCount[id] = 0;
public client_disconnect(id) remove_hook(id);
public client_putinserver(id) remove_hook(id);
public hook_on(id)
{
if(!is_user_alive(id))
{
client_print_color(id, print_team_default, "\4[%s]\1 Нельзя использовать паутинку, когда вы мертвы!", szChatPrefix);
return PLUGIN_HANDLED;
}
if(is_user_zombie(id))
{
client_print_color(id, print_team_default, "\4[%s]\1 Нельзя использовать паутинку, когда вы зомби!", szChatPrefix);
return PLUGIN_HANDLED;
}
if(get_user_flags(id) & ADMIN_HOOK)
{
if(g_nPlayerUseCount[id] < get_pcvar_num(g_UTILS[CVAR_HOOK_COUNT]))
{
get_user_origin(id,g_PlayerAimOrigin[id],3);
++g_nPlayerUseCount[id];
emit_sound(id,CHAN_STATIC,"hook/hook.wav",1.0,ATTN_NORM,0,PITCH_NORM);
set_task(TASK_ON_TIME, "hook_task", id, .flags = "b");
hook_task(id);
}
else
{
client_print_color(id, print_team_default, "\4[%s]\1 Нельзя использовать паутину больше\4 %i\1 раз!", szChatPrefix, get_pcvar_num(g_UTILS[CVAR_HOOK_COUNT]));
return PLUGIN_HANDLED;
}
}
else
client_print_color(id, print_team_default, "\4[%s]\1 У вас нет паутинки, вы не \4V.I.P\1!", szChatPrefix);
return PLUGIN_HANDLED;
}
public hook_off(id)
{
if(get_user_flags(id) & ADMIN_HOOK)
{
remove_hook(id);
g_UTILS[TIMER] = 0;
}
else
client_print_color(id, print_team_default, "\4[%s]\1 У вас нет паутинки, вы не \4V.I.P\1!", szChatPrefix);
return PLUGIN_HANDLED;
}
public hook_task(id)
{
if(!is_user_alive(id))
remove_hook(id);
if (g_UTILS[TIMER] < DURATION_TIME)
g_UTILS[TIMER] += TASK_ON_TIME;
else
{
g_UTILS[TIMER] = 0;
remove_hook(id);
return;
}
remove_beam(id);
draw_hook(id);
new origin[3], Float:velocity[3]; get_user_origin(id,origin);
new distance = get_distance(g_PlayerAimOrigin[id],origin);
if(distance > 25)
{
velocity[0] = (g_PlayerAimOrigin[id][0] - origin[0]) * (2.0 * 300 / distance);
velocity[1] = (g_PlayerAimOrigin[id][1] - origin[1]) * (2.0 * 300 / distance);
velocity[2] = (g_PlayerAimOrigin[id][2] - origin[2]) * (2.0 * 300 / distance);
entity_set_vector(id,EV_VEC_velocity,velocity);
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0});
remove_hook(id);
}
}
public draw_hook(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(1); // TE_BEAMENTPOINT
write_short(id); // entid
write_coord(g_PlayerAimOrigin[id][0]); // origin
write_coord(g_PlayerAimOrigin[id][1]); // origin
write_coord(g_PlayerAimOrigin[id][2]); // origin
write_short(g_UTILS[HOOK_SPRITE]); // sprite index
write_byte(0); // start frame
write_byte(0); // framerate
write_byte(100); // life
write_byte(10); // width
write_byte(0); // noise
write_byte(random(255));
write_byte(random(255));
write_byte(random(255));
write_byte(250); // brightness
write_byte(1); // speed
message_end();
}
public remove_hook(id)
{
remove_task(id);
remove_beam(id);
}
public remove_beam(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(99);
write_short(id);
message_end();
}