Код:
/*
* CSDM Sniper
* Версия: 0.0.2
* Исправления
=============== [ 26.11.2015 ] ===============
- Баг: когда снайпер был бессмертным.
- Баг: когда игра заканчивалась, не возвращась модель.
- Добавлено: нативы.
=============== [ 26.11.2015 ] ===============
P.S.: Не трогайте строчку PL_INCLUDE, так-как она только в разработке.
*/
#include amxmodx //Главный инклюд, отвечает за все.
#include amxmisc //Отвечает за старое меню.
#include cstrike //Отвечает за отлов команды игрока и выдачу патронов.
#include hamsandwich //Отвечает за отлов смерти и нанесенного дамага (увеличивает его).
#include fakemeta //Отвечает за установку модели оружия (не знаю, можно ли через HAM или нет).
#include fun //Отвечает за эффект свечения (оболочки) снайпера, так же выдача оружия.
#define PL_NAME "CSDM Sniper" //Название плагина
#define PL_VERSION "0.0.2" //Версия плагина
#define PL_AUTHOR "OverGame" //Автор плагина
//#define PL_INCLUDE //Закомментируйте, если не хотите, что бы использовались нативы.
#if defined PL_INCLUDE
#include csdm_games //Отвечает за игры
#define PL_REG_NAME "\dДень снайпера" //Имя игры, которое будет в меню.
#define PL_REG_TIME 120 //Время, за которое нужно убить снайпера.
new g_Hash, g_FWD_Sniper_Death, g_FWD_Sniper_Disconnect, g_FWD_Result;
#endif
#define PL_SNIPER_HEALTH 3000 //Количество жизней, у снайпера.
#define PL_SNIPER_AMMO 500 //Количество патронов у снайпера.
#define PL_SNIPER_SELECT 10 //Сколько секунд у игрока, что бы выбрать снайпера?
#define PL_SNIPER_TIME 120.0 //Через какое время, искать нового снайпера?
#define PL_SNIPER_PLAYERS 4 //Запускать снайпера, если игроков "n" или больше.
#define PL_SNIPER_DAMAGE 2.0 //На сколько умножить нанесённый дамаг?
#define PL_TASK_RANDOM 665 //ID задачи рандома
#define PL_TASK_TIMER 666 //ID задачи таймера
#define PL_TASK_INFORMER 667 //ID задачи информера
#define PL_CHAT_PREFIX "[iPLAY СНАЙПЕР]" //Префикс в чате.
new g_Sniper, g_Active = false, g_Maxplayers, g_Time = PL_SNIPER_SELECT, source[][] = {
"models/player/csdm_sniper/csdm_sniper.mdl", "models/csdm_sniper/v_awp.mdl", "models/csdm_sniper/p_awp.mdl"
};
public plugin_precache() for( new i; i < sizeof( source ); i++ ) precache_model( source[ i ] );
public plugin_init() {
register_plugin( PL_NAME, PL_VERSION, PL_AUTHOR );
RegisterHam( Ham_TakeDamage, "player", "fwd_Take_Damage", 0 );
RegisterHam( Ham_Killed, "player", "fwd_Ham_Killed" );
RegisterHam( Ham_Item_Deploy, "weapon_awp", "fwd_Ham_Deploy", 1 );
register_menu( "csdm_menu_sniper", 1023, "csdm_func_sniper" );
#if defined PL_INCLUDE
g_FWD_Sniper_Death = CreateMultiForward( "CSDM_Sniper_Death", ET_CONTINUE, FP_CELL );
g_FWD_Sniper_Disconnect = CreateMultiForward( "CSDM_Sniper_Disconnect", ET_CONTINUE, FP_CELL );
g_Hash = csdm_register_game( PL_REG_NAME, PL_REG_TIME );
#else
set_task( PL_SNIPER_TIME, "csdm_sniper_random", PL_TASK_RANDOM );
#endif
g_Maxplayers = get_maxplayers();
}
public client_disconnect( id ) {
#if defined PL_INCLUDE
if( g_Active && id == g_Sniper ) {
ExecuteForward( g_FWD_Sniper_Disconnect, g_FWD_Result, id );
ExecuteForward( g_FWD_Sniper_Death, g_FWD_Result, id );
}
#else
if( g_Active && id == g_Sniper ) {
g_Sniper = 0;
g_Active = true;
set_task( PL_SNIPER_TIME, "csdm_sniper_random" );
client_print( 0, print_chat, "%s Игра закончена, так-как Снайпер вышел..", PL_CHAT_PREFIX );
}
#endif
return PLUGIN_CONTINUE;
}
public fwd_Take_Damage( victim, inflicator, attacker, Float:damage ) {
if( !is_user_connected( attacker ) || g_Sniper != attacker ) return;
if( victim == attacker || !victim ) return;
SetHamParamFloat( 4, damage * PL_SNIPER_DAMAGE );
}
#if defined PL_INCLUDE
public CSDM_Start_Game( gameid ) {
if( gameid == g_Hash ) {
g_Sniper = 0;
remove_task( PL_TASK_TIMER );
remove_task( PL_TASK_RANDOM );
csdm_sniper_random();
} else {
g_Sniper = 0;
remove_task( PL_TASK_TIMER );
remove_task( PL_TASK_RANDOM );
}
}
#endif
public fwd_Ham_Killed( victim, attacker, corpse ) {
if( is_user_connected( victim ) && victim == g_Sniper ) {
cs_reset_user_model( victim );
g_Sniper = 0; set_user_rendering( victim, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0 );
g_Active = true;
remove_task( PL_TASK_INFORMER );
#if defined PL_INCLUDE
ExecuteForward( g_FWD_Sniper_Death, g_FWD_Result, victim );
#else
set_task( PL_SNIPER_TIME, "csdm_sniper_random" );
client_print( 0, print_chat, "%s Новый снайпер будет выбран через %d секунд.", PL_CHAT_PREFIX, float_to_num( PL_SNIPER_TIME ) );
#endif
}
return
}
public fwd_Ham_Deploy( weapon ) {
static id; id = get_pdata_cbase( weapon, 41, 4 );
if( is_user_connected( id ) && g_Sniper == id ) {
set_pev( id, pev_viewmodel2, source[ 1 ] );
set_pev( id, pev_weaponmodel2, source[ 2 ] );
}
return HAM_IGNORED;
}
showMenu ( id ) {
new buffer [ 512 ], len = format( buffer, charsmax( buffer ), "\yХотите стать снайпером?^n\dУ вас есть %d сек.", g_Time );
len += format( buffer[ len ], charsmax( buffer ) - len, "^n^n\d[1].\w Стать снайпером" );
len += format( buffer[ len ], charsmax( buffer ) - len, "^n\d[2].\w Нет, не желаю" );
show_menu( id, MENU_KEY_0|MENU_KEY_1, buffer, -1, "csdm_menu_sniper" );
return PLUGIN_CONTINUE;
}
public csdm_func_sniper( id, key ) {
if( g_Time <= 0 || g_Sniper != id ) { client_print( id, print_chat, "%s Время вышло!", PL_CHAT_PREFIX ); return PLUGIN_HANDLED; }
switch( key ) {
case 0: csdm_set_user_sniper( id );
case 1: set_user_freezing( g_Sniper, false );
case 9: showMenu( id );
}
remove_task( PL_TASK_TIMER );
return PLUGIN_HANDLED;
}
public csdm_func_timer() {
if( g_Time == 0 && g_Sniper != 0 ) {
remove_task( PL_TASK_TIMER );
set_user_freezing( g_Sniper, false );
g_Sniper = 0;
} else {
g_Time--;
set_user_freezing( g_Sniper, true );
showMenu( g_Sniper );
}
}
public csdm_sniper_random() {
if( get_playersnum() >= PL_SNIPER_PLAYERS ) {
static Players[ 32 ], Count, id_rand;
get_players( Players, Count, "ach" );
id_rand = random_num( 0, Count - 1 );
g_Sniper = Players[ id_rand ];
g_Active = true;
g_Time = PL_SNIPER_SELECT;
set_task ( 1.0, "csdm_func_timer", PL_TASK_TIMER, _, _, "b" );
remove_task( PL_TASK_RANDOM );
} else client_print( 0, print_chat, "%s Снайпер не будет выбран, слишком мало игроков.", PL_CHAT_PREFIX );
}
public csdm_set_user_sniper( id ) {
if( is_user_connected( id ) ) {
cs_set_user_model( id, "csdm_sniper" );
give_item( id, "weapon_awp" );
cs_set_user_bpammo( id, CSW_AWP, PL_SNIPER_AMMO );
set_user_health( id, PL_SNIPER_HEALTH );
set_task ( 1.0, "csdm_sniper_info", PL_TASK_INFORMER, _, _, "b" );
set_pev( id, pev_viewmodel2, source[ 1 ] );
set_pev( id, pev_weaponmodel2, source[ 2 ] );
set_user_freezing( g_Sniper, false );
switch( cs_get_user_team( id ) ) {
case CS_TEAM_T: set_user_rendering( id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 4 );
case CS_TEAM_CT: set_user_rendering( id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 4 );
}
}
}
public csdm_sniper_info() {
if( g_Sniper <= 0 ) return PLUGIN_HANDLED;
for( new id = 1; id <= g_Maxplayers; id++ ) {
if( is_user_bot( id ) || !is_user_connected( id ) ) continue;
set_hudmessage( 0, 127, 255, -1.0, 0.21, 0, 0.50, 1.0 );
show_hudmessage( id, "Внимание! У снайпера %d жизней!", get_user_health( g_Sniper ) );
}
return PLUGIN_CONTINUE;
}
stock set_user_freezing( id, status ) {
if( !is_user_connected( id ) && !is_user_alive( id ) ) return false;
set_user_godmode( id, status );
if( status ) {
set_pev( id, pev_flags, pev( id, pev_flags ) | FL_FROZEN );
set_user_gravity( id, 9999.0 );
set_user_rendering( id, kRenderFxGlowShell, 80, 224, 255, kRenderNormal, 5 );
} else {
set_pev( id, pev_flags, pev( id, pev_flags ) & ~FL_FROZEN );
set_user_rendering( id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0 );
set_user_gravity( id, 1.0 );
}
return true;
}
stock float_to_num( Float:num ) {
new str[ 16 ]; float_to_str( num, str, 15 );
new buffer = contain( str, "," );
format( str, buffer, str );
return str_to_num( str );
}