This commit is contained in:
Yunfan Li
2023-08-28 17:29:14 +08:00
parent 1136b7bfdc
commit 9efec9b325
8 changed files with 39 additions and 30 deletions

View File

@@ -9,6 +9,7 @@
#include "LootStrategyValue.h"
#include "LootObjectStack.h"
#include "GuildTaskMgr.h"
#include "PlayerbotAIConfig.h"
#include "Playerbots.h"
#include "ServerFacade.h"
@@ -31,6 +32,10 @@ bool LootAction::Execute(Event event)
return true;
}
bool LootAction::isUseful() {
return sPlayerbotAIConfig->freeMethodLoot || !bot->GetGroup() || bot->GetGroup()->GetLootMethod() != FREE_FOR_ALL;
}
enum ProfessionSpells
{
ALCHEMY = 2259,
@@ -406,9 +411,9 @@ bool StoreLootAction::Execute(Event event)
if (proto->Quality >= ITEM_QUALITY_RARE && !urand(0, 1) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT))
botAI->PlayEmote(TEXT_EMOTE_CHEER);
std::ostringstream out;
out << "Looting " << chat->FormatItem(proto);
botAI->TellMasterNoFacing(out.str());
// std::ostringstream out;
// out << "Looting " << chat->FormatItem(proto);
// botAI->TellMasterNoFacing(out.str());
//ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", proto->ItemId);
//LOG_ERROR("playerbots", "Bot {} is looting {} {} for usage {}.", bot->GetName().c_str(), itemcount, proto->Name1.c_str(), usage);
@@ -442,10 +447,7 @@ bool StoreLootAction::IsLootAllowed(uint32 itemid, PlayerbotAI* botAI)
if (proto->StartQuest)
{
if (sPlayerbotAIConfig->syncQuestWithPlayer)
return false; //Quest is autocomplete for the bot so no item needed.
else
return true;
return true;
}
for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
@@ -459,14 +461,13 @@ bool StoreLootAction::IsLootAllowed(uint32 itemid, PlayerbotAI* botAI)
{
if (quest->RequiredItemId[i] == itemid)
{
if (quest->RequiredItemId[i] == itemid && AI_VALUE2(uint32, "item count", proto->Name1) < quest->RequiredItemCount[i])
if (AI_VALUE2(uint32, "item count", proto->Name1) < quest->RequiredItemCount[i])
{
if (botAI->GetMaster() && sPlayerbotAIConfig->syncQuestWithPlayer)
return false; //Quest is autocomplete for the bot so no item needed.
}
if (AI_VALUE2(uint32, "item count", proto->Name1) < quest->RequiredItemCount[i])
return false;
return true;
}
}
}

View File

@@ -19,6 +19,7 @@ class LootAction : public MovementAction
LootAction(PlayerbotAI* botAI) : MovementAction(botAI, "loot") { }
bool Execute(Event event) override;
bool isUseful() override;
};
class OpenLootAction : public MovementAction

View File

@@ -78,7 +78,7 @@ ItemUsage ItemUsageValue::Calculate()
}
}
}
if (bot->GetGuildId() && sGuildTaskMgr->IsGuildTaskItem(itemId, bot->GetGuildId()))
return ITEM_USAGE_GUILD_TASK;
@@ -202,13 +202,13 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemTemplate const* itemProto)
return ITEM_USAGE_BAD_EQUIP;
ItemTemplate const* oldItemProto = oldItem->GetTemplate();
float oldScore = PlayerbotFactory::CalculateItemScore(oldItemProto->ItemId, bot);
if (oldItem)
{
// uint32 oldStatWeight = sRandomItemMgr->GetLiveStatWeight(bot, oldItemProto->ItemId);
float oldScore = PlayerbotFactory::CalculateItemScore(oldItemProto->ItemId, bot);
if (itemScore || oldScore)
{
shouldEquip = itemScore >= oldScore * 1.5;
shouldEquip = itemScore > oldScore * 1.1;
}
}
@@ -226,17 +226,17 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemTemplate const* itemProto)
if (oldItemProto->Class == ITEM_CLASS_ARMOR && !sRandomItemMgr->CanEquipArmor(bot->getClass(), bot->getLevel(), oldItemProto))
existingShouldEquip = false;
uint32 oldItemPower = sRandomItemMgr->GetLiveStatWeight(bot, oldItemProto->ItemId);
uint32 newItemPower = sRandomItemMgr->GetLiveStatWeight(bot, itemProto->ItemId);
// uint32 oldItemPower = sRandomItemMgr->GetLiveStatWeight(bot, oldItemProto->ItemId);
// uint32 newItemPower = sRandomItemMgr->GetLiveStatWeight(bot, itemProto->ItemId);
//Compare items based on item level, quality or itemId.
bool isBetter = false;
if (newItemPower > oldItemPower)
isBetter = true;
else if (newItemPower == oldItemPower && itemProto->Quality > oldItemProto->Quality)
isBetter = true;
else if (newItemPower == oldItemPower && itemProto->Quality == oldItemProto->Quality && itemProto->ItemId > oldItemProto->ItemId)
if (itemScore > oldScore)
isBetter = true;
// else if (newItemPower == oldScore && itemProto->Quality > oldItemProto->Quality)
// isBetter = true;
// else if (newItemPower == oldScore && itemProto->Quality == oldItemProto->Quality && itemProto->ItemId > oldItemProto->ItemId)
// isBetter = true;
Item* item = CurrentItem(itemProto);
bool itemIsBroken = item && item->GetUInt32Value(ITEM_FIELD_DURABILITY) == 0 && item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY) > 0;