Compare commits

..

151 Commits

Author SHA1 Message Date
bash
eec2923076 feat(Core/Debug): Combat-aware state label + retry counter visibility + give-up event emit 2026-06-01 00:25:16 +02:00
bash
61067a302e feat(Core/RPG): Per-spawn destination pattern for incomplete quests (drops POI roam) 2026-06-01 00:22:00 +02:00
bash
5ffd2ad89c refactor(Core/RPG): Retry counter + give-up state replaces MoveRandomNear nudge on MoveFarTo failure 2026-06-01 00:08:01 +02:00
bash
e92af1cc06 fix(Core/Movement): AC has no MAX_GAMEOBJECT_TYPE sentinel + no sAreaTriggerStore DBC store 2026-05-31 19:07:32 +02:00
bash
b97da5c741 fix(Core/Movement): MoveNear engine-aware near-point + FollowOnTransport port + drop dead botZoneId 2026-05-31 19:05:06 +02:00
bash
cbd5f8748c fix(Core/Movement): Align HandleSpecialMovement + ClipPath details with reference 2026-05-31 18:53:11 +02:00
bash
1d85510a9e refactor(Core/Movement): Close walking-path divergences from reference (A-E) 2026-05-31 18:38:29 +02:00
bash
c82cd18677 fix(Core/Movement): Take TravelPath/WorldPosition by value in DispatchMovement 2026-05-31 18:20:45 +02:00
bash
566f4975e6 docs(Core/Travel): Note why setAreaCost(12,13) is not ported (mmap dataset diverges) 2026-05-31 18:19:02 +02:00
bash
dae09388ad refactor(Core/Movement): DispatchPathPoints → DispatchMovement (TravelPath sig + transport sandwich) 2026-05-31 18:15:24 +02:00
bash
d00ad8d327 refactor(Core/Movement): WaitForReach formula parity + PointsArray overload 2026-05-31 18:05:35 +02:00
bash
32b687f00a fix(Core/Movement): Take WorldPosition by value in MoveTo2 (IsValid is non-const) 2026-05-31 18:01:15 +02:00
bash
7f7cfb33d8 fix(Core/Movement): WorldPosition::IsValid is PascalCase on AC 2026-05-31 18:00:18 +02:00
bash
bd7422e98b refactor(Core/Movement): Funnel all MoveTo through MoveTo2 path-aware pipeline 2026-05-31 17:55:30 +02:00
bash
97b3e345a8 fix(Core/Debug): Inline zone filter in showpath cmd — GetNodesInZone was removed 2026-05-31 17:12:45 +02:00
bash
0eff76f3ec fix(Core/Travel): Remove stray '}' left over from dead-code sweep 2026-05-31 17:09:47 +02:00
bash
2c822affd2 fix(Core/Movement): Drop FORCED_MOVEMENT_FLIGHT — AC enum has no FLIGHT variant 2026-05-31 17:07:31 +02:00
bash
7cb9dc622c fix(Core/Movement): Restore SpellAuraEffects.h (provides AuraEffect definition) 2026-05-31 16:49:38 +02:00
bash
fa070f5e07 fix(Core/Movement): Restore PositionValue.h include (provides PositionInfo type) 2026-05-31 16:48:09 +02:00
bash
783210c4d0 refactor: Dead-code sweep — TravelMgr.cpp 5x /* */ blocks (-823 lines) + NewRpgBaseAction 5 unused includes 2026-05-31 16:46:11 +02:00
bash
d8c4425409 refactor(Core/Travel): Drop dead zone-index machinery + isEqual + cropUselessLink(single) (-124 lines) 2026-05-31 16:41:11 +02:00
bash
ae0baa3fcc refactor: Dead-code sweep — Follow /* */ block + TravelNode 2x /* */ blocks + LastMovement.lastFollow + 6 unused includes 2026-05-31 16:13:45 +02:00
bash
cd65fda93b refactor(Core/Movement): Remove partial vehicle handling in MoveTo+ChaseTo (deferred to dedicated PR) 2026-05-31 16:00:39 +02:00
bash
3813909341 refactor(Core/Movement): Dead-code sweep — drop old MoveTo commented block + ANGLE_45_DEG + cropUselessNode + addZoneLinkNode + addRandomExtNode 2026-05-31 15:55:40 +02:00
bash
a2d0b4530b refactor(Core/Travel): Drop unused MAX_PATHFINDING_DISTANCE constant (orphaned by ExecuteTravelPlan removal) 2026-05-31 15:50:01 +02:00
bash
1cf604dc60 refactor(Core/Travel): Remove teleportSpell + NODE_TELEPORT + PortalNode + hearthstone/mage A* injection (staticPortal kept) 2026-05-31 15:48:57 +02:00
bash
c6e0cc9cef refactor(Core/Travel): Simplify transport config to TransportSkipRide bool; drop mode-0 deck-walk approximations 2026-05-31 15:38:45 +02:00
bash
fff692e3f3 feat(Core/Movement): Mode-0 transport board/disembark — snap-and-deck-walk on board, NearTeleport+walk on disembark 2026-05-31 15:29:36 +02:00
bash
f6c41f57e4 feat(Core/Movement): BoardTransport mode 1 — teleport directly to boarding edge when transportTeleportType >= 1 2026-05-31 15:21:39 +02:00
bash
6aea0c2ba7 feat(Core/Travel): Add transportTeleportType config + teleport-across-water branch in UpcommingSpecialMovement 2026-05-31 15:17:20 +02:00
bash
e165a1e79b fix(Core/Movement): MoveFarTo re-caches lastPath after UpcommingSpecialMovement (matches reference) 2026-05-31 13:55:31 +02:00
bash
42768fe360 fix(Core/Movement): WaitForTransport now actively disembarks (matches reference UseTransport flow) 2026-05-31 13:54:27 +02:00
bash
eb97533387 fix(Core/Movement): MoveFarTo clears lastMove on collapse + drops AC single-point branch; DispatchPathPoints mirrors reference dispatch order (Clear -> MovePoint(last) -> MoveSplinePath) 2026-05-31 13:52:44 +02:00
bash
ec52e5c310 fix(Core/Travel): GetFullPath now reuses failed probe waypoints as startPath via cropPathTo (matches reference) 2026-05-31 13:49:59 +02:00
bash
7772dc4c0d fix(Core/Travel): Revert AC-side 'improvements' over reference — hearthstone deathCount underflow, A* iteration cap, endPath tolerance 2026-05-31 13:45:33 +02:00
bash
1f9fa42082 fix(Core/Travel): Strip AC-side meaningfulProgress branch in probe-first; match reference acceptance exactly 2026-05-31 13:43:40 +02:00
bash
899f2cba94 fix(Core/Travel): Loosen probe-progress threshold + relax endPath validation to INTERACTION_DISTANCE 2026-05-31 00:54:29 +02:00
bash
77db342969 fix(Core/Travel): Use GetGroupLeader()==bot instead of nonexistent IsGroupLeader 2026-05-31 00:43:49 +02:00
bash
694ba0c64c fix(Core/Travel): Restore probe-first short-circuit in GetFullPath — AC-side workaround for cave-interior destinations the graph misses 2026-05-31 00:42:19 +02:00
bash
14ac3a39b0 debug(Core/Movement): Telemetry whisper showing path tail coords vs bot vs dest 2026-05-31 00:41:20 +02:00
bash
4fab2e4fe6 fix(Core/Travel): GetNodeRoute parity — group-min gold accounting + hearthstone cost formula 2026-05-31 00:38:09 +02:00
bash
e2bcf9683b fix(Core/Travel): Include Transport.h in TravelNode.cpp for GetEntry() call 2026-05-31 00:32:07 +02:00
bash
14c7de977a refactor(Core/Movement): Drop no-progress guard now that probe + zone + validation fixes prevent the oscillation it was masking 2026-05-31 00:28:26 +02:00
bash
0682817b42 fix(Core/Movement): HandleSpecialMovement parity — portal spell-effect check, mount-flying refuse, area-trigger orientation, transport board throttle, teleport failure clears lastPath 2026-05-31 00:26:30 +02:00
bash
69dd655b96 fix(Core/Travel): Restructure GetFullPath to mirror reference: drop probe short-circuit, add per-candidate validation + bad-node tracking + transport early-return + hearthstone fallback 2026-05-31 00:21:51 +02:00
bash
0cbee1621d fix(Core/Travel): Map-wide node scan in GetFullPath candidate pick (was zone-restricted) 2026-05-31 00:18:53 +02:00
bash
8efe3a4321 fix(Core/Travel): Tighten GetFullPath probe gate so graph routing wins when probe misses 2026-05-31 00:10:39 +02:00
bash
1c9fd126ba fix(Core/Movement): No-progress guard in MoveFarTo to break stuck oscillation near unreachable targets 2026-05-31 00:08:39 +02:00
bash
1c12d8ff3e fix(Core/Travel): Hoist AiObjectContext* context in GetNodeRoute so PortalNode injection blocks see it 2026-05-31 00:03:45 +02:00
bash
ea69b56829 fix(Core/Travel): Declare AiObjectContext* context in ClipPath for AI_VALUE macro 2026-05-31 00:02:30 +02:00
bash
35d00b499e fix(Core/Travel): Re-add PathNodeType::NODE_TELEPORT now that BuildPath emits + handler consumes 2026-05-30 23:56:32 +02:00
bash
8844a775f4 fix(Core/Movement): ResolveMovePath takes WorldPosition by value (distance() not const-safe) 2026-05-30 23:55:23 +02:00
bash
77feb8ea56 fix(Core/Travel): Re-add TravelNodePathType::teleportSpell now that PortalNode emits it 2026-05-30 23:52:43 +02:00
bash
2110529b6b fix(Core/Movement): Align Follow IsSafe/bounding-radius + ChaseTo emote clear + IsSitState->IsStandState normalization + MoveNear bounding radius 2026-05-30 23:47:52 +02:00
bash
bdc11b07b3 feat(Core/Travel): Inject hearthstone + mage teleport spells into A* via PortalNode 2026-05-30 23:39:31 +02:00
bash
f8f3de001b feat(Core/Travel): Emit NODE_TELEPORT for teleport-spell edges; add HandleSpecialMovement consumer 2026-05-30 23:29:51 +02:00
bash
a24e1b033c feat(Core/Travel): Port TravelPath::ClipPath; call from MoveFarTo, drop inline clip 2026-05-30 23:28:02 +02:00
bash
8a3a91070b fix(Core/Movement): Force graph routing for vertical moves on map 609 (Ebon Hold) 2026-05-30 23:20:40 +02:00
bash
3bbe51c232 refactor(Core/Movement): Drop unused lastMoveTo* fields + std::future scratch 2026-05-30 23:17:27 +02:00
bash
990e2f2016 refactor(Core/Movement): Drop redundant prefix-trim + setPath in DispatchPathPoints 2026-05-30 23:13:32 +02:00
bash
2b50205e2a fix(Core/Movement): Skip walk dispatch when bot is on transport without special segment 2026-05-30 23:09:09 +02:00
bash
82e7958d2c fix(Core/Movement): Align WaitForTransport + HandleSpecialMovement disembark 2026-05-30 23:06:13 +02:00
bash
cf0bdf13fc refactor(Core/Movement): Rename stale TravelPlan:* labels + drop unused lastdelayTime 2026-05-30 23:01:50 +02:00
bash
3952ebff6e refactor(Core/Travel): Drop TravelPlan struct; GetFullPath returns TravelPath 2026-05-30 22:56:48 +02:00
bash
7ab57c184e refactor(Core/Movement): Drop dead ExecuteTravelPlan + LaunchWalkSpline + MoveToSpline + GetTravelPlan + RefineWalkPoints 2026-05-30 22:53:23 +02:00
bash
db87416f04 refactor(Core/Movement): Drop dead StartTravelPlan + UpdateTravelPlan + debug node lookup 2026-05-30 22:49:47 +02:00
bash
8b87ab091f refactor(Core/Movement): Rewrite MoveFarTo to use ResolveMovePath + HandleSpecialMovement 2026-05-30 22:47:55 +02:00
bash
05cf5a7702 feat(Core/Movement): Add HandleSpecialMovement + WaitForTransport 2026-05-30 22:43:04 +02:00
bash
35a30cdbef feat(Core/Movement): Add MovementAction::ResolveMovePath unified resolver 2026-05-30 22:38:47 +02:00
bash
c55f554bb4 feat(Core/Movement): Add LastMovement::lastTransportEntry for transport-resume gate 2026-05-30 22:05:06 +02:00
bash
d26ac742bb feat(Core/Travel): Port UpcommingSpecialMovement + getNextPoint helpers 2026-05-30 21:59:08 +02:00
bash
c1285bb0ae feat(Core/Travel): Add WorldPosition::projectOnSegment for path-progress checks 2026-05-30 21:52:35 +02:00
bash
77c5c6d8cd feat(Core/Travel): Port TravelPath::cutTo for upcoming special-movement handling 2026-05-30 21:41:34 +02:00
bash
0c9131692c refactor(Core/Movement): Align MoveFarTo preamble + drop spline-plan throttle 2026-05-30 21:28:48 +02:00
bash
1601d6a514 refactor(Core/Movement): Drop IsWaitingForLastMove throttle 2026-05-30 21:07:36 +02:00
bash
dd05767dcc fix(Core/Movement): Bypass stale lastMove gate when bot stopped + loosen probe short-circuit 2026-05-30 20:56:05 +02:00
bash
7278a3bfcb refactor(Conf): Hardcode master-walk-pace distance to 5y, drop config 2026-05-30 20:29:01 +02:00
bash
ecbf3fdec2 fix(Conf): Add missing AiPlayerbot.WalkDistance to playerbots.conf.dist 2026-05-30 20:26:05 +02:00
bash
01ea88624a fix(Core/Travel): Batch NODE_PREPATH into the walk-spline dispatch so per-tick re-resolve actually moves the bot 2026-05-30 20:22:27 +02:00
bash
02844dffd4 fix(Core/RPG): Drop per-tick travelplan whisper to silence spam 2026-05-30 20:18:59 +02:00
bash
2597880d38 fix(Core/Travel): Pass GAMEOBJECT_TYPE_SPELLCASTER to GetGameObjectIfCanInteractWith 2026-05-30 20:07:51 +02:00
bash
f4d308b684 refactor(Core/Travel): Remove dead spline-progress tracking and unused NODE_TELEPORT path 2026-05-30 19:56:41 +02:00
bash
a0e21d9f38 feat(Core/Travel): Re-enable area-trigger, static-portal, and teleport-spell nodes 2026-05-30 19:34:04 +02:00
bash
ed9e7227fb feat(Core/Travel): K-nearest node search, cropPathTo reuse, cross-map pathToEnd 2026-05-30 19:20:25 +02:00
bash
72d9ecabb9 fix(Core/Travel): mmap-path startPath and endPath in GetFullPath 2026-05-30 19:05:00 +02:00
bash
d9a8ac3a2a feat(Core/Travel): Exclude area-trigger, static-portal, teleport-spell path types from PR 2026-05-30 18:57:42 +02:00
bash
8cb54416bf fix(Core/RPG): Per-tick re-resolve travel plan instead of advancing cached plan 2026-05-30 18:38:22 +02:00
bash
558e9ee1e1 feat(Core/Travel): Handle NODE_TELEPORT (hearthstone) and NODE_AREA_TRIGGER 2026-05-30 18:27:52 +02:00
bash
563a415532 fix(Core/Movement): ChaseTo tries mmap path before MoveChase 2026-05-30 18:19:54 +02:00
bash
126294cc38 fix(Core/RPG): Use GetNearPoint and followAngle in MoveWorldObjectTo, bump travel-node threshold to sightDistance 2026-05-30 18:11:06 +02:00
bash
3b106260ac fix(Core/Travel): Soft-bias STEEP at regen PathGenerator sites 2026-05-30 18:07:02 +02:00
bash
b3a8d9f4be Revert "fix(Core/RPG): Drop chained probe and waypoint dispatch in MoveFarTo"
This reverts commit 3384fa4fcfdc8e394653f4604f7de97cf7da9571.
2026-05-30 18:05:39 +02:00
bash
3384fa4fcf fix(Core/RPG): Drop chained probe and waypoint dispatch in MoveFarTo 2026-05-30 15:44:43 +02:00
bash
0d3d38b007 fix(Core/RPG): Align MoveFarTo, MoveWorldObjectTo, MoveRandomNear with cmangos 2026-05-30 15:35:57 +02:00
bash
4e8e3e2afe fix(Core/RPG): Scope do-quest yield-to-grind to current objective only 2026-05-30 15:04:10 +02:00
bash
8c027e3a70 fix(Core/RPG): Drop over-strict MoveFarTo and MoveWorldObjectTo guards 2026-05-30 14:54:36 +02:00
bash
896ad3bf75 fix(Core/RPG): Require LOS from candidate to GO in MoveWorldObjectTo 2026-05-30 14:37:38 +02:00
bash
bdefd38830 fix(Core/Loot): Drop hostiles-in-sight gate on loot-available trigger 2026-05-30 14:28:03 +02:00
bash
5f61fe9ddf refactor(Core/Movement): Drop redundant bot filter setters at PathGenerator sites 2026-05-30 13:53:18 +02:00
bash
82ebaa9594 refactor(Core/Movement): Rename SetAreaCost calls to SetNavTerrainCost 2026-05-30 13:53:18 +02:00
bash
51cea4d76c fix(Core/Movement): Apply bot filter setters at all PathGenerator construction sites 2026-05-30 13:53:18 +02:00
bash
aae47b06c7 fix(Core/Travel): Apply NAV_WATER cost bias on regen PathGenerator 2026-05-30 13:53:18 +02:00
bash
d72d3ded6c fix(Core/Travel): Exclude NAV_GROUND_STEEP on regen PathGenerator 2026-05-30 13:53:17 +02:00
bash
974faf0cb0 fix(Core/Travel): Hoist portal/transport cheat above 2-point reject 2026-05-30 13:53:17 +02:00
bash
e052ec3b17 fix(Core/Travel): Match cmangos buildPath stitching, drop 75y guard 2026-05-30 13:53:17 +02:00
bash
4a991c194d fix(Core/Travel): Preserve walk paths from taxi-path overwrite 2026-05-30 13:53:17 +02:00
bash
ed31f8f8a7 chore(Core/Travel): Warn admins to shutdown after generatenode 2026-05-30 13:53:17 +02:00
bash
479794b66b fix(Core/Travel): Skip 5y dedup when loading nodes from DB 2026-05-30 13:53:17 +02:00
bash
337fbca8c0 chore(DB/Travel): Temporarily disable Aldrassil ramp anchors 2026-05-30 13:53:17 +02:00
bash
fe12f1a708 fix(Core/Travel): Drop 2-point check, keep last-segment teleport guard 2026-05-30 13:53:17 +02:00
bash
8916cf83c0 fix(Core/Travel): Reject paths with >75y final-segment teleport jumps 2026-05-30 13:53:17 +02:00
bash
77caf85fd1 fix(Core/Travel): Reject 2-point BuildShortcut paths between non-adjacent nodes 2026-05-30 13:53:17 +02:00
bash
5e5d41f878 chore(Core/Travel): Bump 2-point shortcut threshold to 75y 2026-05-30 13:53:17 +02:00
bash
63c5d674d6 fix(Core/Travel): Reject 2-point BuildShortcut teleports in chained probe 2026-05-30 13:53:17 +02:00
bash
43ee732003 Revert non-progress chained-probe detection (broke valid paths) 2026-05-30 13:53:17 +02:00
bash
f42f37399f fix(Core/Travel): Loosen chained-probe non-progress threshold 2026-05-30 13:53:17 +02:00
bash
c7929482c4 fix(Core/Travel): Bail chained probe on non-progress oscillation 2026-05-30 13:53:17 +02:00
bash
e1489f213e fix(Core/Travel): Chunk all saveNodeStore phases (deletes, nodes, links) 2026-05-30 13:53:17 +02:00
bash
007189fd5c fix(Core/Travel): Chunk saveNodeStore path inserts to avoid mega-tx 2026-05-30 13:53:17 +02:00
bash
eabefb1d33 feat(DB/Travel): Add Aldrassil ramp travelnode anchors 2026-05-30 13:53:17 +02:00
bash
2208c80caa chore(Core/Debug): Compact debug-move whisper format 2026-05-30 13:53:17 +02:00
bash
a472fc2d68 feat(Core/Travel): Sparse-segment clip in LaunchWalkSpline 2026-05-30 13:53:17 +02:00
bash
bac63e2a8c feat(Core/RPG): Prefix-trim and sparse-segment clip on path dispatch 2026-05-30 13:53:17 +02:00
bash
690288b5cc feat(Core/RPG): Port cmangos 8-angle LOS+navmesh-snap to MoveWorldObjectTo 2026-05-30 13:53:17 +02:00
bash
57134918cb chore(Core/RPG): Loosen Z-mismatch threshold from 5y to 10y 2026-05-30 13:53:17 +02:00
bash
324b50f1be fix(Core/RPG): Reject mmap paths whose endpoint Z misses dest 2026-05-30 13:53:17 +02:00
bash
7d8d8c6b31 fix(Core/RPG): Reject mmap paths that LOS-fail any segment 2026-05-30 13:53:17 +02:00
bash
34b0432aaa feat(Core/RPG): Switch POI when current cluster is empty 2026-05-30 13:53:17 +02:00
bash
edc999c8ac fix(Core/RPG): Stop next to quest objects instead of on top of them 2026-05-30 13:53:17 +02:00
bash
85e2a940a1 chore: Drop bot movement console logs 2026-05-30 13:53:17 +02:00
bash
6754a95890 chore: Tighten comments in travel and movement code 2026-05-30 13:53:17 +02:00
bash
d0fac16c85 chore(Core/Travel): Drop cmangos reference in RefineWalkPoints comment 2026-05-30 13:53:17 +02:00
bash
a64c721f35 fix(Core/RPG): LOS check on MoveRandomNear samples to avoid tree tunneling 2026-05-30 13:53:17 +02:00
bash
27503a9c37 Revert "fix(Core/Travel): LOS check before trusting raw cmangos waypoints" 2026-05-30 13:53:17 +02:00
bash
1a7e6db0c9 fix(Core/Travel): LOS gate on empty-probe single-waypoint fallback 2026-05-30 13:53:16 +02:00
bash
6ae973bb8e fix(Core/Travel): LOS check before trusting raw cmangos waypoints 2026-05-30 13:53:16 +02:00
bash
101da6ecd3 chore(Core/Travel): Revert travelnode threshold to 50y 2026-05-30 13:53:16 +02:00
bash
605e7586c5 chore(Core/Travel): Bump travelnode threshold to 75y 2026-05-30 13:53:16 +02:00
bash
129cb252cf fix(Core/Travel): Trust travelnode waypoints when AC mmap rejects segments 2026-05-30 13:53:16 +02:00
bash
088537277c feat(Core/Travel): Hardcode 50y travelnode threshold 2026-05-30 13:53:16 +02:00
bash
6944da8d69 core filter isnt working yet 2026-05-30 13:53:16 +02:00
bash
980c1b8cd8 refactor(Core/Travel): Drop redundant NAV_GROUND_STEEP excludes (core handles via IsBot) 2026-05-30 13:53:16 +02:00
bash
ad14420400 fix(Core/Travel): Exclude NAV_GROUND_STEEP at all bot PathGenerator sites 2026-05-30 13:53:16 +02:00
bash
1d0aeec7b9 feat(Core/Travel): Align MoveFarTo and probe pipeline with cmangos 2026-05-30 13:53:16 +02:00
bash
7741626631 feat(Core/Travel): Cap bots at 50° via NAV_GROUND_STEEP exclude 2026-05-30 13:53:16 +02:00
bash
806013a4c9 feat(Core/Debug): Trace movement entry points and visualize travel nodes 2026-05-30 13:53:16 +02:00
bash
3269d1a4b3 feat(Core/RPG): MoveFarTo flow, quest-pursuit at POI, MoveRandomNear retries 2026-05-30 13:53:16 +02:00
bash
1ae72b0888 feat(Core/Travel): Travel-node graph routing for long-distance pathing 2026-05-30 13:53:16 +02:00
bash
0a9bf70305 feat(Core/Loot): Quest GO loot, bag-make-room, item-pursuit 2026-05-30 13:53:16 +02:00
bash
e18fdd02cd chore(Tools): Add mmap/vmap client-data extraction script 2026-05-30 13:53:16 +02:00
bash
a23158ef52 feat(DB/Travel): Import cmangos travel-node graph 2026-05-30 13:53:16 +02:00
433 changed files with 854 additions and 1153 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +0,0 @@
DELETE FROM ai_playerbot_texts WHERE name IN (
'send_mail_disabled'
);
DELETE FROM ai_playerbot_texts_chance WHERE name IN (
'send_mail_disabled'
);
INSERT INTO ai_playerbot_texts (id, name, text, say_type, reply_type, text_loc1, text_loc2, text_loc3, text_loc4, text_loc5, text_loc6, text_loc7, text_loc8) VALUES
(1899, 'send_mail_disabled', 'I cannot send mail', 0, 0, '우편을 보낼 수 없습니다', 'Je ne peux pas envoyer de courrier', 'Ich kann keine Post senden', '我不能寄送邮件', '我不能寄送郵件', 'No puedo enviar correo', 'No puedo enviar correo', 'Я не могу отправить почту');
INSERT INTO ai_playerbot_texts_chance (name, probability) VALUES
('send_mail_disabled', 100);

