random glyphs initialization

This commit is contained in:
Yunfan Li
2023-08-29 20:16:58 +08:00
parent b2ec444e4e
commit 4dd6649323
2 changed files with 115 additions and 3 deletions

View File

@@ -294,9 +294,13 @@ void PlayerbotFactory::Randomize(bool incremental)
if (pmo) if (pmo)
pmo->finish(); pmo->finish();
pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "PlayerbotFactory_Guilds"); LOG_INFO("playerbots", "Initializing glyphs...");
LOG_INFO("playerbots", "Initializing guilds...");
bot->SaveToDB(false, false); bot->SaveToDB(false, false);
InitGlyphs();
// pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "PlayerbotFactory_Guilds");
// LOG_INFO("playerbots", "Initializing guilds...");
// bot->SaveToDB(false, false);
// InitGuild(); // InitGuild();
// bot->SaveToDB(false, false); // bot->SaveToDB(false, false);
if (pmo) if (pmo)
@@ -2458,6 +2462,113 @@ void PlayerbotFactory::InitReagents()
} }
} }
void PlayerbotFactory::InitGlyphs()
{
bot->InitGlyphsForLevel();
for (uint32 slotIndex = 0; slotIndex < MAX_GLYPH_SLOT_INDEX; ++slotIndex)
{
bot->SetGlyph(slotIndex, 0, true);
}
uint32 level = bot->getLevel();
uint32 maxSlot = 0;
if (level >= 15)
maxSlot = 2;
if (level >= 30)
maxSlot = 3;
if (level >= 50)
maxSlot = 4;
if (level >= 70)
maxSlot = 5;
if (level >= 80)
maxSlot = 6;
if (!maxSlot)
return;
std::list<uint32> glyphs;
ItemTemplateContainer const* itemTemplates = sObjectMgr->GetItemTemplateStore();
for (ItemTemplateContainer::const_iterator i = itemTemplates->begin(); i != itemTemplates->end(); ++i)
{
uint32 itemId = i->first;
ItemTemplate const* proto = &i->second;
if (!proto)
continue;
if (proto->Class != ITEM_CLASS_GLYPH)
continue;
if ((proto->AllowableClass & bot->getClassMask()) == 0 || (proto->AllowableRace & bot->getRaceMask()) == 0)
continue;
for (uint32 spell = 0; spell < MAX_ITEM_PROTO_SPELLS; spell++)
{
uint32 spellId = proto->Spells[spell].SpellId;
SpellInfo const *entry = sSpellMgr->GetSpellInfo(spellId);
if (!entry)
continue;
for (uint32 effect = 0; effect <= EFFECT_2; ++effect)
{
if (entry->Effects[effect].Effect != SPELL_EFFECT_APPLY_GLYPH)
continue;
uint32 glyph = entry->Effects[effect].MiscValue;
glyphs.push_back(glyph);
}
}
}
if (glyphs.empty())
{
LOG_INFO("playerbots", "No glyphs found for bot {}", bot->GetName().c_str());
return;
}
std::unordered_set<uint32> chosen;
for (uint32 slotIndex = 0; slotIndex < maxSlot; ++slotIndex)
{
uint32 slot = bot->GetGlyphSlot(slotIndex);
GlyphSlotEntry const *gs = sGlyphSlotStore.LookupEntry(slot);
if (!gs)
continue;
std::vector<uint32> ids;
for (std::list<uint32>::iterator i = glyphs.begin(); i != glyphs.end(); ++i)
{
uint32 id = *i;
GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(id);
if (!gp || gp->TypeFlags != gs->TypeFlags)
continue;
ids.push_back(id);
}
int maxCount = urand(0, 3);
int count = 0;
bool found = false;
for (int attempts = 0; attempts < 15; ++attempts)
{
uint32 index = urand(0, ids.size() - 1);
if (index >= ids.size())
continue;
uint32 id = ids[index];
if (chosen.find(id) != chosen.end())
continue;
chosen.insert(id);
bot->SetGlyph(slotIndex, id, true);
found = true;
break;
}
if (!found)
LOG_INFO("playerbots", "No glyphs found for bot {} index {} slot {}", bot->GetName().c_str(), slotIndex, slot);
}
}
void PlayerbotFactory::CancelAuras() void PlayerbotFactory::CancelAuras()
{ {
bot->RemoveAllAuras(); bot->RemoveAllAuras();

View File

@@ -145,6 +145,7 @@ class PlayerbotFactory : public InventoryAction
void InitPotions(); void InitPotions();
void InitFood(); void InitFood();
void InitReagents(); void InitReagents();
void InitGlyphs();
bool CanEquipArmor(ItemTemplate const* proto); bool CanEquipArmor(ItemTemplate const* proto);
bool CanEquipWeapon(ItemTemplate const* proto); bool CanEquipWeapon(ItemTemplate const* proto);
void EnchantItem(Item* item); void EnchantItem(Item* item);