570 lines
29 KiB
Markdown
570 lines
29 KiB
Markdown
# Development Tools
|
||
|
||
<cite>
|
||
**Referenced Files in This Document**
|
||
- [ObjectInspectorWindow.axaml](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml)
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [HexDumpControl.axaml](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [DebugWindow.axaml](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [GIFRecorderWindow.axaml](file://ClassicAssist/Views/GIFRecorderWindow.xaml)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [GIFRecorderViewModel.cs](file://ClassicAssist/ViewModels/GIFRecorderViewModel.cs)
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
</cite>
|
||
|
||
## 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 the development and debugging tools available in ClassicAssist.Avalonia with a focus on:
|
||
- Object Inspector for real-time entity inspection, property viewing, and memory analysis
|
||
- Packet Logger for network traffic analysis, replay system functionality, and custom filter creation
|
||
- GIF Recorder for gameplay recording, animation export, and quality settings configuration
|
||
- Debug Window for console output, log viewing, and diagnostic information
|
||
- Hex Dump utilities for binary data inspection and protocol analysis
|
||
- Integration with external debugging tools and profiling utilities
|
||
- Performance monitoring and memory leak detection techniques
|
||
- Practical guidance for using these tools during development and troubleshooting
|
||
|
||
## Project Structure
|
||
The development and debugging features are implemented across shared UI models and view models, Avalonia-specific views and controls, and core networking components. The following diagram shows how key pieces fit together at a high level.
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "Avalonia UI"
|
||
OIWin["ObjectInspectorWindow"]
|
||
DW["DebugWindow"]
|
||
HD["HexDumpControl"]
|
||
GRWin["GIFRecorderWindow"]
|
||
end
|
||
subgraph "Shared UI Layer"
|
||
OIVM["ObjectInspectorViewModel"]
|
||
DVM["DebugViewModel"]
|
||
PE["PacketEntry"]
|
||
ECV["EntityCollectionViewerViewModel"]
|
||
AOV["ActiveObjectsViewModel"]
|
||
end
|
||
subgraph "Networking Core"
|
||
IPF["IncomingPacketFilters"]
|
||
OPF["OutgoingPacketFilters"]
|
||
IPH["IncomingPacketHandlers"]
|
||
OPH["OutgoingPacketHandlers"]
|
||
PF["PacketFilter"]
|
||
PFC["PacketFilterCondition"]
|
||
PFCs["PacketFilterConditions"]
|
||
PFI["PacketFilterInfo"]
|
||
PWE["PacketWaitEntries"]
|
||
PWEt["PacketWaitEntry"]
|
||
end
|
||
subgraph "Tests"
|
||
RPL["ReplayPacketLog"]
|
||
end
|
||
OIWin --> OIVM
|
||
DW --> DVM
|
||
HD --> PE
|
||
GRWin --> |"Hotkey Command"| GRWin
|
||
OIVM --> ECV
|
||
OIVM --> AOV
|
||
PE --> IPF
|
||
PE --> OPF
|
||
IPF --> PF
|
||
OPF --> PF
|
||
PF --> PFC
|
||
PF --> PFCs
|
||
PF --> PFI
|
||
PF --> PWE
|
||
PWE --> PWEt
|
||
RPL --> IPH
|
||
RPL --> OPH
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [ObjectInspectorWindow.axaml](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml)
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [DebugWindow.axaml](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [HexDumpControl.axaml](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [GIFRecorderWindow.axaml](file://ClassicAssist/Views/GIFRecorderWindow.xaml)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
|
||
**Section sources**
|
||
- [ObjectInspectorWindow.axaml](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml)
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [DebugWindow.axaml](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [HexDumpControl.axaml](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [GIFRecorderWindow.axaml](file://ClassicAssist/Views/GIFRecorderWindow.xaml)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
|
||
## Core Components
|
||
- Object Inspector: Provides live inspection of entities and their properties, supports filtering and sorting, and exposes data suitable for memory analysis workflows.
|
||
- Packet Logger: Captures incoming and outgoing packets, integrates with filters and wait entries, and supports replay via test harnesses.
|
||
- GIF Recorder: Records gameplay to GIF files, exposes quality and export options, and is accessible via hotkeys.
|
||
- Debug Window: Displays console output, logs, and diagnostics for rapid iteration and troubleshooting.
|
||
- Hex Dump Control: Renders raw bytes in hex and ASCII for protocol analysis and binary inspection.
|
||
|
||
**Section sources**
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [GIFRecorderViewModel.cs](file://ClassicAssist/ViewModels/GIFRecorderViewModel.cs)
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
|
||
## Architecture Overview
|
||
The development tools follow a layered architecture:
|
||
- UI layer (Avalonia): Windows and controls render state from ViewModels and shared models.
|
||
- Shared UI layer: ViewModels and models provide cross-platform UI logic and data structures.
|
||
- Networking core: Packet handlers and filters manage capture, processing, and replay.
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as "Developer"
|
||
participant OIWin as "ObjectInspectorWindow"
|
||
participant OIVM as "ObjectInspectorViewModel"
|
||
participant ECV as "EntityCollectionViewerViewModel"
|
||
participant AOV as "ActiveObjectsViewModel"
|
||
User->>OIWin : Open Object Inspector
|
||
OIWin->>OIVM : Initialize ViewModel
|
||
OIVM->>ECV : Load entity collections
|
||
OIVM->>AOV : Load active objects
|
||
OIVM-->>OIWin : Bind properties and lists
|
||
User->>OIVM : Select entity / change filter
|
||
OIVM-->>User : Updated object details and properties
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
|
||
## Detailed Component Analysis
|
||
|
||
### Object Inspector
|
||
Purpose:
|
||
- Real-time inspection of game entities and their properties
|
||
- Filtering and sorting for large datasets
|
||
- Data exposure for memory analysis workflows
|
||
|
||
Key elements:
|
||
- View: ObjectInspectorWindow (Avalonia XAML and code-behind)
|
||
- ViewModel: ObjectInspectorViewModel (shared)
|
||
- Model: ObjectInspectorData (shared)
|
||
- Supporting ViewModels: EntityCollectionViewerViewModel, ActiveObjectsViewModel
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class ObjectInspectorWindow {
|
||
+InitializeComponent()
|
||
+OnLoaded()
|
||
}
|
||
class ObjectInspectorViewModel {
|
||
+SelectedEntity
|
||
+Properties
|
||
+FilterText
|
||
+SortMode
|
||
+Refresh()
|
||
+ApplyFilter()
|
||
}
|
||
class ObjectInspectorData {
|
||
+Name
|
||
+Type
|
||
+Properties
|
||
}
|
||
class EntityCollectionViewerViewModel {
|
||
+Entities
|
||
+Filter
|
||
+SortStyle
|
||
}
|
||
class ActiveObjectsViewModel {
|
||
+ActiveList
|
||
+SelectItem()
|
||
}
|
||
ObjectInspectorWindow --> ObjectInspectorViewModel : "binds to"
|
||
ObjectInspectorViewModel --> ObjectInspectorData : "produces"
|
||
ObjectInspectorViewModel --> EntityCollectionViewerViewModel : "uses"
|
||
ObjectInspectorViewModel --> ActiveObjectsViewModel : "uses"
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [ObjectInspectorWindow.axaml](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml)
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
|
||
Usage tips:
|
||
- Use filters to narrow down entities by name or type
|
||
- Sort by common attributes to locate recently updated objects
|
||
- Inspect nested properties to understand state changes over time
|
||
|
||
**Section sources**
|
||
- [ObjectInspectorWindow.axaml](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml)
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [ObjectInspectorData.cs](file://ClassicAssist.Shared/UI/Models/ObjectInspectorData.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
|
||
### Packet Logger and Replay System
|
||
Purpose:
|
||
- Capture and analyze incoming/outgoing network traffic
|
||
- Apply custom filters to isolate relevant packets
|
||
- Replay captured sessions for testing and debugging
|
||
|
||
Key elements:
|
||
- UI model: PacketEntry (shared)
|
||
- Filters: IncomingPacketFilters, OutgoingPacketFilters
|
||
- Filter engine: PacketFilter, PacketFilterCondition, PacketFilterConditions, PacketFilterInfo
|
||
- Wait entries: PacketWaitEntries, PacketWaitEntry
|
||
- Handlers: IncomingPacketHandlers, OutgoingPacketHandlers
|
||
- Replay: ReplayPacketLog (tests)
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start(["Packet Arrives"]) --> Classify["Classify Direction<br/>Incoming/Outgoing"]
|
||
Classify --> ApplyFilters{"Apply Filters?"}
|
||
ApplyFilters --> |No| Drop["Drop Packet"]
|
||
ApplyFilters --> |Yes| Log["Create PacketEntry"]
|
||
Log --> UpdateUI["Update UI Models"]
|
||
UpdateUI --> WaitCheck{"Any Wait Entries?"}
|
||
WaitCheck --> |Yes| ResolveWait["Resolve PacketWaitEntry"]
|
||
WaitCheck --> |No| End(["End"])
|
||
ResolveWait --> End
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
|
||
Custom filter creation:
|
||
- Implement conditions using the filter condition types
|
||
- Register filters through the incoming/outgoing filter managers
|
||
- Use PacketFilterInfo to describe metadata and enable/disable filters at runtime
|
||
|
||
Replay workflow:
|
||
- ReplayPacketLog drives packet handlers to re-execute recorded sessions
|
||
- Useful for reproducing issues deterministically
|
||
|
||
**Section sources**
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
|
||
### GIF Recorder
|
||
Purpose:
|
||
- Record gameplay to GIF files
|
||
- Configure quality and export settings
|
||
- Accessible via hotkeys for quick capture
|
||
|
||
Key elements:
|
||
- View: GIFRecorderWindow (XAML and code-behind)
|
||
- ViewModel: GIFRecorderViewModel
|
||
- Hotkey command: ShowGIFCaptureWindow
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Dev as "Developer"
|
||
participant HK as "ShowGIFCaptureWindow"
|
||
participant Win as "GIFRecorderWindow"
|
||
participant VM as "GIFRecorderViewModel"
|
||
Dev->>HK : Trigger hotkey
|
||
HK->>Win : Open recorder window
|
||
Win->>VM : Initialize recording settings
|
||
Dev->>VM : Start/Stop recording
|
||
VM-->>Dev : Export GIF with configured quality
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [GIFRecorderWindow.xaml](file://ClassicAssist/Views/GIFRecorderWindow.xaml)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [GIFRecorderViewModel.cs](file://ClassicAssist/ViewModels/GIFRecorderViewModel.cs)
|
||
|
||
Quality and export guidance:
|
||
- Adjust frame rate and compression to balance file size vs. smoothness
|
||
- Prefer lower resolutions for long recordings
|
||
- Use targeted captures around specific events to reduce overhead
|
||
|
||
**Section sources**
|
||
- [ShowGIFCaptureWindow.cs](file://ClassicAssist/Data/Hotkeys/Commands/ShowGIFCaptureWindow.cs)
|
||
- [GIFRecorderWindow.xaml](file://ClassicAssist/Views/GIFRecorderWindow.xaml)
|
||
- [GIFRecorderWindow.xaml.cs](file://ClassicAssist/Views/GIFRecorderWindow.xaml.cs)
|
||
- [GIFRecorderViewModel.cs](file://ClassicAssist/ViewModels/GIFRecorderViewModel.cs)
|
||
|
||
### Debug Window
|
||
Purpose:
|
||
- Display console output and logs
|
||
- Provide diagnostic information for rapid troubleshooting
|
||
|
||
Key elements:
|
||
- View: DebugWindow (Avalonia XAML and code-behind)
|
||
- ViewModel: DebugViewModel (shared)
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class DebugWindow {
|
||
+InitializeComponent()
|
||
+OnLoaded()
|
||
}
|
||
class DebugViewModel {
|
||
+Logs
|
||
+ConsoleOutput
|
||
+ClearLogs()
|
||
+AppendLog(message)
|
||
}
|
||
DebugWindow --> DebugViewModel : "binds to"
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [DebugWindow.axaml](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
|
||
Best practices:
|
||
- Use structured log messages with severity levels
|
||
- Clear logs periodically to avoid UI lag
|
||
- Correlate timestamps with packet logs and GIF captures
|
||
|
||
**Section sources**
|
||
- [DebugWindow.axaml](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
|
||
### Hex Dump Utilities
|
||
Purpose:
|
||
- Inspect raw binary data
|
||
- Analyze protocol payloads and packet contents
|
||
|
||
Key elements:
|
||
- Control: HexDumpControl (Avalonia XAML and code-behind)
|
||
- Data model: PacketEntry (shared)
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class HexDumpControl {
|
||
+Render(bytes)
|
||
+SetHighlight(range)
|
||
}
|
||
class PacketEntry {
|
||
+RawBytes
|
||
+Direction
|
||
+Timestamp
|
||
}
|
||
HexDumpControl --> PacketEntry : "displays"
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [HexDumpControl.axaml](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
|
||
Tips:
|
||
- Highlight known header fields to speed up protocol analysis
|
||
- Combine with packet filters to focus on specific opcodes or ranges
|
||
|
||
**Section sources**
|
||
- [HexDumpControl.axaml](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
|
||
## Dependency Analysis
|
||
The following diagram maps dependencies between UI components, shared models, and networking core.
|
||
|
||
```mermaid
|
||
graph LR
|
||
OIWin["ObjectInspectorWindow"] --> OIVM["ObjectInspectorViewModel"]
|
||
OIVM --> ECV["EntityCollectionViewerViewModel"]
|
||
OIVM --> AOV["ActiveObjectsViewModel"]
|
||
DW["DebugWindow"] --> DVM["DebugViewModel"]
|
||
HD["HexDumpControl"] --> PE["PacketEntry"]
|
||
IPF["IncomingPacketFilters"] --> PF["PacketFilter"]
|
||
OPF["OutgoingPacketFilters"] --> PF
|
||
PF --> PFC["PacketFilterCondition"]
|
||
PF --> PFCs["PacketFilterConditions"]
|
||
PF --> PFI["PacketFilterInfo"]
|
||
PF --> PWE["PacketWaitEntries"]
|
||
PWE --> PWEt["PacketWaitEntry"]
|
||
RPL["ReplayPacketLog"] --> IPH["IncomingPacketHandlers"]
|
||
RPL --> OPH["OutgoingPacketHandlers"]
|
||
```
|
||
|
||
**Diagram sources**
|
||
- [ObjectInspectorWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/ObjectInspectorWindow.axaml.cs)
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [EntityCollectionViewerViewModel.cs](file://ClassicAssist/ViewModels/EntityCollectionViewerViewModel.cs)
|
||
- [ActiveObjectsViewModel.cs](file://ClassicAssist/ViewModels/ActiveObjectsViewModel.cs)
|
||
- [DebugWindow.axaml.cs](file://ClassicAssist.Avalonia/Views/DebugWindow.axaml.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
|
||
**Section sources**
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [PacketEntry.cs](file://ClassicAssist.Shared/UI/Misc/PacketEntry.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [PacketFilter.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilter.cs)
|
||
- [PacketFilterCondition.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterCondition.cs)
|
||
- [PacketFilterConditions.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterConditions.cs)
|
||
- [PacketFilterInfo.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketFilterInfo.cs)
|
||
- [PacketWaitEntries.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntries.cs)
|
||
- [PacketWaitEntry.cs](file://ClassicAssist.Shared/UO/Network/PacketFilter/PacketWaitEntry.cs)
|
||
- [ReplayPacketLog.cs](file://ClassicAssist.Tests/ReplayPacketLog.cs)
|
||
- [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs)
|
||
- [OutgoingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketHandlers.cs)
|
||
|
||
## Performance Considerations
|
||
- Object Inspector:
|
||
- Use incremental refresh and virtualization-friendly bindings to keep UI responsive with large entity sets
|
||
- Debounce filter input to avoid excessive recomputation
|
||
- Packet Logger:
|
||
- Limit logged packets with precise filters; avoid logging every packet when not needed
|
||
- Batch UI updates to prevent frame drops during heavy traffic
|
||
- GIF Recorder:
|
||
- Lower frame rates and resolution for long recordings
|
||
- Avoid capturing while performing CPU-intensive tasks
|
||
- Debug Window:
|
||
- Periodically clear logs to prevent memory growth
|
||
- Use asynchronous append operations to avoid blocking UI thread
|
||
- Hex Dump:
|
||
- Render only visible portions of large buffers
|
||
- Avoid frequent full redraws; use diff-based updates where possible
|
||
|
||
[No sources needed since this section provides general guidance]
|
||
|
||
## Troubleshooting Guide
|
||
Common issues and remedies:
|
||
- Object Inspector appears unresponsive:
|
||
- Ensure filters are not overly broad; refine search criteria
|
||
- Check that collection ViewModels are updating on the correct dispatcher
|
||
- Packet Logger misses packets:
|
||
- Verify filters are enabled and conditions match expected opcodes
|
||
- Confirm handlers are registered and not dropping packets prematurely
|
||
- GIF Recorder produces low-quality output:
|
||
- Increase frame rate and adjust compression settings
|
||
- Reduce scene complexity during capture
|
||
- Debug Window slows down:
|
||
- Clear logs regularly and avoid appending extremely large messages
|
||
- Hex Dump flickers or lags:
|
||
- Limit buffer sizes shown and avoid constant full refreshes
|
||
|
||
**Section sources**
|
||
- [ObjectInspectorViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/ObjectInspectorViewModel.cs)
|
||
- [IncomingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketFilters.cs)
|
||
- [OutgoingPacketFilters.cs](file://ClassicAssist.Shared/UO/Network/OutgoingPacketFilters.cs)
|
||
- [GIFRecorderViewModel.cs](file://ClassicAssist/ViewModels/GIFRecorderViewModel.cs)
|
||
- [DebugViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/DebugViewModel.cs)
|
||
- [HexDumpControl.axaml.cs](file://ClassicAssist.Avalonia/Controls/HexDumpControl.axaml.cs)
|
||
|
||
## Conclusion
|
||
ClassicAssist.Avalonia’s development and debugging toolkit provides powerful capabilities for inspecting game state, analyzing network traffic, recording gameplay, and diagnosing issues quickly. By combining the Object Inspector, Packet Logger with custom filters and replay, GIF Recorder with tunable quality, Debug Window for logs, and Hex Dump for binary analysis, developers can efficiently troubleshoot and optimize their applications. Adopting the performance and troubleshooting recommendations will help maintain responsiveness and reliability during intensive development cycles. |