private static function PerformAudit($rebuild = false) { // Empty glyphs $empty_glyphs = 6; //TODO: check player level switch (self::$m_server) { default: case SERVER_MANGOS: $character_glyphs = DB::Characters()->select("SELECT `slot`, `glyph` FROM `character_glyphs` WHERE `guid` = %d AND `spec` = %d", self::GetGUID(), self::GetActiveSpec()); if (is_array($character_glyphs)) { foreach ($character_glyphs as $glyph) { if ($glyph['slot'] < 6 && $glyph['glyph'] > 0) { --$empty_glyphs; } } } break; case SERVER_TRINITY: $character_glyphs = DB::Characters()->select("SELECT `glyph1`, `glyph2`, `glyph3`, `glyph4`, `glyph5`, `glyph6` FROM `character_glyphs` WHERE `guid` = %d AND `spec` = %d", self::GetGUID(), self::GetActiveSpec()); if (is_array($character_glyphs)) { foreach ($character_glyphs as $glyph) { for ($i = 1; $i < 7; ++$i) { if ($glyph['glyph' . $i] > 0) { --$empty_glyphs; } } } } break; } self::UpdateAudit(AUDIT_TYPE_EMPTY_GLYPH_SLOT, $empty_glyphs); // Unspent talent points. self::UpdateAudit(AUDIT_TYPE_UNSPENT_TALENT_POINTS, self::GetFreeTalentPoints()); if (self::IsInventoryLoaded()) { // Inventory check foreach (self::$m_items as $item) { if (!$item) { continue; } self::UpdateAudit(AUDIT_TYPE_STAT_BONUS, $item->GetItemBonuses()); // Add some stats from ench/gem. // Non optimal armor if (!in_array($item->GetSlot(), array(INV_MAIN_HAND, INV_OFF_HAND, INV_BELT, INV_SHIRT, INV_RANGED_RELIC, INV_TABARD, INV_TRINKET_1, INV_TRINKET_2, INV_NECK, INV_OFF_HAND, INV_RING_1, INV_RING_2, INV_NECK)) && !self::IsOptimalArmorForClass($item->GetEntry())) { self::UpdateAudit(AUDIT_TYPE_NONOPTIMAL_ARMOR, array($item->GetSlot(), $item->GetEntry())); } // Enchant bonus if ($item->GetEnchantmentId() != 0) { //self::UpdateAudit(AUDIT_TYPE_STAT_BONUS, $item->GetEnchantmentId()); } // Unenchanted items if ($item->GetEnchantmentId() == 0 && !in_array($item->GetSlot(), array(INV_BELT, INV_SHIRT, INV_RANGED_RELIC, INV_TABARD, INV_TRINKET_1, INV_TRINKET_2, INV_NECK, INV_OFF_HAND, INV_RING_1, INV_RING_2, INV_NECK))) { self::UpdateAudit(AUDIT_TYPE_UNENCHANTED_ITEM, array($item->GetSlot(), $item->GetEntry())); } // Missing belt buckle if ($item->GetSlot() == INV_BELT && !$item->HasBonusEnchantmentSlot()) { self::UpdateAudit(AUDIT_TYPE_MISSING_BELT_BUCKLE, true); } // Unused profession perks // TODO: add more profession perks (currently only enchanting and blacksmithing are available) switch ($item->GetSlot()) { case INV_RING_1: case INV_RING_2: if (self::HasProfessionSkill(SKILL_ENCHANTING) && self::GetSkillValue(SKILL_ENCHANTING) >= 360 && $item->GetEnchantmentId() == 0) { self::UpdateAudit(AUDIT_TYPE_UNUSED_PROFESSION_PERK, array($item->GetSlot(), $item->GetEntry(), SKILL_ENCHANTING)); } break; case INV_BRACERS: case INV_BELT: if (self::HasProfessionSkill(SKILL_BLACKSMITHING) && self::GetSkillValue(SKILL_BLACKSMITHING) >= 400 && !$item->HasBonusEnchantmentSlot()) { self::UpdateAudit(AUDIT_TYPE_UNUSED_PROFESSION_PERK, array($item->GetSlot(), $item->GetEntry(), SKILL_BLACKSMITHING)); } break; } // Empty sockets $sockets_count = WoW_Items::GetTemplateSocketsCount($item->GetEntry()); if ($item->HasBonusEnchantmentSlot()) { ++$sockets_count; // Include blacksmithing bonus slot } for ($i = 1; $i < 4; ++$i) { if ($item->GetSocketInfo($i, true) == 0) { if ($i <= $sockets_count) { self::UpdateAudit(AUDIT_TYPE_EMPTY_SOCKET, array($item->GetEntry(), $item->GetSlot())); } } else { self::UpdateAudit(AUDIT_TYPE_USED_GEMS, $item->GetSocketInfo($i)); } } } } return true; }