/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. */ #include "LootStrategyAction.h" #include "ChatHelper.h" #include "Event.h" #include "LootAction.h" #include "LootObjectStack.h" #include "LootStrategyValue.h" #include "Playerbots.h" bool LootStrategyAction::Execute(Event event) { std::string const strategy = event.getParam(); LootObjectStack* lootItems = AI_VALUE(LootObjectStack*, "available loot"); std::set& alwaysLootItems = AI_VALUE(std::set&, "always loot list"); Value* lootStrategy = context->GetValue("loot strategy"); if (strategy == "?") { { std::ostringstream out; out << "Loot strategy: "; out << lootStrategy->Get()->GetName(); botAI->TellMaster(out); } { std::ostringstream out; out << "Always loot items: "; for (uint32 itemId : alwaysLootItems) { ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId); if (!proto) continue; out << chat->FormatItem(proto); } botAI->TellMaster(out); } } else { ItemIds items = chat->parseItems(strategy); if (items.size() == 0) { lootStrategy->Set(LootStrategyValue::instance(strategy)); std::ostringstream out; out << "Loot strategy set to " << lootStrategy->Get()->GetName(); botAI->TellMaster(out); return true; } bool remove = strategy.size() > 1 && strategy.substr(0, 1) == "-"; bool query = strategy.size() > 1 && strategy.substr(0, 1) == "?"; for (uint32 itemid : items) { if (query) { if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemid)) { std::ostringstream out; out << (StoreLootAction::IsLootAllowed(itemid, botAI) ? "|cFF000000Will loot " : "|c00FF0000Won't loot ") << ChatHelper::FormatItem(proto); botAI->TellMaster(out.str()); } } else if (remove) { std::set::iterator j = alwaysLootItems.find(itemid); if (j != alwaysLootItems.end()) alwaysLootItems.erase(j); botAI->TellMaster("Item(s) removed from always loot list"); } else { alwaysLootItems.insert(itemid); botAI->TellMaster("Item(s) added to always loot list"); } } } return true; }