setupQuery) return false; if (is_array($data)) $this->template = $data; else $this->template = DB::Aowow()->SelectRow($this->setupQuery, intVal($data)); if (empty($this->template)) { $this->template = null; return false; } $this->Id = isset($this->template['Id']) ? (int)$this->template['Id'] : (int)$this->template['entry']; } // should return data required to display a listview of any kind public function getListviewData() { } // should return data to extend global js variables for a certain type (e.g. g_items) public function addSelfToJScript(&$ref) { } // should return data to extend global js variables for the rewards provided by this type (e.g. g_titles) public function addRewardsToJscript(&$ref1, &$ref2 = null, &$ref3 = null) { } } class BaseTypeList { public $container = []; public $filter = null; protected $setupQuery = ''; /* * condition as array [field, value, operator] * field: must match fieldname; 1: select everything * value: str - operator defaults to: LIKE %% * int - operator defaults to: = * array - operator defaults to: IN () * operator: modifies/overrides default * ! - negated default value (NOT LIKE; <>; NOT IN) * condition as str * defines linking (AND || OR) * * example: * array(['id', 45], ['name', 'test', '!'], 'OR') * results in * WHERE id = 45 OR name NOT LIKE %test%; */ public function __construct($conditions) { if (!$this->setupQuery) return false; $sql = []; $linking = ' AND '; foreach ($conditions as $c) { $field = ''; $op = ''; $val = ''; if (is_array($c)) { if ($c[0] == '1') { $sql[] = '1'; continue; } else if ($c[0]) { $field = '`'.implode('`.`', explode('.', Util::sqlEscape($c[0]))).'`'; } else continue; if (is_array($c[1])) { $op = (isset($c[2]) && $c[2] == '!') ? 'NOT IN' : 'IN'; $val = '('.implode(',', Util::sqlEscape($c[1])).')'; } else if (is_string($c[1])) { $op = (isset($c[2]) && $c[2] == '!') ? 'NOT LIKE' : 'LIKE'; $val = '"%'.Util::sqlEscape($c[1]).'%"'; } else if (is_int($c[1])) { $op = (isset($c[2]) && $c[2] == '!') ? '<>' : '='; $val = Util::sqlEscape($c[1]); } else continue; if (isset($c[2]) && $c[2] != '!') $op = $c[2]; $sql[] = $field.' '.$op.' '.$val; } else if (is_string($c)) $linking = $c == 'OR' ? ' OR ' : ' AND '; else continue; // ignore other possibilities } // todo: add strings propperly without them being escaped by simpleDB..? $this->setupQuery = str_replace('[filter]', $this->filter && $this->filter->buildFilterQuery() ? $this->filter->query.' AND ' : NULL, $this->setupQuery); $this->setupQuery = str_replace('[cond]', empty($sql) ? '1' : '('.implode($linking, $sql).')', $this->setupQuery); $rows = DB::Aowow()->Select($this->setupQuery); $className = str_replace('List', '', get_class($this)); foreach ($rows as $k => $row) $this->container[$k] = new $className($row); // free dirty mindfuck galore here... } public function getListviewData() { $data = array(); // no extra queries required, just call recursively foreach ($this->container as $type) $data[] = $type->getListviewData(); return $data; } public function addSelfToJScript(&$ref) { // no extra queries required, just call recursively foreach ($this->container as $type) $type->addSelfToJScript($ref); } public function addRewardsToJScript(&$ref1, &$ref2 = null, &$ref3 = null) { // no extra queries required, just call recursively foreach ($this->container as $type) $type->addRewardsToJScript($ref1, $ref2, $ref3); } } class Lang { public static $main; public static $search; public static $game; public static $filter; public static $error; public static $account; public static $achievement; public static $compare; public static $item; public static $maps; public static $spell; public static $talent; public static $zone; public static $title; public static function load($loc) { if (@(include('localization/locale_'.$loc.'.php')) !== 1) die('File for localization '.$loc.' not found.'); foreach ($lang as $k => $v) self::$$k = $v; } // todo: expand public static function getInfoBoxForFlags($flags) { $tmp = array(); if ($flags & CUSTOM_DISABLED) $tmp[] = ''.self::$main['disabled'].''; if ($flags & CUSTOM_SERVERSIDE) $tmp[] = ''.self::$main['serverside'].''; return $tmp; } public static function getReputationLevelForPoints($pts) { if ($pts >= 41999) return self::$game['rep'][REP_EXALTED]; else if ($pts >= 20999) return self::$game['rep'][REP_REVERED]; else if ($pts >= 8999) return self::$game['rep'][REP_HONORED]; else if ($pts >= 2999) return self::$game['rep'][REP_FRIENDLY]; else /* if ($pts >= 1) */ return self::$game['rep'][REP_NEUTRAL]; } public static function getStances($stanceMask) { $stanceMask &= 0x1F84F213E; // clamp to available stances/forms.. $tmp = array(); $i = 1; while ($stanceMask) { if ($stanceMask & (1 << ($i - 1))) { $tmp[] = self::$game['st'][$i]; $stanceMask &= ~(1 << ($i - 1)); } $i++; } return implode(', ', $tmp); } public static function getMagicSchools($schoolMask) { $schoolMask &= 0x7F; // clamp to available schools.. $tmp = array(); $i = 1; while ($schoolMask) { if ($schoolMask & (1 << ($i - 1))) { $tmp[] = self::$game['sc'][$i]; $schoolMask &= ~(1 << ($i - 1)); } $i++; } return implode(', ', $tmp); } public static function getClassString($classMask) { $classMask &= CLASS_MASK_ALL; // clamp to available classes.. if ($classMask == CLASS_MASK_ALL) // available to all classes return false; if (!$classMask) // no restrictions left return false; $tmp = array(); $i = 1; while ($classMask) { if ($classMask & (1 << ($i - 1))) { $tmp[] = ''.self::$game['cl'][$i].''; $classMask &= ~(1 << ($i - 1)); } $i++; } return implode(', ', $tmp); } public static function getRaceString($raceMask) { $raceMask &= RACE_MASK_ALL; // clamp to available races.. if ($raceMask == RACE_MASK_ALL) // available to all races (we don't display 'both factions') return false; if (!$raceMask) // no restrictions left (we don't display 'both factions') return false; $tmp = array(); $side = 0; $i = 1; if (!$raceMask) return array('side' => 3, 'name' => self::$game['ra'][0]); if ($raceMask == RACE_MASK_HORDE) return array('side' => 2, 'name' => self::$game['ra'][-2]); if ($raceMask == RACE_MASK_ALLIANCE) return array('side' => 1, 'name' => self::$game['ra'][-1]); if ($raceMask & RACE_MASK_HORDE) $side |= 2; if ($raceMask & RACE_MASK_ALLIANCE) $side |= 1; while ($raceMask) { if ($raceMask & (1 << ($i - 1))) { $tmp[] = ''.self::$game['ra'][$i].''; $raceMask &= ~(1 << ($i - 1)); } $i++; } return array ('side' => $side, 'name' => implode(', ', $tmp)); } } class Util { public static $resistanceFields = array( null, 'holy_res', 'fire_res', 'nature_res', 'frost_res', 'shadow_res', 'arcane_res' ); private static $rarityColorStings = array( // zero-indexed '9d9d9d', 'ffffff', '1eff00', '0070dd', 'a335ee', 'ff8000', 'e5cc80', 'e6cc80' ); public static $localeStrings = array( // zero-indexed 'enus', null, 'frfr', 'dede', null, null, 'eses', null, 'ruru' ); private static $typeStrings = array( // zero-indexed null, 'npc', 'object', 'item', 'itemset', 'quest', 'spell', 'zone', 'faction', 'pet', 'achievement', 'title', 'event', 'class', 'race', 'skill', null, 'currency' ); public static $combatRatingToItemMod = array( // zero-indexed null, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, null, null, null, null, null, null, 28, 29, 30, null, null, null, 37, 44 ); public static $gtCombatRatings = array( 12 => 1.5, 13 => 12, 14 => 15, 15 => 5, 16 => 10, 17 => 10, 18 => 8, 19 => 14, 20 => 14, 21 => 14, 22 => 10, 23 => 10, 24 => 0, 25 => 0, 26 => 0, 27 => 0, 28 => 10, 29 => 10, 30 => 10, 31 => 10, 32 => 14, 33 => 0, 34 => 0, 35 => 25, 36 => 10, 37 => 2.5, 44 => 3.756097412109376 ); public static $lvlIndepRating = array( // rating doesn't scale with level ITEM_MOD_MANA, ITEM_MOD_HEALTH, ITEM_MOD_ATTACK_POWER, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_BLOCK_VALUE ); public static $questClasses = array( // taken from old aowow: 0,1,2,3,8,10 may point to pointless mini-areas -2 => [ 0], 0 => [ 1, 3, 4, 8, 10, 11, 12, 25, 28, 33, 36, 38, 40, 41, 44, 45, 46, 47, 51, 85, 130, 139, 267, 279, 1497, 1519, 1537, 2257, 3430, 3433, 3487, 4080], 1 => [ 14, 15, 16, 17, 141, 148, 215, 331, 357, 361, 400, 405, 406, 440, 490, 493, 618, 1216, 1377, 1637, 1638, 1657, 3524, 3525, 3557], 2 => [ 133, 206, 209, 491, 717, 718, 719, 722, 796, 978, 1196, 1337, 1417, 1581, 1583, 1584, 1941, 2017, 2057, 2100, 2366, 2367, 2437, 2557, 3477, 3562, 3713, 3714, 3715, 3716, 3717, 3789, 3790, 3791, 3792, 3845, 3846, 3847, 3849, 3905, 4095, 4100, 4120, 4196, 4228, 4264, 4272, 4375, 4415, 4494, 4723], 3 => [ 19, 2159, 2562, 2677, 2717, 3428, 3429, 3456, 3606, 3805, 3836, 3840, 3842, 4273, 4500, 4722, 4812], 4 => [ -372, -263, -262, -261, -162, -161, -141, -82, -81, -61], 5 => [ -373, -371, -324, -304, -264, -201, -182, -181, -121, -101, -24], 6 => [ -25, 2597, 3277, 3358, 3820, 4384, 4710], 7 => [ -368, -367, -365, -344, -241, -1], 8 => [ 3483, 3518, 3519, 3520, 3521, 3522, 3523, 3679, 3703], 9 => [-1008, -1007, -1006, -1005, -1004, -1003, -1002, -1001, -375, -374, -370, -369, -366, -364, -284, -41, -22], 10 => [ 65, 66, 67, 210, 394, 495, 3537, 3711, 4024, 4197, 4395] ); public static $sockets = array( // jsStyle Strings 'meta', 'red', 'yellow', 'blue' ); public static $itemMods = array( // zero-indexed; "mastrtng": unused mastery; _[a-z] => taken mods.. 'dmg', 'mana', 'health', 'agi', 'str', 'int', 'spi', 'sta', 'energy', 'rage', 'focus', 'runicpwr', 'defrtng', 'dodgertng', 'parryrtng', 'blockrtng', 'mlehitrtng', 'rgdhitrtng', 'splhitrtng', 'mlecritstrkrtng', 'rgdcritstrkrtng', 'splcritstrkrtng', '_mlehitrtng', '_rgdhitrtng', '_splhitrtng', '_mlecritstrkrtng', '_rgdcritstrkrtng', '_splcritstrkrtng', 'mlehastertng', 'rgdhastertng', 'splhastertng', 'hitrtng', 'critstrkrtng', '_hitrtng', '_critstrkrtng', 'resirtng', 'hastertng', 'exprtng', 'atkpwr', 'rgdatkpwr', 'feratkpwr', 'splheal', 'spldmg', 'manargn', 'armorpenrtng', 'splpwr', 'healthrgn', 'splpen', 'block', // ITEM_MOD_BLOCK_VALUE 'mastrtng', 'armor', 'firres', 'frores', 'holres', 'shares', 'natres', 'arcres', 'firsplpwr', 'frosplpwr', 'holsplpwr', 'shasplpwr', 'natsplpwr', 'arcsplpwr' ); public static $ssdMaskFields = array( 'shoulderMultiplier', 'trinketMultiplier', 'weaponMultiplier', 'primBudged', 'rangedMultiplier', 'clothShoulderArmor', 'leatherShoulderArmor', 'mailShoulderArmor', 'plateShoulderArmor', 'weaponDPS1H', 'weaponDPS2H', 'casterDPS1H', 'casterDPS2H', 'rangedDPS', 'wandDPS', 'spellPower', null, null, 'tertBudged', 'clothCloakArmor', 'clothChestArmor', 'leatherChestArmor', 'mailChestArmor', 'plateChestArmor' ); public static $changeLevelString = '%s'; public static $filterResultString = 'sprintf(%s, %s, %s) + LANG.dash + LANG.lvnote_tryfiltering.replace(\'\', \'\')'; public static $expansionString = array( // 3 & 4 unused .. obviously null, 'bc', 'wotlk', 'cata', 'mop' ); public static $spellEffectStrings = array( 0 => 'None', 1 => 'Instakill', 2 => 'School Damage', 3 => 'Dummy', 4 => 'Portal Teleport', 5 => 'Teleport Units', 6 => 'Apply Aura', 7 => 'Environmental Damage', 8 => 'Power Drain', 9 => 'Health Leech', 10 => 'Heal', 11 => 'Bind', 12 => 'Portal', 13 => 'Ritual Base', 14 => 'Ritual Specialize', 15 => 'Ritual Activate Portal', 16 => 'Quest Complete', 17 => 'Weapon Damage NoSchool', 18 => 'Resurrect', 19 => 'Add Extra Attacks', 20 => 'Dodge', 21 => 'Evade', 22 => 'Parry', 23 => 'Block', 24 => 'Create Item', 25 => 'Weapon', 26 => 'Defense', 27 => 'Persistent Area Aura', 28 => 'Summon', 29 => 'Leap', 30 => 'Energize', 31 => 'Weapon Percent Damage', 32 => 'Trigger Missile', 33 => 'Open Lock', 34 => 'Summon Change Item', 35 => 'Apply Area Aura Party', 36 => 'Learn Spell', 37 => 'Spell Defense', 38 => 'Dispel', 39 => 'Language', 40 => 'Dual Wield', 41 => 'Jump', 42 => 'Jump Dest', 43 => 'Teleport Units Face Caster', 44 => 'Skill Step', 45 => 'Add Honor', 46 => 'Spawn', 47 => 'Trade Skill', 48 => 'Stealth', 49 => 'Detect', 50 => 'Trans Door', 51 => 'Force Critical Hit', 52 => 'Guarantee Hit', 53 => 'Enchant Item Permanent', 54 => 'Enchant Item Temporary', 55 => 'Tame Creature', 56 => 'Summon Pet', 57 => 'Learn Pet Spell', 58 => 'Weapon Damage', 59 => 'Create Random Item', 60 => 'Proficiency', 61 => 'Send Event', 62 => 'Power Burn', 63 => 'Threat', 64 => 'Trigger Spell', 65 => 'Apply Area Aura Raid', 66 => 'Create Mana Gem', 67 => 'Heal Max Health', 68 => 'Interrupt Cast', 69 => 'Distract', 70 => 'Pull', 71 => 'Pickpocket', 72 => 'Add Farsight', 73 => 'Untrain Talents', 74 => 'Apply Glyph', 75 => 'Heal Mechanical', 76 => 'Summon Object Wild', 77 => 'Script Effect', 78 => 'Attack', 79 => 'Sanctuary', 80 => 'Add Combo Points', 81 => 'Create House', 82 => 'Bind Sight', 83 => 'Duel', 84 => 'Stuck', 85 => 'Summon Player', 86 => 'Activate Object', 87 => 'WMO Damage', 88 => 'WMO Repair', 89 => 'WMO Change', 90 => 'Kill Credit', 91 => 'Threat All', 92 => 'Enchant Held Item', 93 => 'Force Deselect', 94 => 'Self Resurrect', 95 => 'Skinning', 96 => 'Charge', 97 => 'Cast Button', 98 => 'Knock Back', 99 => 'Disenchant', 100 => 'Inebriate', 101 => 'Feed Pet', 102 => 'Dismiss Pet', 103 => 'Reputation', 104 => 'Summon Object Slot1', 105 => 'Summon Object Slot2', 106 => 'Summon Object Slot3', 107 => 'Summon Object Slot4', 108 => 'Dispel Mechanic', 109 => 'Summon Dead Pet', 110 => 'Destroy All Totems', 111 => 'Durability Damage', 112 => 'Summon Demon', 113 => 'Resurrect New', 114 => 'Attack Me', 115 => 'Durability Damage Percent', 116 => 'Skin Player Corpse', 117 => 'Spirit Heal', 118 => 'Skill', 119 => 'Apply Area Aura Pet', 120 => 'Teleport Graveyard', 121 => 'Normalized Weapon Dmg', 122 => 'Unknown Effect', 123 => 'Send Taxi', 124 => 'Pull Towards', 125 => 'Modify Threat Percent', 126 => 'Steal Beneficial Buff', 127 => 'Prospecting', 128 => 'Apply Area Aura Friend', 129 => 'Apply Area Aura Enemy', 130 => 'Redirect Threat', 131 => 'Unknown Effect', 132 => 'Play Music', 133 => 'Unlearn Specialization', 134 => 'Kill Credit2', 135 => 'Call Pet', 136 => 'Heal Percent', 137 => 'Energize Percent', 138 => 'Leap Back', 139 => 'Clear Quest', 140 => 'Force Cast', 141 => 'Force Cast With Value', 142 => 'Trigger Spell With Value', 143 => 'Apply Area Aura Owner', 144 => 'Knock Back Dest', 145 => 'Pull Towards Dest', 146 => 'Activate Rune', 147 => 'Quest Fail', 148 => 'Unknown Effect', 149 => 'Charge Dest', 150 => 'Quest Start', 151 => 'Trigger Spell 2', 152 => 'Unknown Effect', 153 => 'Create Tamed Pet', 154 => 'Discover Taxi', 155 => 'Titan Grip', 156 => 'Enchant Item Prismatic', 157 => 'Create Item 2', 158 => 'Milling', 159 => 'Allow Rename Pet', 160 => 'Unknown Effect', 161 => 'Talent Spec Count', 162 => 'Talent Spec Select', 163 => 'Unknown Effect', 164 => 'Remove Aura' ); public static $spellAuraStrings = array( 0 => 'None', 1 => 'Bind Sight', 2 => 'Mod Possess', 3 => 'Periodic Damage', 4 => 'Dummy', 5 => 'Mod Confuse', 6 => 'Mod Charm', 7 => 'Mod Fear', 8 => 'Periodic Heal', 9 => 'Mod Attack Speed', 10 => 'Mod Threat', 11 => 'Taunt', 12 => 'Stun', 13 => 'Mod Damage Done', 14 => 'Mod Damage Taken', 15 => 'Damage Shield', 16 => 'Mod Stealth', 17 => 'Mod Stealth Detection', 18 => 'Mod Invisibility', 19 => 'Mod Invisibility Detection', 20 => 'Obsolete Mod Health', 21 => 'Obsolete Mod Power', 22 => 'Mod Resistance', 23 => 'Periodic Trigger Spell', 24 => 'Periodic Energize', 25 => 'Pacify', 26 => 'Root', 27 => 'Silence', 28 => 'Reflect Spells', 29 => 'Mod Stat', 30 => 'Mod Skill', 31 => 'Mod Increase Speed', 32 => 'Mod Increase Mounted Speed', 33 => 'Mod Decrease Speed', 34 => 'Mod Increase Health', 35 => 'Mod Increase Energy', 36 => 'Shapeshift', 37 => 'Effect Immunity', 38 => 'State Immunity', 39 => 'School Immunity', 40 => 'Damage Immunity', 41 => 'Dispel Immunity', 42 => 'Proc Trigger Spell', 43 => 'Proc Trigger Damage', 44 => 'Track Creatures', 45 => 'Track Resources', 46 => 'Mod Parry Skill', 47 => 'Mod Parry Percent', 48 => 'Mod Dodge Skill', 49 => 'Mod Dodge Percent', 50 => 'Mod Critical Healing Amount', 51 => 'Mod Block Percent', 52 => 'Mod Weapon Crit Percent', 53 => 'Periodic Leech', 54 => 'Mod Hit Chance', 55 => 'Mod Spell Hit Chance', 56 => 'Transform', 57 => 'Mod Spell Crit Chance', 58 => 'Mod Increase Swim Speed', 59 => 'Mod Damage Done Creature', 60 => 'Pacify Silence', 61 => 'Mod Scale', 62 => 'Periodic Health Funnel', 63 => 'Periodic Mana Funnel', 64 => 'Periodic Mana Leech', 65 => 'Mod Casting Speed (not stacking)', 66 => 'Feign Death', 67 => 'Disarm', 68 => 'Stalked', 69 => 'School Absorb', 70 => 'Extra Attacks', 71 => 'Mod Spell Crit Chance School', 72 => 'Mod Power Cost School Percent', 73 => 'Mod Power Cost School', 74 => 'Reflect Spells School', 75 => 'Language', 76 => 'Far Sight', 77 => 'Mechanic Immunity', 78 => 'Mounted', 79 => 'Mod Damage Percent Done', 80 => 'Mod Percent Stat', 81 => 'Split Damage Percent', 82 => 'Water Breathing', 83 => 'Mod Base Resistance', 84 => 'Mod Health Regeneration', 85 => 'Mod Power Regeneration', 86 => 'Channel Death Item', 87 => 'Mod Damage Percent Taken', 88 => 'Mod Health Regeneration Percent', 89 => 'Periodic Damage Percent', 90 => 'Mod Resist Chance', 91 => 'Mod Detect Range', 92 => 'Prevent Fleeing', 93 => 'Unattackable', 94 => 'Interrupt Regeneration', 95 => 'Ghost', 96 => 'Spell Magnet', 97 => 'Mana Shield', 98 => 'Mod Skill Talent', 99 => 'Mod Attack Power', 100 => 'Auras Visible', 101 => 'Mod Resistance Percent', 102 => 'Mod Melee Attack Power Versus', 103 => 'Mod Total Threat', 104 => 'Water Walk', 105 => 'Feather Fall', 106 => 'Hover', 107 => 'Add Flat Modifier', 108 => 'Add Percent Modifier', 109 => 'Add Target Trigger', 110 => 'Mod Power Regeneration Percent', 111 => 'Add Caster Hit Trigger', 112 => 'Override Class Scripts', 113 => 'Mod Ranged Damage Taken', 114 => 'Mod Ranged Damage Taken Percent', 115 => 'Mod Healing', 116 => 'Mod Regeneration During Combat', 117 => 'Mod Mechanic Resistance', 118 => 'Mod Healing Percent', 119 => 'Share Pet Tracking', 120 => 'Untrackable', 121 => 'Empathy', 122 => 'Mod Offhand Damage Percent', 123 => 'Mod Target Resistance', 124 => 'Mod Ranged Attack Power', 125 => 'Mod Melee Damage Taken', 126 => 'Mod Melee Damage Taken Percent', 127 => 'Ranged Attack Power Attacker Bonus', 128 => 'Possess Pet', 129 => 'Mod Speed Always', 130 => 'Mod Mounted Speed Always', 131 => 'Mod Ranged Attack Power Versus', 132 => 'Mod Increase Energy Percent', 133 => 'Mod Increase Health Percent', 134 => 'Mod Mana Regeneration Interrupt', 135 => 'Mod Healing Done', 136 => 'Mod Healing Done Percent', 137 => 'Mod Total Stat Percentage', 138 => 'Mod Melee Haste', 139 => 'Force Reaction', 140 => 'Mod Ranged Haste', 141 => 'Mod Ranged Ammo Haste', 142 => 'Mod Base Resistance Percent', 143 => 'Mod Resistance Exclusive', 144 => 'Safe Fall', 145 => 'Mod Pet Talent Points', 146 => 'Allow Tame Pet Type', 147 => 'Mechanic Immunity Mask', 148 => 'Retain Combo Points', 149 => 'Reduce Pushback', 150 => 'Mod Shield Blockvalue Percent', 151 => 'Track Stealthed', 152 => 'Mod Detected Range', 153 => 'Split Damage Flat', 154 => 'Mod Stealth Level', 155 => 'Mod Water Breathing', 156 => 'Mod Reputation Gain', 157 => 'Pet Damage Multi', 158 => 'Mod Shield Blockvalue', 159 => 'No PvP Credit', 160 => 'Mod AoE Avoidance', 161 => 'Mod Health Regeneration In Combat', 162 => 'Power Burn Mana', 163 => 'Mod Crit Damage Bonus', 164 => 'Unknown Aura', 165 => 'Melee Attack Power Attacker Bonus', 166 => 'Mod Attack Power Percent', 167 => 'Mod Ranged Attack Power Percent', 168 => 'Mod Damage Done Versus', 169 => 'Mod Crit Percent Versus', 170 => 'Detect Amore', 171 => 'Mod Speed (not stacking)', 172 => 'Mod Mounted Speed (not stacking)', 173 => 'Unknown Aura', 174 => 'Mod Spell Damage Of Stat Percent', 175 => 'Mod Spell Healing Of Stat Percent', 176 => 'Spirit Of Redemption', 177 => 'AoE Charm', 178 => 'Mod Debuff Resistance', 179 => 'Mod Attacker Spell Crit Chance', 180 => 'Mod Flat Spell Damage Versus', 181 => 'Unknown Aura', 182 => 'Mod Resistance Of Stat Percent', 183 => 'Mod Critical Threat', 184 => 'Mod Attacker Melee Hit Chance', 185 => 'Mod Attacker Ranged Hit Chance', 186 => 'Mod Attacker Spell Hit Chance', 187 => 'Mod Attacker Melee Crit Chance', 188 => 'Mod Attacker Ranged Crit Chance', 189 => 'Mod Rating', 190 => 'Mod Faction Reputation Gain', 191 => 'Use Normal Movement Speed', 192 => 'Mod Melee Ranged Haste', 193 => 'Melee Slow', 194 => 'Mod Target Absorb School', 195 => 'Mod Target Ability Absorb School', 196 => 'Mod Cooldown', 197 => 'Mod Attacker Spell And Weapon Crit Chance', 198 => 'Unknown Aura', 199 => 'Mod Increases Spell Percent to Hit', 200 => 'Mod XP Percent', 201 => 'Fly', 202 => 'Ignore Combat Result', 203 => 'Mod Attacker Melee Crit Damage', 204 => 'Mod Attacker Ranged Crit Damage', 205 => 'Mod School Crit Dmg Taken', 206 => 'Mod Increase Vehicle Flight Speed', 207 => 'Mod Increase Mounted Flight Speed', 208 => 'Mod Increase Flight Speed', 209 => 'Mod Mounted Flight Speed Always', 210 => 'Mod Vehicle Speed Always', 211 => 'Mod Flight Speed (not stacking)', 212 => 'Mod Ranged Attack Power Of Stat Percent', 213 => 'Mod Rage from Damage Dealt', 214 => 'Unknown Aura', 215 => 'Arena Preparation', 216 => 'Haste Spells', 217 => 'Unknown Aura', 218 => 'Haste Ranged', 219 => 'Mod Mana Regeneration from Stat', 220 => 'Mod Rating from Stat', 221 => 'Detaunt', 222 => 'Unknown Aura', 223 => 'Raid Proc from Charge', 224 => 'Unknown Aura', 225 => 'Raid Proc from Charge With Value', 226 => 'Periodic Dummy', 227 => 'Periodic Trigger Spell With Value', 228 => 'Detect Stealth', 229 => 'Mod AoE Damage Avoidance', 230 => 'Unknown Aura', 231 => 'Proc Trigger Spell With Value', 232 => 'Mechanic Duration Mod', 233 => 'Unknown Aura', 234 => 'Mechanic Duration Mod (not stacking)', 235 => 'Mod Dispel Resist', 236 => 'Control Vehicle', 237 => 'Mod Spell Damage Of Attack Power', 238 => 'Mod Spell Healing Of Attack Power', 239 => 'Mod Scale 2', 240 => 'Mod Expertise', 241 => 'Force Move Forward', 242 => 'Mod Spell Damage from Healing', 243 => 'Mod Faction', 244 => 'Comprehend Language', 245 => 'Mod Aura Duration By Dispel', 246 => 'Mod Aura Duration By Dispel (not stacking)', 247 => 'Clone Caster', 248 => 'Mod Combat Result Chance', 249 => 'Convert Rune', 250 => 'Mod Increase Health 2', 251 => 'Mod Enemy Dodge', 252 => 'Mod Speed Slow All', 253 => 'Mod Block Crit Chance', 254 => 'Mod Disarm Offhand', 255 => 'Mod Mechanic Damage Taken Percent', 256 => 'No Reagent Use', 257 => 'Mod Target Resist By Spell Class', 258 => 'Unknown Aura', 259 => 'Mod HoT Percent', 260 => 'Screen Effect', 261 => 'Phase', 262 => 'Ability Ignore Aurastate', 263 => 'Allow Only Ability', 264 => 'Unknown Aura', 265 => 'Unknown Aura', 266 => 'Unknown Aura', 267 => 'Mod Immune Aura Apply School', 268 => 'Mod Attack Power Of Stat Percent', 269 => 'Mod Ignore Target Resist', 270 => 'Mod Ability Ignore Target Resist', 271 => 'Mod Damage from Caster', 272 => 'Ignore Melee Reset', 273 => 'X Ray', 274 => 'Ability Consume No Ammo', 275 => 'Mod Ignore Shapeshift', 276 => 'Unknown Aura', 277 => 'Mod Max Affected Targets', 278 => 'Mod Disarm Ranged', 279 => 'Initialize Images', 280 => 'Mod Armor Penetration Percent', 281 => 'Mod Honor Gain Percent', 282 => 'Mod Base Health Percent', 283 => 'Mod Healing Received', 284 => 'Linked', 285 => 'Mod Attack Power Of Armor', 286 => 'Ability Periodic Crit', 287 => 'Deflect Spells', 288 => 'Ignore Hit Direction', 289 => 'Unknown Aura', 290 => 'Mod Crit Percent', 291 => 'Mod XP Quest Percent', 292 => 'Open Stable', 293 => 'Override Spells', 294 => 'Prevent Power Regeneration', 295 => 'Unknown Aura', 296 => 'Set Vehicle Id', 297 => 'Block Spell Family', 298 => 'Strangulate', 299 => 'Unknown Aura', 300 => 'Share Damage Percent', 301 => 'School Heal Absorb', 302 => 'Unknown Aura', 303 => 'Mod Damage Done Versus Aurastate', 304 => 'Mod Fake Inebriate', 305 => 'Mod Minimum Speed', 306 => 'Unknown Aura', 307 => 'Heal Absorb Test', 308 => 'Unknown Aura', 309 => 'Unknown Aura', 310 => 'Mod Creature AoE Damage Avoidance', 311 => 'Unknown Aura', 312 => 'Unknown Aura', 313 => 'Unknown Aura', 314 => 'Prevent Ressurection', 315 => 'Underwater Walking', 316 => 'Periodic Haste' ); public static $bgImagePath = array ( 'tiny' => 'style="background-image: url(/images/icons/tiny/%s.gif)"', 'small' => 'style="background-image: url(/images/icons/small/%s.jpg)"', 'medium' => 'style="background-image: url(/images/icons/medium/%s.jpg)"', 'large' => 'style="background-image: url(/images/icons/large/%s.jpg)"', ); private static $execTime = 0.0; public static function execTime($set = false) { if ($set) { self::$execTime = microTime(true); return; } if (!self::$execTime) return; $newTime = microTime(true); $tDiff = $newTime - self::$execTime; self::$execTime = $newTime; return self::formatTime($tDiff * 1000, true); } public static function colorByRarity($idx) { if (!isset(self::$rarityColorStings)) $idx = 1; return self::$rarityColorStings($idx); } public static function formatMoney($qty) { $money = ''; if ($qty >= 10000) { $g = floor($qty / 10000); $money .= ''.$g.' '; $qty -= $g * 10000; } if ($qty >= 100) { $s = floor($qty / 100); $money .= ''.$s.' '; $qty -= $s * 100; } if ($qty > 0) $money .= ''.$qty.''; return $money; } public static function parseTime($sec) { $time = array(); if ($sec >= 3600 * 24) { $time['d'] = floor($sec / 3600 / 24); $sec -= $time['d'] * 3600 * 24; } if ($sec >= 3600) { $time['h'] = floor($sec / 3600); $sec -= $time['h'] * 3600; } if ($sec >= 60) { $time['m'] = floor($sec / 60); $sec -= $time['m'] * 60; } if ($sec > 0) { $time['s'] = (int)$sec; $sec -= $time['s']; } if (($sec * 1000) % 1000) $time['ms'] = (int)($sec * 1000); return $time; } public static function formatTime($base, $short = false) { $s = self::parseTime($base / 1000); $fmt = array(); if ($short) { if (isset($s['d'])) return round($s['d'])." ".Lang::$main['daysAbbr']; if (isset($s['h'])) return round($s['h'])." ".Lang::$main['hoursAbbr']; if (isset($s['m'])) return round($s['m'])." ".Lang::$main['minutesAbbr']; if (isset($s['s'])) return round($s['s'] + @$s['ms'] / 1000, 2)." ".Lang::$main['secondsAbbr']; if (isset($s['ms'])) return $s['ms']." ".Lang::$main['millisecsAbbr']; } else { if (isset($s['d'])) $fmt[] = $s['d']." ".Lang::$main['days']; if (isset($s['h'])) $fmt[] = $s['h']." ".Lang::$main['hours']; if (isset($s['m'])) $fmt[] = $s['m']." ".Lang::$main['minutes']; if (isset($s['s'])) $fmt[] = $s['s']." ".Lang::$main['seconds']; if (isset($s['ms'])) $fmt[] = $s['ms']." ".Lang::$main['millisecs']; } return implode(' ', $fmt); } public static function sideByRaceMask($race) { if (!$race || $race == RACE_MASK_ALL) // Any return 3; if ($race & RACE_MASK_HORDE) // Horde return 2; if ($race & RACE_MASK_ALLIANCE) // Alliance return 1; return 0; } private static function db_conform_array_callback(&$item, $key) { $item = Util::sqlEscape($item); } public static function sqlEscape($string) { if (!is_array($string)) return mysql_real_escape_string(trim($string)); array_walk($string, 'Util::db_conform_array_callback'); return $string; } public static function jsEscape($string) { return strtr(trim($string), array( '\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', ' '<\/', )); } public static function localizedString($data, $field) { // default back to enUS if localization unavailable // default case: selected locale available if (!empty($data[$field.'_loc'.User::$localeId])) return $data[$field.'_loc'.User::$localeId]; // locale not enUS; aowow-type localization available else if (User::$localeId != LOCALE_EN && isset($data[$field.'_loc0']) && !empty($data[$field.'_loc0'])) return '['.$data[$field.'_loc0'].']'; // locale not enUS; TC localization; add brackets else if (User::$localeId != LOCALE_EN && isset($data[$field]) && !empty($data[$field])) return '['.$data[$field].']'; // locale enUS; TC localization; return normal else if (User::$localeId == LOCALE_EN && isset($data[$field]) && !empty($data[$field])) return $data[$field]; // nothing to find; be empty else return ''; } public static function extractURLParams($str) { $arr = explode('.', $str); foreach ($arr as $i => $a) if (!is_numeric($a)) $arr[$i] = null; return $arr; } // for item and spells public static function setRatingLevel($level, $type, $val) { if (in_array($type, array(ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_PARRY_RATING, ITEM_MOD_BLOCK_RATING)) && $level < 34) $level = 34; if (!isset(Util::$gtCombatRatings[$type])) $result = 0; else if ($level > 70) $c = 82 / 52 * pow(131 / 63, ($level - 70) / 10); else if ($level > 60) $c = 82 / (262 - 3 * $level); else if ($level > 10) $c = ($level - 8) / 52; else $c = 2 / 52; $result = number_format($val / Util::$gtCombatRatings[$type] / $c, 2); if (!in_array($type, array(ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_EXPERTISE_RATING))) $result .= '%'; return sprintf(Lang::$item['ratingString'], '' . $result, '' . $level); } public static function powerUseLocale($domain) { foreach (Util::$localeStrings as $k => $v) { if (strstr($v, $domain)) { User::useLocale($k); Lang::load(User::$localeString); return; } } if ($domain == 'www') { /* todo: dont .. should use locale given by inclusion of aowowPower .. should be fixed in aowowPower.js */ User::useLocale(LOCALE_EN); Lang::load(User::$localeString); } } // EnchantmentTypes // 0 => (dnd stuff; ignore) // 1 => proc spell from ObjectX (amountX == procChance?; ignore) // 2 => +AmountX damage // 3 => Spells form ObjectX (amountX == procChance?) // 4 => +AmountX resistance for ObjectX School // 5 => +AmountX for Statistic by type of ObjectX // 6 => Rockbiter AmountX as Damage (ignore) // 7 => Engineering gadgets // 8 => Extra Sockets AmountX as socketCount (ignore) public static function parseItemEnchantment($enchant, $amountOverride = null) { if (!$enchant || empty($enchant)) return false; $jsonStats = array(); for ($h = 1; $h <= 3; $h++) { if (isset($amountOverride)) // itemSuffixes have dynamic amount $enchant['amount'.$h] = $amountOverride; switch ($enchant['type'.$h]) { case 2: @$jsonStats[2] += $enchant['amount'.$h]; break; case 3: case 7: $spl = new Spell($enchant['object'.$h]); $gain = $spl->getStatGain(); foreach ($gain as $k => $v) // array_merge screws up somehow... @$jsonStats[$k] += $v; break; case 4: switch ($enchant['object'.$h]) { case 0: // Physical @$jsonStats[50] += $enchant['amount'.$h]; break; case 1: // Holy @$jsonStats[53] += $enchant['amount'.$h]; break; case 2: // Fire @$jsonStats[51] += $enchant['amount'.$h]; break; case 3: // Nature @$jsonStats[55] += $enchant['amount'.$h]; break; case 4: // Frost @$jsonStats[52] += $enchant['amount'.$h]; break; case 5: // Shadow @$jsonStats[54] += $enchant['amount'.$h]; break; case 6: // Arcane @$jsonStats[56] += $enchant['amount'.$h]; break; } break; case 5: @$jsonStats[$enchant['object'.$h]] += $enchant['amount'.$h]; break; } } // check if we use these mods $return = array(); foreach ($jsonStats as $k => $v) { if ($str = Util::$itemMods[$k]) $return[$str] = $v; } return $return; } } ?>