# Targeting Commands **Referenced Files in This Document** - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) - [TargetCommandTests.cs](file://ClassicAssist.Tests/MacroCommands/TargetCommandTests.cs) ## Table of Contents 1. [Introduction](#introduction) 2. [Project Structure](#project-structure) 3. [Core Components](#core-components) 4. [Architecture Overview](#architecture-overview) 5. [Detailed Component Analysis](#detailed-component-analysis) 6. [Dependency Analysis](#dependency-analysis) 7. [Performance Considerations](#performance-considerations) 8. [Troubleshooting Guide](#troubleshooting-guide) 9. [Conclusion](#conclusion) ## Introduction This document explains how targeting commands work within the ClassicAssist.Avalonia macro system. It covers selection by type, distance, name, color, and entity properties; advanced scenarios such as conditional targeting, priority-based selection, and dynamic target switching; and operational concerns like validation, timeouts, fallback strategies, performance with large collections, and memory management. The goal is to help you build robust combat automation, resource gathering, and social interaction macros that are efficient and resilient. ## Project Structure The targeting subsystem spans shared data structures, hotkey command implementations, and macro command handlers: - Hotkey commands for acquiring targets (enemy/friend) - Macro-level targeting commands - Core targeting manager and queue - Entity collections and base types used for filtering and selection ```mermaid graph TB subgraph "Hotkey Commands" TAE["TargetAcquisitionEnemy.cs"] TAF["TargetAcquisitionFriend.cs"] TGT["Targeting.cs"] end subgraph "Macro Commands" MC["TargetCommands.cs"] end subgraph "Targeting Core" TM["TargetManager.cs"] TQ["TargetQueue.cs"] TE["Enums.cs"] TBD["TargetBodyData.cs"] end subgraph "Entities" EC["EntityCollection.cs"] MCOL["MobileCollection.cs"] MOB["Mobile.cs"] ENT["Entity.cs"] end TAE --> TM TAF --> TM TGT --> TM MC --> TM TM --> TQ TM --> EC TM --> MCOL MCOL --> MOB MOB --> ENT ``` **Diagram sources** - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) **Section sources** - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) ## Core Components - Targeting hotkey commands: Provide quick acquisition of enemies or friends via hotkeys. They typically query nearby mobiles and issue a targeted action. - Macro targeting commands: Expose higher-level commands usable from scripts/macros to select targets based on criteria and perform actions. - TargetManager: Central coordination for selecting, validating, queuing, and issuing targets. - TargetQueue: Manages ordered sequences of targets for batched or sequential operations. - Enums and body data: Define selectable categories, notoriety rules, and body-type mappings used during selection. - Entity collections: Provide filtered views over entities/mobs for efficient querying. Key responsibilities: - Filtering by type, distance, name, color, and properties - Priority and conditional selection - Validation and timeout handling - Queueing and execution of targeting actions **Section sources** - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) ## Architecture Overview The targeting architecture separates user-facing commands (hotkeys and macros) from core selection logic and execution. Selection uses entity collections and filters; execution uses the target manager and queue. ```mermaid sequenceDiagram participant User as "User/Macro" participant HK as "Hotkey Command" participant MC as "Macro Command" participant TM as "TargetManager" participant COL as "Entity/Mobile Collection" participant Q as "TargetQueue" participant Game as "Game Client" User->>HK : Trigger hotkey HK->>TM : Acquire target (criteria) TM->>COL : Filter by type/distance/name/color/properties COL-->>TM : Candidate set TM->>TM : Apply priority/conditions TM->>Q : Enqueue selected target(s) Q->>Game : Issue target action(s) Game-->>TM : Acknowledge/Status TM-->>HK : Result User->>MC : Call macro targeting command MC->>TM : Select target(s) with advanced criteria TM->>COL : Filter + sort + validate TM->>Q : Enqueue or execute immediately Q->>Game : Send target packets Game-->>TM : Responses TM-->>MC : Outcome and metadata ``` **Diagram sources** - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) ## Detailed Component Analysis ### Hotkey Target Acquisition (Enemy/Friend) These commands provide fast, context-aware targeting for common gameplay loops. They typically: - Determine player position and range - Query nearby mobiles - Filter by notoriety or friend lists - Issue a targeted attack or assist action ```mermaid flowchart TD Start(["Hotkey Trigger"]) --> GetPlayer["Get Player Position"] GetPlayer --> QueryNearby["Query Nearby Mobiles"] QueryNearby --> FilterNotoriety{"Filter by Notoriety/Friends?"} FilterNotoriety --> |Yes| ApplyRules["Apply Rules"] FilterNotoriety --> |No| SkipRules["Skip Rules"] ApplyRules --> BestCandidate["Select Best Candidate"] SkipRules --> BestCandidate BestCandidate --> IssueAction["Issue Target Action"] IssueAction --> End(["Done"]) ``` **Diagram sources** - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) **Section sources** - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) ### Macro Targeting Commands Macro commands expose richer selection capabilities suitable for automation: - Type-based selection (e.g., specific bodies or categories) - Distance-based selection (nearest, farthest, within radius) - Name-based selection (exact/partial match) - Color/hue-based selection - Property-based selection (flags, stats, custom properties) - Conditional targeting (if/else branches based on environment/state) - Priority-based selection (rank candidates by multiple criteria) - Dynamic target switching (rotate among valid targets) ```mermaid classDiagram class TargetManager { +SelectByType(criteria) +SelectByDistance(radius, order) +SelectByName(pattern) +SelectByColor(hue) +SelectByProperties(filter) +Validate(target) +Enqueue(targets) +ExecuteNext() } class TargetQueue { +Add(target) +Remove(target) +Peek() +Dequeue() +Count } class EntityCollection { +FilteredView(filters) +OrderBy(comparer) +FirstOrDefault(predicate) } class MobileCollection { +Nearby(playerPos, radius) +ByNotoriety(rules) +ByFriends(list) } TargetManager --> TargetQueue : "uses" TargetManager --> EntityCollection : "queries" TargetManager --> MobileCollection : "queries" ``` **Diagram sources** - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) **Section sources** - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) ### Target Body Data and Enums Selection often relies on predefined body categories and enums: - Body-to-category mapping for creature/item classification - Notoriety and faction enums for friend/enemy logic - Flags and attributes used in property-based filtering ```mermaid classDiagram class TargetBodyData { +Map(bodyId) Category +IsCreature(bodyId) bool +IsItem(bodyId) bool } class Enums { <> Notoriety TargetCategory SelectionOrder } TargetBodyData --> Enums : "uses" ``` **Diagram sources** - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) **Section sources** - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) ### Advanced Targeting Scenarios #### Conditional Targeting Use conditions to choose between different target sets depending on state: - If low health, prioritize friendly healers - If no valid enemy, switch to nearest resource node - If line-of-sight fails, fall back to ranged option ```mermaid flowchart TD Start(["Start"]) --> CheckState["Evaluate Conditions"] CheckState --> ConditionA{"Condition A true?"} ConditionA --> |Yes| SetA["Set Criteria A"] ConditionA --> |No| ConditionB{"Condition B true?"} ConditionB --> |Yes| SetB["Set Criteria B"] ConditionB --> |No| Fallback["Fallback Criteria"] SetA --> Select["Select Targets"] SetB --> Select Fallback --> Select Select --> Validate["Validate & Sort"] Validate --> Execute["Execute/Queue"] Execute --> End(["End"]) ``` [No sources needed since this diagram shows conceptual workflow, not actual code structure] #### Priority-Based Selection Rank candidates using multiple criteria: - Primary: proximity - Secondary: notoriety - Tertiary: resource availability or item quality ```mermaid flowchart TD Start(["Candidates"]) --> Rank1["Sort by Proximity"] Rank1 --> Rank2["Stable Sort by Notoriety"] Rank2 --> Rank3["Stable Sort by Quality/Availability"] Rank3 --> PickTop["Pick Top Ranked"] PickTop --> Validate["Validate Target"] Validate --> Execute["Execute/Queue"] Execute --> End(["End"]) ``` [No sources needed since this diagram shows conceptual workflow, not actual code structure] #### Dynamic Target Switching Rotate among valid targets to distribute workload or avoid stale locks: - Maintain a list of eligible targets - On each cycle, pick next candidate - Re-validate before acting - Reset rotation when invalid ```mermaid sequenceDiagram participant Loop as "Automation Loop" participant TM as "TargetManager" participant Q as "TargetQueue" participant Game as "Game Client" Loop->>TM : Get Next Candidate TM->>TM : Rotate Index TM->>TM : Validate Candidate alt Valid TM->>Q : Enqueue Candidate Q->>Game : Issue Action Game-->>TM : Status else Invalid TM->>TM : Remove From Rotation TM->>Loop : Retry Next end ``` [No sources needed since this diagram shows conceptual workflow, not actual code structure] ### Examples #### Combat Automation - Enemy acquisition by notoriety and distance - Conditional switching if primary target dies or becomes invalid - Fallback to nearest hostile if none found #### Resource Gathering - Select by type (resource nodes), color (ore/gems), and distance - Prioritize highest yield or closest node - Fallback to inventory check and vendor if none available #### Social Interactions - Friend selection by friend list and proximity - Conditional targeting based on chat presence or party status - Fallback to last known friend if current unavailable [No sources needed since these examples illustrate usage patterns without analyzing specific files] ### Target Validation, Timeouts, and Fallbacks - Validation checks include existence, visibility, range, and game-state constraints - Timeout handling prevents macros from hanging indefinitely when targets disappear - Fallback strategies ensure continuity: alternate targets, change criteria, or abort gracefully ```mermaid flowchart TD Start(["Select Target"]) --> Validate["Validate Target"] Validate --> Valid{"Valid?"} Valid --> |Yes| Proceed["Proceed to Action"] Valid --> |No| TimeoutCheck{"Timeout Reached?"} TimeoutCheck --> |Yes| Fallback["Apply Fallback Strategy"] TimeoutCheck --> |No| Retry["Retry With Adjusted Criteria"] Retry --> Validate Fallback --> End(["Exit or Continue"]) Proceed --> End ``` [No sources needed since this diagram shows conceptual workflow, not actual code structure] **Section sources** - [TargetCommandTests.cs](file://ClassicAssist.Tests/MacroCommands/TargetCommandTests.cs) ## Dependency Analysis The following diagram highlights key dependencies among targeting components and entity collections. ```mermaid graph LR TAC["TargetAcquisitionEnemy.cs"] --> TM["TargetManager.cs"] TAF["TargetAcquisitionFriend.cs"] --> TM TGT["Targeting.cs"] --> TM MC["TargetCommands.cs"] --> TM TM --> TQ["TargetQueue.cs"] TM --> EC["EntityCollection.cs"] TM --> MCOL["MobileCollection.cs"] MCOL --> MOB["Mobile.cs"] MOB --> ENT["Entity.cs"] TM --> ENUMS["Enums.cs"] TM --> BODY["TargetBodyData.cs"] ``` **Diagram sources** - [TargetAcquisitionEnemy.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionEnemy.cs) - [TargetAcquisitionFriend.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/TargetAcquisitionFriend.cs) - [Targeting.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/Targeting.cs) - [TargetCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/TargetCommands.cs) - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) **Section sources** - [TargetManager.cs](file://ClassicAssist.Shared/Data/Targeting/TargetManager.cs) - [TargetQueue.cs](file://ClassicAssist.Shared/Data/Targeting/TargetQueue.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) - [Enums.cs](file://ClassicAssist.Shared/Data/Targeting/Enums.cs) - [TargetBodyData.cs](file://ClassicAssist.Shared/Data/Targeting/TargetBodyData.cs) ## Performance Considerations When working with large entity collections: - Prefer filtered views and early pruning (distance, notoriety, type) to reduce candidate sets - Use stable multi-criteria sorting to minimize re-scans - Avoid repeated allocations; reuse comparators and filter objects where possible - Batch enqueue operations instead of issuing individual actions per candidate - Implement timeouts and short-circuit evaluation to prevent long-running selections - Monitor memory pressure by limiting retained references to transient candidates Best practices: - Cache frequently used filters and comparators - Limit search radius for nearby queries - Defer expensive property checks until necessary - Use queues to decouple selection from execution [No sources needed since this section provides general guidance] ## Troubleshooting Guide Common issues and resolutions: - No targets found: Verify filters (type, color, name), distance radius, and notoriety settings - Stale targets: Ensure validation runs before each action and implement rotation/reset logic - Lag spikes: Reduce collection size via tighter filters; avoid heavy computations in hot paths - Inconsistent behavior: Add logging around selection steps and timeouts; confirm game state changes Diagnostic tips: - Inspect candidate counts after each filter stage - Log reasons for rejection (out of range, invalid notoriety, missing properties) - Confirm queue depth and execution timing **Section sources** - [TargetCommandTests.cs](file://ClassicAssist.Tests/MacroCommands/TargetCommandTests.cs) ## Conclusion The targeting subsystem combines flexible filtering, prioritization, and queue-driven execution to support robust automation across combat, gathering, and social interactions. By applying conditional logic, priority ranking, and strong validation with timeouts and fallbacks, macros can remain responsive and efficient even under heavy load. Adhering to performance best practices ensures smooth operation with large entity collections and minimizes memory overhead.