From 81ca7a1bfdfbc4b770511dfadf7a022b0f590ee0 Mon Sep 17 00:00:00 2001 From: mackal Date: Mon, 8 Apr 2013 14:16:08 -0400 Subject: [PATCH] More work on salvage, added some extra checks and won't return stacks of items --- zone/tradeskills.cpp | 53 +++++++++++++++++++++++++++++++------------- zone/zonedb.h | 2 +- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/zone/tradeskills.cpp b/zone/tradeskills.cpp index 920906b7e..6c92fb158 100644 --- a/zone/tradeskills.cpp +++ b/zone/tradeskills.cpp @@ -1063,11 +1063,14 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { // Rolls on each item, is possible to return everything int SalvageChance = aabonuses.SalvageChance + itembonuses.SalvageChance + spellbonuses.SalvageChance; - if(SalvageChance) { - itr = spec->onsalvage.begin(); - while(itr != spec->onsalvage.end()) { - if(MakeRandomInt(0,99) < SalvageChance) - SummonItem(itr->first, itr->second); + // Skip check if not a normal TS or if a quest recipe these should be nofail, but check amyways + if(SalvageChance && spec->tradeskill != 75 && !spec->quest) { + itr = spec->salvage.begin(); + uint8 sc = 0; + while(itr != spec->salvage.end()) { + for(sc = 0; sc < itr->second; sc++) + if(MakeRandomInt(0,99) < SalvageChance) + SummonItem(itr->first, 1); itr++; } } @@ -1421,17 +1424,37 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id qlen = MakeAnyLenString(&query, "SELECT item_id,salvagecount FROM tradeskill_recipe_entries" " WHERE salvagecount>0 AND recipe_id=%u", recipe_id); - spec->onsalvage.clear(); - if (RunQuery(query, qlen, errbuf, &result)) { - qcount = mysql_num_rows(result); - uint8 r; - for(r = 0; r < qcount; r++) { - row = mysql_fetch_row(result); - uint32 item = (uint32)atoi(row[0]); - uint8 num = (uint8)atoi(row[1]); - spec->onsalvage.push_back(pair(item, num)); + spec->salvage.clear(); + // Don't bother with the query if TS is nofail + if (!spec->nofail) { + if (RunQuery(query, qlen, errbuf, &result)) { + qcount = mysql_num_rows(result); + uint8 r; + for(r = 0; r < qcount; r++) { + row = mysql_fetch_row(result); + uint32 item = (uint32)atoi(row[0]); + uint8 num = (uint8)atoi(row[1]); + spec->salvage.push_back(pair(item, num)); + } + mysql_free_result(result); + } + + // Previous query returned nothing, default to component list + if (!spec->salvage.size()) { + qlen = MakeAnyLenString(&query, "SELECT item_id,componentcount FROM tradeskill_recipe_entries" + " WHERE componentcount>0 AND recipe_id=%u", recipe_id); + if (RunQuery(query, qlen, errbuf, &result)) { + qcount = mysql_num_rows(result); + uint8 r; + for(r =0; r < qcount; r++) { + row = mysql_fetch_row(result); + uint32 item = (uint32)atoi(row[0]); + uint8 num = (uint8)atoi(row[1]); + spec->salvage.push_back(pair(item, num)); + } + mysql_free_result(result); + } } - mysql_free_result(result); } safe_delete_array(query); diff --git a/zone/zonedb.h b/zone/zonedb.h index f96919723..d0f5dc9be 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -46,7 +46,7 @@ struct DBTradeskillRecipe_Struct { bool replace_container; vector< pair > onsuccess; vector< pair > onfail; - vector< pair > onsalvage; + vector< pair > salvage; string name; uint8 must_learn; bool has_learnt;