Merge pull request #155 from SilverSokolova/main

Allow buying/crafting more than 1000 items at once [skip ci]
This commit is contained in:
Kae 2024-12-19 19:07:34 +11:00 committed by GitHub
commit 157eb7c141
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 18 additions and 8 deletions

View File

@ -4,7 +4,11 @@
// Disables the crafting timer if true.
"disableTimer" : false,
// This is only used if the crafting timer is enabled.
// This is how many crafts are ran when the crafting timer wraps.
"craftCount" : 1
} }
// This is only used if the crafting timer is enabled.
// This is how many crafts are ran when the crafting timer wraps.
"craftCount" : 1,
// This is how many of any item can be crafted at once.
// This is also used by merchants.
"maxSpinCount" : 9999
} }

View File

@ -42,6 +42,7 @@ CraftingPane::CraftingPane(WorldClientPtr worldClient, PlayerPtr player, Json co
jsonMerge(assets->fetchJson(baseConfig), settings));
m_filter = StringSet::from(jsonToStringList(m_settings.get("filter", JsonArray())));
m_maxSpinCount = m_settings.getUInt("maxSpinCount", 1000);
GuiReader reader;
reader.registerCallback("spinCount.up", [=](Widget*) {
@ -752,14 +753,14 @@ List<ItemRecipe> CraftingPane::determineRecipes() {
int CraftingPane::maxCraft() {
if (m_player->isAdmin())
return 1000;
return m_maxSpinCount;
auto itemDb = Root::singleton().itemDatabase();
int res = 0;
if (m_guiList->selectedItem() != NPos && m_guiList->selectedItem() < m_recipes.size()) {
HashMap<ItemDescriptor, uint64_t> normalizedBag = m_player->inventory()->availableItems();
auto selectedRecipe = recipeFromSelectedWidget();
res = itemDb->maxCraftableInBag(normalizedBag, m_player->inventory()->availableCurrencies(), selectedRecipe);
res = std::min(res, 1000);
res = std::min(res, m_maxSpinCount);
}
return res;
}

View File

@ -69,6 +69,8 @@ private:
StringSet m_filter;
int m_maxSpinCount;
int m_recipeAutorefreshCooldown;
HashMap<ItemDescriptor, ItemPtr> m_itemCache;

View File

@ -38,6 +38,8 @@ MerchantPane::MerchantPane(
m_itemBag = make_shared<ItemBag>(m_settings.getUInt("sellContainerSize"));
m_maxBuyCount = m_settings.getUInt("maxSpinCount", assets->json("/interface/windowconfig/crafting.config:default").getUInt("maxSpinCount", 1000));
GuiReader reader;
reader.registerCallback("spinCount.up", [=](Widget*) {
if (m_selectedIndex != NPos) {
@ -360,8 +362,8 @@ int MerchantPane::maxBuyCount() {
auto assets = Root::singleton().assets();
auto unitPrice = selected->data().toUInt();
if (unitPrice == 0)
return 1000;
return min(1000, (int)floor(m_player->currency("money") / unitPrice));
return m_maxBuyCount;
return min(m_maxBuyCount, (int)floor(m_player->currency("money") / unitPrice));
} else {
return 0;
}

View File

@ -76,6 +76,7 @@ private:
ItemBagPtr m_itemBag;
int m_buyCount;
int m_maxBuyCount;
};
}