#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();
}