Junior Member
|
04-03-2021
, 10:05
Don`t working function Ham_TakeDamage (ZP)
|
#1
|
Hello guys. Need your help. Not working Ham_TakeDamage. When human for the medic/technik (CASE_MEDIC, CASE_TECHNIC) class strikes another human, then the hp or armor doesn`t restored.
Thank you in advance.
Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <zombie_plague_advance>
#include <cromchat>
// Количество ваших классов
#define CLASS_COUNT 9
#define MEDIC_SOUND "items/tr_kevlar.wav"
#define TECHNIC_SOUND "items/tr_kevlar.wav"
#define DMG_KNIFE ( DMG_NEVERGIB | DMG_BULLET )
native zp_level(id)
native give_weapon_akdragon(id)
native give_weapon_p90lapin(id)
native give_weapon_m4a1dragon(id)
new g_class[33]
new g_class_temp[33]
new g_class_level[CLASS_COUNT] = {0, 2, 3, 5, 7, 10, 15, 18, 25}
new g_class_names[CLASS_COUNT][128]
// CVARS
new Float:g_max_health
new Float:g_max_armor
new Float:g_count_armor_class
new g_count_ammo_class_from, g_count_ammo_class_to
new Float:g_percent_damager_class
new Float:g_percent_regen_class
new Float:g_count_armor_prof_class
new Float:g_medic_regen
new Float:g_technic_regen
new g_bankir_ammo[33]
enum
{
CASE_STANDART = 0,
CASE_ARMOR,
CASE_BANKIR,
CASE_MEDIC,
CASE_TECHNIC,
CASE_SNIPER,
CASE_DAMAGER,
CASE_VAMPIRISM,
CASE_PROFI
}
public plugin_init()
{
register_plugin("[ZP] Human Classes", "1.0", "Robert7791")
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
RegisterHam(Ham_Spawn, "player", "fwd_HamSpawn_Post", true);
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_clcmd("human_classes", "show_menu_classes")
register_dictionary("zp_hclasses.txt")
register_cvar("zp_hclass_max_health", "500.0")
register_cvar("zp_hclass_max_armor", "300.0")
register_cvar("zp_hclass_armor", "50.0")
register_cvar("zp_hclass_ammo_from", "5")
register_cvar("zp_hclass_ammo_to", "15")
register_cvar("zp_hclass_percent_damage", "1.15")
register_cvar("zp_hclass_percent_regen", "0.15")
register_cvar("zp_hclass_percent_engineer", "30")
register_cvar("zp_hclass_armor_prof", "100.0")
register_cvar("zp_hclass_medic_regen", "100.0")
register_cvar("zp_hclass_technic_regen", "100.0")
}
public plugin_cfg()
{
new szConfigsDir[64];
get_configsdir(szConfigsDir, charsmax(szConfigsDir));
server_cmd("exec %s/human_classes.cfg", szConfigsDir);
set_task(0.1, "CvarsLoad", 12433);
}
public CvarsLoad()
{
g_max_health = get_cvar_float("zp_hclass_max_health")
g_max_armor = get_cvar_float("zp_hclass_max_armor")
g_count_armor_class = get_cvar_float("zp_hclass_armor")
g_count_ammo_class_from = get_cvar_num("zp_hclass_ammo_from")
g_count_ammo_class_to = get_cvar_num("zp_hclass_ammo_to")
g_percent_damager_class = get_cvar_float("zp_hclass_percent_damage")
g_percent_regen_class = get_cvar_float("zp_hclass_percent_regen")
g_count_armor_prof_class = get_cvar_float("zp_hclass_armor_prof")
g_medic_regen = get_cvar_float("zp_hclass_medic_regen")
g_technic_regen = get_cvar_float("zp_hclass_technic_regen")
formatex(g_class_names[0], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_0", LANG_PLAYER, "HCLASS_ABILITY_0")
formatex(g_class_names[1], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_1", LANG_PLAYER, "HCLASS_ABILITY_1")
formatex(g_class_names[2], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_2", LANG_PLAYER, "HCLASS_ABILITY_2")
formatex(g_class_names[3], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_3", LANG_PLAYER, "HCLASS_ABILITY_3")
formatex(g_class_names[4], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_4", LANG_PLAYER, "HCLASS_ABILITY_4")
formatex(g_class_names[5], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_5", LANG_PLAYER, "HCLASS_ABILITY_5")
formatex(g_class_names[6], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_6", LANG_PLAYER, "HCLASS_ABILITY_6")
formatex(g_class_names[7], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_7", LANG_PLAYER, "HCLASS_ABILITY_7")
formatex(g_class_names[8], charsmax(g_class_names[]), "%L %L", LANG_PLAYER, "HCLASS_NAME_8", LANG_PLAYER, "HCLASS_ABILITY_8")
}
public event_round_start()
{
for (new id=1; id<=32; id++)
g_bankir_ammo[id] = 0
}
public plugin_natives()
{
register_native("get_user_hclass", "native_get_user_hclass", 1)
}
public native_get_user_hclass(id)
{
return g_class[id]
}
public client_putinserver(id)
{
g_class[id] = 0
g_class_temp[id] = 0
g_bankir_ammo[id] = 0
}
public client_disconnect(id)
{
g_class[id] = 0
g_class_temp[id] = 0
g_bankir_ammo[id] = 0
}
public plugin_precache()
{
precache_sound(MEDIC_SOUND)
precache_sound(TECHNIC_SOUND)
}
public show_menu_classes(id)
{
new i_Menu = menu_create("\r[ZP] \wКлассы людей:", "menu_classes")
for (new i=0; i < sizeof(g_class_level); i++)
{
new SzTitleClass[64], SzBtn[10]
if (i == g_class_temp[id])
formatex(SzTitleClass, charsmax(SzTitleClass), "\y%s \r[%dLVL]", g_class_names[i], g_class_level[i])
else if (zp_level(id) >= g_class_level[i])
formatex(SzTitleClass, charsmax(SzTitleClass), "\w%s \r[%dLVL]", g_class_names[i], g_class_level[i])
else
formatex(SzTitleClass, charsmax(SzTitleClass), "\d%s \r[%dLVL]", g_class_names[i], g_class_level[i])
num_to_str(i+1, SzBtn, charsmax(SzBtn))
menu_additem(i_Menu, SzTitleClass, SzBtn)
log_amx("%s", SzTitleClass)
log_amx("%d", SzBtn)
}
menu_setprop(i_Menu, MPROP_BACKNAME, "Назад")
menu_setprop(i_Menu, MPROP_NEXTNAME, "Далее")
menu_setprop(i_Menu, MPROP_EXITNAME, "Выход")
menu_display(id, i_Menu, 0)
}
public menu_classes(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new class_num = str_to_num(s_Data)-1
if (class_num < 0 || class_num > CLASS_COUNT-1)
return PLUGIN_HANDLED
if (!is_user_connected(id))
return PLUGIN_HANDLED
if (zp_level(id) < g_class_level[class_num])
{
CC_SendMessage(id, "^4[ZP] ^1Недостаточный уровень, нужен ^3%d^1!", g_class_level[class_num])
return PLUGIN_HANDLED
}
g_class_temp[id] = class_num
// Для красивого вывода в чат :)
new classname[128]
formatex(classname, charsmax(classname), g_class_names[class_num])
replace_all(classname, charsmax(classname), "\r", "")
replace_all(classname, charsmax(classname), "\y", "")
replace_all(classname, charsmax(classname), "\w", "")
CC_SendMessage(id, "^4[ZP] ^1Вы установили класс: %s", classname)
CC_SendMessage(id, "^4[ZP] ^1Ваш класс изменится в следующем раунде!")
menu_destroy(menu)
return PLUGIN_HANDLED
}
// Forwards
public fwd_HamSpawn_Post(id)
{
if(!is_user_alive(id))
return PLUGIN_HANDLED;
if (zp_get_user_zombie(id) || zp_get_user_survivor(id))
return PLUGIN_HANDLED;
g_class[id] = g_class_temp[id]
switch (g_class[id])
{
case CASE_ARMOR:
{
new Float:armor = g_count_armor_class
if (pev(id, pev_armorvalue) < armor)
set_pev(id, pev_armorvalue, armor)
}
case CASE_BANKIR:
{
// Если в этом раунде уже получали аамо
if(g_bankir_ammo[id])
return PLUGIN_HANDLED
new ammo_from = g_count_ammo_class_from
new ammo_to = g_count_ammo_class_to
new ammo = random_num(ammo_from, ammo_to)
zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + ammo)
g_bankir_ammo[id] = 1
CC_SendMessage(id, "^4[Класс:Банкир] ^1Вы получили ^3%d ^1аммо!", ammo)
}
case CASE_PROFI:
{
new Float:armor = g_count_armor_prof_class
if (pev(id, pev_armorvalue) < armor)
set_pev(id, pev_armorvalue, armor)
new random = random_num(1,3)
switch(random)
{
case 1: give_weapon_m4a1dragon(id)
case 2: give_weapon_p90lapin(id)
case 3: give_weapon_akdragon(id)
}
}
}
return PLUGIN_HANDLED
}
public fw_TakeDamage(victim, weapon, attacker, Float: damage, damagebits)
{
if(victim != attacker && is_user_connected(attacker) && !(zp_get_user_zombie(attacker)))
{
if(g_class[attacker] == CASE_DAMAGER)
SetHamParamFloat(4, damage * g_percent_damager_class)
else if (g_class[attacker] == CASE_MEDIC)
{
if (!(damagebits & DMG_KNIFE))
return HAM_IGNORED
if (!(get_user_weapon(attacker) == CSW_KNIFE))
return HAM_IGNORED
if (zp_get_user_zombie(victim))
return HAM_IGNORED
new Float:health_player
pev(victim, pev_health, health_player)
new Float:NewHealth = health_player + g_medic_regen;
if (NewHealth <= g_max_health)
{
set_pev(victim, pev_health, NewHealth)
}
}
else if (g_class[attacker] == CASE_TECHNIC)
{
if (!(damagebits & DMG_KNIFE))
return HAM_IGNORED
if (!(get_user_weapon(attacker) == CSW_KNIFE))
return HAM_IGNORED
if (zp_get_user_zombie(victim))
return HAM_IGNORED
new Float:armor_player
pev(victim, pev_armorvalue, armor_player)
new Float:NewArmor = armor_player + g_technic_regen;
if (NewArmor <= g_max_armor)
{
set_pev(victim, pev_armorvalue, NewArmor)
client_cmd(attacker, "spk ^"%s^"", TECHNIC_SOUND)
}
}
else if(g_class[attacker] == CASE_VAMPIRISM)
{
if (damagebits!=4098)
return HAM_IGNORED
if (!zp_get_user_zombie(victim))
return HAM_IGNORED
new Float:health_player
pev(attacker, pev_health, health_player)
new Float:NewHealth = health_player + (damage * g_percent_regen_class)
if (NewHealth <= g_max_health)
set_pev(attacker, pev_health, NewHealth)
}
}
return HAM_IGNORED
}
Last edited by snebars; 04-03-2021 at 11:04.
|
|