Ejemplo n.º 1
4
 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;
 }