View File

@ -12,8 +12,8 @@ bool AutoMaintenanceOnLevelupAction::Execute(Event /*event*/)
{
AutoPickTalents();
AutoLearnSpell();
AutoTeleportForLevel();
AutoUpgradeEquip();
AutoTeleportForLevel();
return true;
}
@ -21,11 +21,13 @@ bool AutoMaintenanceOnLevelupAction::Execute(Event /*event*/)
void AutoMaintenanceOnLevelupAction::AutoTeleportForLevel()
{
if (!sPlayerbotAIConfig.autoTeleportForLevel || !sRandomPlayerbotMgr.IsRandomBot(bot))
{
return;
}
if (botAI->HasRealPlayerMaster())
{
return;
}
sRandomPlayerbotMgr.RandomTeleportForLevel(bot);
return;
}
@ -87,17 +89,21 @@ void AutoMaintenanceOnLevelupAction::LearnQuestSpells(std::ostringstream* out)
{
Quest const* quest = i->second;
if (!quest->GetRequiredClasses() || quest->IsRepeatable() || quest->GetMinLevel() < 10 ||
quest->GetMinLevel() > bot->GetLevel())
{
// only process class-specific quests to learn class-related spells, cuz
// we don't want all these bunch of entries to be handled!
if (!quest->GetRequiredClasses())
continue;
}
// skip quests that are repeatable, too low level, or above bots' level
if (quest->IsRepeatable() || quest->GetMinLevel() < 10 || quest->GetMinLevel() > bot->GetLevel())
continue;
// skip if bot doesnt satisfy class, race, or skill requirements
if (!bot->SatisfyQuestClass(quest, false) || !bot->SatisfyQuestRace(quest, false) ||
!bot->SatisfyQuestSkill(quest, false))
{
continue;
}
// use the same logic and impl from Player::learnQuestRewardedSpells
int32 spellId = quest->GetRewSpellCast();
if (!spellId)
@ -107,26 +113,31 @@ void AutoMaintenanceOnLevelupAction::LearnQuestSpells(std::ostringstream* out)
if (!spellInfo)
continue;
// xinef: find effect with learn spell and check if we have this spell
bool found = false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell &&
!bot->HasSpell(spellInfo->Effects[i].TriggerSpell))
{
// pusywizard: don't re-add profession specialties!
if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
break;
break; // pussywizard: break and not cast the spell (found is false)
found = true;
break;
}
}
// xinef: we know the spell, continue
if (!found)
continue;
bot->CastSpell(bot, spellId, true);
// Check if RewardDisplaySpell is set to output the proper spell learned
// after processing quests. Output the original RewardSpell otherwise.
uint32 rewSpellId = quest->GetRewSpell();
if (rewSpellId)
{
@ -156,11 +167,12 @@ std::string const AutoMaintenanceOnLevelupAction::FormatSpell(SpellInfo const* s
void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip()
{
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
if (!sPlayerbotAIConfig.autoUpgradeEquip || !sRandomPlayerbotMgr.IsRandomBot(bot))
return;
PlayerbotFactory factory(bot, bot->GetLevel());
// Clean up old consumables before adding new ones
factory.CleanupConsumables();
factory.InitAmmo();
@ -169,6 +181,9 @@ void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip()
factory.InitConsumables();
factory.InitPotions();
if (sPlayerbotAIConfig.autoUpgradeEquip)
if (!sPlayerbotAIConfig.equipmentPersistence || bot->GetLevel() < sPlayerbotAIConfig.equipmentPersistenceLevel)
{
if (sPlayerbotAIConfig.incrementalGearInit)
factory.InitEquipment(true);
}
}

View File

@ -154,11 +154,9 @@ void EquipAction::EquipItem(Item* item)
calculator.SetOverflowPenalty(false);
// Calculate item scores once and store them
float newItemScore = calculator.CalculateItem(itemId, item->GetItemRandomPropertyId());
float mainHandScore = mainHandItem
? calculator.CalculateItem(mainHandItem->GetTemplate()->ItemId, mainHandItem->GetItemRandomPropertyId()) : 0.0f;
float offHandScore = offHandItem
? calculator.CalculateItem(offHandItem->GetTemplate()->ItemId, offHandItem->GetItemRandomPropertyId()) : 0.0f;
float newItemScore = calculator.CalculateItem(itemId);
float mainHandScore = mainHandItem ? calculator.CalculateItem(mainHandItem->GetTemplate()->ItemId) : 0.0f;
float offHandScore = offHandItem ? calculator.CalculateItem(offHandItem->GetTemplate()->ItemId) : 0.0f;
// Determine where this weapon can go
bool canGoMain = (invType == INVTYPE_WEAPON ||

View File

@ -86,7 +86,7 @@ bool TogglePetSpellAutoCastAction::Execute(Event /*event*/)
uint32 spellId = itr->first;
const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo || !spellInfo->IsAutocastable())
if (!spellInfo->IsAutocastable())
continue;
bool shouldApply = true;

View File

@ -6,7 +6,6 @@
#include "GenericSpellActions.h"
#include <ctime>
#include <unordered_set>
#include "Event.h"
#include "ItemTemplate.h"
@ -24,116 +23,6 @@
using ai::buff::MakeAuraQualifierForBuff;
using ai::spell::HasSpellOrCategoryCooldown;
namespace
{
std::unordered_set<uint32> const& GetMixedTriggerTrinketSpellIds()
{
static std::unordered_set<uint32> const mixedTriggerSpellIds = []()
{
std::unordered_set<uint32> onUseSpellIds;
std::unordered_set<uint32> onEquipSpellIds;
std::unordered_set<uint32> mixedSpellIds;
auto const* itemTemplates = sObjectMgr->GetItemTemplateStore();
if (!itemTemplates)
return mixedSpellIds;
auto const markSpellId = [&](int32 spellId, uint8 spellTrigger)
{
if (spellId <= 0)
return;
if (spellTrigger == ITEM_SPELLTRIGGER_ON_USE)
{
if (onEquipSpellIds.find(spellId) != onEquipSpellIds.end())
mixedSpellIds.insert(spellId);
onUseSpellIds.insert(spellId);
}
else if (spellTrigger == ITEM_SPELLTRIGGER_ON_EQUIP)
{
if (onUseSpellIds.find(spellId) != onUseSpellIds.end())
mixedSpellIds.insert(spellId);
onEquipSpellIds.insert(spellId);
}
};
for (auto const& itr : *itemTemplates)
{
ItemTemplate const& proto = itr.second;
if (proto.InventoryType != INVTYPE_TRINKET)
continue;
for (uint8 spellIndex = 0; spellIndex < MAX_ITEM_PROTO_SPELLS; ++spellIndex)
{
auto const& spellData = proto.Spells[spellIndex];
markSpellId(spellData.SpellId, spellData.SpellTrigger);
}
}
return mixedSpellIds;
}();
return mixedTriggerSpellIds;
}
bool IsManaRestoreEffect(SpellEffectInfo const& effectInfo)
{
return (effectInfo.Effect == SPELL_EFFECT_ENERGIZE &&
effectInfo.MiscValue == POWER_MANA) ||
(effectInfo.Effect == SPELL_EFFECT_APPLY_AURA &&
effectInfo.ApplyAuraName == SPELL_AURA_PERIODIC_ENERGIZE &&
effectInfo.MiscValue == POWER_MANA);
}
bool IsManaEfficiencyEffect(SpellEffectInfo const& effectInfo)
{
return effectInfo.Effect == SPELL_EFFECT_APPLY_AURA &&
(((effectInfo.ApplyAuraName == SPELL_AURA_MOD_POWER_REGEN ||
effectInfo.ApplyAuraName == SPELL_AURA_MOD_POWER_REGEN_PERCENT) &&
effectInfo.MiscValue == POWER_MANA) ||
effectInfo.ApplyAuraName == SPELL_AURA_MOD_POWER_COST_SCHOOL ||
effectInfo.ApplyAuraName == SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT ||
effectInfo.ApplyAuraName == SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
}
bool IsDefensiveTankEffect(SpellEffectInfo const& effectInfo)
{
if (effectInfo.Effect != SPELL_EFFECT_APPLY_AURA)
return false;
uint32 const tankRatingsMask =
(1u << CR_DEFENSE_SKILL) |
(1u << CR_DODGE) |
(1u << CR_PARRY) |
(1u << CR_BLOCK) |
(1u << CR_HIT_TAKEN_MELEE) |
(1u << CR_HIT_TAKEN_RANGED) |
(1u << CR_HIT_TAKEN_SPELL) |
(1u << CR_CRIT_TAKEN_MELEE) |
(1u << CR_CRIT_TAKEN_RANGED) |
(1u << CR_CRIT_TAKEN_SPELL);
switch (effectInfo.ApplyAuraName)
{
case SPELL_AURA_MOD_RESISTANCE:
return (effectInfo.MiscValue & SPELL_SCHOOL_MASK_NORMAL) != 0;
case SPELL_AURA_MOD_RATING:
return (effectInfo.MiscValue & tankRatingsMask) != 0;
case SPELL_AURA_MOD_INCREASE_HEALTH:
case SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT:
case SPELL_AURA_MOD_PARRY_PERCENT:
case SPELL_AURA_MOD_DODGE_PERCENT:
case SPELL_AURA_MOD_BLOCK_PERCENT:
case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
return true;
default:
return false;
}
}
}
CastSpellAction::CastSpellAction(PlayerbotAI* botAI, std::string const spell)
: Action(botAI, spell), range(botAI->GetRange("spell")), spell(spell) {}
@ -540,109 +429,52 @@ bool UseTrinketAction::UseTrinket(Item* item)
uint8 bagIndex = item->GetBagSlot();
uint8 slot = item->GetSlot();
// uint8 spell_index = 0; //not used, line marked for removal.
uint8 cast_count = 1;
ObjectGuid item_guid = item->GetGUID();
uint32 glyphIndex = 0;
uint8 castFlags = 0;
uint32 targetFlag = TARGET_FLAG_NONE;
uint32 spellId = 0;
int32 itemSpellCooldown = 0;
uint32 itemSpellCategory = 0;
int32 itemSpellCategoryCooldown = 0;
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
{
if (item->GetTemplate()->Spells[i].SpellId > 0 &&
item->GetTemplate()->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
{
spellId = item->GetTemplate()->Spells[i].SpellId;
itemSpellCooldown = item->GetTemplate()->Spells[i].SpellCooldown;
itemSpellCategory = item->GetTemplate()->Spells[i].SpellCategory;
itemSpellCategoryCooldown = item->GetTemplate()->Spells[i].SpellCategoryCooldown;
uint64 const itemCooldownKey = (static_cast<uint64>(item->GetEntry()) << 32) | spellId;
uint32 const now = getMSTime();
if (itemSpellCooldown > 0)
{
auto const itemCooldownItr = trinketItemCooldownExpiries.find(itemCooldownKey);
if (itemCooldownItr != trinketItemCooldownExpiries.end())
{
if (itemCooldownItr->second > now)
return false;
trinketItemCooldownExpiries.erase(itemCooldownItr);
}
}
if (itemSpellCategory && itemSpellCategoryCooldown > 0)
{
auto const categoryCooldownItr = trinketCategoryCooldownExpiries.find(itemSpellCategory);
if (categoryCooldownItr != trinketCategoryCooldownExpiries.end())
{
if (categoryCooldownItr->second > now)
return false;
trinketCategoryCooldownExpiries.erase(categoryCooldownItr);
}
}
const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo || !spellInfo->IsPositive())
return false;
bool applyAura = false;
bool restoresMana = false;
bool improvesManaEfficiency = false;
bool defensiveTankEffect = false;
for (int i = 0; i < MAX_SPELL_EFFECTS; i++)
{
const SpellEffectInfo& effectInfo = spellInfo->Effects[i];
if (effectInfo.Effect == SPELL_EFFECT_APPLY_AURA)
{
applyAura = true;
restoresMana = restoresMana || IsManaRestoreEffect(effectInfo);
improvesManaEfficiency = improvesManaEfficiency || IsManaEfficiencyEffect(effectInfo);
defensiveTankEffect = defensiveTankEffect || IsDefensiveTankEffect(effectInfo);
}
if (!applyAura && !restoresMana)
return false;
if (restoresMana || improvesManaEfficiency)
{
if (!AI_VALUE2(bool, "has mana", "self target"))
return false;
uint8 const manaPct = AI_VALUE2(uint8, "mana", "self target");
if ((restoresMana && manaPct >= sPlayerbotAIConfig.mediumMana) ||
manaPct >= sPlayerbotAIConfig.highMana)
{
return false;
}
}
if (defensiveTankEffect)
{
uint8 const healthPct = AI_VALUE2(uint8, "health", "self target");
if (healthPct > sPlayerbotAIConfig.lowHealth)
return false;
}
auto const& mixedTriggerTrinketSpellIds = GetMixedTriggerTrinketSpellIds();
// Exclude trinkets that expose the same spell as both ON_EQUIP and ON_USE across
// item templates. Those are equip/proc effects leaking into the active-use path,
// as seen with the error versions of Oracle Talisman of Ablution (44870) and
// Frenzyheart Insignia of Fury (44869).
if (mixedTriggerTrinketSpellIds.find(spellId) != mixedTriggerTrinketSpellIds.end())
return false;
if (!botAI->CanCastSpell(spellId, bot, false, nullptr, item))
return false;
break;
}
}
if (!applyAura)
return false;
uint32 spellProcFlag = spellInfo->ProcFlags;
// Handle items with procflag "if you kill a target that grants honor or experience"
// Bots will "learn" the trinket proc, so CanCastSpell() will be true
// e.g. on Item https://www.wowhead.com/wotlk/item=44074/oracle-talisman-of-ablution leading to
// constant casting of the proc spell onto themselfes https://www.wowhead.com/wotlk/spell=59787/oracle-ablutions
// This will lead to multiple hundreds of entries in m_appliedAuras -> Once killing an enemy -> Big diff time spikes
if (spellProcFlag != 0) return false;
if (!botAI->CanCastSpell(spellId, bot, false))
return false;
break;
}
}
if (!spellId)
return false;
@ -651,25 +483,7 @@ bool UseTrinketAction::UseTrinket(Item* item)
targetFlag = TARGET_FLAG_NONE;
packet << targetFlag << bot->GetPackGUID();
bot->GetSession()->HandleUseItemOpcode(packet);
uint32 const now = getMSTime();
uint32 const cooldownDelay = bot->GetSpellCooldownDelay(spellId);
if (cooldownDelay > 0)
{
if (itemSpellCooldown > 0)
{
uint64 const itemCooldownKey = (static_cast<uint64>(item->GetEntry()) << 32) | spellId;
trinketItemCooldownExpiries[itemCooldownKey] = now + static_cast<uint32>(itemSpellCooldown);
}
if (itemSpellCategory && itemSpellCategoryCooldown > 0)
{
trinketCategoryCooldownExpiries[itemSpellCategory] = now + static_cast<uint32>(itemSpellCategoryCooldown);
}
}
return true;
}

View File

@ -334,10 +334,6 @@ public:
protected:
bool UseTrinket(Item* trinket);
private:
std::unordered_map<uint64, uint32> trinketItemCooldownExpiries;
std::unordered_map<uint32, uint32> trinketCategoryCooldownExpiries;
};
class CastSpellOnEnemyHealerAction : public CastSpellAction

