18 KiB
Mobile Commands
**Referenced Files in This Document** - [MobileCommands.cs](file://ClassicAssist.Shared/Data/Macros/Commands/MobileCommands.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [PlayerMobile.cs](file://ClassicAssist.Shared/UO/Objects/PlayerMobile.cs) - [MobileCollection.cs](file://ClassicAssist.Shared/UO/Objects/MobileCollection.cs) - [Entity.cs](file://ClassicAssist.Shared/UO/Objects/Entity.cs) - [EntityCollection.cs](file://ClassicAssist.Shared/UO/Objects/EntityCollection.cs) - [MacroInvoker.cs](file://ClassicAssist.Shared/Data/Macros/MacroInvoker.cs) - [MacroManager.cs](file://ClassicAssist.Shared/Data/Macros/MacroManager.cs)Table of Contents
- Introduction
- Project Structure
- Core Components
- Architecture Overview
- Detailed Component Analysis
- Dependency Analysis
- Performance Considerations
- Troubleshooting Guide
- Conclusion
- Appendices
Introduction
Mobile Commands in ClassicAssist provide a comprehensive macro scripting interface for character and NPC manipulation within Ultima Online games. These commands enable automated decision-making, status monitoring, health tracking, skill management, and equipment analysis through a rich set of methods designed for both simple interactions and complex party coordination scenarios.
The mobile command system serves as the bridge between macro scripts and the underlying game engine, offering high-level abstractions for common gaming tasks while maintaining performance optimization for large-scale mobile processing operations.
Project Structure
The mobile command functionality is organized across multiple layers within the ClassicAssist architecture:
graph TB
subgraph "Macro Layer"
MC[MobileCommands.cs]
MI[MacroInvoker.cs]
MM[MacroManager.cs]
end
subgraph "Object Model Layer"
M[Mobile.cs]
PM[PlayerMobile.cs]
EC[EntityCollection.cs]
MColl[MobileCollection.cs]
E[Entity.cs]
end
subgraph "Game Engine Layer"
UO[UO Objects]
Packets[Packets]
Network[Network]
end
MC --> MI
MI --> MM
MC --> M
M --> PM
M --> E
MC --> MColl
MColl --> EC
M --> UO
UO --> Packets
Packets --> Network
Diagram sources
Section sources
Core Components
Mobile Command Interface
The MobileCommands class provides the primary interface for macro scripts to interact with mobile entities (characters and NPCs). It offers methods for:
- Character Inspection: Accessing detailed information about player characters and NPCs
- Status Monitoring: Real-time tracking of health, mana, stamina, and other vital statistics
- Interaction Capabilities: Targeting, attacking, trading, and communication functions
- Equipment Analysis: Viewing and managing character inventory and equipped items
- Skill Management: Monitoring and controlling character skills and abilities
Mobile Object Model
The mobile object hierarchy provides a structured approach to representing game entities:
classDiagram
class Entity {
+int Serial
+string Name
+int Hue
+int Location
+bool Visible
+bool CanTarget
+GetProperties() Property[]
+ToString() string
}
class Mobile {
+int MaxHits
+int Hits
+int MaxMana
+int Mana
+int MaxStam
+int Stam
+int Body
+int Gender
+bool IsDead
+bool IsPlayer
+bool IsNPC
+bool IsFriend
+bool IsEnemy
+MoveTo(x, y, z) void
+Attack(target) void
+UseSkill(skillName) void
+CastSpell(spellName) void
}
class PlayerMobile {
+int Gold
+int BankGold
+int Kills
+int Deaths
+int KDRatio
+int SkillPoints
+int StatPoints
+PartyMember PartyInfo
+Guild GuildInfo
+bool IsGM
+bool IsCriminal
+bool IsWarMode
}
class MobileCollection {
+Mobile[] All
+Mobile[] Players
+Mobile[] NPCs
+Mobile[] Friends
+Mobile[] Enemies
+Filter(predicate) Mobile[]
+FindBySerial(serial) Mobile
+CountByType(type) int
}
Mobile --|> Entity
PlayerMobile --|> Mobile
MobileCollection --> Mobile : contains
Diagram sources
Key Method Categories
Character State Evaluation Methods
- Health and vitality assessment
- Status effect detection
- Combat state monitoring
- Position and movement tracking
Automated Decision Making
- Conditional logic based on mobile conditions
- Priority-based targeting systems
- Resource management decisions
- Emergency response protocols
Party Coordination Patterns
- Team member monitoring
- Coordinated attack strategies
- Support role automation
- Communication automation
Section sources
Architecture Overview
The mobile command system follows a layered architecture pattern that separates concerns between user interface, business logic, and data access:
sequenceDiagram
participant Macro as "Macro Script"
participant Commands as "MobileCommands"
participant Collection as "MobileCollection"
participant Mobile as "Mobile Object"
participant GameEngine as "Game Engine"
Macro->>Commands : GetMobiles(filter)
Commands->>Collection : FilterMobiles(criteria)
Collection->>GameEngine : QueryMobileData()
GameEngine-->>Collection : MobileData[]
Collection-->>Commands : Mobile[]
Commands-->>Macro : Mobile[]
Macro->>Commands : CheckHealth(mobile)
Commands->>Mobile : GetHitPoints()
Mobile->>GameEngine : ReadMobileStats()
GameEngine-->>Mobile : HitPointData
Mobile-->>Commands : HealthStatus
Commands-->>Macro : HealthResult
Macro->>Commands : AttackTarget(target)
Commands->>GameEngine : SendAttackPacket()
GameEngine-->>Commands : PacketSent
Commands-->>Macro : AttackConfirmed
Diagram sources
Detailed Component Analysis
MobileCommand Implementation Pattern
The MobileCommands class implements a fluent API pattern that allows for method chaining and readable macro code:
flowchart TD
Start([Macro Execution]) --> ParseInput["Parse Mobile Command"]
ParseInput --> ValidateParams["Validate Parameters"]
ValidateParams --> CheckCache{"Cache Available?"}
CheckCache --> |Yes| UseCache["Use Cached Data"]
CheckCache --> |No| QueryEngine["Query Game Engine"]
QueryEngine --> UpdateCache["Update Cache"]
UseCache --> ProcessLogic["Process Command Logic"]
UpdateCache --> ProcessLogic
ProcessLogic --> ExecuteAction["Execute Action"]
ExecuteAction --> ReturnResult["Return Result"]
ReturnResult --> End([Command Complete])
Diagram sources
Health Tracking System
The health tracking system provides real-time monitoring of mobile vitality:
stateDiagram-v2
[*] --> Healthy
Healthy --> LowHealth : "health < 50%"
LowHealth --> CriticalHealth : "health < 25%"
CriticalHealth --> Dead : "health = 0"
Dead --> Alive : "resurrection"
Alive --> Healthy : "healing"
Alive --> LowHealth : "damage taken"
LowHealth --> Healthy : "healing"
CriticalHealth --> LowHealth : "healing"
Diagram sources
Equipment Analysis Framework
The equipment analysis system enables comprehensive inventory and gear inspection:
| Category | Properties | Methods | Description |
|---|---|---|---|
| Basic Info | Serial, Name, Hue, Location | GetProperties(), ToString() | Fundamental entity identification |
| Vital Stats | Hits, Mana, Stam, Max values | GetVitality(), CalculatePercentages() | Health and resource monitoring |
| Combat Status | IsDead, IsInCombat, Notoriety | GetCombatState(), AssessThreatLevel() | Battle condition evaluation |
| Social Status | IsPlayer, IsNPC, IsFriend, IsEnemy | GetRelationship(), ClassifyTarget() | Social interaction classification |
| Movement | X, Y, Z, Direction, Speed | MoveTo(), FollowPath(), StopMovement() | Position and navigation control |
| Skills | ActiveSkills, SkillLevels, SkillGains | GetSkillInfo(), MonitorSkillProgress() | Ability and progression tracking |
| Equipment | EquippedItems, Inventory, Weight | AnalyzeGear(), CheckSuitability() | Gear and inventory management |
Section sources
Mobile Collection Filtering
The filtering system supports advanced query capabilities for large-scale mobile processing:
flowchart TD
Input[Mobile Collection] --> ApplyFilters["Apply Filter Criteria"]
ApplyFilters --> TypeFilter{"Type Filter?"}
TypeFilter --> |Players| PlayerFilter[Filter Players Only]
TypeFilter --> |NPCs| NPCFilter[Filter NPCs Only]
TypeFilter --> |All| NoTypeFilter[Include All Types]
PlayerFilter --> StatusFilter{"Status Filter?"}
NPCFilter --> StatusFilter
NoTypeFilter --> StatusFilter
StatusFilter --> HealthCheck{"Health Threshold?"}
StatusFilter --> CombatCheck{"Combat Status?"}
StatusFilter --> DistanceCheck{"Distance Range?"}
HealthCheck --> HealthFilter[Apply Health Filter]
CombatCheck --> CombatFilter[Apply Combat Filter]
DistanceCheck --> DistanceFilter[Apply Distance Filter]
HealthFilter --> CombineResults[Combine Results]
CombatFilter --> CombineResults
DistanceFilter --> CombineResults
NoTypeFilter --> CombineResults
CombineResults --> Output[Filtered Mobile List]
Diagram sources
Dependency Analysis
The mobile command system maintains clear separation of concerns with well-defined dependencies:
graph LR
subgraph "External Dependencies"
UOAPI[UO Game API]
NET[Network Layer]
CACHE[Memory Cache]
end
subgraph "Core Dependencies"
MACRO[Macro System]
UI[UI Framework]
CONFIG[Configuration]
end
subgraph "Mobile System"
MC[MobileCommands]
MO[Mobile Objects]
COL[Mobile Collections]
end
UOAPI --> MO
NET --> MO
CACHE --> MC
MACRO --> MC
UI --> MC
CONFIG --> MC
MC --> MO
MC --> COL
MO --> COL
Diagram sources
Coupling Analysis
- Low Coupling: MobileCommands has minimal direct dependencies on UI components
- High Cohesion: Related mobile operations are grouped logically within the Mobile class
- Interface Segregation: Clear separation between read-only inspection and action-oriented methods
- Dependency Injection: External services (network, cache) are injected rather than hardcoded
Section sources
Performance Considerations
Large-Scale Mobile Processing Optimization
For efficient handling of large numbers of mobile entities, the system implements several optimization strategies:
Caching Strategies
- Property Caching: Frequently accessed properties are cached with invalidation policies
- Collection Caching: Mobile collections are cached and updated incrementally
- Query Result Caching: Common filter queries are cached with time-based expiration
Memory Management
- Lazy Loading: Mobile properties are loaded on-demand rather than all at once
- Weak References: Non-critical mobile references use weak references to prevent memory leaks
- Batch Operations: Bulk updates are processed in batches to reduce GC pressure
Threading Considerations
- Background Processing: Heavy computations run on background threads
- Thread Safety: All public methods are thread-safe for concurrent macro execution
- Event-Driven Updates: Changes propagate via events rather than polling
Performance Best Practices
- Use Efficient Filters: Leverage built-in filtering methods instead of manual iteration
- Minimize Property Access: Cache frequently accessed properties in local variables
- Batch Operations: Group related mobile operations together when possible
- Avoid Unnecessary Queries: Use cached data when available before querying the game engine
- Implement Proper Cleanup: Dispose of large mobile collections when no longer needed
Troubleshooting Guide
Common Issues and Solutions
Mobile Not Found Errors
- Symptom: Commands fail with "mobile not found" exceptions
- Causes: Mobile despawned, out of range, or serial changed
- Solutions: Implement retry logic, add existence checks, handle deserialization errors
Performance Degradation
- Symptom: Macro execution becomes slow with many mobiles
- Causes: Inefficient filtering, excessive property access, memory leaks
- Solutions: Optimize filter criteria, implement caching, monitor memory usage
Thread Safety Issues
- Symptom: Intermittent crashes or corrupted data
- Causes: Concurrent access without proper synchronization
- Solutions: Use thread-safe methods, implement proper locking, avoid shared mutable state
Network Synchronization Problems
- Symptom: Stale mobile data or inconsistent states
- Causes: Network delays, packet loss, timing issues
- Solutions: Implement timeout handling, add validation checks, use event-driven updates
Debugging Techniques
Logging and Diagnostics
- Enable verbose logging for mobile operations
- Track mobile collection sizes and update frequencies
- Monitor memory usage patterns during long-running macros
- Log network packet timing and success rates
Testing Strategies
- Unit test individual mobile operations in isolation
- Integration test complete macro workflows
- Load test with simulated large mobile populations
- Stress test under various network conditions
Section sources
Conclusion
The Mobile Commands system in ClassicAssist provides a robust and flexible foundation for automating character and NPC interactions in Ultima Online. Through its well-designed architecture, comprehensive API surface, and performance optimizations, it enables both simple automation tasks and complex multi-character coordination scenarios.
Key strengths include:
- Comprehensive Coverage: Extensive method coverage for all aspects of mobile interaction
- Performance Focus: Optimized for large-scale operations and real-time responsiveness
- Extensible Design: Clean interfaces that support custom extensions and plugins
- Error Resilience: Robust error handling and recovery mechanisms
- Developer Friendly: Well-documented APIs with consistent patterns and conventions
Future enhancements could include additional AI-driven decision making, machine learning integration for adaptive behavior, and enhanced party coordination features for complex multiplayer scenarios.
Appendices
Quick Reference Examples
Basic Character Inspection
// Get current player information
var player = MobileCommands.GetPlayer();
var healthPercent = player.Hits / (double)player.MaxHits * 100;
// Find nearby enemies
var enemies = MobileCommands.GetMobiles().Where(m => m.IsEnemy && m.Distance < 10);
Automated Health Management
// Monitor health and auto-heal when low
if (player.Hits < player.MaxHits * 0.3)
{
MobileCommands.UseItem("Bandage");
MobileCommands.Wait(1000); // Wait for healing
}
Party Coordination Pattern
// Coordinate attacks with party members
var partyMembers = MobileCommands.GetMobiles().Where(m => m.IsFriend && m.IsPlayer);
foreach (var member in partyMembers)
{
if (member.InCombat && !member.IsAttacking)
{
MobileCommands.Target(member.Target);
MobileCommands.Attack();
}
}
API Method Signatures
Core Mobile Methods
GetMobiles()- Returns all visible mobile entitiesGetPlayer()- Returns the current player characterFindMobileBySerial(serial)- Locates a specific mobile by serial numberGetMobileByName(name)- Searches for mobiles by name
Status Monitoring Methods
GetHealthPercentage(mobile)- Calculates current health percentageIsInCombat(mobile)- Determines combat statusGetDistanceTo(mobile, target)- Calculates distance between entitiesGetNotoriety(mobile)- Returns relationship status
Interaction Methods
Target(mobile)- Sets target to specified mobileAttack(target)- Initiates attack on targetFollow(mobile)- Begins following a mobile entityUseSkill(skillName)- Activates a character skill
Section sources