uint32 ItemTemplate::GetArmor(uint32 itemLevel) const { uint32 quality = ItemQualities(GetQuality()) != ITEM_QUALITY_HEIRLOOM ? ItemQualities(GetQuality()) : ITEM_QUALITY_RARE; if (quality > ITEM_QUALITY_ARTIFACT) return 0; // all items but shields if (GetClass() != ITEM_CLASS_ARMOR || GetSubClass() != ITEM_SUBCLASS_ARMOR_SHIELD) { ItemArmorQualityEntry const* armorQuality = sItemArmorQualityStore.LookupEntry(itemLevel); ItemArmorTotalEntry const* armorTotal = sItemArmorTotalStore.LookupEntry(itemLevel); if (!armorQuality || !armorTotal) return 0; uint32 inventoryType = GetInventoryType(); if (inventoryType == INVTYPE_ROBE) inventoryType = INVTYPE_CHEST; ArmorLocationEntry const* location = sArmorLocationStore.LookupEntry(inventoryType); if (!location) return 0; if (GetSubClass() < ITEM_SUBCLASS_ARMOR_CLOTH || GetSubClass() > ITEM_SUBCLASS_ARMOR_PLATE) return 0; return uint32(armorQuality->QualityMod[quality] * armorTotal->Value[GetSubClass() - 1] * location->Modifier[GetSubClass() - 1] + 0.5f); } // shields ItemArmorShieldEntry const* shield = sItemArmorShieldStore.LookupEntry(itemLevel); if (!shield) return 0; return uint32(shield->Quality[quality] + 0.5f); }
void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamage) const { minDamage = maxDamage = 0.0f; uint32 quality = ItemQualities(GetQuality()) != ITEM_QUALITY_HEIRLOOM ? ItemQualities(GetQuality()) : ITEM_QUALITY_RARE; if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) return; // get the right store here if (GetInventoryType() > INVTYPE_RANGEDRIGHT) return; float dps = 0.0f; switch (GetInventoryType()) { case INVTYPE_AMMO: dps = sItemDamageAmmoStore.AssertEntry(itemLevel)->DPS[quality]; break; case INVTYPE_2HWEAPON: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) dps = sItemDamageTwoHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else dps = sItemDamageTwoHandStore.AssertEntry(itemLevel)->DPS[quality]; break; case INVTYPE_RANGED: case INVTYPE_THROWN: case INVTYPE_RANGEDRIGHT: switch (GetSubClass()) { case ITEM_SUBCLASS_WEAPON_WAND: dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; break; case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_CROSSBOW: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) dps = sItemDamageTwoHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else dps = sItemDamageTwoHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; } break; case INVTYPE_WEAPON: case INVTYPE_WEAPONMAINHAND: case INVTYPE_WEAPONOFFHAND: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else dps = sItemDamageOneHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; } float avgDamage = dps * GetDelay() * 0.001f; minDamage = (GetStatScalingFactor() * -0.5f + 1.0f) * avgDamage; maxDamage = floor(float(avgDamage * (GetStatScalingFactor() * 0.5f + 1.0f) + 0.5f)); }
bool Group::LoadGroupFromDB(Field* fields) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // result = CharacterDatabase.Query("SELECT mainTank, mainAssistant, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, isRaid, leaderGuid, groupId FROM groups"); m_Id = fields[15].GetUInt32(); m_leaderGuid = ObjectGuid(HIGHGUID_PLAYER, fields[14].GetUInt32()); // group leader not exist if (!sObjectMgr.GetPlayerNameByGUID(m_leaderGuid, m_leaderName)) return false; m_groupType = fields[13].GetBool() ? GROUPTYPE_RAID : GROUPTYPE_NORMAL; if (m_groupType == GROUPTYPE_RAID) _initRaidSubGroupsCounter(); m_mainTankGuid = ObjectGuid(HIGHGUID_PLAYER, fields[0].GetUInt32()); m_mainAssistantGuid = ObjectGuid(HIGHGUID_PLAYER, fields[1].GetUInt32()); m_lootMethod = LootMethod(fields[2].GetUInt8()); m_masterLooterGuid = ObjectGuid(HIGHGUID_PLAYER, fields[3].GetUInt32()); m_lootThreshold = ItemQualities(fields[4].GetUInt16()); for (int i = 0; i < TARGET_ICON_COUNT; ++i) m_targetIcons[i] = ObjectGuid(fields[5 + i].GetUInt64()); m_currentLooterGuid = m_masterLooterGuid; return true; }
bool Group::LoadGroupFromDB(Field* fields) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // result = CharacterDatabase.Query("SELECT mainTank, mainAssistant, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty, leaderGuid, groupId FROM groups"); m_Id = fields[17].GetUInt32(); m_leaderGuid = ObjectGuid(HIGHGUID_PLAYER, fields[16].GetUInt32()); // group leader not exist if (!sObjectMgr.GetPlayerNameByGUID(m_leaderGuid, m_leaderName)) return false; m_groupType = GroupType(fields[13].GetUInt8()); if (m_groupType & GROUPTYPE_RAID) _initRaidSubGroupsCounter(); uint32 diff = fields[14].GetUInt8(); if (diff >= MAX_DUNGEON_DIFFICULTY) diff = DUNGEON_DIFFICULTY_NORMAL; m_dungeonDifficulty = Difficulty(diff); uint32 r_diff = fields[15].GetUInt8(); if (r_diff >= MAX_RAID_DIFFICULTY) r_diff = RAID_DIFFICULTY_10MAN_NORMAL; m_raidDifficulty = Difficulty(r_diff); m_mainTankGuid = ObjectGuid(HIGHGUID_PLAYER, fields[0].GetUInt32()); m_mainAssistantGuid = ObjectGuid(HIGHGUID_PLAYER, fields[1].GetUInt32()); m_lootMethod = LootMethod(fields[2].GetUInt8()); m_masterLooterGuid = ObjectGuid(HIGHGUID_PLAYER, fields[3].GetUInt32()); m_lootThreshold = ItemQualities(fields[4].GetUInt16()); for (int i = 0; i < TARGET_ICON_COUNT; ++i) m_targetIcons[i] = ObjectGuid(fields[5 + i].GetUInt64()); m_currentLooterGuid = m_masterLooterGuid; return true; }
void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamage) const { minDamage = maxDamage = 0.0f; uint32 quality = ItemQualities(GetQuality()) != ITEM_QUALITY_HEIRLOOM ? ItemQualities(GetQuality()) : ITEM_QUALITY_RARE; if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) return; DBCStorage<ItemDamageEntry>* store = NULL; // get the right store here if (GetInventoryType() > INVTYPE_RANGEDRIGHT) return; switch (GetInventoryType()) { case INVTYPE_AMMO: store = &sItemDamageAmmoStore; break; case INVTYPE_2HWEAPON: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) store = &sItemDamageTwoHandCasterStore; else store = &sItemDamageTwoHandStore; break; case INVTYPE_RANGED: case INVTYPE_THROWN: case INVTYPE_RANGEDRIGHT: switch (GetSubClass()) { case ITEM_SUBCLASS_WEAPON_WAND: store = &sItemDamageWandStore; break; case ITEM_SUBCLASS_WEAPON_THROWN: store = &sItemDamageThrownStore; break; case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_CROSSBOW: store = &sItemDamageRangedStore; break; default: return; } break; case INVTYPE_WEAPON: case INVTYPE_WEAPONMAINHAND: case INVTYPE_WEAPONOFFHAND: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) store = &sItemDamageOneHandCasterStore; else store = &sItemDamageOneHandStore; break; default: return; } ASSERT(store); ItemDamageEntry const* damageInfo = store->LookupEntry(itemLevel); if (!damageInfo) return; float dps = damageInfo->DPS[quality]; float avgDamage = dps * GetDelay() * 0.001f; minDamage = (GetStatScalingFactor() * -0.5f + 1.0f) * avgDamage; maxDamage = floor(float(avgDamage * (GetStatScalingFactor() * 0.5f + 1.0f) + 0.5f)); }