#include <amxmodx>
#include <hamsandwich>
#include <fun>
#define PLUGIN_NAME "Reflect Shield"
#define PLUGIN_VERSION "1.1"
#define PLUGIN_AUTHOR "Csabika20034 & *tOrNaDo"
// Globális változók a pajzs állapotának és a cooldownnak a tárolására
new bool:g_bShieldActive[33];
new Float:g_fCooldownEnd[33];
// CVAR pointerek a konfigurálhatósághoz
new g_pcvar_duration;
new g_pcvar_cooldown;
new g_pcvar_damage_ratio;
public plugin_init() {
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
// Chat parancs regisztrálása, ez a helyes módja, nem a "+use" felülírása
register_clcmd("say /pajzs", "cmd_activate_shield");
register_clcmd("say_team /pajzs", "cmd_activate_shield");
// Ham_TakeDamage esemény regisztrálása POST módban a nagyobb stabilitásért
RegisterHam(Ham_TakeDamage, "player", "fw_post_TakeDamage", .Post = 1);
// CVAR-ok létrehozása a rugalmas konfigurációért
g_pcvar_duration = register_cvar("shield_duration", "5.0"); // A pajzs aktív időtartama
g_pcvar_cooldown = register_cvar("shield_cooldown", "20.0"); // A képesség cooldownja
g_pcvar_damage_ratio = register_cvar("shield_reflect_ratio", "0.2"); // A visszavert sebzés aránya (0.2 = 20%)
}
// Ha a játékos kilép, nullázzuk az adatait
public client_disconnect(id) {
g_bShieldActive[id] = false;
g_fCooldownEnd[id] = 0.0;
}
// A /pajzs parancsot lekezelő függvény
public cmd_activate_shield(id) {
// Csak élő játékosok használhatják
if (!is_user_alive(id)) {
return;
}
// Ha a pajzs már aktív
if (g_bShieldActive[id]) {
client_print(id, print_chat, "[Pajzs] A képességed már aktív!");
return;
}
// Ha a képesség cooldownon van, visszajelzést adunk a játékosnak
if (get_gametime() < g_fCooldownEnd[id]) {
new Float:fTimeLeft = g_fCooldownEnd[id] - get_gametime();
client_print(id, print_chat, "[Pajzs] A képesség még %d másodpercig nem elérhető.", floatround(fTimeLeft));
return;
}
// Ha minden feltétel teljesül, aktiváljuk a pajzsot
activate_shield(id);
}
public activate_shield(id) {
// Kiolvassuk az értékeket a CVAR-okból
new Float:fDuration = get_pcvar_float(g_pcvar_duration);
new Float:fCooldown = get_pcvar_float(g_pcvar_cooldown);
g_bShieldActive[id] = true;
// A cooldown az aktiválás pillanatában elindul
g_fCooldownEnd[id] = get_gametime() + fCooldown;
// Glow effekt beállítása (piros)
set_user_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16);
// Időzítő beállítása a pajzs kikapcsolásához
set_task(fDuration, "deactivate_shield", id);
client_print(id, print_center, "Visszasebző pajzs AKTÍV!");
}
public deactivate_shield(id) {
// Ellenőrizzük, hogy a játékos még a szerveren van-e
if (!is_user_connected(id)) {
return;
}
g_bShieldActive[id] = false;
// A renderelés helyes visszaállítása az alapértelmezett értékekkel
set_user_rendering(id, kRenderNormal, 0, 0, 0, kRenderNormal, 0);
client_print(id, print_center, "Visszasebző pajzs LEJÁRT!");
}
// A sebzési eseményt lekezelő függvény
public fw_post_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits) {
// Csak akkor foglalkozunk vele, ha a támadó és az áldozat is érvényes játékos
if (attacker <= 0 || attacker > 32 || victim == attacker) {
return;
}
// Ha az áldozat pajzsa aktív, és nem csapattársak
if (g_bShieldActive[victim] && get_user_team(victim) != get_user_team(attacker)) {
// Kiszámoljuk a visszavert sebzést
new Float:fReflectDamage = damage * get_pcvar_float(g_pcvar_damage_ratio);
// A sebzést a helyes módszerrel (ExecuteHam) adjuk a támadónak
// A sebzés forrása az áldozat (victim) lesz
ExecuteHam(Ham_TakeDamage, attacker, victim, fReflectDamage, damagebits | DMG_GENERIC);
// Opcionális visszajelzés a támadónak
client_print(attacker, print_center, "Megsebzett a visszaverő pajzs!");
}
}