void dump_data(std::ostream& out, DBCStorage<T> const& store, bool ext_insert = true) { std::string class_name = ClassInfo<T>::name; strip_trailing(class_name, "Entry"); if (ext_insert) out << "INSERT INTO " << class_name << " VALUES\n"; uint32 last_row = store.GetNumRows() - 1; for (uint32 row = 0; row <= last_row; ++row) { T const* entry = store.LookupEntry(row); if (!entry) continue; if (ext_insert) out << "("; else out << "INSERT INTO " << class_name << " VALUES ("; uint32 col = 0; for (FieldList::const_iterator itr = ClassInfo<T>::fields.begin(); itr != ClassInfo<T>::fields.end(); ++itr, ++col) { bool is_text = ((*itr)->getType() == TYPE_STRING || (*itr)->getType()== TYPE_STRING_CONST) && (*itr)->isArray() && (*itr)->getArraySize() == 16; // all string fields have 16 locales if (is_text && (*itr)->getArrayIndex() != 0) // only dump en_US locale continue; if (col > 0) out << ", "; if (is_text) out << '\'' << escape_string((*itr)->getValue(const_cast<T*>(entry))) << '\''; else out << (*itr)->getValue(const_cast<T*>(entry)); } if (ext_insert) out << (row < last_row ? "),\n" : ");\n"); else out << ");\n"; } }
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)); }