mirror of
https://github.com/gwdevhub/Daybreak.git
synced 2026-07-21 01:59:49 +00:00
794afa6c2c
* Migrate to Fluent UI * Setup window events for Blazor WebView * Setup basic FluentUI styling * FluentUI links * Setup views and viewmodel infra * Remove old navigation logic * Prepare an example of iframe embed * Style window + navigation menu * Setup page based navigation * Add some UI error handling * Introduce UI resiliency to exceptions * Setup settings menu dropdown * Basic setup for options views * Setup reusable OptionBase * Setup options views * Basic styling * Setup scoped css files. Split App into components * Hook option updates to OptionProvider * Fix option dropdowns * Setup multiple themes * Make fonts scalable * Move ViewModels under Views * Launch view + styling * Setup FocusView base * Finish BuildListView implementation * Base for build views * Setup build routing * Implement single build editor * Implement skill description on hover * Scrape skill information from the wiki and cache it locally * Scrape and fix Guild Wars wiki info * Improve mouse hover performance by querying position only when needed * Skill snippet snaps to edges * Setup accounts and executables view * Launch configurations view * Fix build skill icons Attach skill types to skills Scrape upkeep from wiki * Fix skilltype overflow * Adjust navigation menu * Setup privilege elevation flow * Setup MSAL * Options synchronization view * Telemetry view * Version management and update view * Setup plugins view * Setup notifications panel * Base for logs view * Finish LogView * Setup metrics view * Setup UI logging interop * GuildWarsPartySearch view implementation * Setup gitlab mirror job * Eventviewer base * Remove gitlab mirror * Remove mirror pipeline * Fix metricsview crashes * Extract progress component * Setup trade chat views * Setup Download view * Extract progress styling * Setup guild wars copy view * Setup trade alerts * Fix team template view skill selection * Setup basic onboarding view * Overhaul asynchronous progress operations and remove redundant versioning code * Setup modsview base * Setup modsview with mod states * Setup mod installation process * Cleanup more ui migration Remove price history #1076 * Screen selector manage view * Upgrade to .net 10 Closes #1078 * gMod management view * Trader message notification * ReShade management * Update for toolbox * Setup focusview fetching * Setup CharacterComponent * Setup vanquishing component * Setup TitleInformationComponent * Closes #1082 Fix API project for Guild Wars Reforged * Small fixes + attempts to get new exe version * FileId fixes * Current Map and Player Resources widgets * Quest log widget * BuildComponent implementation * Closes #1075 Embed wwwroot into the executable * Cleanup * Fixes to slnx * Fix test project
102 lines
3.5 KiB
C#
102 lines
3.5 KiB
C#
using Daybreak.API.Interop;
|
|
using Daybreak.API.Interop.GuildWars;
|
|
using Daybreak.API.Models;
|
|
using System.Core.Extensions;
|
|
using System.Extensions.Core;
|
|
|
|
namespace Daybreak.API.Services.Interop;
|
|
|
|
public unsafe sealed class AgentContextService : IAddressHealthService
|
|
{
|
|
private const string AgentArrayMask = "xxxxxxx";
|
|
private const int AgentArrayOffset = -0x4;
|
|
private static readonly byte[] AgentArrayAddressPattern = [0x8b, 0x0c, 0x90, 0x85, 0xc9, 0x74, 0x19];
|
|
|
|
private const string PlayerAgentIdMask = "xx????xxxxxxx";
|
|
private const int PlayerAgentIdOffset = -0xE;
|
|
private static readonly byte[] PlayerAgentIdAddressPattern = [0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x8b, 0xec, 0x56, 0x57, 0x8b, 0x7d];
|
|
|
|
private readonly MemoryScanningService memoryScanningService;
|
|
private readonly GWAddressCache agentArrayAddress;
|
|
private readonly GWAddressCache playerAgentIdAddress;
|
|
private readonly ILogger<AgentContextService> logger;
|
|
|
|
public AgentContextService(
|
|
MemoryScanningService memoryScanningService,
|
|
ILogger<AgentContextService> logger)
|
|
{
|
|
this.logger = logger.ThrowIfNull();
|
|
this.memoryScanningService = memoryScanningService.ThrowIfNull();
|
|
this.agentArrayAddress = new GWAddressCache(this.GetAgentArrayAddress);
|
|
this.playerAgentIdAddress = new GWAddressCache(this.GetPreGameContextAddress);
|
|
}
|
|
|
|
public List<AddressState> GetAddressStates()
|
|
{
|
|
return [
|
|
new AddressState
|
|
{
|
|
Address = this.agentArrayAddress.GetAddress() ?? 0,
|
|
Name = nameof(this.agentArrayAddress),
|
|
},
|
|
new AddressState
|
|
{
|
|
Address = this.playerAgentIdAddress.GetAddress() ?? 0,
|
|
Name = nameof(this.playerAgentIdAddress),
|
|
},
|
|
];
|
|
}
|
|
|
|
public WrappedPointer<GuildWarsArray<WrappedPointer<AgentContext>>> GetAgentArray()
|
|
{
|
|
var agentArrayAddress = this.agentArrayAddress.GetAddress();
|
|
if (agentArrayAddress is null or 0x0)
|
|
{
|
|
this.logger.LogError("Failed to get agent array address");
|
|
return null;
|
|
}
|
|
|
|
return (GuildWarsArray<WrappedPointer<AgentContext>>*)agentArrayAddress;
|
|
}
|
|
|
|
public uint GetPlayerAgentId()
|
|
{
|
|
var playerAgentIdAddress = this.playerAgentIdAddress.GetAddress();
|
|
if (playerAgentIdAddress is null or 0x0)
|
|
{
|
|
this.logger.LogError("Failed to get player agent id address");
|
|
return 0;
|
|
}
|
|
|
|
return *(uint*)playerAgentIdAddress;
|
|
}
|
|
|
|
private nuint GetAgentArrayAddress()
|
|
{
|
|
var scopedLogger = this.logger.CreateScopedLogger();
|
|
var address = this.memoryScanningService.FindAndResolveAddress(AgentArrayAddressPattern, AgentArrayMask, AgentArrayOffset);
|
|
if (address is 0)
|
|
{
|
|
scopedLogger.LogError("Failed to find agent array address");
|
|
return 0U;
|
|
}
|
|
|
|
scopedLogger.LogInformation("Agent array address: 0x{address:X8}", address);
|
|
return address;
|
|
}
|
|
|
|
private nuint GetPreGameContextAddress()
|
|
{
|
|
var scopedLogger = this.logger.CreateScopedLogger();
|
|
var address = this.memoryScanningService.FindAndResolveAddress(PlayerAgentIdAddressPattern, PlayerAgentIdMask, PlayerAgentIdOffset);
|
|
if (address is 0)
|
|
{
|
|
scopedLogger.LogError("Failed to find player agent id address");
|
|
return 0U;
|
|
}
|
|
|
|
scopedLogger.LogInformation("Player agent id address: 0x{address:X8}", address);
|
|
return address;
|
|
}
|
|
}
|