diff --git a/.gitignore b/.gitignore index 7f2c069f8..675879489 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ server/logs/*.log server/*.log +*.bak diff --git a/EQ2/source/WorldServer/Commands/Commands.cpp b/EQ2/source/WorldServer/Commands/Commands.cpp index 768c93f25..1bb2f0983 100644 --- a/EQ2/source/WorldServer/Commands/Commands.cpp +++ b/EQ2/source/WorldServer/Commands/Commands.cpp @@ -2275,8 +2275,8 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie LogWrite(COMMAND__ERROR, 0, "Command", "Unknown spell ID: %u and tier: %u", item->skill_info->spell_id, item->skill_info->spell_tier); } else if(item->generic_info.item_type == 7){ - LogWrite(TRADESKILL__DEBUG, 0, "Recipe", "Scribing recipe book %s (%u) for player %s.", item->name.c_str(), item->details.item_id, player->GetName()); - Recipe* recipe_book = new Recipe(master_recipebook_list.GetRecipeBooks(item->details.item_id)); + LogWrite(TRADESKILL__DEBUG, 0, "Recipe", "Scribing recipe book %s (%u) for player %s.", item->name.c_str(), item->recipebook_info->recipe_id, player->GetName()); + Recipe* recipe_book = new Recipe(master_recipebook_list.GetRecipeBooks(item->recipebook_info->recipe_id));//(item->details.item_id)); // if valid recipe book and the player doesn't have it if (recipe_book && recipe_book->GetLevel() > client->GetPlayer()->GetTSLevel()) { client->Message(CHANNEL_NARRATIVE, "Your tradeskill level is not high enough to scribe this book."); @@ -2286,7 +2286,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie client->Message(CHANNEL_NARRATIVE, "Your tradeskill class cannot use this recipe."); safe_delete(recipe_book); } - else if (recipe_book && !(client->GetPlayer()->GetRecipeBookList()->HasRecipeBook(item->details.item_id))) { + else if (recipe_book && !(client->GetPlayer()->GetRecipeBookList()->HasRecipeBook(item->recipebook_info->recipe_id))){// (item->details.item_id))) { LogWrite(TRADESKILL__DEBUG, 0, "Recipe", "Valid recipe book that the player doesn't have"); // Add recipe book to the players list client->GetPlayer()->GetRecipeBookList()->AddRecipeBook(recipe_book); diff --git a/EQ2/source/WorldServer/Items/Items.cpp b/EQ2/source/WorldServer/Items/Items.cpp index b2f9b1a38..c7030dde9 100644 --- a/EQ2/source/WorldServer/Items/Items.cpp +++ b/EQ2/source/WorldServer/Items/Items.cpp @@ -1502,6 +1502,7 @@ void Item::SetItemType(int8 in_type){ } else if(IsRecipeBook() && !recipebook_info){ recipebook_info = new RecipeBook_Info; + recipebook_info->recipe_id = 0; recipebook_info->uses = 0; } else if(IsBook() && !book_info){ @@ -2422,7 +2423,7 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16 } } packet->setDataByName("uses", recipebook_info->uses); - if(player->GetRecipeBookList()->HasRecipeBook(details.item_id)) + if(player->GetRecipeBookList()->HasRecipeBook(recipebook_info->recipe_id)) packet->setDataByName("scribed", 1); else packet->setDataByName("scribed", 0); diff --git a/EQ2/source/WorldServer/Items/Items.h b/EQ2/source/WorldServer/Items/Items.h index c04bc7a0c..8d7842d3c 100644 --- a/EQ2/source/WorldServer/Items/Items.h +++ b/EQ2/source/WorldServer/Items/Items.h @@ -869,6 +869,7 @@ public: }; struct RecipeBook_Info{ vector recipes; + int32 recipe_id; int8 uses; }; struct ItemSet_Info{ diff --git a/EQ2/source/WorldServer/Items/ItemsDB.cpp b/EQ2/source/WorldServer/Items/ItemsDB.cpp index 48200d448..d670ad968 100644 --- a/EQ2/source/WorldServer/Items/ItemsDB.cpp +++ b/EQ2/source/WorldServer/Items/ItemsDB.cpp @@ -488,8 +488,11 @@ int32 WorldDatabase::LoadRecipeBookItems(int32 item_id) Query query; MYSQL_ROW row; - 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()); + //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()); + std::string select_query_addition = std::string(" and r.item_id = ") + std::to_string(item_id); + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT r.item_id, ri.recipe_id ,ri.`name`FROM item_details_recipe r LEFT JOIN item_details_recipe_items ri ON ri.recipe_id = r.recipe_id where ri.recipe_id is not null%s", (item_id == 0) ? "" : select_query_addition.c_str()); + int32 total = 0; int32 id = 0; @@ -503,9 +506,11 @@ int32 WorldDatabase::LoadRecipeBookItems(int32 item_id) if(item) { LogWrite(ITEM__DEBUG, 5, "Items", "\tRecipe Book for item_id %u", id); - LogWrite(ITEM__DEBUG, 5, "Items", "\tType: %i, '%s'", ITEM_TYPE_RECIPE, row[1]); + LogWrite(ITEM__DEBUG, 5, "Items", "\tType: %i, '%s'", ITEM_TYPE_RECIPE, row[2]); item->SetItemType(ITEM_TYPE_RECIPE); - item->recipebook_info->recipes.push_back(string(row[1])); + item->recipebook_info->recipe_id = (atoi(row[1])); + item->recipebook_info->recipes.push_back(string(row[2])); + //item->recipebook_info->recipe_id(row[1]); total++; } else @@ -1286,6 +1291,9 @@ void WorldDatabase::LoadCharacterItemList(int32 account_id, int32 char_id, Playe if(master_item) { Item* item = new Item(master_item); + int32 xxx = 0; + if(master_item->recipebook_info) + item->recipebook_info->recipe_id = master_item->recipebook_info->recipe_id; item->details.unique_id = strtoul(row[1], NULL, 0); item->details.slot_id = atoi(row[2]); diff --git a/EQ2/source/WorldServer/Recipes/Recipe.cpp b/EQ2/source/WorldServer/Recipes/Recipe.cpp index 25d3c1538..6973364de 100644 --- a/EQ2/source/WorldServer/Recipes/Recipe.cpp +++ b/EQ2/source/WorldServer/Recipes/Recipe.cpp @@ -153,7 +153,7 @@ int32 MasterRecipeList::Size() { } vector MasterRecipeList::GetRecipes(const char* book_name) { - vector ret;; + vector ret; map::iterator itr; m_recipes.writelock(__FUNCTION__, __LINE__); @@ -303,6 +303,8 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display Item* item = 0; RecipeProducts* rp = 0; vector::iterator itr; + vector comp_list; + int8 i = 0; int32 firstID = 0; int32 primary_comp_id = 0; @@ -412,6 +414,7 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display if (item) { packet->setSubstructDataByName("recipe_info", "primary_qty_avail", item->details.count); packet->setSubstructDataByName("recipe_info", "primary_comp", recipe->primary_build_comp_title); + break; } } // store the id of the primary comp @@ -436,11 +439,11 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display int8 total_build_components = 0; if (recipe->components.count(1) > 0) total_build_components++; - if (recipe->components.count(2)) + if (recipe->components.count(2) > 0) total_build_components++; - if (recipe->components.count(3)) + if (recipe->components.count(3) > 0) total_build_components++; - if (recipe->components.count(4)) + if (recipe->components.count(4) > 0) total_build_components++; @@ -486,7 +489,7 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display item = client->GetPlayer()->item_list.GetItemFromID((*itr)); if (item) { packet->setArrayDataByName("build_comp_qty_avail", item->details.count, index ); - + break; } } else if (index == 2) { @@ -500,7 +503,7 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display item = client->GetPlayer()->item_list.GetItemFromID((*itr)); if (item) { packet->setArrayDataByName("build_comp_qty_avail", item->details.count, index ); - + break; } } else if (index == 3) { @@ -514,7 +517,7 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display item = client->GetPlayer()->item_list.GetItemFromID((*itr)); if (item) { packet->setArrayDataByName("build_comp_qty_avail", item->details.count, index ); - + break; } } @@ -663,6 +666,9 @@ EQ2Packet * Recipe::SerializeRecipe(Client *client, Recipe *recipe, bool display return app; } -void Recipe::AddBuildComp(int32 itemID, int8 slot) { - components[slot].push_back(itemID); +void Recipe::AddBuildComp(int32 itemID, int8 slot, bool preffered) { + if (preffered = 1) + components[slot].insert(components[slot].begin(), itemID); + else + components[slot].push_back(itemID); } diff --git a/EQ2/source/WorldServer/Recipes/Recipe.h b/EQ2/source/WorldServer/Recipes/Recipe.h index 4f77d1065..631bc3c99 100644 --- a/EQ2/source/WorldServer/Recipes/Recipe.h +++ b/EQ2/source/WorldServer/Recipes/Recipe.h @@ -30,6 +30,12 @@ class Item; using namespace std; +struct RecipeComp + +{ + int32 RecipeComp; + +}; struct RecipeProducts { int32 product_id; int32 byproduct_id; @@ -122,7 +128,7 @@ public: ///Add a build component to this recipe ///Item id of the component ///Slot id for this component - void AddBuildComp(int32 itemID, int8 slot); + void AddBuildComp(int32 itemID, int8 slot, bool preferred = 0); // int8 = slot, vector = itemid map > components; diff --git a/EQ2/source/WorldServer/Recipes/RecipeDB.cpp b/EQ2/source/WorldServer/Recipes/RecipeDB.cpp index 0da380042..c29500f96 100644 --- a/EQ2/source/WorldServer/Recipes/RecipeDB.cpp +++ b/EQ2/source/WorldServer/Recipes/RecipeDB.cpp @@ -41,8 +41,8 @@ void WorldDatabase::LoadRecipes() { "r.stage0_id, r.stage1_id, r.stage2_id, r.stage3_id, r.stage4_id, r.stage0_qty, r.stage1_qty, r.stage2_qty, r.stage3_qty, r.stage4_qty,\n" "r.stage0_byp_id, r.stage1_byp_id, r.stage2_byp_id, r.stage3_byp_id, r.stage4_byp_id, r.stage0_byp_qty, r.stage1_byp_qty, r.stage2_byp_qty, r.stage3_byp_qty, r.stage4_byp_qty\n" "FROM `recipe` r\n" - "LEFT JOIN ((SELECT item_id, soe_recipe_crc FROM item_details_recipe_items GROUP BY soe_recipe_crc) as idri) ON idri.soe_recipe_crc = r.soe_id\n" - "LEFT JOIN items i ON idri.item_id = i.id\n" + "LEFT JOIN ((SELECT recipe_id, soe_recipe_crc FROM item_details_recipe_items GROUP BY soe_recipe_crc) as idri) ON idri.soe_recipe_crc = r.soe_id\n" + "LEFT JOIN items i ON idri.recipe_id = i.id\n" "INNER JOIN items ipc ON r.stage4_id = ipc.id\n" "INNER JOIN recipe_comp_list pcl ON r.primary_comp_list = pcl.id\n" "INNER JOIN recipe_comp_list fcl ON r.fuel_comp_list = fcl.id\n" @@ -243,10 +243,10 @@ void WorldDatabase::LoadRecipeComponents() { bool status = database_new.Select(&res, "SELECT r.id, pc.item_id AS primary_comp, fc.item_id AS fuel_comp, sc.item_id as secondary_comp, rsc.`index` + 1 AS slot\n" "FROM recipe r\n" - "INNER JOIN (select comp_list, item_id FROM recipe_comp_list_item GROUP BY comp_list) as pc ON r.primary_comp_list = pc.comp_list\n" - "INNER JOIN (select comp_list, item_id FROM recipe_comp_list_item GROUP BY comp_list) as fc ON r.fuel_comp_list = fc.comp_list\n" + "INNER JOIN (select comp_list, item_id FROM recipe_comp_list_item ) as pc ON r.primary_comp_list = pc.comp_list\n" + "INNER JOIN (select comp_list, item_id FROM recipe_comp_list_item ) as fc ON r.fuel_comp_list = fc.comp_list\n" "LEFT JOIN recipe_secondary_comp rsc ON rsc.recipe_id = r.id\n" - "LEFT JOIN (select comp_list, item_id FROM recipe_comp_list_item GROUP BY comp_list) as sc ON rsc.comp_list = sc.comp_list\n" + "LEFT JOIN (select comp_list, item_id FROM recipe_comp_list_item) as sc ON rsc.comp_list = sc.comp_list\n" "WHERE r.bHaveAllProducts\n" "ORDER BY r.id, rsc.`index` ASC"); @@ -265,7 +265,6 @@ void WorldDatabase::LoadRecipeComponents() { if (!recipe) { continue; } - recipe->AddBuildComp(res.GetInt32(1), 0); recipe->AddBuildComp(res.GetInt32(2), 5); }