diff --git a/EQ2/source/WorldServer/Commands/Commands.cpp b/EQ2/source/WorldServer/Commands/Commands.cpp index e5464ec4a..0fda6ed4c 100644 --- a/EQ2/source/WorldServer/Commands/Commands.cpp +++ b/EQ2/source/WorldServer/Commands/Commands.cpp @@ -199,6 +199,8 @@ Commands::Commands(){ spawn_set_values["soga_body_age"] = SPAWN_SET_SOGA_BODY_AGE; spawn_set_values["attack_type"] = SPAWN_SET_ATTACK_TYPE; spawn_set_values["race_type"] = SPAWN_SET_RACE_TYPE; + spawn_set_values["loot_tier"] = SPAWN_SET_LOOT_TIER; + spawn_set_values["loot_drop_type"] = SPAWN_SET_LOOT_DROP_TYPE; zone_set_values["expansion_id"] = ZONE_SET_VALUE_EXPANSION_ID; zone_set_values["name"] = ZONE_SET_VALUE_NAME; @@ -880,6 +882,22 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c } break; } + case SPAWN_SET_LOOT_TIER:{ + if(target->IsEntity()){ + sprintf(tmp, "%u", target->GetLootTier()); + int32 new_value = atoul(value); + target->SetLootTier(new_value); + } + break; + } + case SPAWN_SET_LOOT_DROP_TYPE:{ + if(target->IsEntity()){ + sprintf(tmp, "%u", target->GetLootDropType()); + int32 new_value = atoul(value); + target->SetLootDropType(new_value); + } + break; + } if(temp_value) *temp_value = string(tmp); @@ -903,7 +921,7 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c if (target->GetDatabaseID() > 0) { char query[256]; - snprintf(query, 256, "update spawn set expansion_flag=%u where id=%i", atoul(value), target->GetDatabaseID()); + snprintf(query, 256, "update spawn set expansion_flag=%u where id=%u", atoul(value), target->GetDatabaseID()); if (database.RunQuery(query, strnlen(query, 256))) { if(client) @@ -917,7 +935,7 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c if (target->GetDatabaseID() > 0) { char query[256]; - snprintf(query, 256, "update spawn set holiday_flag=%u where id=%i", atoul(value), target->GetDatabaseID()); + snprintf(query, 256, "update spawn set holiday_flag=%u where id=%u", atoul(value), target->GetDatabaseID()); if (database.RunQuery(query, strnlen(query, 256))) { if(client) @@ -931,7 +949,7 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c if (target->GetDatabaseID() > 0) { char query[256]; - snprintf(query, 256, "update spawn set aaxp_rewards=%u where id=%i", atoul(value), target->GetDatabaseID()); + snprintf(query, 256, "update spawn set aaxp_rewards=%u where id=%u", atoul(value), target->GetDatabaseID()); if (database.RunQuery(query, strnlen(query, 256))) { if(client) @@ -1554,6 +1572,38 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c } break; } + case SPAWN_SET_LOOT_TIER:{ + int32 new_value = atoul(value); + target->SetLootTier(new_value); + + if (target->GetDatabaseID() > 0) + { + char query[256]; + snprintf(query, 256, "update spawn set loot_tier=%u where id=%u", atoul(value), target->GetDatabaseID()); + if (database.RunQuery(query, strnlen(query, 256))) + { + if(client) + client->Message(CHANNEL_COLOR_RED, "Ran query:%s", query); + } + } + break; + } + case SPAWN_SET_LOOT_DROP_TYPE:{ + int32 new_value = atoul(value); + target->SetLootDropType(new_value); + + if (target->GetDatabaseID() > 0) + { + char query[256]; + snprintf(query, 256, "update spawn set loot_drop_type=%u where id=%u", atoul(value), target->GetDatabaseID()); + if (database.RunQuery(query, strnlen(query, 256))) + { + if(client) + client->Message(CHANNEL_COLOR_RED, "Ran query:%s", query); + } + } + break; + } } } return true; @@ -4872,6 +4922,8 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie case SPAWN_SET_SOGA_BODY_AGE: case SPAWN_SET_ATTACK_TYPE: case SPAWN_SET_RACE_TYPE: + case SPAWN_SET_LOOT_TIER: + case SPAWN_SET_LOOT_DROP_TYPE: { // not applicable already ran db command break; @@ -5171,10 +5223,27 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie } case COMMAND_RELOAD_ITEMS:{ LogWrite(COMMAND__INFO, 0, "Command", "Reloading items.."); - client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Started Reloading items (this might take a few minutes...)"); - database.ReloadItemList(); - database.LoadMerchantInformation(); - client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Finished Reloading items."); + + int32 item_id = (sep && sep->arg[0]) ? atoul(sep->arg[0]) : 0; + if(item_id > 0) { + client->Message(CHANNEL_COLOR_YELLOW, "Reloading item %u based on /reload items [item_id].", item_id); + } + else { + client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Started Reloading items (this might take a few minutes...)"); + } + + database.ReloadItemList(item_id); + + if(!item_id) { + database.LoadMerchantInformation(); // we skip if there is only a reload of single item not all items + } + + if(item_id > 0) { + client->Message(CHANNEL_COLOR_YELLOW, "Reloaded item %u.", item_id); + } + else { + client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Finished Reloading items."); + } break; } case COMMAND_ENABLE_ABILITY_QUE:{ diff --git a/EQ2/source/WorldServer/Commands/Commands.h b/EQ2/source/WorldServer/Commands/Commands.h index 64943955d..a27d609f7 100644 --- a/EQ2/source/WorldServer/Commands/Commands.h +++ b/EQ2/source/WorldServer/Commands/Commands.h @@ -569,6 +569,8 @@ private: #define SPAWN_SET_ATTACK_TYPE 102 #define SPAWN_SET_RACE_TYPE 103 +#define SPAWN_SET_LOOT_TIER 104 +#define SPAWN_SET_LOOT_DROP_TYPE 105 #define ZONE_SET_VALUE_EXPANSION_ID 0 #define ZONE_SET_VALUE_NAME 1 diff --git a/EQ2/source/WorldServer/Items/Items.cpp b/EQ2/source/WorldServer/Items/Items.cpp index c14aa63df..eb9bd2693 100644 --- a/EQ2/source/WorldServer/Items/Items.cpp +++ b/EQ2/source/WorldServer/Items/Items.cpp @@ -865,6 +865,12 @@ void MasterItemList::RemoveAll(){ } void MasterItemList::AddItem(Item* item){ + map<int32, Item*>::iterator iter; + if((iter = items.find(item->details.item_id)) != items.end()) { + Item* tmpItem = items[item->details.item_id]; + items.erase(iter); + safe_delete(tmpItem); + } items[item->details.item_id] = item; } diff --git a/EQ2/source/WorldServer/Items/ItemsDB.cpp b/EQ2/source/WorldServer/Items/ItemsDB.cpp index b1ad03f06..48200d448 100644 --- a/EQ2/source/WorldServer/Items/ItemsDB.cpp +++ b/EQ2/source/WorldServer/Items/ItemsDB.cpp @@ -228,11 +228,13 @@ void WorldDatabase::LoadDataFromRow(DatabaseResult* result, Item* item) } -int32 WorldDatabase::LoadSkillItems() +int32 WorldDatabase::LoadSkillItems(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, spell_id, spell_tier FROM item_details_skill"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, spell_id, spell_tier FROM item_details_skill%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -262,11 +264,13 @@ int32 WorldDatabase::LoadSkillItems() return total; } -int32 WorldDatabase::LoadShields() +int32 WorldDatabase::LoadShields(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, mitigation_low, mitigation_high FROM item_details_shield"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, mitigation_low, mitigation_high FROM item_details_shield%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -292,11 +296,13 @@ int32 WorldDatabase::LoadShields() } return total; } -int32 WorldDatabase::LoadAdornments() +int32 WorldDatabase::LoadAdornments(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, duration, item_types,slot_type FROM item_details_adornments"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, duration, item_types,slot_type FROM item_details_adornments%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -331,11 +337,13 @@ int32 WorldDatabase::LoadClassifications() return total; } -int32 WorldDatabase::LoadBaubles() +int32 WorldDatabase::LoadBaubles(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, cast, recovery, duration, recast, display_slot_optional, display_cast_time, display_bauble_type, effect_radius, max_aoe_targets, display_until_cancelled FROM item_details_bauble"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, cast, recovery, duration, recast, display_slot_optional, display_cast_time, display_bauble_type, effect_radius, max_aoe_targets, display_until_cancelled FROM item_details_bauble%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -370,13 +378,14 @@ int32 WorldDatabase::LoadBaubles() return total; } -int32 WorldDatabase::LoadBooks() +int32 WorldDatabase::LoadBooks(int32 item_id) { DatabaseResult result; int32 total = 0; int32 id = 0; - if( database_new.Select(&result, "SELECT item_id, language, author, title FROM item_details_book") ) + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + if( database_new.Select(&result, "SELECT item_id, language, author, title FROM item_details_book%s", (item_id == 0) ? "" : select_query_addition.c_str()) ) { while( result.Next() ) { @@ -408,14 +417,15 @@ int32 WorldDatabase::LoadBooks() return total; } -int32 WorldDatabase::LoadItemsets() +int32 WorldDatabase::LoadItemsets(int32 item_id) { DatabaseResult result; int32 total = 0; int32 id = 0; + std::string select_query_addition = std::string(" and crate.item_id = ") + std::to_string(item_id); //if (database_new.Select(&result, "SELECT id, itemset_item_id, item_id, item_icon,item_stack_size,item_list_color,language_type FROM item_details_itemset")) - if (database_new.Select(&result, "select crate.item_id, crateitem.reward_item_id, crateitem.icon, crateitem.stack_size, crateitem.name_color, crateitem.name, crateitem.language_type from item_details_reward_crate crate, item_details_reward_crate_item crateitem where crateitem.crate_item_id = crate.item_id")) + if (database_new.Select(&result, "select crate.item_id, crateitem.reward_item_id, crateitem.icon, crateitem.stack_size, crateitem.name_color, crateitem.name, crateitem.language_type from item_details_reward_crate crate, item_details_reward_crate_item crateitem where crateitem.crate_item_id = crate.item_id%s", (item_id == 0) ? "" : select_query_addition.c_str())) { while (result.Next()) { @@ -439,11 +449,13 @@ int32 WorldDatabase::LoadItemsets() return total; } -int32 WorldDatabase::LoadHouseItem() +int32 WorldDatabase::LoadHouseItem(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, rent_reduction, status_rent_reduction, coin_rent_reduction, house_only FROM item_details_house"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, rent_reduction, status_rent_reduction, coin_rent_reduction, house_only FROM item_details_house%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -471,11 +483,13 @@ int32 WorldDatabase::LoadHouseItem() return total; } -int32 WorldDatabase::LoadRecipeBookItems() +int32 WorldDatabase::LoadRecipeBookItems(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, name FROM item_details_recipe_items"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, name FROM item_details_recipe_items%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -501,12 +515,14 @@ int32 WorldDatabase::LoadRecipeBookItems() return total; } -int32 WorldDatabase::LoadHouseContainers(){ +int32 WorldDatabase::LoadHouseContainers(int32 item_id){ DatabaseResult result; int32 total = 0; int32 id = 0; - if( database_new.Select(&result, "SELECT item_id, num_slots, allowed_types, broker_commission, fence_commission FROM item_details_house_container") ) + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + if( database_new.Select(&result, "SELECT item_id, num_slots, allowed_types, broker_commission, fence_commission FROM item_details_house_container%s", (item_id == 0) ? "" : select_query_addition.c_str()) ) { while (result.Next() ) { @@ -533,11 +549,13 @@ int32 WorldDatabase::LoadHouseContainers(){ return total; } -int32 WorldDatabase::LoadArmor() +int32 WorldDatabase::LoadArmor(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, mitigation_low, mitigation_high FROM item_details_armor"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, mitigation_low, mitigation_high FROM item_details_armor%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -563,11 +581,13 @@ int32 WorldDatabase::LoadArmor() return total; } -int32 WorldDatabase::LoadBags() +int32 WorldDatabase::LoadBags(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, num_slots, weight_reduction FROM item_details_bag"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, num_slots, weight_reduction FROM item_details_bag%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; if(result) @@ -595,11 +615,13 @@ int32 WorldDatabase::LoadBags() return total; } -int32 WorldDatabase::LoadFoods() +int32 WorldDatabase::LoadFoods(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, type, level, duration, satiation FROM item_details_food"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, type, level, duration, satiation FROM item_details_food%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -629,11 +651,13 @@ int32 WorldDatabase::LoadFoods() return total; } -int32 WorldDatabase::LoadRangeWeapons() +int32 WorldDatabase::LoadRangeWeapons(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, dmg_low, dmg_high, dmg_mastery_low, dmg_mastery_high, dmg_base_low, dmg_base_high, delay, damage_rating, range_low, range_high, damage_type FROM item_details_range"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, dmg_low, dmg_high, dmg_mastery_low, dmg_mastery_high, dmg_base_low, dmg_base_high, delay, damage_rating, range_low, range_high, damage_type FROM item_details_range%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -669,11 +693,13 @@ int32 WorldDatabase::LoadRangeWeapons() return total; } -int32 WorldDatabase::LoadThrownWeapons() +int32 WorldDatabase::LoadThrownWeapons(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, range_bonus, damage_bonus, hit_bonus, damage_type FROM item_details_thrown"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, range_bonus, damage_bonus, hit_bonus, damage_type FROM item_details_thrown%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -703,11 +729,13 @@ int32 WorldDatabase::LoadThrownWeapons() return total; } -int32 WorldDatabase::LoadWeapons() +int32 WorldDatabase::LoadWeapons(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, wield_style, dmg_low, dmg_high, dmg_mastery_low, dmg_mastery_high, dmg_base_low, dmg_base_high, delay, damage_rating, damage_type FROM item_details_weapon"); + + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, wield_style, dmg_low, dmg_high, dmg_mastery_low, dmg_mastery_high, dmg_base_low, dmg_base_high, delay, damage_rating, damage_type FROM item_details_weapon%s", (item_id == 0) ? "" : select_query_addition.c_str()); int32 total = 0; int32 id = 0; @@ -742,11 +770,13 @@ int32 WorldDatabase::LoadWeapons() return total; } -int32 WorldDatabase::LoadItemAppearances() +int32 WorldDatabase::LoadItemAppearances(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, equip_type, red, green, blue, highlight_red, highlight_green, highlight_blue FROM item_appearances ORDER BY item_id asc"); + + std::string select_query_addition = std::string("where item_id = ") + std::to_string(item_id) + " "; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, equip_type, red, green, blue, highlight_red, highlight_green, highlight_blue FROM item_appearances %sORDER BY item_id asc", (item_id == 0) ? "" : select_query_addition.c_str()); int32 id = 0; Item* item = 0; int32 total = 0; @@ -775,11 +805,13 @@ int32 WorldDatabase::LoadItemAppearances() return total; } -int32 WorldDatabase::LoadItemEffects() +int32 WorldDatabase::LoadItemEffects(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, effect, percentage, bullet FROM item_effects ORDER BY item_id, id"); + + std::string select_query_addition = std::string("where item_id = ") + std::to_string(item_id) + " "; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, effect, percentage, bullet FROM item_effects %sORDER BY item_id, id", (item_id == 0) ? "" : select_query_addition.c_str()); int32 id = 0; Item* item = 0; int32 total = 0; @@ -807,11 +839,13 @@ int32 WorldDatabase::LoadItemEffects() } return total; } -int32 WorldDatabase::LoadBookPages() +int32 WorldDatabase::LoadBookPages(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, page, page_text, page_text_valign, page_text_halign FROM item_details_book_pages ORDER BY item_id, id"); + + std::string select_query_addition = std::string("where item_id = ") + std::to_string(item_id) + " "; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, page, page_text, page_text_valign, page_text_halign FROM item_details_book_pages %sORDER BY item_id, id", (item_id == 0) ? "" : select_query_addition.c_str()); int32 id = 0; Item* item = 0; int32 total = 0; @@ -839,11 +873,13 @@ int32 WorldDatabase::LoadBookPages() } return total; } -int32 WorldDatabase::LoadItemLevelOverride() +int32 WorldDatabase::LoadItemLevelOverride(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, adventure_class_id, tradeskill_class_id, level FROM item_levels_override ORDER BY item_id asc"); + + std::string select_query_addition = std::string("where item_id = ") + std::to_string(item_id) + " "; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, adventure_class_id, tradeskill_class_id, level FROM item_levels_override %sORDER BY item_id asc", (item_id == 0) ? "" : select_query_addition.c_str()); int32 id = 0; Item* item = 0; int32 total = 0; @@ -872,11 +908,13 @@ int32 WorldDatabase::LoadItemLevelOverride() return total; } -int32 WorldDatabase::LoadItemStats() +int32 WorldDatabase::LoadItemStats(int32 item_id) { Query query; MYSQL_ROW row; - MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, type, subtype, iValue, fValue, sValue, level FROM item_mod_stats ORDER BY stats_order asc"); + + std::string select_query_addition = std::string("where item_id = ") + std::to_string(item_id) + " "; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT item_id, type, subtype, iValue, fValue, sValue, level FROM item_mod_stats %sORDER BY stats_order asc", (item_id == 0) ? "" : select_query_addition.c_str()); int32 id = 0; Item* item = 0; int32 total = 0; @@ -912,7 +950,7 @@ int32 WorldDatabase::LoadItemStats() return total; } -int32 WorldDatabase::LoadItemModStrings() +int32 WorldDatabase::LoadItemModStrings(int32 item_id) { DatabaseResult result; @@ -920,7 +958,8 @@ int32 WorldDatabase::LoadItemModStrings() Item* item = 0; int32 total = 0; - if( !database_new.Select(&result, "SELECT * FROM item_mod_strings") ) { + std::string select_query_addition = std::string(" where item_id = ") + std::to_string(item_id); + if( !database_new.Select(&result, "SELECT * FROM item_mod_strings%s", (item_id == 0) ? "" : select_query_addition.c_str()) ) { LogWrite(ITEM__ERROR, 0, "Items", "Cannot load WorldDatabase::LoadItemModStrings in %s, line: %i", __FUNCTION__, __LINE__); return 0; } @@ -953,7 +992,7 @@ void WorldDatabase::LoadBrokerItemStats() DatabaseResult result; if( !database_new.Select(&result, "SELECT * FROM broker_item_map") ) { - LogWrite(ITEM__ERROR, 0, "Items", "Cannot load WorldDatabase::LoadItemModStrings in %s, line: %i", __FUNCTION__, __LINE__); + LogWrite(ITEM__ERROR, 0, "Items", "Cannot load WorldDatabase::LoadBrokerItemStats in %s, line: %i", __FUNCTION__, __LINE__); } else { while( result.Next() ) @@ -966,14 +1005,16 @@ void WorldDatabase::LoadBrokerItemStats() } } } -void WorldDatabase::ReloadItemList() +void WorldDatabase::ReloadItemList(int32 item_id) { LogWrite(ITEM__DEBUG, 0, "Items", "Unloading Item List..."); - master_item_list.RemoveAll(); - LoadItemList(); + if(!item_id) { + master_item_list.RemoveAll(); + } + LoadItemList(item_id); } -void WorldDatabase::LoadItemList() +void WorldDatabase::LoadItemList(int32 item_id) { DatabaseResult result; @@ -981,8 +1022,8 @@ void WorldDatabase::LoadItemList() int32 total = 0; int32 normal_items = 0; string item_type; - - if( !database_new.Select(&result, "SELECT * FROM items") ) + std::string select_query_addition = std::string(" where id = ") + std::to_string(item_id); + if( !database_new.Select(&result, "SELECT * FROM items%s", (item_id == 0) ? "" : select_query_addition.c_str()) ) LogWrite(ITEM__ERROR, 0, "Items", "Cannot load items in %s, line: %i", __FUNCTION__, __LINE__); else { @@ -1005,42 +1046,44 @@ void WorldDatabase::LoadItemList() } LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Normal Items", normal_items); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Baubles", LoadBaubles()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Bags", LoadBags()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Books", LoadBooks()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Sets", LoadItemsets()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Items", LoadHouseItem()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Food Items", LoadFoods()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Weapons", LoadWeapons()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Ranged Weapons", LoadRangeWeapons()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Thrown Weapons", LoadThrownWeapons()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Armor Pieces", LoadArmor()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Shields", LoadShields()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Skill Items", LoadSkillItems()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Adornment Items", LoadAdornments()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Recipe Book Items", LoadRecipeBookItems()); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Containers", LoadHouseContainers()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Baubles", LoadBaubles(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Bags", LoadBags(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Books", LoadBooks(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Sets", LoadItemsets(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Items", LoadHouseItem(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Food Items", LoadFoods(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Weapons", LoadWeapons(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Ranged Weapons", LoadRangeWeapons(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Thrown Weapons", LoadThrownWeapons(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Armor Pieces", LoadArmor(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Shields", LoadShields(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Skill Items", LoadSkillItems(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Adornment Items", LoadAdornments(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Recipe Book Items", LoadRecipeBookItems(item_id)); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u House Containers", LoadHouseContainers(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Appearances..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Appearances", LoadItemAppearances()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Appearances", LoadItemAppearances(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Stats..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Stats", LoadItemStats()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Stats", LoadItemStats(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Stats Mods (Strings)..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Stats", LoadItemModStrings()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Stats", LoadItemModStrings(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Effects..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Effects", LoadItemEffects()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Effects", LoadItemEffects(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Book Pages..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Book Pages", LoadBookPages()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Book Pages", LoadBookPages(item_id)); LogWrite(ITEM__DEBUG, 0, "Items", "Loading Item Level Overrides..."); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Level Overrides", LoadItemLevelOverride()); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded %u Item Level Overrides", LoadItemLevelOverride(item_id)); - LoadBrokerItemStats(); - LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded Broker Item Stat Map Versioning"); + if(!item_id) { + LoadBrokerItemStats(); + LogWrite(ITEM__DEBUG, 0, "Items", "\tLoaded Broker Item Stat Map Versioning"); + } LogWrite(ITEM__INFO, 0, "Items", "Loaded %u Total Item%s (took %u seconds)", total, ( total == 1 ) ? "" : "s", Timer::GetUnixTimeStamp() - t_now); } diff --git a/EQ2/source/WorldServer/WorldDatabase.h b/EQ2/source/WorldServer/WorldDatabase.h index d4fc1ec77..1fd561438 100644 --- a/EQ2/source/WorldServer/WorldDatabase.h +++ b/EQ2/source/WorldServer/WorldDatabase.h @@ -261,32 +261,32 @@ public: void LoadGroundSpawns(ZoneServer* zone); void LoadWidgets(ZoneServer* zone); void LoadSigns(ZoneServer* zone); - void ReloadItemList(); - void LoadItemList(); - int32 LoadItemStats(); - int32 LoadItemModStrings(); - int32 LoadItemAppearances(); - int32 LoadItemLevelOverride(); - int32 LoadItemEffects(); - int32 LoadBookPages(); + void ReloadItemList(int32 item_id = 0); + void LoadItemList(int32 item_id = 0); + int32 LoadItemStats(int32 item_id = 0); + int32 LoadItemModStrings(int32 item_id = 0); + int32 LoadItemAppearances(int32 item_id = 0); + int32 LoadItemLevelOverride(int32 item_id = 0); + int32 LoadItemEffects(int32 item_id = 0); + int32 LoadBookPages(int32 item_id = 0); int32 LoadNextUniqueItemID(); - int32 LoadSkillItems(); - int32 LoadRangeWeapons(); - int32 LoadThrownWeapons(); - int32 LoadBaubles(); - int32 LoadBooks(); - int32 LoadItemsets(); - int32 LoadHouseItem(); - int32 LoadRecipeBookItems(); - int32 LoadArmor(); - int32 LoadAdornments(); + int32 LoadSkillItems(int32 item_id = 0); + int32 LoadRangeWeapons(int32 item_id = 0); + int32 LoadThrownWeapons(int32 item_id = 0); + int32 LoadBaubles(int32 item_id = 0); + int32 LoadBooks(int32 item_id = 0); + int32 LoadItemsets(int32 item_id = 0); + int32 LoadHouseItem(int32 item_id = 0); + int32 LoadRecipeBookItems(int32 item_id = 0); + int32 LoadArmor(int32 item_id = 0); + int32 LoadAdornments(int32 item_id = 0); int32 LoadClassifications(); - int32 LoadShields(); - int32 LoadBags(); - int32 LoadFoods(); - int32 LoadWeapons(); + int32 LoadShields(int32 item_id = 0); + int32 LoadBags(int32 item_id = 0); + int32 LoadFoods(int32 item_id = 0); + int32 LoadWeapons(int32 item_id = 0); int32 LoadRanged(); - int32 LoadHouseContainers(); + int32 LoadHouseContainers(int32 item_id = 0); void LoadBrokerItemStats(); map<int32, vector<LevelArray*> >* LoadSpellClasses();