104 lines
6.1 KiB
Markdown
104 lines
6.1 KiB
Markdown
# AdventureBot interactions and player-led groups
|
||
|
||
Implemented 2026-10-28 on feature/clientless-player-core. No autonomous bot-to-bot
|
||
party formation, role assignment, healer/tank AI or proactive PvP aggression.
|
||
PlayerAI.cpp supplies spell/attack foundations and charmed-player follow logic;
|
||
it does not implement invitation decisions. AdventureBots keep independent
|
||
controllers and use the native party invitation response handler.
|
||
|
||
## Encounters
|
||
|
||
Directed native text emotes greet/hello/wave/bow/salute/smile/thank and
|
||
rude/threaten/roar generate GUID-only notices in ClientlessPlayerMgr. Map workers
|
||
never call AdventureBot policy directly. Queues are bounded and delivered on the
|
||
world thread. Participants must be alive, mutually visible, in the same map,
|
||
instance and phase, within 25 yards and in line of sight.
|
||
|
||
Replies wait 1–3 seconds, briefly interrupt the current activity, face the other
|
||
player and use native animation emotes. Friendly encounters wave/bow; hostility
|
||
or hostile emotes produce a negative gesture. There is no automatic attack just
|
||
because another player is hostile. Original intent deadlines are retained.
|
||
The global reply cooldown is 15 seconds, the same partner has 120 seconds.
|
||
Direct chat/free conversation parsing is not implemented.
|
||
|
||
Bots in social/leisure/rest can occasionally initiate a five-second encounter
|
||
with another available AdventureBot within 12 yards. The lower character GUID
|
||
initiates and reserves both participants. The peer must also have a compatible
|
||
intent. Sociability weights initiation. Pair cooldown is five minutes; native
|
||
animation replies never feed back into incoming text-emote events. Occasional
|
||
localized 'Safe travels' accompanies greetings. This is a short greeting, not a
|
||
multi-line conversation or synchronized shared activity.
|
||
|
||
Real positive damage by another player or their pet against the bot's active
|
||
combat target can queue a thank-you. Damage attribution is captured after damage
|
||
rejection/duel clamping and before lethal cleanup; no threat-only inference.
|
||
The thank-you is deferred until combat and the existing self-care finish, and
|
||
requires the helper still to be nearby and friendly. Dummy training is excluded.
|
||
|
||
## Invitations and group behavior
|
||
|
||
An actual native invitation is answered after 2–4 seconds in a safe state.
|
||
Acceptance probability clamps sociability plus an intent adjustment to [0,1]:
|
||
rest −0.50, profession/economy −0.25, adventure/instance +0.20, other +0.10.
|
||
Inviter must be alive and friendly. Bots do not accept invitations from other
|
||
clientless players yet; autonomous bot grouping is explicitly deferred.
|
||
Invitations are declined inside dungeons. Normal faction/group restrictions run
|
||
before the invitation reaches the bot; none are bypassed.
|
||
|
||
Membership suspends autonomous intent execution, clears its queued actions and
|
||
retains its deadline. Native membership survives server restart. Bots follow the
|
||
current leader with checked local MMAP paths, aiming about three yards behind
|
||
and stopping within five yards. Longer/cross-map routes use existing
|
||
travel_to_node actions toward a nearby TravelGraph node at the leader's location;
|
||
no new teleport shortcut is introduced. Coverage of the graph and native portal
|
||
rules determines whether these routes work. An active graph trip is allowed to
|
||
finish before local follow resumes. Transport/flight states are not interrupted.
|
||
Unreachable destinations are retried conservatively; an active leader does not
|
||
cause a timeout merely because the route is missing.
|
||
|
||
Nearby (40 yards) group members' actual combat targets or attackers can be
|
||
supported with the existing damage executor. Self-defense retains priority and
|
||
the first actual damager focus. Assist requires native attack permission, valid
|
||
visibility/phase, a verified path, at least 30% HP, and excludes world bosses and
|
||
creatures more than two levels above the bot. Other classes currently retain
|
||
basic autoattacks; class-specific support roles remain future work.
|
||
|
||
## Leaving
|
||
|
||
Never voluntarily leave while dead, fighting, in a dungeon/raid, on a transport,
|
||
or in flight. Pending conditions are reevaluated when safe:
|
||
|
||
- A changed scheduled intent/location permits leaving. Personality
|
||
`group_loyalty` is the chance of staying for that new block (default 0.25,
|
||
Arthoran 0.35). The choice is made once per observed change, not each tick.
|
||
A new date generates/loads the native daily plan even while grouped.
|
||
For manual intents, expiry of the original deadline also changes this token.
|
||
- The leader being explicitly AFK for ten minutes, or ten minutes of observed
|
||
inactivity, permits leaving. Position/orientation, selection, combat,
|
||
casting, native chat, text emotes, spell and item requests count as activity.
|
||
Sampling cannot detect every conceivable stationary action. Native AFK takes
|
||
precedence while set. A new leader starts a fresh observation window; returning
|
||
from AFK ends the explicit AFK window. Observation clocks restart after a
|
||
server restart, so a restart does not immediately evict a bot.
|
||
|
||
Before voluntarily leaving, a localized farewell is sent to the native party
|
||
chat. Native RemoveMember performs removal. Removal/disbanding by other players
|
||
also resumes autonomous scheduling at the current time, retaining deadlines.
|
||
|
||
## Diagnostics and verification
|
||
|
||
`clientless interaction 26` reports membership, leader, partner, intent,
|
||
schedule observation, idle/AFK seconds, sociability and loyalty. No state changes.
|
||
|
||
`tests/clientless/test_adventure_interactions.py` compiles and executes production
|
||
manager code with deterministic native-world adapters: invitation acceptance and
|
||
rejection, group following/path rejection, leader changes, 599/600-second
|
||
boundaries, activity, deferred exits, directed group emotes, hostile replies,
|
||
pair reservation, cooldowns, graph handoff and deferred thanks.
|
||
`test_adventure_combat_reactions.py` also covers player target permission and
|
||
player damage notices while preserving corpse recovery regression checks.
|
||
|
||
These tests do not replace live client acceptance. Multi-client player invites,
|
||
real PvP/pet defense, cross-map/instance group following, ten real minutes of AFK,
|
||
and two simultaneously online AdventureBots require separate gameplay checks.
|