From 5d570a81a0eb2d9396aaf3a053eb6498e0ae64fc Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sat, 27 May 2023 13:59:37 +0800 Subject: [PATCH] feat: fix initialization --- src/PlayerbotFactory.cpp | 257 ++++++++++++------ src/PlayerbotFactory.h | 1 + src/RandomPlayerbotMgr.cpp | 7 + src/RandomPlayerbotMgr.h | 1 + .../actions/CheckMountStateAction.cpp | 24 +- 5 files changed, 192 insertions(+), 98 deletions(-) diff --git a/src/PlayerbotFactory.cpp b/src/PlayerbotFactory.cpp index 782351dd..d44a7b0e 100644 --- a/src/PlayerbotFactory.cpp +++ b/src/PlayerbotFactory.cpp @@ -15,6 +15,7 @@ #include "RandomPlayerbotFactory.h" #include "ItemVisitors.h" #include "InventoryAction.h" +#include "SharedDefines.h" #include #define PLAYER_SKILL_INDEX(x) (PLAYER_SKILL_INFO_1_1 + ((x)*3)) @@ -121,6 +122,7 @@ void PlayerbotFactory::Randomize(bool incremental) LOG_INFO("playerbots", "Preparing to {} randomize...", (incremental ? "incremental" : "full")); Prepare(); // bot->SaveToDB(false, false); + // bot->SaveToDB(false, false); LOG_INFO("playerbots", "Resetting player..."); PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "PlayerbotFactory_Reset"); bot->resetTalents(true); @@ -128,20 +130,20 @@ void PlayerbotFactory::Randomize(bool incremental) ClearSkills(); // bot->SaveToDB(false, false); ClearSpells(); - // bot->SaveToDB(false, false); + bot->SaveToDB(false, false); if (!incremental) { ClearInventory(); ResetQuests(); } - // bot->SaveToDB(false, false); + bot->SaveToDB(false, false); bot->GiveLevel(level); bot->InitStatsForLevel(); bot->SetHealth(bot->GetMaxHealth()); bot->SetPower(POWER_MANA, bot->GetMaxPower(POWER_MANA)); CancelAuras(); - // bot->SaveToDB(false, false); + bot->SaveToDB(false, false); if (pmo) pmo->finish(); @@ -180,7 +182,7 @@ void PlayerbotFactory::Randomize(bool incremental) pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "PlayerbotFactory_Spells1"); LOG_INFO("playerbots", "Initializing spells (step 1)..."); - bot->LearnDefaultSkills(); + // bot->LearnDefaultSkills(); InitClassSpells(); // bot->SaveToDB(false, false); InitAvailableSpells(); @@ -540,7 +542,8 @@ void PlayerbotFactory::InitPet() CreatureTemplate const* co = sObjectMgr->GetCreatureTemplate(ids[index]); if (!co) continue; - + if (co->Name.size() > 21) + continue; uint32 guid = map->GenerateLowGuid(); uint32 pet_number = sObjectMgr->GeneratePetNumber(); pet = new Pet(bot, HUNTER_PET); @@ -561,6 +564,7 @@ void PlayerbotFactory::InitPet() pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); pet->GetMap()->AddToMap(pet->ToCreature()); // pet->InitPetCreateSpells(); + pet->InitTalentForLevel(); // pet->LearnPetPassives(); pet->CastPetAuras(true); pet->UpdateAllStats(); @@ -571,7 +575,6 @@ void PlayerbotFactory::InitPet() LOG_INFO("playerbots", "Bot {}: assign pet {} ({} level)", bot->GetName().c_str(), co->Entry, bot->getLevel()); pet->SavePetToDB(PET_SAVE_AS_CURRENT); bot->PetSpellInitialize(); - pet->SavePetToDB(PET_SAVE_AS_CURRENT); break; } } @@ -616,6 +619,21 @@ void PlayerbotFactory::ClearSkills() bot->SetUInt32Value(PLAYER_SKILL_INDEX(1), 0); } +void PlayerbotFactory::ClearEverything() +{ + bot->SaveToDB(false, false); + LOG_INFO("playerbots", "Resetting player..."); + bot->resetTalents(true); + bot->SaveToDB(false, false); + ClearSkills(); + // bot->SaveToDB(false, false); + ClearSpells(); + bot->SaveToDB(false, false); + ClearInventory(); + ResetQuests(); + bot->SaveToDB(false, false); +} + void PlayerbotFactory::ClearSpells() { std::list spells; @@ -623,8 +641,9 @@ void PlayerbotFactory::ClearSpells() { uint32 spellId = itr->first; const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if(itr->second->State == PLAYERSPELL_REMOVED) + if(itr->second->State == PLAYERSPELL_REMOVED) { continue; + } spells.push_back(spellId); } @@ -1622,9 +1641,9 @@ void PlayerbotFactory::InitSkills() SetRandomSkill(SKILL_POLEARMS); SetRandomSkill(SKILL_FIST_WEAPONS); SetRandomSkill(SKILL_THROWN); + bot->SetSkill(SKILL_PLATE_MAIL, 0, skillLevel, skillLevel); break; case CLASS_PALADIN: - bot->SetSkill(SKILL_PLATE_MAIL, 0, skillLevel, skillLevel); SetRandomSkill(SKILL_SWORDS); SetRandomSkill(SKILL_AXES); SetRandomSkill(SKILL_MACES); @@ -1632,6 +1651,7 @@ void PlayerbotFactory::InitSkills() SetRandomSkill(SKILL_2H_MACES); SetRandomSkill(SKILL_2H_AXES); SetRandomSkill(SKILL_POLEARMS); + bot->SetSkill(SKILL_PLATE_MAIL, 0, skillLevel, skillLevel); break; case CLASS_PRIEST: SetRandomSkill(SKILL_MACES); @@ -1647,6 +1667,7 @@ void PlayerbotFactory::InitSkills() SetRandomSkill(SKILL_2H_AXES); SetRandomSkill(SKILL_DAGGERS); SetRandomSkill(SKILL_FIST_WEAPONS); + bot->SetSkill(SKILL_MAIL, 0, skillLevel, skillLevel); break; case CLASS_MAGE: SetRandomSkill(SKILL_SWORDS); @@ -1674,6 +1695,7 @@ void PlayerbotFactory::InitSkills() SetRandomSkill(SKILL_FIST_WEAPONS); SetRandomSkill(SKILL_THROWN); bot->SetSkill(SKILL_MAIL, 0, skillLevel, skillLevel); + bot->SetSkill(SKILL_DUAL_WIELD, 0, bot->getLevel() < 20 ? 0 : 1, bot->getLevel() < 20 ? 0 : 1); break; case CLASS_ROGUE: SetRandomSkill(SKILL_SWORDS); @@ -1699,19 +1721,19 @@ void PlayerbotFactory::InitSkills() break; } - switch (bot->getClass()) - { - case CLASS_WARRIOR: - case CLASS_PALADIN: - bot->SetSkill(SKILL_PLATE_MAIL, 1, skillLevel, skillLevel); - break; - case CLASS_SHAMAN: - case CLASS_HUNTER: - bot->SetSkill(SKILL_MAIL, 1, skillLevel, skillLevel); - break; - default: - break; - } + // switch (bot->getClass()) + // { + // case CLASS_WARRIOR: + // case CLASS_PALADIN: + // bot->SetSkill(SKILL_PLATE_MAIL, 0, skillLevel, skillLevel); + // break; + // case CLASS_SHAMAN: + // case CLASS_HUNTER: + // bot->SetSkill(SKILL_MAIL, 0, skillLevel, skillLevel); + // break; + // default: + // break; + // } } void PlayerbotFactory::SetRandomSkill(uint16 id) @@ -1736,72 +1758,135 @@ void PlayerbotFactory::SetRandomSkill(uint16 id) void PlayerbotFactory::InitAvailableSpells() { bot->LearnDefaultSkills(); - bot->LearnCustomSpells(); - bot->learnQuestRewardedSpells(); - CreatureTemplateContainer const* creatures = sObjectMgr->GetCreatureTemplates(); - for (CreatureTemplateContainer::const_iterator itr = creatures->begin(); itr != creatures->end(); ++itr) + CreatureTemplateContainer const* creatureTemplateContainer = sObjectMgr->GetCreatureTemplates(); + for (CreatureTemplateContainer::const_iterator i = creatureTemplateContainer->begin(); i != creatureTemplateContainer->end(); ++i) { - if (itr->second.trainer_type != TRAINER_TYPE_TRADESKILLS && itr->second.trainer_type != TRAINER_TYPE_CLASS) + CreatureTemplate const& co = i->second; + if (co.trainer_type != TRAINER_TYPE_TRADESKILLS && co.trainer_type != TRAINER_TYPE_CLASS) continue; - if (itr->second.trainer_type == TRAINER_TYPE_CLASS && itr->second.trainer_class != bot->getClass()) + if (co.trainer_type == TRAINER_TYPE_CLASS && co.trainer_class != bot->getClass()) continue; - TrainerSpellData const* trainer_spells = sObjectMgr->GetNpcTrainerSpells(itr->second.Entry); + uint32 trainerId = co.Entry; + + TrainerSpellData const* trainer_spells = sObjectMgr->GetNpcTrainerSpells(trainerId); + if (!trainer_spells) + trainer_spells = sObjectMgr->GetNpcTrainerSpells(trainerId); + if (!trainer_spells) continue; - for (TrainerSpellMap::const_iterator iter = trainer_spells->spellList.begin(); iter != trainer_spells->spellList.end(); ++iter) - { - TrainerSpell const* tSpell = &iter->second; - if (!tSpell) - continue; + for (TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr) + { + TrainerSpell const* tSpell = &itr->second; - TrainerSpellState state = bot->GetTrainerSpellState(tSpell); - if (state != TRAINER_SPELL_GREEN) - continue; + if (!tSpell) + continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(tSpell->spell); - if (!spellInfo) - continue; + if (!tSpell->learnedSpell[0] && !bot->IsSpellFitByClassAndRace(tSpell->learnedSpell[0])) + continue; - if (itr->second.trainer_type == TRAINER_TYPE_TRADESKILLS) - { - std::string const SpellName = spellInfo->SpellName[0]; - if (spellInfo->Effects[EFFECT_1].Effect == SPELL_EFFECT_SKILL_STEP) - { - uint32 skill = spellInfo->Effects[EFFECT_1].MiscValue; - if (skill && !bot->HasSkill(skill)) - { - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill); - if (pSkill) - { - if (SpellName.find("Apprentice") != std::string::npos && pSkill->categoryId == SKILL_CATEGORY_PROFESSION || pSkill->categoryId == SKILL_CATEGORY_SECONDARY) - continue; - } - } - } - } + TrainerSpellState state = bot->GetTrainerSpellState(tSpell); + if (state != TRAINER_SPELL_GREEN) + continue; - bool learned = false; + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(tSpell->spell); + bool learn = true; for (uint8 j = 0; j < 3; ++j) { if (!tSpell->learnedSpell[j] && !bot->IsSpellFitByClassAndRace(tSpell->learnedSpell[j])) continue; - if (spellInfo->Effects[j].Effect == SPELL_EFFECT_LEARN_SPELL) + if (spellInfo->Effects[j].Effect == SPELL_EFFECT_PROFICIENCY || + spellInfo->Effects[j].Effect == SPELL_EFFECT_SKILL_STEP || + spellInfo->Effects[j].Effect == SPELL_EFFECT_DUAL_WIELD) { - uint32 learnedSpell = spellInfo->Effects[j].TriggerSpell; - bot->learnSpell(learnedSpell); - learned = true; + learn = false; + break; } } + if (!learn) { + continue; + } - if (!learned) - bot->learnSpell(tSpell->spell); - } + if (tSpell->learnedSpell[0]) { + bot->learnSpell(tSpell->learnedSpell[0], false); + } + else { + LOG_INFO("playerbots", "!tSpell->learnedSpell[0] {}", tSpell->spell); + botAI->CastSpell(tSpell->spell, bot); + } + } } + // bot->LearnDefaultSkills(); + // bot->LearnCustomSpells(); + // bot->learnQuestRewardedSpells(); + + // CreatureTemplateContainer const* creatures = sObjectMgr->GetCreatureTemplates(); + // for (CreatureTemplateContainer::const_iterator itr = creatures->begin(); itr != creatures->end(); ++itr) + // { + // if (itr->second.trainer_type != TRAINER_TYPE_TRADESKILLS && itr->second.trainer_type != TRAINER_TYPE_CLASS) + // continue; + + // if (itr->second.trainer_type == TRAINER_TYPE_CLASS && itr->second.trainer_class != bot->getClass()) + // continue; + + // TrainerSpellData const* trainer_spells = sObjectMgr->GetNpcTrainerSpells(itr->second.Entry); + // if (!trainer_spells) + // continue; + + // for (TrainerSpellMap::const_iterator iter = trainer_spells->spellList.begin(); iter != trainer_spells->spellList.end(); ++iter) + // { + // TrainerSpell const* tSpell = &iter->second; + // if (!tSpell) + // continue; + + // TrainerSpellState state = bot->GetTrainerSpellState(tSpell); + // if (state != TRAINER_SPELL_GREEN) + // continue; + + // SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(tSpell->spell); + // if (!spellInfo) + // continue; + + // if (itr->second.trainer_type == TRAINER_TYPE_TRADESKILLS) + // { + // std::string const SpellName = spellInfo->SpellName[0]; + // if (spellInfo->Effects[EFFECT_1].Effect == SPELL_EFFECT_SKILL_STEP) + // { + // uint32 skill = spellInfo->Effects[EFFECT_1].MiscValue; + // if (skill && !bot->HasSkill(skill)) + // { + // SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill); + // if (pSkill) + // { + // if (SpellName.find("Apprentice") != std::string::npos && pSkill->categoryId == SKILL_CATEGORY_PROFESSION || pSkill->categoryId == SKILL_CATEGORY_SECONDARY) + // continue; + // } + // } + // } + // } + + // // bool learned = false; + // // for (uint8 j = 0; j < 3; ++j) + // // { + // // if (!tSpell->learnedSpell[j] && !bot->IsSpellFitByClassAndRace(tSpell->learnedSpell[j])) + // // continue; + + // // if (spellInfo->Effects[j].Effect == SPELL_EFFECT_LEARN_SPELL) + // // { + // // uint32 learnedSpell = spellInfo->Effects[j].TriggerSpell; + // // bot->learnSpell(learnedSpell); + // // learned = true; + // // } + // // } + + // // if (!learned) + // bot->learnSpell(tSpell->spell); + // } + // } } void PlayerbotFactory::InitClassSpells() @@ -1810,8 +1895,8 @@ void PlayerbotFactory::InitClassSpells() switch (bot->getClass()) { case CLASS_WARRIOR: - bot->learnSpell(78, false); - bot->learnSpell(2457, false); + bot->learnSpell(78, true); + bot->learnSpell(2457, true); if (level >= 10) { bot->learnSpell(71, false); // Defensive Stance bot->learnSpell(355, false); // Taunt @@ -1822,27 +1907,27 @@ void PlayerbotFactory::InitClassSpells() } break; case CLASS_PALADIN: - bot->learnSpell(21084, false); - bot->learnSpell(635, false); + bot->learnSpell(21084, true); + bot->learnSpell(635, true); if (level >= 12) { bot->learnSpell(7328, false); // Redemption } break; case CLASS_ROGUE: - bot->learnSpell(1752, false); - bot->learnSpell(2098, false); + bot->learnSpell(1752, true); + bot->learnSpell(2098, true); break; case CLASS_DEATH_KNIGHT: - bot->learnSpell(45477, false); - bot->learnSpell(47541, false); - bot->learnSpell(45462, false); - bot->learnSpell(45902, false); + bot->learnSpell(45477, true); + bot->learnSpell(47541, true); + bot->learnSpell(45462, true); + bot->learnSpell(45902, true); //to leave DK starting area bot->learnSpell(50977, false); break; case CLASS_HUNTER: - bot->learnSpell(2973, false); - bot->learnSpell(75, false); + bot->learnSpell(2973, true); + bot->learnSpell(75, true); if (level >= 10) { bot->learnSpell(883, false); // call pet bot->learnSpell(1515, false); // tame pet @@ -1852,16 +1937,16 @@ void PlayerbotFactory::InitClassSpells() } break; case CLASS_PRIEST: - bot->learnSpell(585, false); - bot->learnSpell(2050, false); + bot->learnSpell(585, true); + bot->learnSpell(2050, true); break; case CLASS_MAGE: - bot->learnSpell(133, false); - bot->learnSpell(168, false); + bot->learnSpell(133, true); + bot->learnSpell(168, true); break; case CLASS_WARLOCK: - bot->learnSpell(687, false); - bot->learnSpell(686, false); + bot->learnSpell(687, true); + bot->learnSpell(686, true); if (level >= 10) { bot->learnSpell(697, false); // summon voidwalker } @@ -1873,8 +1958,8 @@ void PlayerbotFactory::InitClassSpells() } break; case CLASS_DRUID: - bot->learnSpell(5176, false); - bot->learnSpell(5185, false); + bot->learnSpell(5176, true); + bot->learnSpell(5185, true); if (level >= 10) { bot->learnSpell(5487, false); // bear form bot->learnSpell(6795, false); // Growl @@ -1882,8 +1967,8 @@ void PlayerbotFactory::InitClassSpells() } break; case CLASS_SHAMAN: - bot->learnSpell(403, false); - bot->learnSpell(331, false); + bot->learnSpell(403, true); + bot->learnSpell(331, true); if (level >= 4) { bot->learnSpell(8071, false); // stoneskin totem } diff --git a/src/PlayerbotFactory.h b/src/PlayerbotFactory.h index 6f93d165..804e91c8 100644 --- a/src/PlayerbotFactory.h +++ b/src/PlayerbotFactory.h @@ -110,6 +110,7 @@ class PlayerbotFactory : public InventoryAction void Refresh(); void Randomize(bool incremental); static std::list classQuestIds; + void ClearEverything(); void InitSkills(); static uint32 tradeSkills[]; diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 070a9471..46b84e66 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1324,6 +1324,12 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) pmo->finish(); } +void RandomPlayerbotMgr::Clear(Player* bot) +{ + PlayerbotFactory factory(bot, bot->GetLevel()); + factory.ClearEverything(); +} + uint32 RandomPlayerbotMgr::GetZoneLevel(uint16 mapId, float teleX, float teleY, float teleZ) { uint32 maxLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); @@ -1634,6 +1640,7 @@ bool RandomPlayerbotMgr::HandlePlayerbotConsoleCommand(ChatHandler* handler, cha std::map handlers; handlers["init"] = &RandomPlayerbotMgr::RandomizeFirst; + handlers["clear"] = &RandomPlayerbotMgr::Clear; handlers["levelup"] = handlers["level"] = &RandomPlayerbotMgr::IncreaseLevel; handlers["refresh"] = &RandomPlayerbotMgr::Refresh; handlers["teleport"] = &RandomPlayerbotMgr::RandomTeleportForLevel; diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index e66e5b20..12edcf7b 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -47,6 +47,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder bool IsRandomBot(Player* bot); bool IsRandomBot(ObjectGuid::LowType bot); void Randomize(Player* bot); + void Clear(Player* bot); void RandomizeFirst(Player* bot); void IncreaseLevel(Player* bot); void ScheduleTeleport(uint32 bot, uint32 time = 0); diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 75cd507f..099c442b 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -79,20 +79,20 @@ bool CheckMountStateAction::Execute(Event event) return Mount(); } - if (!bot->InBattleground()) - { - if (AI_VALUE(GuidPosition, "rpg target")) - { - if (sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "rpg target"), sPlayerbotAIConfig->farDistance) && noattackers && !dps && !enemy) - return Mount(); - } + // if (!bot->InBattleground()) + // { + // if (AI_VALUE(GuidPosition, "rpg target")) + // { + // if (sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "rpg target"), sPlayerbotAIConfig->farDistance) && noattackers && !dps && !enemy) + // return Mount(); + // } - if (((!AI_VALUE(GuidVector, "possible rpg targets").empty()) && noattackers && !dps && !enemy) && urand(0, 100) > 50) - return Mount(); - } + // if (((!AI_VALUE(GuidVector, "possible rpg targets").empty()) && noattackers && !dps && !enemy) && urand(0, 100) > 50) + // return Mount(); + // } - if (!bot->IsMounted() && !attackdistance && (fartarget || chasedistance)) - return Mount(); + // if (!bot->IsMounted() && !attackdistance && (fartarget || chasedistance)) + // return Mount(); if (!bot->IsFlying() && attackdistance && bot->IsMounted() && (enemy || dps || (!noattackers && bot->IsInCombat()))) {