Благодаря предварително!
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <reapi>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
new g_iMaxPlayers;
#define IsPlayer(%1) (1 <= (%1) <= g_iMaxPlayers)
#pragma semicolon 1
#pragma ctrlchar '\'
new const __Plugin__[] = "HNS: AntiFrag";
new const __Version__[] = "1.0";
new const __Author__[] = "Kaido Ren";
enum cvarsList {
cvarProtectDuration,
cvarRendering,
cvarChatPrefix[32]
} new gl_sCvars[cvarsList] = {
3, // default value for cvarProtectDuration
0, // default value for cvarRendering
"[Fatall-Error](Anti-Frag)" // default value for cvarChatPrefix
};
public plugin_init() {
register_plugin(
.plugin_name = __Plugin__,
.version = __Version__,
.author = __Author__
);
g_iMaxPlayers = get_maxplayers();
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", .post = false);
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_SlowDown", .post = true);
register_srvcmd("hns_antifrag_pd", "CvarChangesHandler");
register_srvcmd("hns_antifrag_prefix", "CvarChangesHandler");
register_srvcmd("hns_antifrag_render", "CvarChangesHandler");
register_dictionary("hns_antifrag.txt");
}
const damageKnife = (DMG_NEVERGIB);
public CBasePlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType) {
if (!IsPlayer(pevAttacker) || pevInflictor != pevAttacker || !rg_is_player_can_takedamage(this, pevAttacker)) {
return HC_CONTINUE;
}
if (~bitsDamageType & damageKnife) {
return HC_CONTINUE;
}
if (!task_exists(this) && get_entvar(this, var_health) <= flDamage) {
return HC_CONTINUE;
}
new szName[2][32];
get_user_name(this, szName[0], charsmax(szName[]));
get_user_name(pevAttacker, szName[1], charsmax(szName[]));
if (task_exists(this)) {
client_print_color(pevAttacker, print_team_default, "\4%s\1 %L", gl_sCvars[cvarChatPrefix], this, "AF_TAKEDMG_PROTECT_FOR_ATTACKER", szName[0]);
SetHookChainArg(4, ATYPE_FLOAT, 0.0);
SetHookChainReturn(ATYPE_INTEGER, 0);
return HC_SUPERCEDE;
}
client_print_color(this, print_team_default, "\4%s\1 %L", gl_sCvars[cvarChatPrefix], this, "AF_TAKEDMG_FOR_VICTIM_1", szName[1]);
client_print_color(this, print_team_default, "\4%s\1 %L", gl_sCvars[cvarChatPrefix], this, "AF_TAKEDMG_FOR_VICTIM_2", gl_sCvars[cvarProtectDuration]);
set_task(float(gl_sCvars[cvarProtectDuration]), "TaskTick", this);
if (gl_sCvars[cvarRendering]) {
rg_set_rendering(this, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 30);
}
return HC_CONTINUE;
}
public CBasePlayer_TakeDamage_SlowDown(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType) {
if (!IsPlayer(pevAttacker) || this == pevAttacker) {
return HC_CONTINUE;
}
if (GetHookChainReturn(ATYPE_INTEGER) && is_user_alive(this)) {
set_member(this, m_flVelocityModifier, 1.0);
}
return HC_CONTINUE;
}
public TaskTick(const player) {
if (gl_sCvars[cvarRendering] && is_user_connected(player)) {
rg_set_rendering(player);
}
}
stock rg_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) {
new Float:renderColor[3];
renderColor[0] = float(r);
renderColor[1] = float(g);
renderColor[2] = float(b);
set_entvar(entity, var_renderfx, fx);
set_entvar(entity, var_rendercolor, renderColor);
set_entvar(entity, var_rendermode, render);
set_entvar(entity, var_renderamt, float(amount));
return 1;
}
public CvarChangesHandler() {
new szArg[2][32];
read_argv(0, szArg[0], charsmax(szArg[]));
switch (szArg[0][14]) {
case 'd': { // hns_antifrag_p > d <
if (read_argv(1, szArg[1], charsmax(szArg[]))) {
gl_sCvars[cvarProtectDuration] = str_to_num(szArg[1]);
}
}
case 'e': { // hns_antifrag_r > e < ndervictim
if (read_argv(1, szArg[1], charsmax(szArg[]))) {
gl_sCvars[cvarRendering] = clamp(str_to_num(szArg[1]), 0, 1);
}
}
case 'r': { // hns_antifrag_p > r < efix
if (read_argv(1, szArg[1], charsmax(szArg[]))) {
copy(gl_sCvars[cvarChatPrefix], charsmax(gl_sCvars[cvarChatPrefix]), szArg[1]);
}
}
}
}