mirror of
https://github.com/mod-playerbots/mod-playerbots
synced 2025-11-29 15:58:20 +08:00
ICC fixes GS, PP, BQL, SINDY (#885)
* ICC PP WIP WIP * added mutated plague for PP * BPC added (kinetic and boss targeting need to be done by player) OT collects dark nucles, bots spread on vortex and other stuff they do ok on their own. Tested only on 10NM, should work on 25NM * Tank pos. correction * BQL, ranged spread, link, flame, bite, tanking tested 10NM to do (better fire spread, hc tacti, melee spread when in air) * LDW improved improved shadow logic, ranged spread for easier shadow handling * dbs update, fixed teleporting Bots should only go and teleport to the mage that is actually below zero now * DBS ranged fix Ranged should spread more quickly and freak out less * Festergut && DBS fixed ranged spread (both) fixed spore logic (fester) * Rotface fix Improved big ooze tanking (static pos, todo kiting) ooze explosion spread mechanic fix ooze pool fix Player needs to mark rotface with skull icon, oterwise bots try to attack oozes * BQL fixed for 25nm todo: better melee logic in air phase, better melee flame spread * VDW, Sister Svalna, Sindy update Sister Svalna, bots can pickup spears and throw at svalna when she has shield up VDW added healer strats to use portal and heal boss (atm druids are for raid healing only, so use druide + any other healer, ideally player should be healer) todo (focus on supressers, add healer rotations, atm they use quickest spell they can) Sindragosa Added tank boss manipulation (boss orientation and position) bots detect (buffet, unchained magic and chilled to the bone and act accordingly) bots detect frost beacon move to safe spot and los frost bombs around them, while dpsing tombs (todo stop dps if only one tomb is left, if we have frost bombs around, not a big deal atm since in nm they dont one shot) Last phase bots los behind tomb to loose buffet, tanks swap when they have hi buffet count. Player should tell bots with skull rti if they should kill tomb or focus boss. todo (dynamic tomb los in last phase so that healers can see tank but also hide behind tomb to break los from boss) Removed some debug messages, improved LM spike action (nearest bots also try to help kill it) Improved Lady Deathwshiper shade action (only targeted bots will run away instead of every bot that is near it) dbs improved tank switch I recommend to use 3 healers (just to be safe) and 2 paladin tanks (warr seems to struggle with agro) in 10 man 25 man 6-7 healers (just to be safe) Since most of the bosses are about survival and not dps * LK Update (doable) LK added Improved tank switching for all bosses Fixed PP gas cloud kiting Malleable goo todo (dont know how to detect it since its not object or npc) just summon ranged bots to safe position to bypass BPC fixed OT sometimes not tanking kele kinectic bombs todo (for now player should take care of them) Sindragosa fixed rare case when she is in air phase but tombs went to last phase position LK Bots can handle necrotic Bots can handle adds Bots should focus valkyre that actually grabbed someone (if unlucky and player just use attack command and summon bots to you if they are far away from you) if they grab bots you can either summon to make them useless or let bots cc them and do it legit way. Defile should be watched by player and once it was cast just summon bots to you Vile spirits for some reason go to the ground and get nuked by bots aoe spells so there is not much to be done **Player needs to be alive the whole LK fight since you will have to watch out for frost spehers (sometimes bots ignore them), summon bots when defile is up and summon ranged bots if they get stuck near shambling or raging spirits since their aoe will wipe you) all in all LK is doable both 10 and 25nm, player needs to have knowledge of lk fight and needs to know how to use multibot addon and make macros for eg summoning or commanding groups of bots or individual bots) Dont forget frost/shadow/nature resist auras in whole ICC since it will help alot I have done whole icc 10 and 25 with 2 pala tanks, 2/5 heals and rest dps, if you use +1 or +2 heals it should be easier (since I was testing I did close to 0 dmg in fights same with heals) * fixed changes made by mistake fix * Malleable fix (simple spread mechanic) Malleable mechanic added (simple spread for now) Gas cloud fixed (Bots sometimes got stuck between puddle and kite location) * Defile Update Bots detect and avoid defile (they struggle to find a way back to the boss around it tho, use summon to help them) Melee bots should be able to stand behind/to the flank of shambling/spirits * GS fixed bots not returning to their ship for A and H Bots will return back to ship after killing mage * PP gas cloud kiting improved PP gas cloud kiting improved * BPC targeting fixed Bots will mark valid prince with skull RTI now * BQL added melee spread in air pahse BQL added melee spread * VDW healing rotation improved Healers will now use strong heals and hots * Fixed Necrotic Plague Fixed issue with Necrotic where it would get dispelled too soon, or would not get dispelled at all * LK Update Refined defile logic Added 3 points for ranged and melee in winter phase (east, west, south when facing throne) fixed frost spheres targeting (hunter will focus them) Atm bots will reset z axis if they fall underground or if they get teleported by lk Better positioning in 1st phase * 10HC update until PP LK defile improved for 10nm (bots sometimes stood 2 close to defile until it grew few times) Improved rotface for HC PP remade for 10HC. Gas cloud is now properly kited Fixed a rare case of server crash when there were ooze and gas cloud alive at same time. Bots will move around puddles according to its size now. Bots that get unboud plague will simply move away from raid and die thus loosing it from raid. Volatile ooze improved stacking. Fixed ranged sometimes glitching thru walls when spreading out from other members. 10HC PP is now doable but its hard without summoning (summoning break gascloud and ooze targets so its easier to do). You need to watch boss so you dont phase 2 soon otherwise you will get 2x ooze and cloud which is almoust always a wipe. If abo is not played near perfection bots will struggle with oozes and gas clouds if they are not slowed on time. Always save energy to slow gas cloud since it will wipe the group if it reach its target. Bots will sometimes stand in puddle, just command them to move and they will figure out what to do. todo (proper malleable handling) * Up until Sindy 10HC BPC added shadow prison handling, bots stop moving if more than 12 stack, tanks more than 18 Improved spreading logic VDW fixed issue where bots in portal wold move at half speed compared to real player * fixed accidental change * LK 10HC update Added Shadow trap logic (if they stand in it, not a big deal since bots wont get yeeted only players will) When harvest soul, only player will be in another dimension (you must survive) **Sindy and LK can be done, but I must dissapoint purist, at my skill level I could not achieve to do HC without using summon or other "cheat" bot functions. Other bosses are all doable now in 10hc * ICC fixes GS, PP; BQL, SINDY Minor fixes, bite action improved
This commit is contained in:
@@ -403,12 +403,14 @@ bool IccGunshipTeleportAllyAction::Execute(Event event)
|
||||
if (!boss)
|
||||
return false;
|
||||
|
||||
// Only target the mage that is channeling Below Zero
|
||||
// Only proceed if the mage is channeling Below Zero
|
||||
if (!(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(69705)))
|
||||
{
|
||||
// If not casting and we're too far from waiting position, go there
|
||||
if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_ALLY2) > 45.0f)
|
||||
return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionX(),
|
||||
ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionY(), ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionZ(), bot->GetOrientation());
|
||||
return false;
|
||||
}
|
||||
|
||||
bot->SetTarget(boss->GetGUID());
|
||||
@@ -419,7 +421,7 @@ bool IccGunshipTeleportAllyAction::Execute(Event event)
|
||||
if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_ALLY) > 15.0f)
|
||||
return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_ALLY.GetPositionX(),
|
||||
ICC_GUNSHIP_TELEPORT_ALLY.GetPositionY(), ICC_GUNSHIP_TELEPORT_ALLY.GetPositionZ(), bot->GetOrientation());
|
||||
else
|
||||
|
||||
return Attack(boss);
|
||||
}
|
||||
|
||||
@@ -429,12 +431,14 @@ bool IccGunshipTeleportHordeAction::Execute(Event event)
|
||||
if (!boss)
|
||||
return false;
|
||||
|
||||
// Only target the sorcerer that is channeling Below Zero
|
||||
// Only proceed if the sorcerer is channeling Below Zero
|
||||
if (!(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(69705)))
|
||||
{
|
||||
// If not casting and we're too far from waiting position, go there
|
||||
if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_HORDE2) > 45.0f)
|
||||
return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionX(),
|
||||
ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionY(), ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionZ(), bot->GetOrientation());
|
||||
return false;
|
||||
}
|
||||
|
||||
bot->SetTarget(boss->GetGUID());
|
||||
@@ -445,7 +449,7 @@ bool IccGunshipTeleportHordeAction::Execute(Event event)
|
||||
if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_HORDE) > 15.0f)
|
||||
return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_HORDE.GetPositionX(),
|
||||
ICC_GUNSHIP_TELEPORT_HORDE.GetPositionY(), ICC_GUNSHIP_TELEPORT_HORDE.GetPositionZ(), bot->GetOrientation());
|
||||
else
|
||||
|
||||
return Attack(boss);
|
||||
}
|
||||
|
||||
@@ -1054,7 +1058,8 @@ bool IccPutricideVolatileOozeAction::Execute(Event event)
|
||||
}
|
||||
}
|
||||
|
||||
// For melee
|
||||
/*
|
||||
// For melee old stacking
|
||||
if (botAI->IsMelee(bot) && !botAI->IsMainTank(bot))
|
||||
{
|
||||
// If ooze exists and someone has aura, attack the ooze
|
||||
@@ -1074,6 +1079,18 @@ bool IccPutricideVolatileOozeAction::Execute(Event event)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// For melee new only attacking
|
||||
if (botAI->IsMelee(bot) && !botAI->IsMainTank(bot))
|
||||
{
|
||||
// If ooze exists and someone has aura, attack the ooze
|
||||
if (ooze)
|
||||
{
|
||||
bot->SetTarget(ooze->GetGUID());
|
||||
return Attack(ooze);
|
||||
}
|
||||
}
|
||||
|
||||
// For ranged and healers
|
||||
if (botAI->IsRanged(bot) || botAI->IsHeal(bot))
|
||||
@@ -1539,41 +1556,41 @@ bool IccBqlTankPositionAction::Execute(Event event)
|
||||
float moveIncrement = 3.0f;
|
||||
bool isRanged = botAI->IsRanged(bot);
|
||||
bool isMelee = botAI->IsMelee(bot);
|
||||
Aura* aura = botAI->GetAura("Frenzied Bloodthirst", bot);
|
||||
|
||||
GuidVector members = AI_VALUE(GuidVector, "group members");
|
||||
if (isRanged && !(bot->HasAura(70877) || bot->HasAura(71474) && boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))) //frenzied bloodthrist
|
||||
if (isRanged && !aura) //frenzied bloodthrist
|
||||
{
|
||||
// Ranged: spread from other ranged
|
||||
for (auto& member : members)
|
||||
{
|
||||
Unit* unit = botAI->GetUnit(member);
|
||||
if (!unit || !unit->IsAlive() || unit == bot || unit->HasAura(70877) || unit->HasAura(71474))
|
||||
if (!unit || !unit->IsAlive() || unit == bot || botAI->GetAura("Frenzied Bloodthirst", unit))
|
||||
continue;
|
||||
|
||||
float dist = bot->GetExactDist2d(unit);
|
||||
if (dist < radius)
|
||||
{
|
||||
float moveDistance = std::min(moveIncrement, radius - dist + 1.0f);
|
||||
return FleePosition(unit->GetPosition(), moveDistance);
|
||||
// return MoveAway(unit, moveDistance);
|
||||
return MoveAway(unit, moveDistance);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isMelee && boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) // melee also spread
|
||||
|
||||
if (isMelee && !aura && boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) // melee also spread
|
||||
{
|
||||
// Melee: spread from other melee
|
||||
for (auto& member : members)
|
||||
{
|
||||
Unit* unit = botAI->GetUnit(member);
|
||||
if (!unit || !unit->IsAlive() || unit == bot || unit->HasAura(70877) || unit->HasAura(71474))
|
||||
if (!unit || !unit->IsAlive() || unit == bot || botAI->GetAura("Frenzied Bloodthirst", unit))
|
||||
continue;
|
||||
|
||||
float dist = bot->GetExactDist2d(unit);
|
||||
if (dist < radius)
|
||||
{
|
||||
float moveDistance = std::min(moveIncrement, radius - dist + 1.0f);
|
||||
return FleePosition(unit->GetPosition(), moveDistance);
|
||||
// return MoveAway(unit, moveDistance);
|
||||
return MoveAway(unit, moveDistance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1583,7 +1600,8 @@ bool IccBqlTankPositionAction::Execute(Event event)
|
||||
bool IccBqlPactOfDarkfallenAction::Execute(Event event)
|
||||
{
|
||||
// Check if bot has Pact of the Darkfallen
|
||||
if (!bot->HasAura(71340))
|
||||
Aura* aura = botAI->GetAura("Pact of the Darkfallen", bot);
|
||||
if (!aura)
|
||||
return false;
|
||||
|
||||
const float POSITION_TOLERANCE = 1.0f; // Within 1 yards to break the link
|
||||
@@ -1603,7 +1621,7 @@ bool IccBqlPactOfDarkfallenAction::Execute(Event event)
|
||||
if (!member || member->GetGUID() == bot->GetGUID())
|
||||
continue;
|
||||
|
||||
if (member->HasAura(71340)) //pact of darkfallen
|
||||
if (botAI->GetAura("Pact of the Darkfallen", member)) //pact of darkfallen
|
||||
{
|
||||
playersWithAura.push_back(member);
|
||||
// If this player is a tank, store them
|
||||
@@ -1679,7 +1697,9 @@ bool IccBqlPactOfDarkfallenAction::Execute(Event event)
|
||||
bool IccBqlVampiricBiteAction::Execute(Event event)
|
||||
{
|
||||
// Only act when bot has Frenzied Bloodthirst
|
||||
if (!(bot->HasAura(70877) || bot->HasAura(71474)))
|
||||
Aura* aura = botAI->GetAura("Frenzied Bloodthirst", bot);
|
||||
|
||||
if (!aura)
|
||||
return false;
|
||||
|
||||
const float BITE_RANGE = 2.0f;
|
||||
@@ -1688,9 +1708,26 @@ bool IccBqlVampiricBiteAction::Execute(Event event)
|
||||
if (!group)
|
||||
return false;
|
||||
|
||||
// Create lists for potential targets
|
||||
std::vector<Player*> dpsTargets;
|
||||
std::vector<Player*> healTargets;
|
||||
// Create lists for potential targets with their distances
|
||||
std::vector<std::pair<Player*, float>> dpsTargets;
|
||||
std::vector<std::pair<Player*, float>> healTargets;
|
||||
|
||||
// Get list of players who are currently being targeted
|
||||
std::set<ObjectGuid> currentlyTargetedPlayers;
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||
{
|
||||
Player* member = itr->GetSource();
|
||||
if (!member || !member->IsAlive() || member == bot)
|
||||
continue;
|
||||
|
||||
if (botAI->GetAura("Frenzied Bloodthirst", member))
|
||||
{
|
||||
if (ObjectGuid targetGuid = member->GetTarget())
|
||||
{
|
||||
currentlyTargetedPlayers.insert(targetGuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||
{
|
||||
@@ -1699,28 +1736,40 @@ bool IccBqlVampiricBiteAction::Execute(Event event)
|
||||
continue;
|
||||
|
||||
// Skip if already has essence, frenzy, or is a tank, or uncontrollable frenzy
|
||||
if (member->HasAura(70867) || member->HasAura(70877) || member->HasAura(70879) || member->HasAura(71473)
|
||||
|| member->HasAura(71474) || member->HasAura(71525) || member->HasAura(71530) || member->HasAura(71531)
|
||||
|| member->HasAura(71532) || member->HasAura(71533) || member->HasAura(70923) || botAI->IsTank(member))
|
||||
if (botAI->GetAura("Frenzied Bloodthirst", member) || botAI->GetAura("Essence of the Blood Queen", member) || botAI->GetAura("Uncontrollable Frenzy", member) || botAI->IsTank(member))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip if this player is currently targeted by another bot
|
||||
if (currentlyTargetedPlayers.find(member->GetGUID()) != currentlyTargetedPlayers.end())
|
||||
continue;
|
||||
|
||||
float distance = bot->GetDistance(member);
|
||||
|
||||
if (botAI->IsDps(member))
|
||||
dpsTargets.push_back(member);
|
||||
dpsTargets.push_back(std::make_pair(member, distance));
|
||||
else if (botAI->IsHeal(member))
|
||||
healTargets.push_back(member);
|
||||
healTargets.push_back(std::make_pair(member, distance));
|
||||
}
|
||||
|
||||
// First try DPS targets
|
||||
// Sort both vectors by distance
|
||||
auto sortByDistance = [](const std::pair<Player*, float>& a, const std::pair<Player*, float>& b) {
|
||||
return a.second < b.second;
|
||||
};
|
||||
|
||||
std::sort(dpsTargets.begin(), dpsTargets.end(), sortByDistance);
|
||||
std::sort(healTargets.begin(), healTargets.end(), sortByDistance);
|
||||
|
||||
// First try closest DPS target
|
||||
if (!dpsTargets.empty())
|
||||
{
|
||||
target = dpsTargets[0]; // Take first available DPS
|
||||
target = dpsTargets[0].first;
|
||||
}
|
||||
// If no DPS available, try healers
|
||||
// If no DPS available, try closest healer
|
||||
else if (!healTargets.empty())
|
||||
{
|
||||
target = healTargets[0]; // Take first available healer
|
||||
target = healTargets[0].first;
|
||||
}
|
||||
|
||||
if (!target)
|
||||
@@ -1753,9 +1802,9 @@ bool IccBqlVampiricBiteAction::Execute(Event event)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (botAI->CanCastSpell(70946, target))
|
||||
if (botAI->CanCastSpell("Vampiric Bite", target))
|
||||
{
|
||||
return botAI->CastSpell(70946, target);
|
||||
return botAI->CastSpell("Vampiric Bite", target);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2728,7 +2777,7 @@ bool IccLichKingAddsAction::Execute(Event event)
|
||||
return bot->TeleportTo(bot->GetMapId(), bot->GetPositionX(),
|
||||
bot->GetPositionY(), 840.857f, bot->GetOrientation());
|
||||
|
||||
//temp soultion for bots when they get teleport far away into another dimension (they are unable to attack spirit warden)
|
||||
//temp soultion for bots when they get teleport far away into another dimension (they are unable to attack spirit warden) in heroic they will be in safe spot while player is surviving vile spirits
|
||||
Difficulty diff = bot->GetRaidDifficulty();
|
||||
if (!(diff == RAID_DIFFICULTY_10MAN_HEROIC || diff == RAID_DIFFICULTY_25MAN_HEROIC) && abs(bot->GetPositionY() - -2095.7915f) > 200.0f)
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@ const Position ICC_SINDRAGOSA_THOMB4_POSITION = Position(4381.819f, 2483.1448f,
|
||||
const Position ICC_SINDRAGOSA_THOMB5_POSITION = Position(4381.819f, 2495.1448f, 203.37704f); // 12y east from pos2/4
|
||||
const Position ICC_SINDRAGOSA_CENTER_POSITION = Position(4408.0464f, 2484.478f, 203.37529f);
|
||||
const Position ICC_SINDRAGOSA_THOMBMB2_POSITION = Position(4382.6113f, 2505.4922f, 203.38197f);
|
||||
const Position ICC_SINDRAGOSA_FBOMB_POSITION = Position(4366.0225f, 2501.569f, 203.38226f); //old 4400.031f, 2507.0295f, 203.37929f
|
||||
const Position ICC_SINDRAGOSA_FBOMB_POSITION = Position(4400.031f, 2507.0295f, 203.37929f); //old 4400.031f, 2507.0295f, 203.37929f //alternate for 10 man 4366.0225f, 2501.569f, 203.38226f
|
||||
const Position ICC_SINDRAGOSA_LOS2_POSITION = Position(4376.0938f, 2511.103f, 203.38303f);
|
||||
const Position ICC_LICH_KING_ADDS_POSITION = Position(486.63647f, -2095.7915f, 840.857f);
|
||||
const Position ICC_LK_FROST1_POSITION = Position(503.96548f, -2183.216f, 840.857f);
|
||||
|
||||
@@ -497,7 +497,9 @@ bool IccBqlTankPositionTrigger::IsActive()
|
||||
bool IccBqlPactOfDarkfallenTrigger::IsActive()
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "blood-queen lana'thel");
|
||||
if (!boss || !bot->HasAura(71340))
|
||||
|
||||
Aura* aura = botAI->GetAura("Pact of the Darkfallen", bot);
|
||||
if (!boss || !aura)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -509,8 +511,9 @@ bool IccBqlVampiricBiteTrigger::IsActive()
|
||||
if (!boss)
|
||||
return false;
|
||||
|
||||
Aura* aura = botAI->GetAura("Frenzied Bloodthirst", bot);
|
||||
// Only trigger when bot has Frenzied Bloodthirst
|
||||
if (!(bot->HasAura(70877) || bot->HasAura(71474)))
|
||||
if (!aura)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user