#include <amxmodx>
#include <hamsandwich>
#define VERSION "0.9.7"
#define MAXPLAYERS 32
#define DMG_ENERGYBEAM (1<<10) // Laser or other high energy beam
#define HLW_GAUSS 9 // Half-Life "weapon_gauss"
#define HLW_EGON 10 // Half-Life "weapon_egon"
#define CHANNEL_HUD_EGON 1 // Разезервированный HUD-канал для EGON
new const THECFGFILE[] = "addons/amxmodx/configs/damager_hldm.cfg"
new const Float:g_coordinates[][] =
{
{0.50, 0.40},
{0.56, 0.44},
{0.60, 0.50},
{0.56, 0.56},
{0.50, 0.60},
{0.44, 0.56},
{0.40, 0.50},
{0.44, 0.44}
}
new const g_enterstep[][] =
{
"%d^n^n", "^n%d^n", "^n^n%d", "^n%d^n"
}
new g_iPlayerPos[MAXPLAYERS+1], g_PlayerEgonAddPos[MAXPLAYERS+1], me_combo[MAXPLAYERS+1]
new Float:me_last_damage_time[MAXPLAYERS+1][MAXPLAYERS+1]
new my_weapon_in_hand[MAXPLAYERS+1];
new dmg_info_color[3], dmg_victim_i_color[3] // red, green, blue
new cvar_damager_enable, cvar_dmg_info_colors, cvar_dmg_victim_i_colors, cvar_dmg_info_random, cvar_accum_time, cvar_hud_tick_egon_show
public plugin_init()
{
register_plugin("Damager Half-Life DM", VERSION, "Leo_[BH]")
cvar_damager_enable = register_cvar("damager_enable", "1");
cvar_dmg_info_colors = register_cvar("damager_color", "0 255 0");
cvar_dmg_victim_i_colors = register_cvar("damager_color_victim", "255 0 0");
cvar_dmg_info_random = register_cvar("damager_random_color", "0");
cvar_accum_time = register_cvar("damager_accum_time", "0.5");
cvar_hud_tick_egon_show = register_cvar("damager_egon_show_tick", "0");
register_event("CurWeapon", "checkWeapon", "be", "1=1")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
}
new linetext[][] = {
"// Enable damage hud info? 1 - enable; 0 - disable.",
"// Включить информацию об уроне в интерфейсе? 1 - включено; 0 - отключено.",
"damager_enable ^"1^"",
"",
"// Set attacker damage hud info colors {Red, Gree, Blue} (0-255)",
"// Задать цвета информации об уроне атакующему {Красный, Зеленый, Синий} (0-255)",
"damager_color ^"0 255 0^"",
"",
"// Set victim damage hud info colors {Red, Gree, Blue} (0-255)",
"// Задать цвета информации об уроне жертве {Красный, Зеленый, Синий} (0-255)",
"damager_color_victim ^"255 0 0^"",
"",
"// If enabled, colors will be set random and ignore previous colors variables",
"// Если включено, то цвет будет каждый раз случайный, а предыдущие переменные по цвету будут игнорироваться",
"damager_random_color ^"0^"",
"",
"// How many seconds have accumulated damage in one display (only for the gluon cannon and gauss) ",
"// За сколько прошедших секунд аккумулировать урон в одно отображение (функция только для глюон-пушки и гаусс-пушки)",
"damager_accum_time ^"0.5^"",
"",
"// Show additional damage info from weapon_egon",
"// Показывать дополнительно урон от глюон-пушки справа от прицела в столбик",
"damager_egon_show_tick ^"0^"",
"",
"// Автор плагина: Leo_BH"
}
public plugin_cfg()
{
if(!file_exists(THECFGFILE))
{
for(new i = 0; i < sizeof(linetext); i++)
{
write_file(THECFGFILE, linetext[i]);
}
}
server_cmd("exec %s", THECFGFILE)
reload_vars()
}
public reload_vars()
{
if(get_pcvar_num(cvar_dmg_info_random))
{
dmg_info_color[0] = random_num(0, 255)
dmg_info_color[1] = random_num(0, 255)
dmg_info_color[2] = random_num(0, 255)
dmg_victim_i_color[0] = random_num(0, 255)
dmg_victim_i_color[1] = random_num(0, 255)
dmg_victim_i_color[2] = random_num(0, 255)
}
else
{
new szColor[12], szRed[4], szGreen[4], szBlue[4]
get_pcvar_string(cvar_dmg_info_colors, szColor, charsmax(szColor))
parse(szColor, szRed, charsmax(szRed), szGreen, charsmax(szGreen), szBlue, charsmax(szBlue))
dmg_info_color[0] = clamp(str_to_num(szRed), 0, 255)
dmg_info_color[1] = clamp(str_to_num(szGreen), 0, 255)
dmg_info_color[2] = clamp(str_to_num(szBlue), 0, 255)
get_pcvar_string(cvar_dmg_victim_i_colors, szColor, charsmax(szColor))
parse(szColor, szRed, charsmax(szRed), szGreen, charsmax(szGreen), szBlue, charsmax(szBlue))
dmg_victim_i_color[0] = clamp(str_to_num(szRed), 0, 255)
dmg_victim_i_color[1] = clamp(str_to_num(szGreen), 0, 255)
dmg_victim_i_color[2] = clamp(str_to_num(szBlue), 0, 255)
}
}
// // // // // // // // // // // // // // //
public checkWeapon(id)
{
if(!is_user_alive(id))
return PLUGIN_CONTINUE
my_weapon_in_hand[id] = read_data(2)
return PLUGIN_CONTINUE
}
// // // // // // // // // // // // // // //
public fw_TakeDamage_Post(victim, inflictor, attacker, Float:damage, damage_type)
{
if(!is_user_connected(victim)) return HAM_IGNORED;
if(!is_user_connected(attacker)) return HAM_IGNORED;
if(!get_pcvar_num(cvar_damager_enable)){
return HAM_IGNORED; // if damager disabled - return;
}
reload_vars()
new Float:gametime = get_gametime()
if(me_last_damage_time[attacker][victim] + get_pcvar_float(cvar_accum_time) < gametime)
{
me_combo[attacker] = 0
}
me_last_damage_time[attacker][victim] = gametime
new dmgnum = floatround(damage)
if(dmgnum < 1) return HAM_IGNORED;
me_combo[attacker] += dmgnum
if(my_weapon_in_hand[attacker] == HLW_EGON && damage_type & DMG_ENERGYBEAM)
{
egon_show_damage(attacker, dmgnum)
egon_show_victim_damage(victim, dmgnum, attacker)
}
else if(my_weapon_in_hand[attacker] == HLW_GAUSS)
{
show_damage(attacker, dmgnum)
show_victim_damage(victim, dmgnum)
}
else
{
show_damage(attacker, dmgnum)
show_victim_damage(victim, dmgnum)
}
return HAM_IGNORED;
}
public egon_show_damage(id, damage)
{
if(!is_user_connected(id)) return;
if(is_user_bot(id)) return;
new thisPos = g_iPlayerPos[id]
set_hudmessage(dmg_info_color[0], dmg_info_color[1], dmg_info_color[2], Float:g_coordinates[thisPos][0], Float:g_coordinates[thisPos][1], 0, 0.0, 3.0, 0.0, 2.0, CHANNEL_HUD_EGON);
show_hudmessage(id, "%d", me_combo[id])
if(get_pcvar_num(cvar_hud_tick_egon_show)) {
hud_tick_egon(id, damage)
}
}
public egon_show_victim_damage(id, damage, attacker)
{
if(!is_user_connected(id)) return;
if(is_user_bot(id)) return;
new thisPos = g_iPlayerPos[id]
set_hudmessage(dmg_victim_i_color[0], dmg_victim_i_color[1], dmg_victim_i_color[2], Float:g_coordinates[thisPos][0], Float:g_coordinates[thisPos][1], 0, 0.0, 3.0, 0.0, 2.0, CHANNEL_HUD_EGON);
show_hudmessage(id, "%d", me_combo[attacker])
}
public hud_tick_egon(id, damage) // Special HUD
{
set_hudmessage(0, 255, 255, 0.60, -1.0, 0, 6.0, 0.1, 0.00, 0.2);
new iePos = ++g_PlayerEgonAddPos[id]
if( iePos == sizeof(g_enterstep) )
{
iePos = g_PlayerEgonAddPos[id] = 0
}
show_hudmessage(id, g_enterstep[iePos], damage);
}
public show_damage(id, damage)
{
if(!is_user_connected(id)) return;
if(is_user_bot(id)) return;
new iPos = ++g_iPlayerPos[id]
if( iPos == sizeof(g_coordinates) )
{
iPos = g_iPlayerPos[id] = 0
}
set_hudmessage(dmg_info_color[0], dmg_info_color[1], dmg_info_color[2], Float:g_coordinates[iPos][0], Float:g_coordinates[iPos][1], 0, 0.1, 2.0, 0.02, 1.0, -1);
show_hudmessage(id, "%d", damage)
}
public show_victim_damage(id, damage)
{
if(!is_user_connected(id)) return;
if(is_user_bot(id)) return;
new iPos = ++g_iPlayerPos[id]
if( iPos == sizeof(g_coordinates) )
{
iPos = g_iPlayerPos[id] = 0
}
set_hudmessage(dmg_victim_i_color[0], dmg_victim_i_color[1], dmg_victim_i_color[2], Float:g_coordinates[iPos][0], Float:g_coordinates[iPos][1], 0, 0.1, 2.0, 0.02, 1.0, -1);
show_hudmessage(id, "%d", damage)
}
public client_connect(id)
{
for(new i = 0; i < 33; i++) me_last_damage_time[id][i] = 0.0
me_combo[id] = 0
g_iPlayerPos[id] = random_num(0, charsmax(g_coordinates))
my_weapon_in_hand[id] = 0
}
// = = = = = = = = = = = = = = = = = =
// Автор плагина: Leo_[BH]
// = = = = = = = = = = = = = = = = = =