bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly) { if (IsDead()) { ClearRefineMode(); return false; } if (!item) { ClearRefineMode(); return false; } if (!CanHandleItem(true)) { ClearRefineMode(); return false; } if (quest::CQuestManager::instance().GetEventFlag("update_refine_time") != 0) { if (get_global_time() < quest::CQuestManager::instance().GetEventFlag("update_refine_time") + (60 * 5)) { sys_log(0, "can't refine %d %s", GetPlayerID(), GetName()); return false; } } const TRefineTable * prt = CRefineManager::instance().GetRefineRecipe(item->GetRefineSet()); if (!prt) return false; DWORD result_vnum = item->GetRefinedVnum(); // REFINE_COST goldptr_1 cost = ComputeRefineFee(prt->cost); int RefineChance = GetQuestFlag("main_quest_lv7.refine_chance"); if (RefineChance > 0 && item->CheckItemUseLevel(20) && item->GetType() == ITEM_WEAPON) { cost = 0; } // END_OF_REFINE_COST if (result_vnum == 0) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("No advancement possible.")); return false; } if (item->GetCount() > 1) //@M2Fixme020 { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot refine a stacked item.")); return false; } if (item->GetType() == ITEM_USE && item->GetSubType() == USE_TUNING) return false; TItemTable * pProto = ITEM_MANAGER::instance().GetTable(item->GetRefinedVnum()); if (!pProto) { sys_err("DoRefine NOT GET ITEM PROTO %d", item->GetRefinedVnum()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Item can't be made better.")); return false; } // REFINE_COST if (GetGold() < cost) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Not enough Yang for an advancement.")); return false; } if (!bMoneyOnly && !RefineChance) { for (int i = 0; i < prt->material_count; ++i) { if (CountSpecifyItem(prt->materials[i].vnum, item->GetCell()) < prt->materials[i].count) //@M2Reserved014 { if (test_server) { ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Not enough material for an advancement.")); return false; } } for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count, item->GetCell()); //@M2Reserved014 } int prob = number(1, 100); if (IsRefineThroughGuild() || bMoneyOnly) prob -= 10; if (RefineChance > 0 && cost == 0) { SetQuestFlag("main_quest_lv7.refine_chance", RefineChance - 1); } #ifdef ENABLE_REFINE_CHANCE_PERCENT CAffect* pAffect = FindAffect(AFFECT_REFINE_PERC); if (pAffect) { prob -= pAffect->lApplyValue; if (IsGM()) ChatPacket(CHAT_TYPE_INFO, "Set rate : %d Get rate %d", prob, prt->prob); } #endif // END_OF_REFINE_COST if (prob <= prt->prob) { LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false); if (pkNewItem) { DWORD olditem = item->GetID(); //const char* itemname = item->GetName(); ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem); CELLPTR wCell = item->GetCell(); // DETAIL_REFINE_LOG NotifyRefineSuccess(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER"); ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)"); // END_OF_DETAIL_REFINE_LOG pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, wCell)); #ifdef ENABLE_EXTENDED_BATTLE_PASS UpdateExtBattlePassMissionProgress(BP_ITEM_REFINE, 1, item->GetVnum()); #endif ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem); //LogManager::instance().RefineLog(GetName(), pkNewItem->GetName(), olditem, pkNewItem->GetID(), "SUCESS"); sys_log(0, "Refine Success %d", cost); sys_log(0, "PayPee %d", cost); PayRefineFee(cost); sys_log(0, "PayPee End %d", cost); //M2_DELETE_ARRAY(itemname); //@M2Fixme021 } else { // DETAIL_REFINE_LOG sys_err("cannot create item %u", result_vnum); NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER"); // END_OF_DETAIL_REFINE_LOG } } else { //LogManager::instance().RefineLog(GetName(), item->GetName(), item->GetID(), 0, "FAILED"); NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER"); ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)"); //PointChange(POINT_GOLD, -cost); PayRefineFee(cost); } return true; }