mirror of
https://github.com/liyunfan1223/mod-playerbots.git
synced 2026-06-20 15:39:25 +02:00
# Pull Request
Removed unused variables and fixed styling issues.
## How to Test the Changes
- Step-by-step instructions to test the change
- Any required setup (e.g. multiple players, bots, specific
configuration)
- Expected behavior and how to verify it
## 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**)
If this introduces more advanced or AI-heavy logic:
- [ ] Lightweight mode remains the default
- [ ] More complex behavior is optional and thereby configurable
---
## 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
This was filtered from the code provided by SmashingQuasar. Eliminated
variables were confirmed to be not used, but unclear at times if that is
due to mistakes in writing.
---------
Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com>
277 lines
6.7 KiB
C++
277 lines
6.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 "StatsValues.h"
|
|
#include "AiObjectContext.h"
|
|
#include "Group.h"
|
|
#include "Pet.h"
|
|
#include "PlayerbotAIConfig.h"
|
|
#include "ServerFacade.h"
|
|
#include "Player.h"
|
|
|
|
Unit* HealthValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 HealthValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return 100;
|
|
|
|
return (static_cast<float>(target->GetHealth()) / target->GetMaxHealth()) * 100;
|
|
}
|
|
|
|
Unit* IsDeadValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
bool IsDeadValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return false;
|
|
|
|
return target->getDeathState() != DeathState::Alive;
|
|
}
|
|
|
|
bool PetIsDeadValue::Calculate()
|
|
{
|
|
if ((bot->GetLevel() < 10 && bot->getClass() == CLASS_HUNTER) || bot->IsMounted())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!bot->GetPet())
|
|
{
|
|
uint32 ownerid = bot->GetGUID().GetCounter();
|
|
QueryResult result = CharacterDatabase.Query("SELECT id FROM character_pet WHERE owner = {}", ownerid);
|
|
if (!result)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
if (bot->GetPetGUID() && !bot->GetPet())
|
|
return true;
|
|
|
|
return bot->GetPet() && bot->GetPet()->getDeathState() != DeathState::Alive;
|
|
}
|
|
|
|
bool PetIsHappyValue::Calculate() { return !bot->GetPet() || bot->GetPet()->GetHappinessState() == HAPPY; }
|
|
|
|
Unit* RageValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 RageValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return 0;
|
|
|
|
return (target->GetPower(POWER_RAGE) / 10.0f);
|
|
}
|
|
|
|
Unit* EnergyValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 EnergyValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return 0;
|
|
|
|
return (static_cast<float>(target->GetPower(POWER_ENERGY)));
|
|
}
|
|
|
|
Unit* ManaValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 ManaValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return 100;
|
|
|
|
return (static_cast<float>(target->GetPower(POWER_MANA)) / target->GetMaxPower(POWER_MANA)) * 100;
|
|
}
|
|
|
|
Unit* HasManaValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
bool HasManaValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return false;
|
|
|
|
constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 27827u;
|
|
if (target->HasAura(PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID))
|
|
return false;
|
|
|
|
return target->GetPower(POWER_MANA);
|
|
}
|
|
|
|
Unit* ComboPointsValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 ComboPointsValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target || target->GetGUID() != bot->GetComboTargetGUID())
|
|
return 0;
|
|
|
|
return bot->GetComboPoints();
|
|
}
|
|
|
|
Unit* IsMountedValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
bool IsMountedValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return false;
|
|
|
|
return target->IsMounted();
|
|
}
|
|
|
|
Unit* IsInCombatValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
bool IsInCombatValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return false;
|
|
|
|
if (target->IsInCombat())
|
|
return true;
|
|
|
|
if (target == bot)
|
|
{
|
|
if (Group* group = bot->GetGroup())
|
|
{
|
|
Group::MemberSlotList const& groupSlot = group->GetMemberSlots();
|
|
for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++)
|
|
{
|
|
Player* member = ObjectAccessor::FindPlayer(itr->guid);
|
|
if (!member || member == bot)
|
|
continue;
|
|
|
|
if (member->IsInCombat() &&
|
|
ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(member, bot),
|
|
PlayerbotAIConfig::instance().reactDistance))
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsInCombatValue::EqualToLast(bool value) { return value == lastValue; }
|
|
|
|
uint8 BagSpaceValue::Calculate()
|
|
{
|
|
uint32 totalused = 0, total = 16;
|
|
for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++)
|
|
{
|
|
if (bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
|
|
++totalused;
|
|
}
|
|
|
|
for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag)
|
|
{
|
|
const Bag* const pBag = (Bag*)bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag);
|
|
if (pBag)
|
|
{
|
|
ItemTemplate const* pBagProto = pBag->GetTemplate();
|
|
if (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER)
|
|
{
|
|
total += pBag->GetBagSize();
|
|
totalused += pBag->GetBagSize() - pBag->GetFreeSlots();
|
|
}
|
|
}
|
|
}
|
|
|
|
return (static_cast<float>(totalused) / total) * 100;
|
|
}
|
|
|
|
uint8 DurabilityValue::Calculate()
|
|
{
|
|
uint32 totalMax = 0, total = 0;
|
|
|
|
for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
|
|
{
|
|
uint16 pos = ((INVENTORY_SLOT_BAG_0 << 8) | i);
|
|
Item* item = bot->GetItemByPos(pos);
|
|
|
|
if (!item)
|
|
continue;
|
|
|
|
uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
|
|
if (!maxDurability)
|
|
continue;
|
|
|
|
totalMax += maxDurability;
|
|
|
|
uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
|
|
|
|
total += curDurability;
|
|
}
|
|
|
|
if (total == 0)
|
|
return 0;
|
|
|
|
return (static_cast<float>(total) / totalMax) * 100;
|
|
}
|
|
|
|
Unit* SpeedValue::GetTarget()
|
|
{
|
|
AiObjectContext* ctx = AiObject::context;
|
|
return ctx->GetValue<Unit*>(qualifier)->Get();
|
|
}
|
|
|
|
uint8 SpeedValue::Calculate()
|
|
{
|
|
Unit* target = GetTarget();
|
|
if (!target)
|
|
return 100;
|
|
|
|
return (uint8)(100.0f * target->GetSpeedRate(MOVE_RUN));
|
|
}
|
|
|
|
bool IsInGroupValue::Calculate() { return bot->GetGroup(); }
|
|
|
|
bool ExperienceValue::EqualToLast(uint32 value) { return value != lastValue; }
|
|
|
|
uint32 ExperienceValue::Calculate() { return bot->GetUInt32Value(PLAYER_XP); }
|