View File

@ -44,21 +44,6 @@ bool ResetAiAction::Execute(Event event)
}
}
}
if (Player* master = botAI->GetMaster())
{
Group* botGroup = bot->GetGroup();
Group* masterGroup = master->GetGroup();
if (botGroup && (!masterGroup || masterGroup != botGroup))
botAI->SetMaster(nullptr);
}
if (sRandomPlayerbotMgr.IsRandomBot(bot) && !bot->InBattleground())
{
if (bot->GetGroup() && (!botAI->GetMaster() || GET_PLAYERBOT_AI(botAI->GetMaster())))
{
if (Player* newMaster = botAI->FindNewMaster())
botAI->SetMaster(newMaster);
}
}
PlayerbotRepository::instance().Reset(botAI);
botAI->ResetStrategies(false);
botAI->TellMaster("AI was reset to defaults");

View File

@ -34,23 +34,24 @@ bool SendMailAction::Execute(Event event)
Player* receiver = GetMaster();
Player* tellTo = receiver;
std::vector<std::string> ss = split(text, ' ');
if (ss.size() > 1)
{
if (Player* p = ObjectAccessor::FindPlayer(ObjectGuid(uint64(ss[ss.size() - 1].c_str()))))
receiver = p;
}
if (!receiver)
receiver = event.getOwner();
if (!receiver || receiver == bot)
{
return false;
}
if (!tellTo)
tellTo = receiver;
if (!sPlayerbotAIConfig.botSendMailEnabled)
{
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
"send_mail_disabled", "I cannot send mail", {}),
LANG_UNIVERSAL, tellTo);
return false;
}
if (!mailboxFound && !randomBot)
{
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(

View File

@ -16,7 +16,7 @@ void WorldPacketHandlerStrategy::InitTriggers(std::vector<TriggerNode*>& trigger
triggers.push_back(
new TriggerNode("uninvite guid", { NextAction("uninvite", relevance) }));
triggers.push_back(
new TriggerNode("group set leader", { NextAction("reset botAI", relevance) }));
new TriggerNode("group set leader", { /*NextAction("leader", relevance),*/ }));
triggers.push_back(new TriggerNode(
"not enough money", { NextAction("tell not enough money", relevance) }));
triggers.push_back(

View File

@ -161,7 +161,9 @@ void ShamanAoeStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
}
else if (tab == SHAMAN_TAB_ENHANCEMENT)
{
triggers.push_back(new TriggerNode("medium aoe",{ NextAction("fire nova", 23.0f), }));
triggers.push_back(new TriggerNode("medium aoe",{ NextAction("magma totem", 24.0f),
NextAction("fire nova", 23.0f), }));
triggers.push_back(new TriggerNode("maelstrom weapon 5 and medium aoe", { NextAction("chain lightning", 22.0f), }));
triggers.push_back(new TriggerNode("maelstrom weapon 4 and medium aoe", { NextAction("chain lightning", 21.0f), }));
triggers.push_back(new TriggerNode("enemy within melee", { NextAction("fire nova", 5.1f), }));

View File

@ -5,7 +5,6 @@
#include "WarriorActions.h"
#include "AiFactory.h"
#include "Playerbots.h"
bool CastBerserkerRageAction::isPossible()
@ -37,27 +36,6 @@ bool CastBerserkerRageAction::isUseful()
bool CastSunderArmorAction::isUseful()
{
Group* group = bot->GetGroup();
if (!group)
return false;
if (!botAI->IsTank(bot, false))
{
for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next())
{
Player* member = ref->GetSource();
if (!member || member == bot || !member->IsAlive() || !member->IsInWorld() ||
member->GetMapId() != bot->GetMapId())
{
continue;
}
if (member->getClass() == CLASS_WARRIOR &&
botAI->IsTank(member, false))
return false;
}
}
Aura* aura = botAI->GetAura("sunder armor", GetTarget(), false, true);
return !aura || aura->GetStackAmount() < 5 || aura->GetDuration() <= 6000;
}

View File

@ -112,7 +112,6 @@ std::vector<NextAction> ArmsWarriorStrategy::getDefaultActions()
return {
NextAction("bladestorm", ACTION_DEFAULT + 0.2f),
NextAction("mortal strike", ACTION_DEFAULT + 0.1f),
NextAction("sunder armor", ACTION_DEFAULT + 0.05f),
NextAction("melee", ACTION_DEFAULT)
};
}

View File

@ -1,7 +1,7 @@
#include "Playerbots.h"
#include "AiFactory.h"
#include "ACTriggers.h"
#include "ACActions.h"
#include "AuchenaiCryptsTriggers.h"
#include "AuchenaiCryptsActions.h"
// Shirrak the Dead Watcher

View File

@ -3,7 +3,7 @@
#include "AttackAction.h"
#include "MovementActions.h"
#include "ACTriggers.h"
#include "AuchenaiCryptsTriggers.h"
// Shirrak the Dead Watcher

View File

@ -3,7 +3,7 @@
#include "AiObjectContext.h"
#include "Action.h"
#include "ACActions.h"
#include "AuchenaiCryptsActions.h"
class TbcDungeonAuchenaiCryptsActionContext : public NamedObjectContext<Action>
{

View File

@ -3,7 +3,7 @@
#include "AiObjectContext.h"
#include "TriggerContext.h"
#include "ACTriggers.h"
#include "AuchenaiCryptsTriggers.h"
class TbcDungeonAuchenaiCryptsTriggerContext : public NamedObjectContext<Trigger>
{

View File

@ -1,6 +1,6 @@
#include "ACMultipliers.h"
#include "ACActions.h"
#include "ACTriggers.h"
#include "AuchenaiCryptsMultipliers.h"
#include "AuchenaiCryptsActions.h"
#include "AuchenaiCryptsTriggers.h"
#include "MovementActions.h"
#include "ReachTargetActions.h"
#include "FollowActions.h"

View File

@ -1,6 +1,6 @@
#include "ACTriggers.h"
#include "ACStrategy.h"
#include "ACMultipliers.h"
#include "AuchenaiCryptsTriggers.h"
#include "AuchenaiCryptsStrategy.h"
#include "AuchenaiCryptsMultipliers.h"
void TbcDungeonAuchenaiCryptsStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "ACTriggers.h"
#include "AuchenaiCryptsTriggers.h"
#include "AiObject.h"
#include "AiObjectContext.h"

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "ANActions.h"
#include "AzjolNerubActions.h"
bool AttackWebWrapAction::isUseful() { return !botAI->IsHeal(bot); }
bool AttackWebWrapAction::Execute(Event /*event*/)

View File

@ -5,7 +5,7 @@
#include "AttackAction.h"
#include "PlayerbotAI.h"
#include "Playerbots.h"
#include "ANTriggers.h"
#include "AzjolNerubTriggers.h"
class AttackWebWrapAction : public AttackAction
{

View File

@ -3,7 +3,7 @@
#include "Action.h"
#include "NamedObjectContext.h"
#include "ANActions.h"
#include "AzjolNerubActions.h"
class WotlkDungeonANActionContext : public NamedObjectContext<Action>
{

View File

@ -3,7 +3,7 @@
#include "NamedObjectContext.h"
#include "AiObjectContext.h"
#include "ANTriggers.h"
#include "AzjolNerubTriggers.h"
class WotlkDungeonANTriggerContext : public NamedObjectContext<Trigger>
{

View File

@ -1,9 +1,9 @@
#include "ANMultipliers.h"
#include "ANActions.h"
#include "AzjolNerubMultipliers.h"
#include "AzjolNerubActions.h"
#include "GenericSpellActions.h"
#include "ChooseTargetActions.h"
#include "MovementActions.h"
#include "ANTriggers.h"
#include "AzjolNerubTriggers.h"
#include "Action.h"
float KrikthirMultiplier::GetValue(Action* action)

View File

@ -1,5 +1,5 @@
#include "ANStrategy.h"
#include "ANMultipliers.h"
#include "AzjolNerubStrategy.h"
#include "AzjolNerubMultipliers.h"
void WotlkDungeonANStrategy::InitTriggers(std::vector<TriggerNode*> &triggers)
{

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "ANTriggers.h"
#include "AzjolNerubTriggers.h"
#include "AiObject.h"
#include "AiObjectContext.h"

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "CoSActions.h"
#include "CullingOfStratholmeActions.h"
bool ExplodeGhoulSpreadAction::Execute(Event /*event*/)
{

View File

@ -6,7 +6,7 @@
#include "GenericSpellActions.h"
#include "PlayerbotAI.h"
#include "Playerbots.h"
#include "CoSTriggers.h"
#include "CullingOfStratholmeTriggers.h"
class ExplodeGhoulSpreadAction : public MovementAction
{

View File

@ -3,7 +3,7 @@
#include "Action.h"
#include "NamedObjectContext.h"
#include "CoSActions.h"
#include "CullingOfStratholmeActions.h"
class WotlkDungeonCoSActionContext : public NamedObjectContext<Action>
{

View File

@ -3,7 +3,7 @@
#include "NamedObjectContext.h"
#include "AiObjectContext.h"
#include "CoSTriggers.h"
#include "CullingOfStratholmeTriggers.h"
class WotlkDungeonCoSTriggerContext : public NamedObjectContext<Trigger>
{

View File

@ -1,9 +1,9 @@
#include "CoSMultipliers.h"
#include "CoSActions.h"
#include "CullingOfStratholmeMultipliers.h"
#include "CullingOfStratholmeActions.h"
#include "GenericSpellActions.h"
#include "ChooseTargetActions.h"
#include "MovementActions.h"
#include "CoSTriggers.h"
#include "CullingOfStratholmeTriggers.h"
#include "Action.h"
float EpochMultiplier::GetValue(Action* action)

View File

@ -1,5 +1,5 @@
#include "CoSStrategy.h"
#include "CoSMultipliers.h"
#include "CullingOfStratholmeStrategy.h"
#include "CullingOfStratholmeMultipliers.h"
void WotlkDungeonCoSStrategy::InitTriggers(std::vector<TriggerNode*> &triggers)
{

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "CoSTriggers.h"
#include "CullingOfStratholmeTriggers.h"
#include "AiObject.h"
#include "AiObjectContext.h"

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "DTKActions.h"
#include "DrakTharonKeepActions.h"
bool CorpseExplodeSpreadAction::Execute(Event /*event*/)
{

View File

@ -6,7 +6,7 @@
#include "GenericSpellActions.h"
#include "PlayerbotAI.h"
#include "Playerbots.h"
#include "DTKTriggers.h"
#include "DrakTharonKeepTriggers.h"
const Position NOVOS_PARTY_POSITION = Position(-378.852f, -760.349f, 28.587f);

View File

@ -3,7 +3,7 @@
#include "Action.h"
#include "NamedObjectContext.h"
#include "DTKActions.h"
#include "DrakTharonKeepActions.h"
class WotlkDungeonDTKActionContext : public NamedObjectContext<Action>
{

View File

@ -3,7 +3,7 @@
#include "NamedObjectContext.h"
#include "AiObjectContext.h"
#include "DTKTriggers.h"
#include "DrakTharonKeepTriggers.h"
class WotlkDungeonDTKTriggerContext : public NamedObjectContext<Trigger>
{

View File

@ -1,9 +1,9 @@
#include "DTKMultipliers.h"
#include "DTKActions.h"
#include "DrakTharonKeepMultipliers.h"
#include "DrakTharonKeepActions.h"
#include "GenericSpellActions.h"
#include "ChooseTargetActions.h"
#include "MovementActions.h"
#include "DTKTriggers.h"
#include "DrakTharonKeepTriggers.h"
#include "Action.h"
float NovosMultiplier::GetValue(Action* action)

View File

@ -1,5 +1,5 @@
#include "DTKStrategy.h"
#include "DTKMultipliers.h"
#include "DrakTharonKeepStrategy.h"
#include "DrakTharonKeepMultipliers.h"
void WotlkDungeonDTKStrategy::InitTriggers(std::vector<TriggerNode*> &triggers)
{

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "DTKTriggers.h"
#include "DrakTharonKeepTriggers.h"
#include "AiObject.h"
#include "AiObjectContext.h"

View File

@ -2,22 +2,22 @@
#define _PLAYERBOT_DUNGEONSTRATEGYCONTEXT_H
#include "Strategy.h"
#include "ACStrategy.h"
#include "UKStrategy.h"
#include "NexStrategy.h"
#include "ANStrategy.h"
#include "AKStrategy.h"
#include "DTKStrategy.h"
#include "VHStrategy.h"
#include "GDStrategy.h"
#include "HoSStrategy.h"
#include "HoLStrategy.h"
#include "OCStrategy.h"
#include "UPStrategy.h"
#include "CoSStrategy.h"
#include "FoSStrategy.h"
#include "PoSStrategy.h"
#include "TOCStrategy.h"
#include "AuchenaiCrypts/Strategy/AuchenaiCryptsStrategy.h"
#include "UtgardeKeep/Strategy/UtgardeKeepStrategy.h"
#include "Nexus/Strategy/NexusStrategy.h"
#include "AzjolNerub/Strategy/AzjolNerubStrategy.h"
#include "OldKingdom/Strategy/OldKingdomStrategy.h"
#include "DraktharonKeep/Strategy/DrakTharonKeepStrategy.h"
#include "VioletHold/Strategy/VioletHoldStrategy.h"
#include "Gundrak/Strategy/GundrakStrategy.h"
#include "HallsOfStone/Strategy/HallsOfStoneStrategy.h"
#include "HallsOfLightning/Strategy/HallsOfLightningStrategy.h"
#include "Oculus/Strategy/OculusStrategy.h"
#include "UtgardePinnacle/Strategy/UtgardePinnacleStrategy.h"
#include "CullingOfStratholme/Strategy/CullingOfStratholmeStrategy.h"
#include "ForgeOfSouls/Strategy/ForgeOfSoulsStrategy.h"
#include "PitOfSaron/Strategy/PitOfSaronStrategy.h"
#include "TrialOfTheChampion/Strategy/TrialOfTheChampionStrategy.h"
/*
Full list/TODO:

View File

@ -1,5 +1,5 @@
#include "Playerbots.h"
#include "FoSActions.h"
#include "ForgeOfSoulsActions.h"
bool MoveFromBronjahmAction::Execute(Event /*event*/)
{

View File

@ -5,7 +5,7 @@
#include "AttackAction.h"
#include "PlayerbotAI.h"
#include "Playerbots.h"
#include "FoSTriggers.h"
#include "ForgeOfSoulsTriggers.h"
const Position BRONJAHM_TANK_POSITION = Position(5297.920f, 2506.698f, 686.068f);

View File

@ -3,7 +3,7 @@
#include "Action.h"
#include "NamedObjectContext.h"
#include "FoSActions.h"
#include "ForgeOfSoulsActions.h"
class WotlkDungeonFoSActionContext : public NamedObjectContext<Action>
{

View File

@ -3,7 +3,7 @@
#include "NamedObjectContext.h"
#include "AiObjectContext.h"
#include "FoSTriggers.h"
#include "ForgeOfSoulsTriggers.h"
class WotlkDungeonFoSTriggerContext : public NamedObjectContext<Trigger>
{

View File

@ -1,10 +1,10 @@
#include "FoSMultipliers.h"
#include "FoSActions.h"
#include "ForgeOfSoulsMultipliers.h"
#include "ForgeOfSoulsActions.h"
#include "GenericSpellActions.h"
#include "ChooseTargetActions.h"
#include "MovementActions.h"
#include "FoSTriggers.h"
#include "FoSActions.h"
#include "ForgeOfSoulsTriggers.h"
#include "ForgeOfSoulsActions.h"
float BronjahmMultiplier::GetValue(Action* action) {
Unit* boss = AI_VALUE2(Unit *, "find target", "bronjahm");

View File

@ -1,5 +1,5 @@
#include "FoSStrategy.h"
#include "FoSMultipliers.h"
#include "ForgeOfSoulsStrategy.h"
#include "ForgeOfSoulsMultipliers.h"
void WotlkDungeonFoSStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{

Some files were not shown because too many files have changed in this diff Show More