if (WoW_Characters::GetGuildID() > 0) { $guild_str = sprintf('<div class="guild"> <a href="%s?character=%s">%s</a> </div>', WoW_Characters::GetGuildURL(), urlencode(WoW_Characters::GetName()), WoW_Characters::GetGuildName()); } else { $guild_str = null; } echo sprintf('<div class="name"><a href="%s" rel="np">%s</a></div> <div class="under-name color-c%d"> <a href="/wow/game/race/%s" class="race">%s</a>-<a href="/wow/game/class/%s" class="class">%s</a> <span class="level"><strong>%d</strong></span> %s </div> %s <div class="realm"> <span id="profile-info-realm" class="tip" data-battlegroup="%s">%s</span> </div>', WoW_Characters::GetURL(), WoW_Characters::GetName(), WoW_Characters::GetClassID(), WoW_Characters::GetRaceKey(), WoW_Characters::GetRaceName(), WoW_Characters::GetClassKey(), WoW_Characters::GetClassName(), WoW_Characters::GetLevel(), WoW_Locale::GetString('template_lvl'), $guild_str, WoWConfig::$DefaultBGName, WoW_Characters::GetRealmName()); ?> </div> </div> <?php WoW_Template::LoadTemplate('block_profile_menu'); ?> </div> </div> </div> </div> <div class="profile-contents"> <div class="profile-section-header">
private static function _ApplyItemBonuses($proto, $slot, $apply, $only_level_scale = false) { if (!$proto) { return false; } $ssd = $proto->ScalingStatDistribution ? DB::WoW()->selectRow("SELECT * FROM `DBPREFIX_ssd` WHERE `entry` = %d", $proto->ScalingStatDistribution) : null; if ($only_level_scale && !$ssd) { return false; } $ssd_level = WoW_Characters::GetLevel(); if ($ssd && $ssd_level > $ssd['MaxLevel']) { $ssd_level = $ssd['MaxLevel']; } $ssv = $proto->ScalingStatValue ? DB::WoW()->selectRow("SELECT * FROM `DBPREFIX_ssv` WHERE `id` = %d", $proto->ScalingStatValue) : null; if ($only_level_scale && !$ssv) { return false; } for ($i = 0; $i < MAX_ITEM_PROTO_STATS; ++$i) { $statType = 0; $val = 0; // If set ScalingStatDistribution need get stats and values from it if ($ssd && $ssv) { if ($ssd['StatMod_' . $i] < 0) { continue; } $statType = $ssd['StatMod_' . $i]; $val = WoW_Items::GetSSDMultiplier($ssv, $proto->ScalingStatValue) * $ssd['Modifier_' . $i] / 1000; } else { if ($i >= $proto->StatsCount) { continue; } $statType = $proto->ItemStat[$i]['type']; $val = $proto->ItemStat[$i]['value']; } if ($val == 0) { continue; } switch ($statType) { case ITEM_MOD_MANA: self::HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, $val, $apply); break; case ITEM_MOD_HEALTH: // modify HP self::HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, $val, $apply); break; case ITEM_MOD_AGILITY: // modify agility self::HandleStatModifier(UNIT_MOD_STAT_AGILITY, BASE_VALUE, $val, $apply); self::ApplyStatBuffMod(STAT_AGILITY, $val, $apply); break; case ITEM_MOD_STRENGTH: //modify strength self::HandleStatModifier(UNIT_MOD_STAT_STRENGTH, BASE_VALUE, $val, $apply); self::ApplyStatBuffMod(STAT_STRENGTH, $val, $apply); break; case ITEM_MOD_INTELLECT: //modify intellect self::HandleStatModifier(UNIT_MOD_STAT_INTELLECT, BASE_VALUE, $val, $apply); self::ApplyStatBuffMod(STAT_INTELLECT, $val, $apply); break; case ITEM_MOD_SPIRIT: //modify spirit self::HandleStatModifier(UNIT_MOD_STAT_SPIRIT, BASE_VALUE, $val, $apply); self::ApplyStatBuffMod(STAT_SPIRIT, $val, $apply); break; case ITEM_MOD_STAMINA: //modify stamina self::HandleStatModifier(UNIT_MOD_STAT_STAMINA, BASE_VALUE, $val, $apply); self::ApplyStatBuffMod(STAT_STAMINA, $val, $apply); break; case ITEM_MOD_DEFENSE_SKILL_RATING: self::ApplyRatingMod(CR_DEFENSE_SKILL, $val, $apply); break; case ITEM_MOD_DODGE_RATING: self::ApplyRatingMod(CR_DODGE, $val, $apply); break; case ITEM_MOD_PARRY_RATING: self::ApplyRatingMod(CR_PARRY, $val, $apply); break; case ITEM_MOD_BLOCK_RATING: self::ApplyRatingMod(CR_BLOCK, $val, $apply); break; case ITEM_MOD_HIT_MELEE_RATING: self::ApplyRatingMod(CR_HIT_MELEE, $val, $apply); break; case ITEM_MOD_HIT_RANGED_RATING: self::ApplyRatingMod(CR_HIT_RANGED, $val, $apply); break; case ITEM_MOD_HIT_SPELL_RATING: self::ApplyRatingMod(CR_HIT_SPELL, $val, $apply); break; case ITEM_MOD_CRIT_MELEE_RATING: self::ApplyRatingMod(CR_CRIT_MELEE, $val, $apply); break; case ITEM_MOD_CRIT_RANGED_RATING: self::ApplyRatingMod(CR_CRIT_RANGED, $val, $apply); break; case ITEM_MOD_CRIT_SPELL_RATING: self::ApplyRatingMod(CR_CRIT_SPELL, $val, $apply); break; case ITEM_MOD_HIT_TAKEN_MELEE_RATING: self::ApplyRatingMod(CR_HIT_TAKEN_MELEE, $val, $apply); break; case ITEM_MOD_HIT_TAKEN_RANGED_RATING: self::ApplyRatingMod(CR_HIT_TAKEN_RANGED, $val, $apply); break; case ITEM_MOD_HIT_TAKEN_SPELL_RATING: self::ApplyRatingMod(CR_HIT_TAKEN_SPELL, $val, $apply); break; case ITEM_MOD_CRIT_TAKEN_MELEE_RATING: self::ApplyRatingMod(CR_CRIT_TAKEN_MELEE, $val, $apply); break; case ITEM_MOD_CRIT_TAKEN_RANGED_RATING: self::ApplyRatingMod(CR_CRIT_TAKEN_RANGED, $val, $apply); break; case ITEM_MOD_CRIT_TAKEN_SPELL_RATING: self::ApplyRatingMod(CR_CRIT_TAKEN_SPELL, $val, $apply); break; case ITEM_MOD_HASTE_MELEE_RATING: self::ApplyRatingMod(CR_HASTE_MELEE, $val, $apply); break; case ITEM_MOD_HASTE_RANGED_RATING: self::ApplyRatingMod(CR_HASTE_RANGED, $val, $apply); break; case ITEM_MOD_HASTE_SPELL_RATING: self::ApplyRatingMod(CR_HASTE_SPELL, $val, $apply); break; case ITEM_MOD_HIT_RATING: self::ApplyRatingMod(CR_HIT_MELEE, $val, $apply); self::ApplyRatingMod(CR_HIT_RANGED, $val, $apply); self::ApplyRatingMod(CR_HIT_SPELL, $val, $apply); break; case ITEM_MOD_CRIT_RATING: self::ApplyRatingMod(CR_CRIT_MELEE, $val, $apply); self::ApplyRatingMod(CR_CRIT_RANGED, $val, $apply); self::ApplyRatingMod(CR_CRIT_SPELL, $val, $apply); break; case ITEM_MOD_HIT_TAKEN_RATING: self::ApplyRatingMod(CR_HIT_TAKEN_MELEE, $val, $apply); self::ApplyRatingMod(CR_HIT_TAKEN_RANGED, $val, $apply); self::ApplyRatingMod(CR_HIT_TAKEN_SPELL, $val, $apply); break; case ITEM_MOD_CRIT_TAKEN_RATING: self::ApplyRatingMod(CR_CRIT_TAKEN_MELEE, $val, $apply); self::ApplyRatingMod(CR_CRIT_TAKEN_RANGED, $val, $apply); self::ApplyRatingMod(CR_CRIT_TAKEN_SPELL, $val, $apply); break; case ITEM_MOD_RESILIENCE_RATING: self::ApplyRatingMod(CR_CRIT_TAKEN_MELEE, $val, $apply); self::ApplyRatingMod(CR_CRIT_TAKEN_RANGED, $val, $apply); self::ApplyRatingMod(CR_CRIT_TAKEN_SPELL, $val, $apply); break; case ITEM_MOD_HASTE_RATING: self::ApplyRatingMod(CR_HASTE_MELEE, $val, $apply); self::ApplyRatingMod(CR_HASTE_RANGED, $val, $apply); self::ApplyRatingMod(CR_HASTE_SPELL, $val, $apply); break; case ITEM_MOD_EXPERTISE_RATING: self::ApplyRatingMod(CR_EXPERTISE, $val, $apply); break; case ITEM_MOD_ATTACK_POWER: self::HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, $val, $apply); self::HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, $val, $apply); break; case ITEM_MOD_RANGED_ATTACK_POWER: self::HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, $val, $apply); break; case ITEM_MOD_MANA_REGENERATION: self::ApplyManaRegenBonus($val, $apply); break; case ITEM_MOD_ARMOR_PENETRATION_RATING: self::ApplyRatingMod(CR_ARMOR_PENETRATION, $val, $apply); break; case ITEM_MOD_SPELL_POWER: self::ApplySpellPowerBonus($val, $apply); break; case ITEM_MOD_SPELL_PENETRATION: self::ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, -$val, $apply); self::$m_spellPenetrationItemMod += $apply ? $val : -$val; break; case ITEM_MOD_BLOCK_VALUE: self::HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, $val, $apply); break; // deprecated item mods // deprecated item mods case ITEM_MOD_FERAL_ATTACK_POWER: case ITEM_MOD_SPELL_HEALING_DONE: case ITEM_MOD_SPELL_DAMAGE_DONE: break; } } if ($ssv) { if ($spellbonus = WoW_Items::GetSpellBonus($ssv, $proto->ScalingStatValue)) { self::ApplySpellPowerBonus($spellbonus, $apply); } } $armor = $proto->armor; if ($ssv) { if ($ssvarmor = WoW_Items::GetArmorMod($ssv, $proto->ScalingStatValue)) { $armor = $ssvarmor; } } // Add armor bonus from ArmorDamageModifier if > 0 if ($proto->ArmorDamageModifier > 0) { $armor += $proto->ArmorDamageModifier; } if ($armor) { self::HandleStatModifier(UNIT_MOD_ARMOR, BASE_VALUE, $armor, $apply); } if ($proto->block) { self::HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, $proto->block, $apply); } if ($proto->holy_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, $proto->holy_res, $apply); } if ($proto->fire_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, $proto->fire_res, $apply); } if ($proto->nature_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, $proto->nature_res, $apply); } if ($proto->frost_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, $proto->frost_res, $apply); } if ($proto->shadow_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, $proto->shadow_res, $apply); } if ($proto->arcane_res) { self::HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, $proto->arcane_res, $apply); } $attType = BASE_ATTACK; $damage = 0.0; if ($slot == EQUIPMENT_SLOT_RANGED && in_array($proto->InventoryType, array(INV_TYPE_RANGED, INV_TYPE_THROWN, INV_TYPE_RANGED_RIGHT))) { $attType = RANGED_ATTACK; } elseif ($slot == EQUIPMENT_SLOT_OFFHAND) { $attType = OFF_ATTACK; } $minDamage = $proto->Damage[0]['min']; $maxDamage = $proto->Damage[0]['max']; $extraDPS = 0; if ($ssv) { if ($extraDPS = WoW_Items::GetDPSMod($ssv, $proto->ScalingStatValue)) { $average = $extraDPS * $proto->delay / 1000; $minDamage = 0.7 * $average; $maxDamage = 1.3 * $average; } } if ($minDamage > 0) { $damage = $apply ? $minDamage : BASE_MINDAMAGE; self::SetBaseWeaponDamage($attType, MINDAMAGE, $damage); } if ($maxDamage > 0) { $damage = $apply ? $maxDamage : BASE_MAXDAMAGE; self::SetBaseWeaponDamage($attType, MAXDAMAGE, $damage); } if ($proto->delay) { if ($slot == EQUIPMENT_SLOT_RANGED) { self::SetAttackTime(RANGED_ATTACK, $apply ? $proto->delay : BASE_ATTACK_TIME); } elseif ($slot == EQUIPMENT_SLOT_MAINHAND) { self::SetAttackTime(BASE_ATTACK, $apply ? $proto->delay : BASE_ATTACK_TIME); } elseif ($slot == EQUIPMENT_SLOT_OFFHAND) { self::SetAttackTime(OFF_ATTACK, $apply ? $proto->delay : BASE_ATTACK_TIME); } } if (self::CanModifyStats() && ($damage || $proto->delay)) { self::UpdateDamagePhysical($attType); } }
foreach ($audit[AUDIT_TYPE_EMPTY_SOCKET] as $tmp) { $count_empty_sockets += $tmp['count']; $empty_sockets_slots .= $tmp['slot']; $empty_sockets_slots_js .= $tmp['slot'] . ': ' . $tmp['count']; ++$i; if ($i < count($audit[AUDIT_TYPE_EMPTY_SOCKET])) { $empty_sockets_slots .= ','; $empty_sockets_slots_js .= ','; } } $empty_sockets_js = sprintf($empty_sockets_slots_js_tpl, $empty_sockets_slots_js); echo sprintf('<li data-slots="%s"> ' . sprintf(WoW_Locale::GetString('template_character_audit_empty_sockets'), $count_empty_sockets, count($audit[AUDIT_TYPE_EMPTY_SOCKET])) . ' </li>', $empty_sockets_slots); } if (isset($audit[AUDIT_TYPE_NONOPTIMAL_ARMOR]) && is_array($audit[AUDIT_TYPE_NONOPTIMAL_ARMOR]) && WoW_Characters::GetLevel() >= 40) { $nonop_armor_slots = ''; $nonop_armor_slots_js_tpl = '"inappropriateArmorItems": {%s},'; $nonop_armor_count = 0; foreach ($audit[AUDIT_TYPE_NONOPTIMAL_ARMOR] as $tmp) { ++$nonop_armor_count; } echo sprintf('<li data-slots="%d"> <span class="tip">%s</span> </li>', $nonop_armor_count, sprintf(WoW_Locale::GetString('template_character_audit_nonop_armor'), $nonop_armor_count, WoW_Utils::GetAppropriateItemClassForClassID(WoW_Characters::GetClassID()))); } if (isset($audit[AUDIT_TYPE_MISSING_BELT_BUCKLE]) && $audit[AUDIT_TYPE_MISSING_BELT_BUCKLE] == true) { echo sprintf('<li data-slots="5">%s</li>', sprintf(WoW_Locale::GetString('template_character_audit_missing_belt_buckle'), BELT_BUCKLE_ID, WoW_Items::GetItemName(BELT_BUCKLE_ID))); } ?> </ul>
echo WoW_Characters::GetRaceName(); ?> </a>-<a href="<?php echo WoW::GetWoWPath(); ?> /wow/game/class/<?php echo WoW_Characters::GetClassKey(); ?> " class="class"><?php echo WoW_Characters::GetClassName(); ?> </a> (<span id="profile-info-spec" class="spec tip"><?php echo $talents['specsData'][WoW_Characters::GetActiveSpec()]['name']; ?> </span>) <span class="level"><strong><?php echo WoW_Characters::GetLevel(); ?> </strong></span> <?php echo WoW_Locale::GetString('template_lvl'); ?> <span class="comma">,</span> <span class="realm tip" id="profile-info-realm" data-battlegroup="<?php echo WoWConfig::$DefaultBGName; ?> "> <?php echo WoW_Characters::GetRealmName(); ?> </span> </div> <div class="achievements"><a href="<?php
<span class="icon-frame frame-56"> <img src="<?php echo WoW::GetWoWPath(); ?> /wow/static/images/2d/avatar/<?php echo sprintf('%d-%d', WoW_Characters::GetRaceID(), WoW_Characters::GetGender()); ?> .jpg" alt="" width="56" height="56" /> <span class="frame"></span> </span> <h3><?php echo WoW_Characters::GetName(); ?> </h3> <div class="color-c<?php echo sprintf('%d">%s-%s (%s) %d %s', WoW_Characters::GetClassID(), WoW_Characters::GetRaceName(), WoW_Characters::GetClassName(), $talents['specsData'][WoW_Characters::GetActiveSpec()]['name'], WoW_Characters::GetLevel(), WoW_Locale::GetString('template_lvl')); ?> </div> <div class="color-tooltip-<?php echo WoW_Characters::GetFactionName(); ?> "><?php echo WoW_Characters::GetRealmName(); ?> </div> <span class="character-achievementpoints"><?php echo WoW_Achievements::GetAchievementsPoints(); ?> </span> <span class="clear"><!-- --></span> <span class="character-talents">