// TODO: Check if we get the correct CR table internal static void UpdateCritChance(this Unit unit) { var chr = unit as Character; if (chr != null) { // Crit chance from crit rating var critChance = chr.GetCombatRating(CombatRating.MeleeCritChance) / GameTables.GetCRTable(CombatRating.MeleeCritChance)[chr.Level - 1]; var rangedCritChance = chr.GetCombatRating(CombatRating.RangedCritChance) / GameTables.GetCRTable(CombatRating.RangedCritChance)[chr.Level - 1]; // Crit chance from agility rangedCritChance += ((Character)unit).Archetype.Class.CalculateRangedCritChance(unit.Level, unit.Agility); rangedCritChance += unit.IntMods[(int)StatModifierInt.RangedCritChance]; critChance += ((Character)unit).Archetype.Class.CalculateMeleeCritChance(unit.Level, unit.Agility); critChance += unit.GetCritMod(DamageSchool.Physical); chr.CritChanceMeleePct = critChance; chr.CritChanceRangedPct = rangedCritChance; chr.CritChanceOffHandPct = critChance; } }
internal static void UpdateExpertise(this Unit unit) { if (unit is Character) { var chr = unit as Character; var expertise = (uint)chr.IntMods[(int)StatModifierInt.Expertise]; expertise += (uint)(chr.GetCombatRating(CombatRating.Expertise) / GameTables.GetCRTable(CombatRating.Expertise)[chr.Level - 1]); chr.Expertise = expertise; } }
internal static void UpdateExpertise(this Unit unit) { if (!(unit is Character)) { return; } Character character = unit as Character; uint num = (uint)character.IntMods[23] + (uint)((double)character.GetCombatRating(CombatRating.Expertise) / (double)GameTables.GetCRTable(CombatRating.Expertise)[character.Level - 1]); character.Expertise = num; }
internal static void UpdateSpellCritChance(this Character chr) { chr.UpdateCritChance(); for (var school = DamageSchool.Physical + 1; school < DamageSchool.Count; school++) { var chance = chr.GetCombatRating(CombatRating.SpellCritChance) / GameTables.GetCRTable(CombatRating.SpellCritChance)[chr.Level - 1]; chance += chr.Archetype.Class.CalculateMagicCritChance(chr.Level, chr.Intellect); chance += chr.GetCritMod(school); chr.SetCritChance(school, chance); } }
internal static void UpdateRangedHitChance(this Unit unit) { float hitChance; hitChance = unit.IntMods[(int)StatModifierInt.HitChance]; if (unit is Character) { var chr = unit as Character; hitChance += chr.GetCombatRating(CombatRating.RangedHitChance) / GameTables.GetCRTable(CombatRating.RangedHitChance)[chr.Level - 1]; chr.HitChance = hitChance; } }
/// <summary> /// Increases the defense skill according to your defense rating /// Updates Dodge and Parry chances /// </summary> /// <param name="unit"></param> internal static void UpdateDefense(this Unit unit) { var chr = unit as Character; if (chr != null) { var defense = chr.GetCombatRating(CombatRating.DefenseSkill) / GameTables.GetCRTable(CombatRating.DefenseSkill)[chr.Level - 1]; //chr.Defense = chr.Skills[SkillId.Defense].ActualValue + defense; chr.Defense = (uint)defense; UpdateDodgeChance(unit); UpdateParryChance(unit); } }
internal static void UpdateDodgeChance(this Unit unit) { var chr = unit as Character; if (chr != null) { float dodgeChance = 0; if (chr.Agility == 0) { return; // too early } dodgeChance += (chr.GetCombatRating(CombatRating.Dodge) / GameTables.GetCRTable(CombatRating.Dodge)[chr.Level - 1]); dodgeChance += ((Character)unit).Archetype.Class.CalculateDodge(unit.Level, unit.Agility, unit.BaseStats[(int)StatType.Agility], (int)chr.Skills.GetValue(SkillId.Defense), chr.GetCombatRating(CombatRating.Dodge), chr.GetCombatRating(CombatRating.DefenseSkill) ); dodgeChance += unit.IntMods[(int)StatModifierInt.DodgeChance]; chr.DodgeChance = dodgeChance; } }
internal static void UpdateBlockChance(this Unit unit) { var chr = unit as Character; if (chr == null) { return; } var inv = chr.Inventory; if (inv == null) { // called too early return; } var shield = inv[InventorySlot.OffHand]; var blockValue = 0; var blockChance = 0f; if (shield != null && shield.Template.InventorySlotType == InventorySlotType.Shield) { blockChance = chr.IntMods[(int)StatModifierInt.BlockChance]; blockValue = 5 + (int)shield.Template.BlockValue + (int)blockChance; // + block from block rating blockChance += chr.GetCombatRating(CombatRating.Block) / GameTables.GetCRTable(CombatRating.Block)[chr.Level - 1]; } blockValue += chr.Strength / 2 - 10; blockValue = GetMultiMod(chr.FloatMods[(int)StatModifierFloat.BlockValue], blockValue); chr.BlockValue = (uint)blockValue; chr.BlockChance = blockChance; }
private static void WriteTable(CombatRating rating, StreamWriter writer) { var table = GameTables.GetCRTable(rating); WriteTable(table, writer); }