Mario Punch

Mario Punch 01.09.2025

Нет прав для скачивания
C++:
#include <amxmisc>
#include <hamsandwich>
#include <reapi>
#include <xs>

#define FNullString(%0)            (!%0[0] || %0[0] == '0' || strlen(%0) <= 0)

new Float:mario_falldmg;
new Float:mario_attack_damage;
new mario_gibs;
new mario_dodge;
new Float:mario_incoming_damage_multi;
new mario_sound[64];

new Float:flFallVelocity;

public plugin_precache()
{
    register_plugin("Mario Punch", "01.09.2025", "@emmajule");
    
    parse_cfg();
    
    if (!FNullString(mario_sound)) {
        precache_sound(mario_sound);
    }
}

public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_FlPlayerFallDamage, "CSGameRules_FlPlayerFallDamage", false);
    RegisterHookChain(RG_CSGameRules_FlPlayerFallDamage, "CSGameRules_FlPlayerFallDamage_Post", true);
}

public CSGameRules_FlPlayerFallDamage(const id)
{
    flFallVelocity = Float:get_member(id, m_flFallVelocity);
}

public CSGameRules_FlPlayerFallDamage_Post(const id)
{
    new target_id = get_entvar(id, var_groundentity);
    
    if (is_nullent(target_id)) {
        return;
    }
    
    if (!ExecuteHam(Ham_IsPlayer, target_id)) {
        return;
    }
    
    if (!rg_is_player_can_takedamage(target_id, id)) {
        return;
    }
    
    new Float:falldmg = Float:GetHookChainReturn(ATYPE_FLOAT);
    if (falldmg < mario_falldmg) {
        return;
    }
    
    new Float:attackedDamage = falldmg;
    if (mario_attack_damage != 0.0) {
        attackedDamage = mario_attack_damage;
    }
    
    new damageType = DMG_CRUSH;
    if (mario_gibs) {
        damageType |= DMG_ALWAYSGIB;
    }
    
    set_member(target_id, m_LastHitGroup, HITGROUP_GENERIC);
    
    // ExecuteHamB(Ham_TakeDamage, target_id, 0, id, attackedDamage, damageType);
    rg_multidmg_clear();
    rg_multidmg_add(0, target_id, attackedDamage, damageType);
    rg_multidmg_apply(0, id);
    
    if (!FNullString(mario_sound)) {
        rh_emit_sound2(id, 0, CHAN_AUTO, mario_sound);
    }
    
    if (mario_dodge != 0) {
        static Float:vel[3];
        get_entvar(id, var_velocity, vel);
        
        vel[2] = mario_dodge == 1 ? flFallVelocity : float(mario_dodge);
        set_entvar(id, var_velocity, vel);
    }
    
    falldmg *= mario_incoming_damage_multi;
    SetHookChainReturn(ATYPE_FLOAT, falldmg);
}

parse_cfg()
{
    bind_pcvar_float(create_cvar("mario_falldmg", "0", .description = "Сколько нужно получить урон от падения чтобы удар сработал^n0 - Практически при малейшем уроне!"), mario_falldmg);
    bind_pcvar_float(create_cvar("mario_attack_damage", "100", .description = "Урон от удара^nЕсли 0, то будет использоватся тот же урон что и от падения"), mario_attack_damage);
    bind_pcvar_num(create_cvar("mario_gibs", "0", .description = "Смерть от удара будет в ошметки"), mario_gibs);
    bind_pcvar_num(create_cvar("mario_dodge", "350", .description = "После совершения удара игрок подпрыгивает^n1 - На ту же скорость что была при падении^n>2 - Произвольная указанная скорость"), mario_dodge);
    bind_pcvar_float(create_cvar("mario_incoming_damage_multi", "0", .description = "Множитель входящего урона от падения при успешном совершении удара^nНапример при 0 игрок вообще не получит урона, 0.5 - половину!"), mario_incoming_damage_multi);
    bind_pcvar_string(create_cvar("mario_sound", "nolkfun/goomba_stomp.wav", .description = "Звук применения удара^nИспользуйте 0 или пустые ковычки если не нужен."), mario_sound, 63);
    
    new path[PLATFORM_MAX_PATH];
    get_configsdir(path, charsmax(path));
    // strcat(path, "/plugins/mario_punch.cfg", charsmax(path));
    strcat(path, "/mario_punch.cfg", charsmax(path));
    
    server_cmd("exec %s", path);
    server_exec();
}
Назад
Верх