From 407fa917f8fa9d2380d517220e687be7a1e58a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E4=BD=A9=E8=8C=B9?= Date: Tue, 21 Mar 2023 15:04:57 -0600 Subject: [PATCH] Casting tweaks --- src/PlayerbotAI.cpp | 38 +++++++++------- src/strategy/values/SpellIdValue.cpp | 67 +++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 6f043c83..a0a717a6 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1473,7 +1473,7 @@ bool PlayerbotAI::IsTellAllowed(PlayerbotSecurityLevel securityLevel) return false; if (sPlayerbotAIConfig->whisperDistance && !bot->GetGroup() && sRandomPlayerbotMgr->IsRandomBot(bot) && master->GetSession()->GetSecurity() < SEC_GAMEMASTER && - (bot->GetMapId() != master->GetMapId() || bot->GetDistance(master) > sPlayerbotAIConfig->whisperDistance)) + (bot->GetMapId() != master->GetMapId() || sServerFacade->GetDistance2d(bot, master) > sPlayerbotAIConfig->whisperDistance)) return false; return true; @@ -1687,7 +1687,7 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, } } - if (bot != target && bot->GetDistance(target) > sPlayerbotAIConfig->sightDistance) + if (bot != target && sServerFacade->GetDistance2d(bot, target) > sPlayerbotAIConfig->sightDistance) return false; } @@ -1756,7 +1756,7 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, GameObject* goTarget, uint8 effec } } - if (bot->GetDistance(goTarget) > sPlayerbotAIConfig->sightDistance) + if (sServerFacade->GetDistance2d(bot, goTarget) > sPlayerbotAIConfig->sightDistance) return false; ObjectGuid oldSel = bot->GetTarget(); @@ -1899,10 +1899,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) WorldObject* faceTo = target; if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, faceTo)) { - if (!bot->isMoving()) - bot->SetFacingToObject(faceTo); - - failWithDelay = true; + sServerFacade->SetFacingTo(bot, faceTo); + //failWithDelay = true; } if (failWithDelay) @@ -1962,17 +1960,18 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) } } - spell->prepare(&targets); - if (bot->isMoving() && spell->GetCastTime()) { bot->StopMoving(); - SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown); - spell->cancel(); +// SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown); +// spell->cancel(); //delete spell; - return false; +// return false; } + spell->prepare(&targets); + SpellCastResult spellSuccess = spell->CheckCast(true); + if (spellInfo->Effects[0].Effect == SPELL_EFFECT_OPEN_LOCK || spellInfo->Effects[0].Effect == SPELL_EFFECT_SKINNING) { LootObject loot = *aiObjectContext->GetValue("loot target"); @@ -1984,8 +1983,13 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) } } + if (spellSuccess != SPELL_CAST_OK) + return false; + WaitForSpellCast(spell); - aiObjectContext->GetValue("last spell cast")->Get().Set(spellId, target->GetGUID(), time(nullptr)); + if (spell->GetCastTime()) + aiObjectContext->GetValue("last spell cast")->Get().Set(spellId, target->GetGUID(), time(nullptr)); + aiObjectContext->GetValue("position")->Get()["random"].Reset(); if (oldSel) @@ -2367,6 +2371,9 @@ bool PlayerbotAI::IsInVehicle(bool canControl, bool canCast, bool canAttack, boo if (!vehicleBase || !vehicleBase->IsAlive()) return false; + if (!vehicle->GetVehicleInfo()) + return false; + // get seat VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot); if (!seat) @@ -2480,7 +2487,6 @@ bool PlayerbotAI::IsInterruptableSpellCasting(Unit* target, std::string const sp bool PlayerbotAI::HasAuraToDispel(Unit* target, uint32 dispelType) { bool isFriend = bot->IsFriendlyTo(target); - bool isHostile = bot->IsHostileTo(target); for (uint32 type = SPELL_AURA_NONE; type < TOTAL_AURAS; ++type) { Unit::AuraEffectList const& auras = target->GetAuraEffectsByType((AuraType)type); @@ -2493,7 +2499,7 @@ bool PlayerbotAI::HasAuraToDispel(Unit* target, uint32 dispelType) if (isPositiveSpell && isFriend) continue; - if (!isPositiveSpell && isHostile) + if (!isPositiveSpell && !isFriend) continue; if (sPlayerbotAIConfig->dispelAuraDuration && aura->GetDuration() && aura->GetDuration() < (int32)sPlayerbotAIConfig->dispelAuraDuration) @@ -2673,7 +2679,7 @@ bool PlayerbotAI::HasManyPlayersNearby(uint32 trigerrValue, float range) for (auto& player : sRandomPlayerbotMgr->GetPlayers()) { - if ((!player->IsGameMaster() || player->isGMVisible()) && player->GetDistance(bot) < sqRange) + if ((!player->IsGameMaster() || player->isGMVisible()) && sServerFacade->GetDistance2d(player, bot) < sqRange) { found++; diff --git a/src/strategy/values/SpellIdValue.cpp b/src/strategy/values/SpellIdValue.cpp index 2b1b0d33..5d084cb9 100644 --- a/src/strategy/values/SpellIdValue.cpp +++ b/src/strategy/values/SpellIdValue.cpp @@ -3,6 +3,8 @@ */ #include "SpellIdValue.h" + +#include #include "ChatHelper.h" #include "Playerbots.h" #include "Vehicle.h" @@ -95,22 +97,65 @@ uint32 SpellIdValue::Calculate() if (spellIds.empty()) return 0; int32 saveMana = (int32)round(AI_VALUE(double, "mana save level")); - int32 rank = 1; - int32 highest = 0; - int32 lowest = 0; - for (std::set::reverse_iterator i = spellIds.rbegin(); i != spellIds.rend(); ++i) + uint32 rank = 1; + uint32 highestRank = 0; + uint32 highestSpellId = 0; + uint32 lowestRank = 0; + uint32 lowestSpellId = 0; + if (saveMana <= 1) { - if (!highest) - highest = *i; + for (uint32 spellId : std::ranges::reverse_view(spellIds)) + { + const SpellInfo *pSpellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!pSpellInfo) + continue; - if (saveMana == rank) - return *i; + std::string spellName = pSpellInfo->Rank[0]; - lowest = *i; - ++rank; + // For atoi, the input string has to start with a digit, so lets search for the first digit + size_t i = 0; + for (; i < spellName.length(); i++) + { if (isdigit(spellName[i])) break; } + + // remove the first chars, which aren't digits + spellName = spellName.substr(i, spellName.length() - i); + + // convert the remaining text to an integer + int id = atoi(spellName.c_str()); + + if (!id) + { + highestSpellId = spellId; + continue; + } + + if (!highestRank || id > highestRank) + { + highestRank = id; + highestSpellId = spellId; + } + + if (!lowestRank || (lowestRank && id < lowestRank)) + { + lowestRank = id; + lowestSpellId = spellId; + } + } + } + else + { + for (uint32 spellId : std::ranges::reverse_view(spellIds)) + { + if (!highestSpellId) + highestSpellId = spellId; + if (saveMana == rank) + return spellId; + lowestSpellId = spellId; + rank++; + } } - return saveMana > 1 ? lowest : highest; + return saveMana > 1 ? lowestSpellId : highestSpellId; } uint32 VehicleSpellIdValue::Calculate()