void Unit::CalculateResistanceReduction(Unit *pVictim,dealdamage * dmg) { float AverageResistance = 0.0f; float ArmorReduce; if((*dmg).school_type == 0)//physical { if(this->IsPlayer()) ArmorReduce = PowerCostPctMod[0]; else ArmorReduce = 0.0f; if(ArmorReduce >= pVictim->GetResistance(0)) // fully penetrated :O return; // double Reduction = double(pVictim->GetResistance(0)) / double(pVictim->GetResistance(0)+400+(85*getLevel())); //dmg reduction formula from xinef double Reduction = 0; if(getLevel() < 60) Reduction = double(pVictim->GetResistance(0) - ArmorReduce) / double(pVictim->GetResistance(0)+400+(85*getLevel())); else if(getLevel() > 59 && getLevel() < 70) Reduction = double(pVictim->GetResistance(0) - ArmorReduce) / double(pVictim->GetResistance(0)-22167.5+(467.5*getLevel())); // else Reduction = double(pVictim->GetResistance(0) - ArmorReduce) / double(pVictim->GetResistance(0)+10557.5); if(Reduction > 0.75f) Reduction = 0.75f; else if(Reduction < 0) Reduction = 1; if(Reduction) dmg[0].full_damage = (uint32)(dmg[0].full_damage*(1-Reduction)); // no multiply by 0 } else { // applying resistance to other type of damage int32 RResist = float2int32( float(pVictim->GetResistance( (*dmg).school_type ) + ((pVictim->getLevel() > getLevel()) ? (pVictim->getLevel() - this->getLevel()) * 5 : 0)) - PowerCostPctMod[(*dmg).school_type] ); if (RResist<0) RResist = 0; AverageResistance = (float)(RResist) / (float)(getLevel() * 5) * 0.75f; if(AverageResistance > 0.75f) AverageResistance = 0.75f; // NOT WOWWIKILIKE but i think it's actual to add some fullresist chance frome resistances float Resistchance=(float)pVictim->GetResistance( (*dmg).school_type)/(float)pVictim->getLevel(); Resistchance*=Resistchance; if(Rand(Resistchance)) AverageResistance=1.0f; if(AverageResistance>0) (*dmg).resisted_damage = (uint32)(((*dmg).full_damage)*AverageResistance); else (*dmg).resisted_damage=0; } }