Пример плагина: Хуки урона и здоровья (fun.inc + hamsandwich.inc)
Пример: вампиризм через fun + hamsandwich
<fun> — модуль работы с игроком: здоровье, оружие, оружие модели, noclip, godmode. <hamsandwich> — обёртка над HamSandwich, позволяет перехватывать движковые форварды: Ham_TakeDamage, Ham_Spawn, Ham_Killed и сотни других.
Что делает плагин
- Игрок, нанёсший урон, лечится на 50% от нанесённого урона (вампиризм).
- При спавне каждому игроку даётся 125 HP вместо 100.
- Команда
/heal в чат мгновенно лечит до 100 (кулдаун 30 сек).
Полный код плагина
#include <amxmodx>
#include <fun>
#include <hamsandwich>
new Float:g_next_heal[33];
public plugin_init()
{
register_plugin("Vampire Mod", "1.0", "WikiExample");
RegisterHam(Ham_TakeDamage, "player", "fwd_TakeDamage_Post", 1);
RegisterHam(Ham_Spawn, "player", "fwd_Spawn_Post", 1);
register_clcmd("say /heal", "cmd_heal");
}
public fwd_TakeDamage_Post(victim, inflictor, attacker, Float:damage, damage_bits)
{
if (!is_user_connected(attacker) || attacker == victim)
return HAM_IGNORED;
new Float:heal = damage * 0.5;
new Float:new_hp;
pev(attacker, pev_health, new_hp); // fakemeta для чтения точного HP
new_hp += heal;
if (new_hp > 200.0) new_hp = 200.0;
set_user_health(attacker, floatround(new_hp)); // fun.inc
return HAM_IGNORED;
}
public fwd_Spawn_Post(id)
{
if (!is_user_alive(id)) return HAM_IGNORED;
set_task(0.5, "give_bonushp", id); // ждём пока игрок полностью заспавнится
return HAM_IGNORED;
}
public give_bonushp(id)
{
if (is_user_alive(id))
set_user_health(id, 125);
}
public cmd_heal(id)
{
new Float:now = get_gametime();
if (now < g_next_heal[id])
{
new Float:left = g_next_heal[id] - now;
client_print(id, print_chat, "[Heal] Подождите %.1f сек.", left);
return PLUGIN_HANDLED;
}
set_user_health(id, 100);
g_next_heal[id] = now + 30.0;
client_print(id, print_chat, "[Heal] HP восстановлено. Кулдаун 30 сек.");
return PLUGIN_HANDLED;
}
Ключевые функции
set_user_health(id, hp)— ставит HP (fun.inc).get_user_health(id)— читает.RegisterHam(Ham_TakeDamage, "player", "fwd", post=1)— перехват урона. post=1 = AFTER (по умолчанию pre).set_user_godmode(id, 1)— включает бессмертие (fun.inc).get_gametime()— игровое время (float), удобно для кулдаунов.set_task(seconds, "func", id)— вызывает функцию через N секунд (amxmodx.inc).
Важно: RegisterHam для пост-хука возвращает HAM_IGNORED а не PLUGIN_CONTINUE.
Подробные инструкции и обсуждения ждём вас на нашем форуме — в разделе CS 1.6.