You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

600 lines
15 KiB

-- Pawn by Vger-Azjol-Nerub
-- www.vgermods.com
-- © 2006-2021 Travis Spomer. This mod is released under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 license.
-- See Readme.htm for more information.
--
-- Scale templates
------------------------------------------------------------
-- Test code for getting spec IDs matched up:
--/script local Index; for Index = 1, GetNumSpecializations() do local ID, Name = GetSpecializationInfo(Index) VgerCore.Message("(" .. Index .. ") Spec ID " .. ID .. " is " .. Name) end
-- Returns the template from PawnScaleTemplates for a given class ID and spec ID.
function PawnFindScaleTemplate(ClassID, SpecID)
local _, Template
if VgerCore.IsClassic or VgerCore.IsBurningCrusade then
for _, Template in pairs(PawnScaleTemplatesClassic) do
if Template.ClassID == ClassID then return Template end
end
else
for _, Template in pairs(PawnScaleTemplates) do
if Template.ClassID == ClassID and Template.SpecID == SpecID then return Template end
end
end
VgerCore.Fail("Failed to find a scale template for class " .. tostring(ClassID) .. " and spec " .. tostring(SpecID))
end
-- Returns a starter set of stat values for a given template row returned by PawnFindScaleTemplate.
function PawnGetStatValuesForTemplate(Template, NoStats)
local ScaleValues, StatName
if NoStats then
ScaleValues = {}
else
if VgerCore.IsClassic or VgerCore.IsBurningCrusade then
ScaleValues =
{
["Stamina"] = 0.01,
["Armor"] = 0.1,
-- These should really be multiplied on Classic Era, but this is just a template so the values aren't that important.
["HitRating"] = 1,
["SpellHitRating"] = 1,
["CritRating"] = 1,
["SpellCritRating"] = 1,
["HasteRating"] = 1,
["SpellHasteRating"] = 1,
["ExpertiseRating"] = 1,
["SpellPenetration"] = 1,
-- ["AxeRating"] = 1,
-- ["2HAxeRating"] = 1,
-- ["DaggerRating"] = 1,
-- ["SwordRating"] = 1,
-- ["2HSwordRating"] = 1,
-- ["MaceRating"] = 1,
-- ["2HMaceRating"] = 1,
-- ["UnarmedRating"] = 1,
-- ["GunRating"] = 1,
-- ["BowRating"] = 1,
-- ["CrossbowRating"] = 1,
["Ap"] = 0.5,
["Rap"] = 0.4,
["FeralAp"] = 0.5,
["SpellDamage"] = 0.855,
["Healing"] = 0.455,
["DefenseRating"] = 1,
["DodgeRating"] = 1,
["ParryRating"] = 1,
["BlockRating"] = 1,
["BlockValue"] = 0.65,
["ResilienceRating"] = 1,
["MetaSocketEffect"] = 36,
["Mp5"] = 2.5,
["Hp5"] = 2.5,
["FireResist"] = 1,
["ShadowResist"] = 1,
["NatureResist"] = 1,
["ArcaneResist"] = 1,
["FrostResist"] = 1,
["FireSpellDamage"] = 0.7,
["ShadowSpellDamage"] = 0.7,
["NatureSpellDamage"] = 0.7,
["ArcaneSpellDamage"] = 0.7,
["FrostSpellDamage"] = 0.7,
["HolySpellDamage"] = 0.7,
["Dps"] = 3.4,
}
local UsesPhysicalAttacks, UsesSpells
for _, StatName in pairs(Template.PrimaryStats) do
ScaleValues[StatName] = 1
if StatName == "Strength" or StatName == "Agility" then UsesPhysicalAttacks = true end
if StatName == "Intellect" then UsesSpells = true end
end
-- For pure casters that never use strength or agility, remove stats like AP and DPS.
if not UsesPhysicalAttacks then
ScaleValues.Ap = nil
ScaleValues.Rap = nil
ScaleValues.FeralAp = nil
ScaleValues.DefenseRating = nil
ScaleValues.DodgeRating = nil
ScaleValues.ParryRating = nil
ScaleValues.Dps = nil
ScaleValues.AxeRating = nil
ScaleValues["2HAxeRating"] = nil
ScaleValues.DaggerRating = nil
ScaleValues.SwordRating = nil
ScaleValues["2HSwordRating"] = nil
ScaleValues.MaceRating = nil
ScaleValues["2HMaceRating"] = nil
ScaleValues.UnarmedRating = nil
ScaleValues.GunRating = nil
ScaleValues.BowRating = nil
ScaleValues.CrossbowRating = nil
end
-- For non-casters, remove the spell stats.
if not UsesSpells then
ScaleValues.SpellCritRating = nil
ScaleValues.SpellHitRating = nil
ScaleValues.SpellHasteRating = nil
ScaleValues.SpellDamage = nil
ScaleValues.Healing = nil
ScaleValues.Mp5 = nil
ScaleValues.FireSpellDamage = nil
ScaleValues.ShadowSpellDamage = nil
ScaleValues.NatureSpellDamage = nil
ScaleValues.ArcaneSpellDamage = nil
ScaleValues.FrostSpellDamage = nil
ScaleValues.HolySpellDamage = nil
end
-- Only druids can make use of feral AP.
if Template.ClassID ~= 11 then
ScaleValues.FeralAp = nil
end
else
ScaleValues =
{
["Stamina"] = 0.01,
["CritRating"] = 0.5,
["HasteRating"] = 0.5,
["MasteryRating"] = 0.5,
["Versatility"] = 0.5,
["MovementSpeed"] = 0.01,
["Avoidance"] = 0.01,
["Leech"] = 0.01,
["Indestructible"] = 0.01,
}
ScaleValues[Template.PrimaryStat] = 1
if Template.Role == "TANK" then
ScaleValues.Stamina = 1
ScaleValues.Armor = 1
end
end
end
for _, StatName in pairs(PawnNeverUsableStats[Template.ClassID]) do
ScaleValues[StatName] = PawnIgnoreStatValue
end
if Template.UnusableStats then
for _, StatName in pairs(Template.UnusableStats) do
ScaleValues[StatName] = PawnIgnoreStatValue
if (VgerCore.IsClassic or VgerCore.IsBurningCrusade) and StatName == "IsShield" then
ScaleValues.BlockRating = nil
ScaleValues.BlockValue = nil
end
end
end
return ScaleValues
end
-- PawnScaleTemplates: Master list of scale templates for each class and spec.
PawnScaleTemplates =
{
{
["ClassID"] = 6, -- Death Knight
["SpecID"] = 1, -- Blood
["Role"] = "TANK",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 6, -- Death Knight
["SpecID"] = 2, -- Frost
["Role"] = "DAMAGER",
["PrimaryStat"] = "Strength",
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 6, -- Death Knight
["SpecID"] = 3, -- Unholy
["Role"] = "DAMAGER",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 12, -- Demon Hunter
["SpecID"] = 1, -- Havoc
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 12, -- Demon Hunter
["SpecID"] = 2, -- Vengeance
["Role"] = "TANK",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 11, -- Druid
["SpecID"] = 1, -- Balance
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 11, -- Druid
["SpecID"] = 2, -- Feral
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 11, -- Druid
["SpecID"] = 3, -- Guardian
["Role"] = "TANK",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 11, -- Druid
["SpecID"] = 4, -- Restoration
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 3, -- Hunter
["SpecID"] = 1, -- Beast Mastery
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsDagger", "IsPolearm", "IsStaff", "IsFist", "IsSword", "Is2HSword", "IsAxe", "Is2HAxe", "IsOffHand", "IsFrill" }
},
{
["ClassID"] = 3, -- Hunter
["SpecID"] = 2, -- Marksmanship
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsDagger", "IsPolearm", "IsStaff", "IsFist", "IsSword", "Is2HSword", "IsAxe", "Is2HAxe", "IsOffHand", "IsFrill" }
},
{
["ClassID"] = 3, -- Hunter
["SpecID"] = 3, -- Survival
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 8, -- Mage
["SpecID"] = 1, -- Arcane
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 8, -- Mage
["SpecID"] = 2, -- Fire
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 8, -- Mage
["SpecID"] = 3, -- Frost
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 10, -- Monk
["SpecID"] = 1, -- Brewmaster
["Role"] = "TANK",
["PrimaryStat"] = "Agility",
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 10, -- Monk
["SpecID"] = 2, -- Mistweaver
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = { "IsOffHand" }
},
{
["ClassID"] = 10, -- Monk
["SpecID"] = 3, -- Windwalker
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFrill" }
},
{
["ClassID"] = 2, -- Paladin
["SpecID"] = 1, -- Holy
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = {}
},
{
["ClassID"] = 2, -- Paladin
["SpecID"] = 2, -- Protection
["Role"] = "TANK",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = {}
},
{
["ClassID"] = 2, -- Paladin
["SpecID"] = 3, -- Retribution
["Role"] = "DAMAGER",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = {}
},
{
["ClassID"] = 5, -- Priest
["SpecID"] = 1, -- Discipline
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 5, -- Priest
["SpecID"] = 2, -- Holy
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 5, -- Priest
["SpecID"] = 3, -- Shadow
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 4, -- Rogue
["SpecID"] = 1, -- Assassination
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFist", "IsAxe", "IsMace", "IsSword", "IsBow", "IsCrossbow", "IsGun", "IsFrill" }
},
{
["ClassID"] = 4, -- Rogue
["SpecID"] = 2, -- Outlaw
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsBow", "IsCrossbow", "IsGun", "IsFrill" }
},
{
["ClassID"] = 4, -- Rogue
["SpecID"] = 3, -- Subtlety
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFist", "IsAxe", "IsMace", "IsSword", "IsBow", "IsCrossbow", "IsGun", "IsFrill" }
},
{
["ClassID"] = 7, -- Shaman
["SpecID"] = 1, -- Elemental
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = { "IsOffHand" }
},
{
["ClassID"] = 7, -- Shaman
["SpecID"] = 2, -- Enhancement
["Role"] = "DAMAGER",
["PrimaryStat"] = "Agility",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsShield", "IsFrill" }
},
{
["ClassID"] = 7, -- Shaman
["SpecID"] = 3, -- Restoration
["Role"] = "HEALER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = { "IsOffHand" }
},
{
["ClassID"] = 9, -- Warlock
["SpecID"] = 1, -- Affliction
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 9, -- Warlock
["SpecID"] = 2, -- Demonology
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 9, -- Warlock
["SpecID"] = 3, -- Destruction
["Role"] = "DAMAGER",
["PrimaryStat"] = "Intellect",
["UnusableStats"] = {}
},
{
["ClassID"] = 1, -- Warrior
["SpecID"] = 1, -- Arms
["Role"] = "DAMAGER",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 1, -- Hide 1H upgrades
["UnusableStats"] = { "IsFrill", "IsBow", "IsCrossbow", "IsGun" }
},
{
["ClassID"] = 1, -- Warrior
["SpecID"] = 2, -- Fury
["Role"] = "DAMAGER",
["PrimaryStat"] = "Strength",
["UnusableStats"] = { "IsFrill", "IsBow", "IsCrossbow", "IsGun" }
},
{
["ClassID"] = 1, -- Warrior
["SpecID"] = 3, -- Protection
["Role"] = "TANK",
["PrimaryStat"] = "Strength",
["HideUpgrades"] = 2, -- Hide 2H upgrades
["UnusableStats"] = { "IsFrill", "IsBow", "IsCrossbow", "IsGun", "IsOffHand" }
},
}
PawnScaleTemplatesClassic =
{
{
["ClassID"] = 11, -- Druid
["PrimaryStats"] = { "Strength", "Agility", "Stamina", "Intellect", "Spirit" }
},
{
["ClassID"] = 3, -- Hunter
["PrimaryStats"] = { "Strength", "Agility", "Intellect" }
},
{
["ClassID"] = 8, -- Mage
["PrimaryStats"] = { "Strength", "Agility", "Intellect", "Spirit" }
},
{
["ClassID"] = 2, -- Paladin
["PrimaryStats"] = { "Strength", "Agility", "Stamina", "Intellect" }
},
{
["ClassID"] = 5, -- Priest
["PrimaryStats"] = { "Intellect", "Spirit" }
},
{
["ClassID"] = 4, -- Rogue
["PrimaryStats"] = { "Strength", "Agility" }
},
{
["ClassID"] = 7, -- Shaman
["PrimaryStats"] = { "Strength", "Agility", "Intellect" }
},
{
["ClassID"] = 9, -- Warlock
["PrimaryStats"] = { "Stamina", "Intellect", "Spirit" }
},
{
["ClassID"] = 1, -- Warrior
["PrimaryStats"] = { "Strength", "Agility", "Stamina" }
},
}
-- PawnNeverUsableStats: Master list of stats that are NEVER usable for each class, regardless of spec.
PawnNeverUsableStats =
{
[1] = -- Warrior
{ "IsWand", "IsWarglaive" },
[2] = -- Paladin
{ "IsDagger", "IsFist", "IsStaff", "IsWand", "IsBow", "IsCrossbow", "IsGun", "IsWarglaive", "IsOffHand", "IsThrown" },
[3] = -- Hunter
{ "IsWand", "IsMace", "Is2HMace", "IsWarglaive", "IsPlate", "IsShield" },
[4] = -- Rogue
{ "IsPolearm", "IsStaff", "Is2HAxe", "Is2HMace", "Is2HSword", "IsWand", "IsWarglaive", "IsMail", "IsPlate", "IsShield" },
[5] = -- Priest
{ "IsAxe", "Is2HAxe", "IsFist", "IsPolearm", "IsSword", "Is2HSword", "Is2HMace", "IsWarglaive", "IsBow", "IsCrossbow", "IsGun", "IsOffHand", "IsLeather", "IsMail", "IsPlate", "IsShield", "IsThrown" },
[6] = -- Death Knight
{ "IsDagger", "IsFist", "IsWand", "IsBow", "IsCrossbow", "IsGun", "IsStaff", "IsWarglaive", "IsShield", "IsThrown" },
[7] = -- Shaman
{ "IsPolearm", "IsSword", "Is2HSword", "IsWand", "IsBow", "IsCrossbow", "IsGun", "IsWarglaive", "IsPlate", "IsThrown" },
[8] = -- Mage
{ "IsAxe", "Is2HAxe", "IsFist", "IsPolearm", "Is2HSword", "IsMace", "Is2HMace", "IsWarglaive", "IsBow", "IsCrossbow", "IsGun", "IsOffHand", "IsLeather", "IsMail", "IsPlate", "IsShield", "IsThrown" },
[9] = -- Warlock
{ "IsAxe", "Is2HAxe", "IsFist", "IsPolearm", "Is2HSword", "IsMace", "Is2HMace", "IsWarglaive", "IsBow", "IsCrossbow", "IsGun", "IsOffHand", "IsLeather", "IsMail", "IsPlate", "IsShield", "IsThrown" },
[10] = -- Monk
{ "IsDagger", "Is2HAxe", "Is2HMace", "Is2HSword", "IsWand", "IsBow", "IsCrossbow", "IsGun", "IsWarglaive", "IsMail", "IsPlate", "IsShield", "IsOffHand", "IsThrown" },
[11] = -- Druid
{ "IsWand", "IsBow", "IsCrossbow", "IsGun", "IsAxe", "Is2HAxe", "IsSword", "Is2HSword", "IsWarglaive", "IsOffHand", "IsMail", "IsPlate", "IsShield", "IsThrown" },
-- Note: feral and guardian artifacts are actually off-hand items, even though druids can't normally equip them.
[12] = -- Demon Hunter
{ "IsDagger", "IsMace", "IsWand", "IsBow", "IsCrossbow", "IsGun", "Is2HAxe", "Is2HMace", "Is2HSword", "IsPolearm", "IsStaff", "IsMail", "IsPlate", "IsShield", "IsThrown" },
}
if VgerCore.IsClassic then
-- Shamans didn't learn to dual-wield until Burning Crusade.
tinsert(PawnNeverUsableStats[7], "IsOffHand")
end
if VgerCore.IsClassic or VgerCore.IsBurningCrusade then
-- Rogues didn't learn to use axes until Wrath of the Lich King.
tinsert(PawnNeverUsableStats[4], "IsAxe")
end