public static function GetGearForCharacter($CharacterGuid) { $Statement = Characters::$CharConnection->prepare(' SELECT ii.itemEntry, ii.enchantments, ci.slot FROM character_inventory ci LEFT JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = :guid AND ii.itemEntry != 6948 AND ci.bag = 0 AND ci.slot < 19 ORDER BY ci.slot '); $Statement->bindParam(':guid', $CharacterGuid); $Statement->execute(); $Result = $Statement->fetchAll(PDO::FETCH_ASSOC); $Equipment = []; $ItemInstanceData = $Result; $FingerID = 11; $TrinketID = 12; $TwoHanderID = 17; foreach ($Result as $Key => $Item) { $ItemData = Items::GetItemInfo($Item['itemEntry']); if (Items::IsEquipment($ItemData['InventoryType'])) { if ($ItemData['InventoryType'] == 11) { $iData = Items::SiteSlotPositionByType($FingerID); $FingerID = $FingerID + 100; $Equipment[] = $ItemData['entry'] . ' = ' . $iData['side'] . ' = ' . $iData['placement']; } if ($ItemData['InventoryType'] == 12) { $iData = Items::SiteSlotPositionByType($TrinketID); $TrinketID = $TrinketID + 100; $Equipment[] = $ItemData['entry'] . ' = ' . $iData['side'] . ' = ' . $iData['placement']; } if ($ItemData['InventoryType'] == 17) { if ($TwoHanderID > 120) { break; } $iData = Items::SiteSlotPositionByType($TwoHanderID); $TwoHanderID = $TwoHanderID + 100; $Equipment[] = $ItemData['entry'] . ' = ' . $iData['side'] . ' = ' . $iData['placement']; } else { $iData = Items::SiteSlotPositionByType($ItemData['InventoryType']); $Equipment[] = $ItemData['entry'] . ' = ' . $iData['side'] . ' = ' . $iData['placement']; } } else { unset($Result[$Key]); } } $Similarities = []; foreach ($Equipment as $Item) { $Exploded = explode('=', $Item); $ItemID = trim($Exploded[0]); $ItemSide = trim($Exploded[1]); $ItemPosition = trim($Exploded[2]); $Result = Text::Like($Equipment, $ItemID); if (count($Result) > 1) { foreach ($Result as $Key => $Value) { unset($Equipment[$Key]); } $Similarities[] = array_shift($Result); } } $Similarities = array_unique($Similarities); $Equipment = array_merge($Equipment, $Similarities); $EquippedItems = []; $LeftIndexes = [11, 12, 13, 14, 15, 16, 17, 18]; $RightIndexes = [21, 22, 23, 24, 25, 26, 27, 28]; $BottomIndexes = [31, 32, 33]; foreach ($Equipment as $Item) { $Exploded = explode('=', $Item); $ItemID = trim($Exploded[0]); $ItemSide = trim($Exploded[1]); $ItemPosition = trim($Exploded[2]); if ($ItemSide == 'left') { $Position = 10 + $ItemPosition; } elseif ($ItemSide == 'right') { $Position = 20 + $ItemPosition; } elseif ($ItemSide == 'bottom') { $Position = 30 + $ItemPosition; } $EquippedItems[$Position]['site'] = ['side' => $ItemSide, 'position' => $ItemPosition]; $EquippedItems[$Position]['data'] = Items::GetItemInfo($ItemID); $EntryID = Text::MASearch($ItemInstanceData, 'itemEntry', $ItemID); $Enchantments = $ItemInstanceData[$EntryID]['enchantments']; if (Items::isItemEnchanted($Enchantments)) { $EquippedItems[$Position]['data']['enchanted'] = 1; } else { $EquippedItems[$Position]['data']['enchanted'] = 0; } if ($EquippedItems[$Position]['data']['enchanted']) { $SocketsCount = 1; $SpellsCount = 1; $EnchantmentsList = Items::getEnchantments($Enchantments); $EnchantmentsData = []; foreach ($EnchantmentsList as $EnchantmentID) { if ($EnchantmentID != $EquippedItems[$Position]['data']['socketBonus']) { $Data = Items::getEnchantmentData($EnchantmentID); if ($Data['is_socket']) { $EnchantmentsData['socket' . $SocketsCount] = $Data; $SocketsCount++; } else { $EnchantmentsData['spell' . $SpellsCount] = $Data; $SpellsCount++; } } } $EquippedItems[$Position]['enchantments'] = $EnchantmentsData; } } foreach ($LeftIndexes as $Index) { if (!isset($EquippedItems[$Index])) { $EquippedItems[$Index]['site'] = ['side' => 'left', 'position' => $Index - 10]; $SearchResult = Text::Search(Items::SiteSlotPositionByType(null, true), ['side' => 'left', 'placement' => $Index - 10])[0]; $EquippedItems[$Index]['data'] = ['InventoryType' => $SearchResult]; } } foreach ($RightIndexes as $Index) { if (!isset($EquippedItems[$Index])) { $EquippedItems[$Index]['site'] = ['side' => 'right', 'position' => $Index - 20]; $SearchResult = Text::Search(Items::SiteSlotPositionByType(null, true), ['side' => 'left', 'placement' => $Index - 20])[0]; $EquippedItems[$Index]['data'] = ['InventoryType' => $SearchResult]; } } foreach ($BottomIndexes as $Index) { if (!isset($EquippedItems[$Index])) { $EquippedItems[$Index]['site'] = ['side' => 'bottom', 'position' => $Index - 30]; $SearchResult = Text::Search(Items::SiteSlotPositionByType(null, true), ['side' => 'left', 'placement' => $Index - 30])[0]; $EquippedItems[$Index]['data'] = ['InventoryType' => $SearchResult]; } } ksort($EquippedItems); $ItemLevel = 0; $ItemsCount = 0; foreach ($EquippedItems as $Item) { if (isset($Item['data']['entry']) && $Item['data']['InventoryType'] != 19 && $Item['data']['InventoryType'] != 4) { if (isset($Item['data'])) { $ItemLevel = $ItemLevel + $Item['data']['ItemLevel']; $ItemsCount++; } } } $Result = $EquippedItems; $LevelData = Characters::LevelStats(Characters::$CharacterRace, Characters::$CharacterClass, Characters::$CharacterLevel); $StrengthValue = $LevelData['str']; $AgilityValue = $LevelData['agi']; $IntellectValue = $LevelData['inte']; $StaminaValue = $LevelData['sta']; $SpiritValue = $LevelData['spi']; $ArmorValue = 2 * $LevelData['agi']; $ParryValue = 0; $DodgeValue = 0; $BlockValue = 0; $CritValue = 0; $HasteValue = 0; $SpellPowerValue = 0; $ArmorPenetrationValue = 0; $SpellPenetrationValue = 0; $MainHandSpeed = 0; $OffHandSpeed = 0; $RangedSpeed = 0; $MainHandDps = 0; $OffHandDps = 0; $RangedDps = 0; $MHD = []; $OHD = []; $RHD = []; $isTwoHanders = false; foreach ($Result as $Item) { if (isset($Item['data'])) { if (isset($Item['data']['armor']) && $Item['data']['armor'] != 0) { $ArmorValue = $ArmorValue + $Item['data']['armor']; } for ($i = 1; $i <= 5; $i++) { if (isset($Item['data']['stat_type' . $i]) && $Item['data']['stat_type' . $i] != 0) { if ($Item['data']['stat_type' . $i] == 3) { $AgilityValue = $AgilityValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 4) { $StrengthValue = $StrengthValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 5) { $IntellectValue = $IntellectValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 6) { $IntellectValue = $IntellectValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 7) { $StaminaValue = $StaminaValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 13) { $DodgeValue = $DodgeValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 14) { $ParryValue = $ParryValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 32) { $CritValue = $CritValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 36) { $HasteValue = $HasteValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 45) { $SpellPowerValue = $SpellPowerValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 48) { $BlockValue = $BlockValue + $Item['data']['stat_value' . $i]; } } } if (isset($Item['data']['enchanted']) && $Item['data']['enchanted']) { for ($i = 1; $i <= 3; $i++) { if (isset($Item['enchantments']['socket' . $i])) { $SocketData = $Item['enchantments']['socket' . $i]; $BonusData = Items::GetValueVariable($SocketData['text_loc0']); if (count($BonusData) > 1) { foreach ($BonusData as $Bonus) { $Value = $Bonus['value']; $Points = $Bonus['points']; ${$Value} = ${$Value} + $Points; } } else { $Bonus = $BonusData[0]; $Value = $Bonus['value']; $Points = $Bonus['points']; ${$Value} = ${$Value} + $Points; } } } } if ($Item['site']['side'] == 'bottom' && $Item['site']['position'] == 1) { $MainHandSpeed = $Item['data']['delay']; $MainHandDps = round(($Item['data']['dmg_min1'] + $Item['data']['dmg_max1']) / 2 / ($Item['data']['delay'] / 1000), 2); $MHD = ['min' => $Item['data']['dmg_min1'], 'max' => $Item['data']['dmg_max1'], 'speed' => round($Item['data']['delay'] / 1000, 1)]; } if ($Item['site']['side'] == 'bottom' && $Item['site']['position'] == 2 && isset($Item['data']['entry'])) { if ($Item['data']['InventoryType'] == 17) { $isTwoHanders = true; } $OffHandSpeed = $OffHandSpeed = $Item['data']['delay']; $OffHandDps = round(($Item['data']['dmg_min1'] + $Item['data']['dmg_max1']) / 2 / ($Item['data']['delay'] / 1000), 2); $OHD = ['min' => $Item['data']['dmg_min1'], 'max' => $Item['data']['dmg_max1'], 'speed' => round($Item['data']['delay'] / 1000, 1), 'name' => $Item['data']['name']]; } if ($Item['site']['side'] == 'bottom' && $Item['site']['position'] == 3) { $RangedSpeed = $Item['data']['delay']; $RangedDps = round(($Item['data']['dmg_min1'] + $Item['data']['dmg_max1']) / 2 / ($Item['data']['delay'] / 1000), 2); $RHD = ['min' => $Item['data']['dmg_min1'], 'max' => $Item['data']['dmg_max1'], 'speed' => round($Item['data']['delay'] / 1000, 1)]; } } } $Result['StrengthValue'] = $StrengthValue; $Result['AgilityValue'] = $AgilityValue; $Result['IntellectValue'] = $IntellectValue; $Result['StaminaValue'] = $StaminaValue; $Result['SpiritValue'] = $SpiritValue; $Result['ArmorValue'] = $ArmorValue; $Result['ParryValue'] = $ParryValue; $Result['DodgeValue'] = $DodgeValue; $Result['BlockValue'] = $BlockValue; $Result['CritValue'] = $CritValue; $Result['HasteValue'] = $HasteValue; $Result['SpellPowerValue'] = $SpellPowerValue; $Result['ArmorPenetration'] = $ArmorPenetrationValue; $Result['SpellPenetration'] = $SpellPenetrationValue; //Main Hand Stats $Result['MainHandSpeed'] = $MainHandSpeed; $Result['MainHandDps'] = $MainHandDps; $Result['MainHandData'] = $MHD; //Off Hand Stats $Result['OffHandSpeed'] = $OffHandSpeed; $Result['OffHandDps'] = $OffHandDps; $Result['OffHandData'] = $OHD; //Ranged Stats $Result['RangedSpeed'] = $RangedSpeed; $Result['RangedDps'] = $RangedDps; $Result['RangedData'] = $RHD; $BaseAP = Characters::CalculateAttackPower(Characters::$CharacterClass, Characters::$CharacterLevel, $StrengthValue, $AgilityValue); if ($isTwoHanders) { $AttackPower = ($Result['OffHandDps'] + $BaseAP / 3.5) * $OffHandSpeed / 1000; } else { $AttackPower = ($MainHandDps + $BaseAP / 3.5) * $MainHandSpeed / 1000; } if (!empty($Result['MainHandData'])) { $Result['MainHandDamage'] = Items::CalculateWeaponDamage($Result['MainHandData'], $AttackPower); } else { $Result['MainHandDamage'] = ['minimum' => -1, 'maximum' => -1, 'dps' => -1, 'speed' => -1]; } if (!empty($Result['OffHandData'])) { $Result['OffHandDamage'] = Items::CalculateWeaponDamage($Result['OffHandData'], $AttackPower); } else { $Result['OffHandDamage'] = ['minimum' => -1, 'maximum' => -1, 'dps' => -1, 'speed' => -1]; } if (!empty($Result['RangedData'])) { $Result['RangedDamage'] = Items::CalculateWeaponDamage($Result['RangedData'], $AttackPower); } else { $Result['RangedDamage'] = ['minimum' => -1, 'maximum' => -1, 'dps' => -1, 'speed' => -1]; } $Result['AttackPower'] = round($AttackPower, 0); $Result['DamageReduction'] = Characters::DamageReductionByLevel(Characters::$CharacterLevel, $ArmorValue); $Result['TotalItemLevel'] = $ItemLevel; $Result['EquippedItems'] = $ItemsCount; $Result['hasOffhand'] = $isTwoHanders; return $Result; }
public static function GetGearForCharacter($CharacterGuid) { $Statement = Characters::$CharConnection->prepare(' SELECT ii.itemEntry, ci.slot FROM character_inventory ci LEFT JOIN item_instance ii ON ci.item = ii.guid WHERE ci.slot >= 0 AND ci.slot <= 18 AND ci.guid = :guid ORDER BY ci.slot '); $Statement->bindParam(':guid', $CharacterGuid); $Statement->execute(); $Result = $Statement->fetchAll(PDO::FETCH_ASSOC); $Index = 0; // Fill empty slots $SlotRange = range(0, 18); // Add item Data to existing slots foreach ($Result as $Item) { if (in_array($Item['slot'], $SlotRange)) { $Result[$Index]['data'] = Items::GetItemInfo($Item['itemEntry']); unset($SlotRange[$Item['slot']]); $Index++; } } foreach ($SlotRange as $MissingSlot) { $Result[] = array('itemEntry' => 0, 'slot' => $MissingSlot); } $ItemLevel = 0; $ItemsCount = 0; foreach ($Result as $Item) { if ($Item['slot'] != 18 && $Item['slot'] != 3) { if (isset($Item['data'])) { $ItemLevel = $ItemLevel + $Item['data']['ItemLevel']; $ItemsCount++; } } } $StrengthValue = 0; $AgilityValue = 0; $IntellectValue = 0; $StaminaValue = 0; $SpiritValue = 0; $ArmorValue = 0; $ParryValue = 0; $DodgeValue = 0; $BlockValue = 0; $CritValue = 0; $HasteValue = 0; $MainHandSpeed = 0; $OffHandSpeed = 0; $RangedSpeed = 0; foreach ($Result as $Item) { if (isset($Item['data'])) { if ($Item['data']['armor'] != 0) { $ArmorValue = $ArmorValue + $Item['data']['armor']; } for ($i = 1; $i <= 5; $i++) { if ($Item['data']['stat_type' . $i] != 0) { if ($Item['data']['stat_type' . $i] == 3) { $AgilityValue = $AgilityValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 4) { $StrengthValue = $StrengthValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 5) { $IntellectValue = $IntellectValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 6) { $IntellectValue = $IntellectValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 7) { $StaminaValue = $StaminaValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 13) { $DodgeValue = $DodgeValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 14) { $ParryValue = $ParryValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 32) { $CritValue = $CritValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 36) { $HasteValue = $HasteValue + $Item['data']['stat_value' . $i]; } elseif ($Item['data']['stat_type' . $i] == 48) { $BlockValue = $BlockValue + $Item['data']['stat_value' . $i]; } } } if ($Item['slot'] == 15) { $MainHandSpeed = $Item['data']['delay']; } elseif ($Item['slot'] == 16) { $OffHandSpeed = $Item['data']['delay']; } elseif ($Item['slot'] == 17) { $RangedSpeed = $Item['data']['delay']; } } } $Result['StrengthValue'] = $StrengthValue; $Result['AgilityValue'] = $AgilityValue; $Result['IntellectValue'] = $IntellectValue; $Result['StaminaValue'] = $StaminaValue; $Result['SpiritValue'] = $SpiritValue; $Result['ArmorValue'] = $ArmorValue; $Result['ParryValue'] = $ParryValue; $Result['DodgeValue'] = $DodgeValue; $Result['BlockValue'] = $BlockValue; $Result['CritValue'] = $CritValue; $Result['HasteValue'] = $HasteValue; $Result['MainHandSpeed'] = $MainHandSpeed; $Result['OffHandSpeed'] = $OffHandSpeed; $Result['RangedSpeed'] = $RangedSpeed; $Result['AttackPower'] = Characters::CalculateAttackPower(Characters::$CharacterClass, Characters::$CharacterLevel, $StrengthValue, $AgilityValue); $Result['DamageReduction'] = Characters::DamageReductionByLevel(Characters::$CharacterLevel, $ArmorValue); $Result['TotalItemLevel'] = $ItemLevel; $Result['EquippedItems'] = $ItemsCount; return $Result; }