diff --git a/zone/bot.cpp b/zone/bot.cpp index 7fe72733a..5b875e294 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -4016,11 +4016,10 @@ bool Bot::Spawn(Client* botCharacterOwner) { ping_timer.Start(8000); // there is something askew with spawn struct appearance fields... // I re-enabled this until I can sort it out - uint32 item_id = 0; + const auto& m = GetBotItemSlots(); uint8 material_from_slot = 0xFF; for (int slot_id = EQ::invslot::EQUIPMENT_BEGIN; slot_id <= EQ::invslot::EQUIPMENT_END; ++slot_id) { - item_id = GetBotItemBySlot(slot_id); - if (item_id != 0) { + if (m.find(slot_id) != m.end()) { material_from_slot = EQ::InventoryProfile::CalcMaterialFromSlot(slot_id); if (material_from_slot != 0xFF) { SendWearChange(material_from_slot); @@ -4064,6 +4063,26 @@ void Bot::GetBotItems(EQ::InventoryProfile &inv, std::string* error_message) UpdateEquipmentLight(); } +std::map Bot::GetBotItemSlots() +{ + std::map m; + if (!GetBotID()) { + return m; + } + + if (!database.botdb.LoadItemSlots(GetBotID(), m)) { + GetBotOwner()->CastToClient()->Message( + Chat::White, + fmt::format( + "Failed to load inventory slots for {}.", + GetCleanName() + ).c_str() + ); + } + + return m; +} + // Returns the inventory record for this bot from the database for the specified equipment slot. uint32 Bot::GetBotItemBySlot(uint16 slot_id) { @@ -4077,8 +4096,9 @@ uint32 Bot::GetBotItemBySlot(uint16 slot_id) GetBotOwner()->CastToClient()->Message( Chat::White, fmt::format( - "{}", - BotDatabase::fail::LoadItemBySlot() + "Failed to load slot ID {} for {}.", + slot_id, + GetCleanName() ).c_str() ); } @@ -4734,11 +4754,11 @@ void Bot::PerformTradeWithClient(int16 begin_slot_id, int16 end_slot_id, Client* return; } } - + if ( !trade_instance->IsClassEquipable(GetClass()) || GetLevel() < trade_instance->GetItem()->ReqLevel || - (!trade_instance->IsRaceEquipable(GetRace()) && !RuleB(Bot, AllowBotEquipAnyRaceGear)) + (!trade_instance->IsRaceEquipable(GetRace()) && !RuleB(Bots, AllowBotEquipAnyRaceGear)) ) { if (trade_event_exists) { event_trade.push_back(ClientTrade(trade_instance, trade_index)); diff --git a/zone/bot.h b/zone/bot.h index 3e8f27b22..06798f5d8 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -558,9 +558,9 @@ public: inline InspectMessage_Struct& GetInspectMessage() { return _botInspectMessage; } inline const InspectMessage_Struct& GetInspectMessage() const { return _botInspectMessage; } - // "Quest API" Methods + // "Quest API" Methods bool HasBotSpellEntry(uint16 spellid); - + // "SET" Class Methods void SetBotSpellID(uint32 newSpellID); virtual void SetSpawnStatus(bool spawnStatus) { _spawnStatus = spawnStatus; } @@ -672,6 +672,7 @@ public: uint32 augment_six = 0 ); uint32 CountBotItem(uint32 item_id); + std::map GetBotItemSlots(); uint32 GetBotItemBySlot(uint16 slot_id); bool HasBotItem(uint32 item_id); void RemoveBotItem(uint32 item_id); diff --git a/zone/bot_database.cpp b/zone/bot_database.cpp index 7313ef645..572e26628 100644 --- a/zone/bot_database.cpp +++ b/zone/bot_database.cpp @@ -24,6 +24,8 @@ #include "../common/strings.h" #include "../common/eqemu_logsys.h" +#include "../common/repositories/bot_inventories_repository.h" + #include "zonedb.h" #include "../common/zone_store.h" #include "bot.h" @@ -1360,6 +1362,30 @@ bool BotDatabase::LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint return true; } +bool BotDatabase::LoadItemSlots(const uint32 bot_id, std::map& m) +{ + if (!bot_id) { + return false; + } + + const auto& l = BotInventoriesRepository::GetWhere( + database, + fmt::format( + "bot_id = {}", + bot_id + ) + ); + if (l.empty()) { + return false; + } + + for (const auto& e : l) { + m.insert(std::pair(e.slot_id, e.item_id)); + } + + return true; +} + bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQ::ItemInstance* item_inst) { if (!bot_inst || !bot_inst->GetBotID() || slot_id > EQ::invslot::EQUIPMENT_END) @@ -3276,7 +3302,6 @@ const char* BotDatabase::fail::QueryInventoryCount() { return "Failed to query i const char* BotDatabase::fail::LoadItems() { return "Failed to load items"; } const char* BotDatabase::fail::SaveItems() { return "Failed to save items"; } const char* BotDatabase::fail::DeleteItems() { return "Failed to delete items"; } -const char* BotDatabase::fail::LoadItemBySlot() { return "Failed to load item by slot"; } const char* BotDatabase::fail::SaveItemBySlot() { return "Failed to save item by slot"; } const char* BotDatabase::fail::DeleteItemBySlot() { return "Failed to delete item by slot"; } const char* BotDatabase::fail::LoadEquipmentColor() { return "Failed to load equipment color"; } diff --git a/zone/bot_database.h b/zone/bot_database.h index 2183c6d02..7700caf67 100644 --- a/zone/bot_database.h +++ b/zone/bot_database.h @@ -89,6 +89,7 @@ public: bool SaveItems(Bot* bot_inst); bool DeleteItems(const uint32 bot_id); + bool LoadItemSlots(const uint32 bot_id, std::map& m); bool LoadItemBySlot(Bot* bot_inst); bool LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint32& item_id); bool SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQ::ItemInstance* item_inst); @@ -219,7 +220,6 @@ public: static const char* LoadItems(); static const char* SaveItems(); static const char* DeleteItems(); - static const char* LoadItemBySlot(); static const char* SaveItemBySlot(); static const char* DeleteItemBySlot(); static const char* LoadEquipmentColor();