public ObrazeniaPre(this, idinflictor, idattacker, Float:damage, damagebits) {
if(!is_user_connected(idattacker))
return HAM_IGNORED;
if(!is_user_alive(this) || get_user_health(this) < 2)
return HAM_IGNORED;
if(damagebits & (1<<6)) {
SetHamParamFloat(4, float(floatround(damage*1.2)));
return HAM_HANDLED;
}
if(/*!get_pcvar_num(g_Cvary[e_friendly_fire]) && */get_user_team(this) == get_user_team(idattacker))
return HAM_IGNORED;
if(!gInfPla[this][epd_klasa] && !gInfPla[idattacker][epd_klasa])
return HAM_IGNORED;
new weapon;
if(idinflictor == idattacker) weapon = get_user_weapon(idattacker);
else if(damagebits & (1<<24) && is_valid_ent(idinflictor)) {
new szClass[32];
entity_get_string(idinflictor, EV_SZ_classname, szClass, 31);
if(equal(szClass, "grenade"))
weapon = CSW_HEGRENADE;
}
if(weapon <= 0)
return HAM_IGNORED;
static Float:fNewDamage; fNewDamage = damage;
fNewDamage -= (damage*Float:gInfPla[this][epd_redukcja_obrazen]);
fNewDamage += (fNewDamage*Float:gInfPla[idattacker][epd_zwiekszenie_obrazen]);
ObrazeniaItemu(this, fNewDamage);
ObrazeniaExp(this, idattacker, fNewDamage);
ObrazeniaGold(idattacker, fNewDamage);
new bool:zmiana;
if(!gInfPla[this][epd_diablo]) {
new Float:takedamage[3], iRet, iRet2;
takedamage[0] = damage;
takedamage[1] = fNewDamage;
static function_call, dklasa_data[data_klasa], ditem_array[data_item];
if(gInfPla[this][epd_klasa]) {
ArrayGetArray(array_klasa, gInfPla[this][epd_klasa], dklasa_data);
function_call = get_func_id("dbm_take_class_damage", dklasa_data[pluginy_klas]);
if(function_call != -1) {
callfunc_begin_i(function_call, dklasa_data[pluginy_klas]);
callfunc_push_int(this);
callfunc_push_int(idattacker);
callfunc_push_array(_:takedamage, 3, true);
callfunc_push_int(weapon);
callfunc_push_int(damagebits);
iRet = callfunc_end();
}
}
if(gInfPla[idattacker][epd_klasa]) {
ArrayGetArray(array_klasa, gInfPla[idattacker][epd_klasa], dklasa_data);
function_call = get_func_id("dbm_take_class_damage", dklasa_data[pluginy_klas]);
if(function_call != -1) {
callfunc_begin_i(function_call, dklasa_data[pluginy_klas]);
callfunc_push_int(this);
callfunc_push_int(idattacker);
callfunc_push_array(_:takedamage, 3, true);
callfunc_push_int(weapon);
callfunc_push_int(damagebits);
iRet2 = callfunc_end();
}
}
if(iRet2 > iRet) iRet = iRet2;
if(gInfPla[this][epd_item]) {
ArrayGetArray(array_item, gInfPla[this][epd_item], ditem_array);
function_call = get_func_id("dbm_take_item_damage", ditem_array[pluginy_itemow]);
if(function_call != -1) {
callfunc_begin_i(function_call, ditem_array[pluginy_itemow]);
callfunc_push_int(this);
callfunc_push_int(idattacker);
callfunc_push_array(_:takedamage, 3, true);
callfunc_push_int(weapon);
callfunc_push_int(damagebits);
iRet2 = callfunc_end();
}
}
if(iRet2 > iRet) iRet = iRet2;
if(gInfPla[idattacker][epd_item]) {
ArrayGetArray(array_item, gInfPla[idattacker][epd_item], ditem_array);
function_call = get_func_id("dbm_take_item_damage", ditem_array[pluginy_itemow]);
if(function_call != -1) {
callfunc_begin_i(function_call, ditem_array[pluginy_itemow]);
callfunc_push_int(this);
callfunc_push_int(idattacker);
callfunc_push_array(_:takedamage, 3, true);
callfunc_push_int(weapon);
callfunc_push_int(damagebits);
iRet2 = callfunc_end();
}
}
if(iRet2 > iRet) iRet = iRet2;
ExecuteForward(g_Forwardy[fw_zadaj_obrazenia], iRet2, this, idattacker, PrepareArray(_:takedamage, 3, 1), weapon, damagebits);
if(iRet2 > iRet) iRet = iRet2;
if(iRet == 4)
return HAM_SUPERCEDE;
else if(iRet == 3) {
SetHamParamEntity(1, idattacker);
SetHamParamEntity(2, this);
SetHamParamEntity(3, this);
zmiana = true;
}
else if(iRet == 2) {
new ret2;
ExecuteForward(g_Forwardy[fw_anti_death], ret2, this);
if(!ret2) {
takedamage[2] = 0.0;
entity_set_float(this, EV_FL_armortype, 0.0);
entity_set_float(this, EV_FL_armorvalue, 0.0);
fNewDamage += get_user_health(this)+1;
}
}
if(takedamage[2] != 0.0)
fNewDamage += takedamage[2];
}
if(fNewDamage != damage) {
if(fNewDamage < 1.0 && damage > 0.0) fNewDamage = 1.0;
//if(entity_get_float(this, EV_FL_health)-fNewDamage < 1.0) fNewDamage += 1.0;
new irounddmg = floatround(fNewDamage);
SetHamParamFloat(4, float(irounddmg));
zmiana = true;
}
if(zmiana)
return HAM_HANDLED;
return HAM_IGNORED;
}