mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-02-07 20:51:09 +00:00
# Pull Request
- Applies the clean and corrected singletons, Meyer pattern. (cherry
picked from @SmashingQuasar )
Testing by just playing the game in various ways. Been tested by myself
@Celandriel and @SmashingQuasar
---
## Complexity & Impact
- Does this change add new decision branches?
- [x] No
- [ ] Yes (**explain below**)
- Does this change increase per-bot or per-tick processing?
- [x] No
- [ ] Yes (**describe and justify impact**)
- Could this logic scale poorly under load?
- [x] No
- [ ] Yes (**explain why**)
---
## Defaults & Configuration
- Does this change modify default bot behavior?
- [x] No
- [ ] Yes (**explain why**)
---
## AI Assistance
- Was AI assistance (e.g. ChatGPT or similar tools) used while working
on this change?
- [x] No
- [ ] Yes (**explain below**)
---
## Final Checklist
- [x] Stability is not compromised
- [x] Performance impact is understood, tested, and acceptable
- [x] Added logic complexity is justified and explained
- [x] Documentation updated if needed
---
## Notes for Reviewers
Anything that significantly improves realism at the cost of stability or
performance should be carefully discussed
before merging.
---------
Co-authored-by: Nicolas Lebacq <nicolas.cordier@outlook.com>
Co-authored-by: Keleborn <22352763+Celandriel@users.noreply.github.com>
84 lines
2.7 KiB
C++
84 lines
2.7 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
|
* and/or modify it under version 3 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#include "RevealGatheringItemAction.h"
|
|
|
|
#include "CellImpl.h"
|
|
#include "ChatHelper.h"
|
|
#include "Event.h"
|
|
#include "GridNotifiers.h"
|
|
#include "GridNotifiersImpl.h"
|
|
#include "Playerbots.h"
|
|
#include "ServerFacade.h"
|
|
#include "NearestGameObjects.h"
|
|
|
|
bool RevealGatheringItemAction::Execute(Event event)
|
|
{
|
|
if (!bot->GetGroup())
|
|
return false;
|
|
|
|
std::list<GameObject*> targets;
|
|
AnyGameObjectInObjectRangeCheck u_check(bot, sPlayerbotAIConfig.grindDistance);
|
|
Acore::GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(bot, targets, u_check);
|
|
Cell::VisitObjects(bot, searcher, sPlayerbotAIConfig.reactDistance);
|
|
|
|
std::vector<GameObject*> result;
|
|
for (GameObject* go : targets)
|
|
{
|
|
if (!go || !go->isSpawned() ||
|
|
ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, go),
|
|
sPlayerbotAIConfig.lootDistance))
|
|
continue;
|
|
|
|
if (LockEntry const* lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))
|
|
{
|
|
for (uint8 i = 0; i < 8; ++i)
|
|
{
|
|
if (lockInfo->Type[i] == LOCK_KEY_SKILL)
|
|
{
|
|
uint32 skillId = SkillByLockType(LockType(lockInfo->Index[i]));
|
|
uint32 reqSkillValue = std::max(2u, lockInfo->Skill[i]);
|
|
if ((skillId == SKILL_MINING || skillId == SKILL_HERBALISM) &&
|
|
botAI->HasSkill((SkillType)skillId) && uint32(bot->GetSkillValue(skillId)) >= reqSkillValue)
|
|
{
|
|
result.push_back(go);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE && botAI->HasSkill(SKILL_FISHING))
|
|
result.push_back(go);
|
|
}
|
|
|
|
if (result.empty())
|
|
return false;
|
|
|
|
GameObject* go = result[urand(0, result.size() - 1)];
|
|
if (!go)
|
|
return false;
|
|
|
|
std::ostringstream msg;
|
|
msg << "I see a " << ChatHelper::FormatGameobject(go) << ". ";
|
|
|
|
switch (go->GetGoType())
|
|
{
|
|
case GAMEOBJECT_TYPE_CHEST:
|
|
msg << "Let's look at it.";
|
|
break;
|
|
case GAMEOBJECT_TYPE_FISHINGNODE:
|
|
msg << "Let's fish a bit.";
|
|
break;
|
|
default:
|
|
msg << "Should we go nearer?";
|
|
}
|
|
|
|
// everything is fine, do it
|
|
botAI->Ping(go->GetPositionX(), go->GetPositionY());
|
|
bot->Say(msg.str(), LANG_UNIVERSAL);
|
|
return true;
|
|
}
|