diff --git a/Daybreak.API/Converters/PointerValueConverter.cs b/Daybreak.API/Converters/PointerValueConverter.cs deleted file mode 100644 index 65f4bd1a..00000000 --- a/Daybreak.API/Converters/PointerValueConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Daybreak.API.Interop; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Daybreak.API.Converters; - -public sealed class PointerValueConverter : JsonConverter -{ - public override PointerValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var s = reader.GetString() ?? throw new JsonException("Expected string"); - return PointerValue.Parse(s); - } - - public override void Write(Utf8JsonWriter writer, PointerValue value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString()); - } -} diff --git a/Daybreak.API/Extensions/AttributeContextExtensions.cs b/Daybreak.API/Extensions/AttributeContextExtensions.cs index 8956d131..17b9891a 100644 --- a/Daybreak.API/Extensions/AttributeContextExtensions.cs +++ b/Daybreak.API/Extensions/AttributeContextExtensions.cs @@ -1,17 +1,18 @@ using Daybreak.API.Interop.GuildWars; using Daybreak.Shared.Models.Api; -using ZLinq; namespace Daybreak.API.Extensions; public static class AttributeContextExtensions { - public static List GetAttributeEntryList(this AttributeContext[] attributes) + public static IEnumerable GetAttributeEntryList(this AttributeStructArray54 attributes) { - return attributes - .AsValueEnumerable() - .Take(45) // There are only 45 maximum attributes in game - .Where(a => a.LevelBase > 0 && a.Level >= a.LevelBase) // Select only attributes with points in them - .Select(a => new AttributeEntry(a.Id, a.LevelBase, a.Level)).ToList(); + foreach (var attribute in attributes) + { + if (attribute.LevelBase > 0 && attribute.Level >= attribute.LevelBase) + { + yield return new AttributeEntry((uint)attribute.Id, attribute.LevelBase, attribute.Level); + } + } } } diff --git a/Daybreak.API/Extensions/CharacterInformationExtensions.cs b/Daybreak.API/Extensions/CharacterInformationExtensions.cs new file mode 100644 index 00000000..ae402f69 --- /dev/null +++ b/Daybreak.API/Extensions/CharacterInformationExtensions.cs @@ -0,0 +1,36 @@ +using Daybreak.API.Interop.GuildWars; + +namespace Daybreak.API.Extensions; + +public static class CharacterInformationExtensions +{ + public unsafe static Profession GetPrimaryProfession(this CharacterInformation characterInformation) + { + return (Profession)((characterInformation.Props[2] >> 20) & 0xF); + } + + public unsafe static Profession GetSecondaryProfession(this CharacterInformation characterInformation) + { + return (Profession)((characterInformation.Props[7] >> 10) & 0xF); + } + + public unsafe static uint GetLevel(this CharacterInformation characterInformation) + { + return (characterInformation.Props[7] >> 4) & 0x3F; + } + + public unsafe static Campaign GetCampaign(this CharacterInformation characterInformation) + { + return (Campaign)(characterInformation.Props[7] & 0xF); + } + + public unsafe static MapID GetMapId(this CharacterInformation characterInformation) + { + return (MapID)((characterInformation.Props[0] >> 16) & 0xFFFF); + } + + public unsafe static bool IsPvP(this CharacterInformation characterInformation) + { + return ((characterInformation.Props[7] >> 9) & 0x1) == 0x1; + } +} diff --git a/Daybreak.API/Extensions/GameContextExtensions.cs b/Daybreak.API/Extensions/GameContextExtensions.cs index 70c34cd0..89c10e95 100644 --- a/Daybreak.API/Extensions/GameContextExtensions.cs +++ b/Daybreak.API/Extensions/GameContextExtensions.cs @@ -1,4 +1,5 @@ -using Daybreak.API.Interop.GuildWars; +using Daybreak.API.Interop; +using Daybreak.API.Interop.GuildWars; using System.Diagnostics.CodeAnalysis; namespace Daybreak.API.Extensions; @@ -11,21 +12,21 @@ public static bool TryGetPlayerId( { playerId = 0; if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null || - gameContext.Pointer->WorldContext->PlayerControlledChar is null) + gameContext.Pointer->World is null || + gameContext.Pointer->World->PlayerControlledChar is null) { return false; } - playerId = gameContext.Pointer->WorldContext->PlayerControlledChar->AgentId; + playerId = gameContext.Pointer->World->PlayerControlledChar->AgentId; return true; } public static bool TryGetBuildContext( this WrappedPointer gameContext, - [NotNullWhen(true)] out GuildWarsArray? skillbars, + [NotNullWhen(true)] out GuildWarsArray? skillbars, [NotNullWhen(true)] out GuildWarsArray? attributes, - [NotNullWhen(true)] out GuildWarsArray? professions, + [NotNullWhen(true)] out GuildWarsArray? professions, [NotNullWhen(true)] out GuildWarsArray? unlockedSkills) { skillbars = default; @@ -33,15 +34,15 @@ public static bool TryGetBuildContext( professions = default; unlockedSkills = default; if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null) + gameContext.Pointer->World is null) { return false; } - skillbars = gameContext.Pointer->WorldContext->Skillbars; - attributes = gameContext.Pointer->WorldContext->Attributes; - professions = gameContext.Pointer->WorldContext->Professions; - unlockedSkills = gameContext.Pointer->WorldContext->UnlockedCharacterSkills; + skillbars = gameContext.Pointer->World->Skillbar.Value; + attributes = gameContext.Pointer->World->Attributes.Value; + professions = gameContext.Pointer->World->PartyProfessionStates; + unlockedSkills = gameContext.Pointer->World->UnlockedCharacterSkills; return true; } @@ -57,15 +58,16 @@ public static bool TryGetPlayerParty( heroes = default; henchmen = default; if (gameContext.IsNull || - gameContext.Pointer->PartyContext is null) + gameContext.Pointer->Party is 0) { return false; } - partyId = gameContext.Pointer->PartyContext->PlayerParty->PartyId; - players = gameContext.Pointer->PartyContext->PlayerParty->Players; - heroes = gameContext.Pointer->PartyContext->PlayerParty->Heroes; - henchmen = gameContext.Pointer->PartyContext->PlayerParty->Henchmen; + var partyInfo = GWCA.GW.PartyMgr.GetPartyInfo(0); + partyId = partyInfo->PartyId; + players = partyInfo->Players; + heroes = partyInfo->Heroes; + henchmen = partyInfo->Henchmen; return true; } @@ -75,27 +77,27 @@ public static bool TryGetHeroFlags( { heroFlags = default; if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null) + gameContext.Pointer->World is null) { return false; } - heroFlags = gameContext.Pointer->WorldContext->HeroFlags; + heroFlags = gameContext.Pointer->World->HeroFlags.Value; return true; } public static bool TryGetAccountContext( this WrappedPointer gameContext, - out WrappedPointer accountContext) + out WrappedPointer accountContext) { accountContext = default; if (gameContext.IsNull || - gameContext.Pointer->AccountContext is null) + gameContext.Pointer->Account is null) { return false; } - accountContext = gameContext.Pointer->AccountContext; + accountContext = gameContext.Pointer->Account; return true; } } diff --git a/Daybreak.API/Extensions/TitleExtensions.cs b/Daybreak.API/Extensions/TitleExtensions.cs new file mode 100644 index 00000000..cdda2ee2 --- /dev/null +++ b/Daybreak.API/Extensions/TitleExtensions.cs @@ -0,0 +1,16 @@ +using Daybreak.API.Interop.GuildWars; + +namespace Daybreak.API.Extensions; + +public static class TitleExtensions +{ + public static bool IsPercentageBased(this Title title) + { + return (title.Props & 1) != 0; + } + + public static bool HasTiers(this Title title) + { + return (title.Props & 3) == 2; + } +} diff --git a/Daybreak.API/Interop/Frame.cs b/Daybreak.API/Interop/Frame.cs new file mode 100644 index 00000000..3b8a11a5 --- /dev/null +++ b/Daybreak.API/Interop/Frame.cs @@ -0,0 +1,34 @@ +using System.Runtime.InteropServices; + +namespace Daybreak.API.Interop; + +[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x1AC)] +[GWCAEquivalent("Frame")] +public readonly struct Frame +{ + [FieldOffset(0x0008)] + public readonly uint FrameLayout; + + [FieldOffset(0x0018)] + public readonly uint VisibilityFlags; + + [FieldOffset(0x0020)] + public readonly uint Type; + + [FieldOffset(0x0024)] + public readonly uint TemplateType; + + [FieldOffset(0x00b8)] + public readonly uint ChildOffsetId; + + [FieldOffset(0x00bc)] + public readonly uint FrameId; + + [FieldOffset(0x018C)] + public readonly uint FrameState; + + public bool IsCreated => (this.FrameState & 0x4) != 0; + public bool IsHidden => (this.FrameState & 0x200) != 0; + public bool IsVisible => !this.IsHidden; + public bool IsDIsabled => (this.FrameState & 0x10) != 0; +} diff --git a/Daybreak.API/Interop/GWAddressCache.cs b/Daybreak.API/Interop/GWAddressCache.cs deleted file mode 100644 index a49b69fc..00000000 --- a/Daybreak.API/Interop/GWAddressCache.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Core.Extensions; - -namespace Daybreak.API.Interop; - -public sealed class GWAddressCache(Func provider) -{ - private readonly Func provider = provider.ThrowIfNull(); - private nuint? cachedAddress; - - public nuint? GetAddress() - { - if (this.cachedAddress.HasValue) - { - return this.cachedAddress.Value; - } - - var addr = this.provider(); - if (addr is 0x0) - { - return null; - } - - this.cachedAddress = addr; - return addr; - } -} diff --git a/Daybreak.API/Interop/GWCA.cs b/Daybreak.API/Interop/GWCA.cs index 3afafc6d..adeec6f0 100644 --- a/Daybreak.API/Interop/GWCA.cs +++ b/Daybreak.API/Interop/GWCA.cs @@ -9,2512 +9,18712 @@ using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; -namespace Daybreak.API.Interop; +namespace Daybreak.API.Interop +{ /// -/// P/Invoke bindings for 521 C++ exports from gwca.dll (0 skipped). +/// P/Invoke bindings for 522 C++ exports from gwca.dll (0 skipped). /// Nested classes mirror the C++ namespace hierarchy (e.g. GW::Agents → GWCA.GW.Agents). /// Types annotated with [GWCAEquivalent] are used in signatures where available. /// -internal static unsafe partial class GWCA +public static unsafe partial class GWCA { private const string DllName = "gwca.dll"; - - internal static partial class GW + // ═══════════════════════════════════════════════════ + // Parsed structs diagnostic: + // [NAMESPACE] GWCA.GW popped at line 46 + // [NAMESPACE] GWCA.GW.Agents popped at line 123 + // [NAMESPACE] GWCA.GW.CameraMgr popped at line 35 + // [NAMESPACE] GWCA.GW.Chat popped at line 21 + // [NAMESPACE] GWCA.GW.Chat.TextColor popped at line 49 + // [NAMESPACE] GWCA.GW.Constants popped at line 25 + // [NAMESPACE] GWCA.GW.Constants.Camera popped at line 357 + // [NAMESPACE] GWCA.GW.Constants.DialogID popped at line 331 + // [NAMESPACE] GWCA.GW.Constants.HealthbarHeight popped at line 232 + // [NAMESPACE] GWCA.GW.Constants.ItemID popped at line 201 + // [NAMESPACE] GWCA.GW.Constants.Preference popped at line 62 + // [NAMESPACE] GWCA.GW.Constants.Range popped at line 288 + // [NAMESPACE] GWCA.GW.Constants.SqrRange popped at line 298 + // [NAMESPACE] GWCA.GW.Effects popped at line 60 + // [NAMESPACE] GWCA.GW.EventMgr popped at line 32 + // [NAMESPACE] GWCA.GW.FriendListMgr popped at line 32 + // [NAMESPACE] GWCA.GW.GameThread popped at line 32 + // [NAMESPACE] GWCA.GW.GuildMgr popped at line 21 + // [NAMESPACE] GWCA.GW.Hook popped at line 22 + // [NAMESPACE] GWCA.GW.Items popped at line 95 + // [NAMESPACE] GWCA.GW.Map popped at line 165 + // [NAMESPACE] GWCA.GW.MemoryMgr popped at line 30 + // [NAMESPACE] GWCA.GW.Merchant popped at line 26 + // [NAMESPACE] GWCA.GW.Packet popped at line 112 + // [NAMESPACE] GWCA.GW.Packet.StoC popped at line 107 + // [NAMESPACE] GWCA.GW.Packet.StoC.GenericValueID popped at line 70 + // [NAMESPACE] GWCA.GW.Packet.StoC.JumboMessageType popped at line 82 + // [NAMESPACE] GWCA.GW.Packet.StoC.JumboMessageValue popped at line 99 + // [NAMESPACE] GWCA.GW.PartyMgr popped at line 107 + // [NAMESPACE] GWCA.GW.PlayerMgr popped at line 56 + // [NAMESPACE] GWCA.GW.QuestMgr popped at line 43 + // [NAMESPACE] GWCA.GW.Render popped at line 122 + // [NAMESPACE] GWCA.GW.Scanner popped at line 52 + // [NAMESPACE] GWCA.GW.SkillbarMgr popped at line 39 + // [NAMESPACE] GWCA.GW.StoC popped at line 50 + // [NAMESPACE] GWCA.GW.Trade popped at line 22 + // [NAMESPACE] GWCA.GW.UI popped at line 774 + // [NAMESPACE] GWCA.GW.UI.UIPacket popped at line 29 + // [NAMESPACE] GWCA.GWCA popped at line 15 + // GWCA.GW.AccountContext: 9 fields [OK] + // GWCA.GW.AccountInfo: 7 fields [OK] + // GWCA.GW.AccountUnlockedCount: 3 fields [OK] + // GWCA.GW.AccountUnlockedItemInfo: 3 fields [OK] + // GWCA.GW.Agent: 43 fields [OK] + // GWCA.GW.AgentContext: 27 fields [OK] + // GWCA.GW.AgentEffects: 3 fields [OK] + // GWCA.GW.AgentGadget: 5 fields [OK] + // GWCA.GW.AgentInfo: 1 fields [OK] + // GWCA.GW.AgentItem: 4 fields [OK] + // GWCA.GW.AgentLiving: 56 fields [OK] + // GWCA.GW.AgentMovement: 12 fields [OK] + // GWCA.GW.AgentSummaryInfo: 10 fields [SKIP: mixed offset fields] + // GWCA.GW.AreaInfo: 31 fields [OK] + // GWCA.GW.Attribute: 5 fields [OK] + // GWCA.GW.AttributeInfo: 5 fields [OK] + // GWCA.GW.Bag: 7 fields [OK] + // GWCA.GW.Buff: 4 fields [OK] + // GWCA.GW.ButtonFrame: 0 fields [SKIP: no fields] + // GWCA.GW.Camera: 56 fields [OK] + // GWCA.GW.CapeDesign: 7 fields [OK] + // GWCA.GW.CharacterInformation: 4 fields [OK] + // GWCA.GW.CharAdjustment: 4 fields [OK] + // GWCA.GW.CharContext: 34 fields [OK] + // GWCA.GW.Chat.ChatBuffer: 4 fields [OK] + // GWCA.GW.Chat.ChatMessage: 4 fields [OK] + // GWCA.GW.Cinematic: 2 fields [OK] + // GWCA.GW.CompositeModelInfo: 2 fields [OK] + // GWCA.GW.ControlledMinions: 2 fields [OK] + // GWCA.GW.DupeSkill: 2 fields [OK] + // GWCA.GW.DyeInfo: 1 fields [OK] + // GWCA.GW.EditableTextFrame: 0 fields [SKIP: no fields] + // GWCA.GW.Effect: 6 fields [OK] + // GWCA.GW.EquipmentVTable: 0 fields [SKIP: no fields] + // GWCA.GW.FrameWithValue: 0 fields [SKIP: no fields] + // GWCA.GW.Friend: 7 fields [OK] + // GWCA.GW.FriendList: 8 fields [SKIP: unresolved typedef in field friends: FriendsListArray] + // GWCA.GW.GadgetContext: 1 fields [OK] + // GWCA.GW.GadgetInfo: 4 fields [OK] + // GWCA.GW.GameContext: 23 fields [OK] + // GWCA.GW.GameplayContext: 3 fields [SKIP: mixed offset fields] + // GWCA.GW.GamePos: 3 fields [OK] + // GWCA.GW.GHKey: 1 fields [OK] + // GWCA.GW.Guild: 12 fields [OK] + // GWCA.GW.GuildContext: 34 fields [OK] + // GWCA.GW.GuildHistoryEvent: 3 fields [OK] + // GWCA.GW.GuildPlayer: 12 fields [OK] + // GWCA.GW.HenchmanPartyMember: 4 fields [OK] + // GWCA.GW.HeroConstData: 6 fields [OK] + // GWCA.GW.HeroFlag: 8 fields [OK] + // GWCA.GW.HeroInfo: 30 fields [OK] + // GWCA.GW.HeroPartyMember: 6 fields [OK] + // GWCA.GW.Inventory: 39 fields [OK] + // GWCA.GW.Item: 26 fields [OK] + // GWCA.GW.ItemContext: 12 fields [OK] + // GWCA.GW.ItemData: 4 fields [OK] + // GWCA.GW.ItemFormula: 5 fields [OK] + // GWCA.GW.ItemModifier: 1 fields [OK] + // GWCA.GW.LoginCharacter: 2 fields [OK] + // GWCA.GW.MapAgent: 13 fields [OK] + // GWCA.GW.MapContext: 57 fields [OK] + // GWCA.GW.MapProp: 18 fields [OK] + // GWCA.GW.MapStaticData: 37 fields [SKIP: unresolved typedef in field map: PathingMapArray] + // GWCA.GW.MapTypeInstanceInfo: 3 fields [OK] + // GWCA.GW.Mat4x3f: 13 fields [OK] + // GWCA.GW.MaterialCost: 4 fields [OK] + // GWCA.GW.Merchant.QuoteInfo: 2 fields [OK] + // GWCA.GW.Merchant.TransactionInfo: 1 fields [OK] + // GWCA.GW.MissionMapContext: 12 fields [OK] + // GWCA.GW.MissionMapIcon: 10 fields [OK] + // GWCA.GW.MissionMapSubContext: 1 fields [OK] + // GWCA.GW.MissionMapSubContext2: 9 fields [OK] + // GWCA.GW.MissionObjective: 3 fields [OK] + // GWCA.GW.Module: 0 fields [SKIP: no fields] + // GWCA.GW.Node: 2 fields [OK] + // GWCA.GW.NodeCache: 3 fields [SKIP: complex template in field buffer: BaseArray] + // GWCA.GW.NPC: 12 fields [OK] + // GWCA.GW.NPCEquipment: 39 fields [SKIP: vtable in field vtable: EquipmentVTable*] + // GWCA.GW.ObjectPool: 3 fields [OK] + // GWCA.GW.ObjectPoolBlock: 2 fields [OK] + // GWCA.GW.ObserverMatch: 11 fields [OK] + // GWCA.GW.ObserverMatchTeam: 5 fields [OK] + // GWCA.GW.Packet.StoC.PacketBase: 1 fields [OK] + // GWCA.GW.PartyAlly: 3 fields [OK] + // GWCA.GW.PartyAttribute: 2 fields [OK] + // GWCA.GW.PartyContext: 16 fields [SKIP: complex template in field requests: TList] + // GWCA.GW.PartyInfo: 7 fields [OK] + // GWCA.GW.PartyMemberMoraleInfo: 4 fields [OK] + // GWCA.GW.PartyMoraleLink: 3 fields [OK] + // GWCA.GW.PartySearch: 13 fields [OK] + // GWCA.GW.PartySearchContext: 5 fields [OK] + // GWCA.GW.PathContext: 15 fields [SKIP: unresolved typedef in field blockedPlanes: BlockedPlaneArray] + // GWCA.GW.PathEngineContext: 6 fields [OK] + // GWCA.GW.PathingMap: 19 fields [SKIP: complex template in field dat_vectors: BaseArray] + // GWCA.GW.PathingTrapezoid: 14 fields [OK] + // GWCA.GW.PathNode: 6 fields [SKIP: complex template in field priority: PrioQLink] + // GWCA.GW.PathWaypoint: 6 fields [OK] + // GWCA.GW.PetInfo: 7 fields [OK] + // GWCA.GW.Player: 15 fields [OK] + // GWCA.GW.PlayerControlledCharacter: 77 fields [OK] + // GWCA.GW.PlayerEquipment: 7 fields [OK] + // GWCA.GW.PlayerPartyMember: 3 fields [OK] + // GWCA.GW.Portal: 6 fields [OK] + // GWCA.GW.PreGameContext: 7 fields [OK] + // GWCA.GW.PrioQ: 2 fields [OK] + // GWCA.GW.PrioQLink: 4 fields [SKIP: template param T in field pq] + // GWCA.GW.ProfessionState: 5 fields [OK] + // GWCA.GW.ProgressBarContext: 5 fields [OK] + // GWCA.GW.PropByType: 2 fields [OK] + // GWCA.GW.PropModelInfo: 6 fields [OK] + // GWCA.GW.PropsContext: 6 fields [SKIP: complex template in field propsByType: Array>] + // GWCA.GW.PvPItemInfo: 1 fields [OK] + // GWCA.GW.PvPItemUpgradeInfo: 10 fields [OK] + // GWCA.GW.Quest: 11 fields [OK] + // GWCA.GW.RecObject: 9 fields [OK] + // GWCA.GW.Render.Mat4x3f: 13 fields [OK] + // GWCA.GW.SalvageSessionInfo: 9 fields [OK] + // GWCA.GW.ScannerSectionOffset: 2 fields [OK] + // GWCA.GW.ScrollableFrame: 0 fields [SKIP: no fields] + // GWCA.GW.SinkNode: 1 fields [OK] + // GWCA.GW.Skill: 48 fields [OK] + // GWCA.GW.Skillbar: 5 fields [OK] + // GWCA.GW.SkillbarCast: 3 fields [OK] + // GWCA.GW.SkillbarMgr.Attribute: 1 fields [OK] + // GWCA.GW.SkillbarMgr.SkillTemplate: 6 fields [OK] + // GWCA.GW.SkillbarSkill: 5 fields [OK] + // GWCA.GW.SubStruct1: 1 fields [OK] + // GWCA.GW.SubStructUnk: 9 fields [OK] + // GWCA.GW.TabsFrame: 0 fields [SKIP: no fields] + // GWCA.GW.TagInfo: 4 fields [OK] + // GWCA.GW.TextCache: 1 fields [OK] + // GWCA.GW.TextParser: 14 fields [OK] + // GWCA.GW.THash: 5 fields [SKIP: template param T in field m_fullList] + // GWCA.GW.THashLink: 6 fields [SKIP: template param T in field elem] + // GWCA.GW.Title: 11 fields [OK] + // GWCA.GW.TitleClientData: 3 fields [OK] + // GWCA.GW.TitleTier: 3 fields [OK] + // GWCA.GW.TLink: 2 fields [SKIP: template param T in field next_node] + // GWCA.GW.TList: 2 fields [SKIP: template param T in field link] + // GWCA.GW.TownAlliance: 8 fields [OK] + // GWCA.GW.TradeContext: 4 fields [OK] + // GWCA.GW.TradeItem: 2 fields [OK] + // GWCA.GW.TradePlayer: 2 fields [OK] + // GWCA.GW.UI.AgentNameTagInfo: 15 fields [OK] + // GWCA.GW.UI.ChatTemplate: 3 fields [OK] + // GWCA.GW.UI.CompassPoint: 2 fields [OK] + // GWCA.GW.UI.CreateUIComponentPacket: 6 fields [OK] + // GWCA.GW.UI.DialogBodyInfo: 3 fields [OK] + // GWCA.GW.UI.DialogButtonInfo: 4 fields [OK] + // GWCA.GW.UI.FloatingWindow: 9 fields [OK] + // GWCA.GW.UI.Frame: 86 fields [SKIP: unresolved typedef in field relation: FrameRelation] + // GWCA.GW.UI.FrameInteractionCallback: 3 fields [OK] + // GWCA.GW.UI.FramePosition: 17 fields [OK] + // GWCA.GW.UI.FrameRelation: 5 fields [SKIP: complex template in field siblings: TList] + // GWCA.GW.UI.InteractionMessage: 3 fields [OK] + // GWCA.GW.UI.MapEntryMessage: 2 fields [OK] + // GWCA.GW.UI.TooltipInfo: 8 fields [OK] + // GWCA.GW.UI.UIChatMessage: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kAgentSkillPacket: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kAgentSkillStartedCast: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kAgentSpeechBubble: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kAllyOrGuildMessage: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kChangeTarget: 6 fields [OK] + // GWCA.GW.UI.UIPacket.kCompassDraw: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kDialogueMessage: 5 fields [OK] + // GWCA.GW.UI.UIPacket.kEffectAdd: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kErrorMessage: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kGetColor: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kInteractAgent: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kInventorySlotUpdated: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kItemUpdated: 14 fields [OK] + // GWCA.GW.UI.UIPacket.kKeyAction: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kLoadMapContext: 7 fields [OK] + // GWCA.GW.UI.UIPacket.kLogChatMessage: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kLogout: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kMeasureContent: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kMouseAction: 5 fields [OK] + // GWCA.GW.UI.UIPacket.kMouseClick: 5 fields [OK] + // GWCA.GW.UI.UIPacket.kMouseCoordsClick: 6 fields [OK] + // GWCA.GW.UI.UIPacket.kMoveItem: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kObjectiveAdd: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kObjectiveComplete: 1 fields [OK] + // GWCA.GW.UI.UIPacket.kObjectiveUpdated: 1 fields [OK] + // GWCA.GW.UI.UIPacket.kPartySearchInvite: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPartyShowConfirmDialog: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kPlayerChatMessage: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kPostProcessingEffect: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPreferenceEnumChanged: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPreferenceFlagChanged: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPreferenceValueChanged: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPreStartSalvage: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kPrintChatMessage: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kRecvWhisper: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kResize: 9 fields [OK] + // GWCA.GW.UI.UIPacket.kSendCallTarget: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendChangeTarget: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendChatMessage: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendLoadSkillTemplate: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendMerchantRequestQuote: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendMerchantTransactItem: 5 fields [OK] + // GWCA.GW.UI.UIPacket.kSendMoveItem: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kSendPingWeaponSet: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kSendUseItem: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kSendWorldAction: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kServerActiveQuestChanged: 5 fields [OK] + // GWCA.GW.UI.UIPacket.kSetAgentProfession: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kSetLayout: 6 fields [OK] + // GWCA.GW.UI.UIPacket.kSetRendererValue: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kShowXunlaiChest: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kStartWhisper: 1 fields [OK] + // GWCA.GW.UI.UIPacket.kTomeSkillSelection: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kUIPositionChanged: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kUseKitOnItem: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kVendorItems: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kVendorQuote: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kVendorWindow: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kWeaponSetChanged: 4 fields [OK] + // GWCA.GW.UI.UIPacket.kWeaponSwap: 2 fields [OK] + // GWCA.GW.UI.UIPacket.kWriteToChatLog: 3 fields [OK] + // GWCA.GW.UI.UIPacket.kWriteToChatLogWithSender: 3 fields [OK] + // GWCA.GW.UI.WindowPosition: 3 fields [OK] + // GWCA.GW.Vec2f: 2 fields [OK] + // GWCA.GW.Vec3f: 3 fields [OK] + // GWCA.GW.VisibleEffect: 3 fields [OK] + // GWCA.GW.WeaponSet: 2 fields [OK] + // GWCA.GW.WorldContext: 107 fields [OK] + // GWCA.GW.WorldMapContext: 21 fields [OK] + // GWCA.GW.XNode: 4 fields [OK] + // GWCA.GW.YNode: 3 fields [OK] + // GWCA.HookEntry: 0 fields [SKIP: no fields] + // GWCA.ItemGeneral_ReuseID: 0 fields [SKIP: no fields] + // GWCA.TextLabelFrame: 0 fields [SKIP: no fields] + // ═══════════════════════════════════════════════════ + + + public static partial class GW { // GW::DisableHooks [LibraryImport(DllName, EntryPoint = "?DisableHooks@GW@@YAXXZ")] - internal static partial void DisableHooks(); + public static partial void DisableHooks(); // GW::EnableHooks [LibraryImport(DllName, EntryPoint = "?EnableHooks@GW@@YAXXZ")] - internal static partial void EnableHooks(); + public static partial void EnableHooks(); // GW::FatalAssert [LibraryImport(DllName, EntryPoint = "?FatalAssert@GW@@YAXPBD0I0@Z")] - internal static partial void FatalAssert(byte* ptr1, nint ptr2, uint value3, nint ptr4); + public static partial void FatalAssert(byte* ptr1, nint ptr2, uint value3, nint ptr4); // GW::GetAccountContext [LibraryImport(DllName, EntryPoint = "?GetAccountContext@GW@@YAPAUAccountContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.AccountGameContext* GetAccountContext(); + public static partial global::Daybreak.API.Interop.GuildWars.AccountContext* GetAccountContext(); // GW::GetAgentContext [LibraryImport(DllName, EntryPoint = "?GetAgentContext@GW@@YAPAUAgentContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentGameContext* GetAgentContext(); + public static partial global::Daybreak.API.Interop.GuildWars.AgentContext* GetAgentContext(); // GW::GetAvailableChars [LibraryImport(DllName, EntryPoint = "?GetAvailableChars@GW@@YAPAV?$Array@UCharacterInformation@GW@@@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAvailableChars(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAvailableChars(); // GW::GetCharContext [LibraryImport(DllName, EntryPoint = "?GetCharContext@GW@@YAPAUCharContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.CharContext* GetCharContext(); + public static partial global::Daybreak.API.Interop.GuildWars.CharContext* GetCharContext(); // GW::GetDistance [LibraryImport(DllName, EntryPoint = "?GetDistance@GW@@YAMABUVec2f@1@0@Z")] - internal static partial float GetDistance(global::System.Numerics.Vector2* vector21, nint ptr2); + public static partial float GetDistance(global::Daybreak.API.Interop.GuildWars.Vec2fStruct* vector21, nint ptr2); // GW::GetDistance [LibraryImport(DllName, EntryPoint = "?GetDistance@GW@@YAMUVec3f@1@0@Z")] - internal static partial float GetDistance(global::System.Numerics.Vector3 vector31, nint ptr2); + public static partial float GetDistance(global::Daybreak.API.Interop.GuildWars.Vec3fStruct vec3fStruct1, nint ptr2); // GW::GetGameContext [LibraryImport(DllName, EntryPoint = "?GetGameContext@GW@@YAPAUGameContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GameContext* GetGameContext(); + public static partial global::Daybreak.API.Interop.GuildWars.GameContext* GetGameContext(); - // GW::GetGameplayContext - [LibraryImport(DllName, EntryPoint = "?GetGameplayContext@GW@@YAPAUGameplayContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GameplayContext* GetGameplayContext(); + // GW::GetGameplayContext | returns TODO: map struct GW::GameplayContext + // [LibraryImport(DllName, EntryPoint = "?GetGameplayContext@GW@@YAPAUGameplayContext@1@XZ")] + // public static partial GameplayContext* GetGameplayContext(); // GW::GetGuildContext [LibraryImport(DllName, EntryPoint = "?GetGuildContext@GW@@YAPAUGuildContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildContext* GetGuildContext(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildContext* GetGuildContext(); // GW::GetItemContext [LibraryImport(DllName, EntryPoint = "?GetItemContext@GW@@YAPAUItemContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.ItemContext* GetItemContext(); + public static partial global::Daybreak.API.Interop.GuildWars.ItemContext* GetItemContext(); // GW::GetMapContext [LibraryImport(DllName, EntryPoint = "?GetMapContext@GW@@YAPAUMapContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.MapContext* GetMapContext(); + public static partial global::Daybreak.API.Interop.GuildWars.MapContext* GetMapContext(); // GW::GetNorm [LibraryImport(DllName, EntryPoint = "?GetNorm@GW@@YAMUVec2f@1@@Z")] - internal static partial float GetNorm(global::System.Numerics.Vector2 vector2); + public static partial float GetNorm(global::Daybreak.API.Interop.GuildWars.Vec2fStruct vec2fStruct); // GW::GetNorm [LibraryImport(DllName, EntryPoint = "?GetNorm@GW@@YAMUVec3f@1@@Z")] - internal static partial float GetNorm(global::System.Numerics.Vector3 vector3); + public static partial float GetNorm(global::Daybreak.API.Interop.GuildWars.Vec3fStruct vec3fStruct); - // GW::GetPartyContext - [LibraryImport(DllName, EntryPoint = "?GetPartyContext@GW@@YAPAUPartyContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.PartyContext* GetPartyContext(); + // GW::GetPartyContext | returns TODO: map struct GW::PartyContext + // [LibraryImport(DllName, EntryPoint = "?GetPartyContext@GW@@YAPAUPartyContext@1@XZ")] + // public static partial PartyContext* GetPartyContext(); // GW::GetPreGameContext [LibraryImport(DllName, EntryPoint = "?GetPreGameContext@GW@@YAPAUPreGameContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.PreGameContext* GetPreGameContext(); + public static partial global::Daybreak.API.Interop.GuildWars.PreGameContext* GetPreGameContext(); // GW::GetWorldContext [LibraryImport(DllName, EntryPoint = "?GetWorldContext@GW@@YAPAUWorldContext@1@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.WorldContext* GetWorldContext(); + public static partial global::Daybreak.API.Interop.GuildWars.WorldContext* GetWorldContext(); // GW::Hash [LibraryImport(DllName, EntryPoint = "?Hash@GW@@YAIPBXI@Z")] - internal static partial uint Hash(void* ptr1, uint value2); + public static partial uint Hash(void* ptr1, uint value2); // GW::Hash16 [LibraryImport(DllName, EntryPoint = "?Hash16@GW@@YAIG@Z")] - internal static partial uint Hash16(ushort value); + public static partial uint Hash16(ushort value); // GW::Hash32 [LibraryImport(DllName, EntryPoint = "?Hash32@GW@@YAII@Z")] - internal static partial uint Hash32(uint value); + public static partial uint Hash32(uint value); // GW::Hash8 [LibraryImport(DllName, EntryPoint = "?Hash8@GW@@YAIE@Z")] - internal static partial uint Hash8(byte value); + public static partial uint Hash8(byte value); // GW::HashWString [LibraryImport(DllName, EntryPoint = "?HashWString@GW@@YAIPB_WI@Z")] - internal static partial uint HashWString(ushort* ptr1, uint value2); + public static partial uint HashWString(ushort* ptr1, uint value2); // GW::Initialize [LibraryImport(DllName, EntryPoint = "?Initialize@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Initialize(); + public static partial bool Initialize(); // GW::LogMessage — varargs, requires manual interop // GW::RegisterLogHandler [LibraryImport(DllName, EntryPoint = "?RegisterLogHandler@GW@@YAXP6AXPAXW4LogLevel@1@PBD2I2@Z0@Z")] - internal static partial void RegisterLogHandler(nint callback1, nint ptr2); + public static partial void RegisterLogHandler(nint callback1, nint ptr2); // GW::RegisterPanicHandler [LibraryImport(DllName, EntryPoint = "?RegisterPanicHandler@GW@@YAXP6AXPAXPBD1I1@Z0@Z")] - internal static partial void RegisterPanicHandler(nint callback1, nint ptr2); + public static partial void RegisterPanicHandler(nint callback1, nint ptr2); // GW::Terminate [LibraryImport(DllName, EntryPoint = "?Terminate@GW@@YAXXZ")] - internal static partial void Terminate(); + public static partial void Terminate(); - internal static partial class Agents + public static partial class Agents { // GW::Agents::ChangeTarget [LibraryImport(DllName, EntryPoint = "?ChangeTarget@Agents@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ChangeTarget(uint value); + public static partial bool ChangeTarget(uint value); // GW::Agents::ChangeTarget [LibraryImport(DllName, EntryPoint = "?ChangeTarget@Agents@GW@@YA_NPBUAgent@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ChangeTarget(global::Daybreak.API.Interop.GuildWars.AgentContext* agentContext); + public static partial bool ChangeTarget(global::Daybreak.API.Interop.GuildWars.Agent* agent); - // GW::Agents::CountAllegianceInRange | value1: enum GW::Constants::Allegiance (as int) + // GW::Agents::CountAllegianceInRange [LibraryImport(DllName, EntryPoint = "?CountAllegianceInRange@Agents@GW@@YAIW4Allegiance@Constants@2@M@Z")] - internal static partial uint CountAllegianceInRange(int value1, float value2); + public static partial uint CountAllegianceInRange(global::Daybreak.API.Interop.GWCA.GW.Constants.Allegiance allegiance1, float value2); // GW::Agents::GetAgentArray [LibraryImport(DllName, EntryPoint = "?GetAgentArray@Agents@GW@@YAPAV?$Array@PAUAgent@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentArray(); // GW::Agents::GetAgentByID [LibraryImport(DllName, EntryPoint = "?GetAgentByID@Agents@GW@@YAPAUAgent@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentContext* GetAgentByID(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.Agent* GetAgentByID(uint value); // GW::Agents::GetAgentEncName [LibraryImport(DllName, EntryPoint = "?GetAgentEncName@Agents@GW@@YAPA_WI@Z")] - internal static partial ushort* GetAgentEncName(uint value); + public static partial ushort* GetAgentEncName(uint value); // GW::Agents::GetAgentEncName [LibraryImport(DllName, EntryPoint = "?GetAgentEncName@Agents@GW@@YAPA_WPBUAgent@2@@Z")] - internal static partial ushort* GetAgentEncName(global::Daybreak.API.Interop.GuildWars.AgentContext* agentContext); + public static partial ushort* GetAgentEncName(global::Daybreak.API.Interop.GuildWars.Agent* agent); // GW::Agents::GetAgentIdByLoginNumber [LibraryImport(DllName, EntryPoint = "?GetAgentIdByLoginNumber@Agents@GW@@YAII@Z")] - internal static partial uint GetAgentIdByLoginNumber(uint value); + public static partial uint GetAgentIdByLoginNumber(uint value); // GW::Agents::GetAmountOfPlayersInInstance [LibraryImport(DllName, EntryPoint = "?GetAmountOfPlayersInInstance@Agents@GW@@YAIXZ")] - internal static partial uint GetAmountOfPlayersInInstance(); + public static partial uint GetAmountOfPlayersInInstance(); // GW::Agents::GetControlledCharacter [LibraryImport(DllName, EntryPoint = "?GetControlledCharacter@Agents@GW@@YAPAUAgentLiving@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentLivingContext* GetControlledCharacter(); + public static partial global::Daybreak.API.Interop.GuildWars.AgentLiving* GetControlledCharacter(); // GW::Agents::GetControlledCharacterId [LibraryImport(DllName, EntryPoint = "?GetControlledCharacterId@Agents@GW@@YAIXZ")] - internal static partial uint GetControlledCharacterId(); + public static partial uint GetControlledCharacterId(); // GW::Agents::GetEvaluatedTargetId [LibraryImport(DllName, EntryPoint = "?GetEvaluatedTargetId@Agents@GW@@YAIXZ")] - internal static partial uint GetEvaluatedTargetId(); + public static partial uint GetEvaluatedTargetId(); // GW::Agents::GetHeroAgentID [LibraryImport(DllName, EntryPoint = "?GetHeroAgentID@Agents@GW@@YAII@Z")] - internal static partial uint GetHeroAgentID(uint value); + public static partial uint GetHeroAgentID(uint value); // GW::Agents::GetIsAgentTargettable [LibraryImport(DllName, EntryPoint = "?GetIsAgentTargettable@Agents@GW@@YA_NPBUAgent@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsAgentTargettable(global::Daybreak.API.Interop.GuildWars.AgentContext* agentContext); + public static partial bool GetIsAgentTargettable(global::Daybreak.API.Interop.GuildWars.Agent* agent); // GW::Agents::GetMapAgentArray [LibraryImport(DllName, EntryPoint = "?GetMapAgentArray@Agents@GW@@YAPAV?$Array@UMapAgent@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetMapAgentArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetMapAgentArray(); // GW::Agents::GetMapAgentByID [LibraryImport(DllName, EntryPoint = "?GetMapAgentByID@Agents@GW@@YAPAUMapAgent@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.MapAgentContext* GetMapAgentByID(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.MapAgent* GetMapAgentByID(uint value); // GW::Agents::GetNPCArray [LibraryImport(DllName, EntryPoint = "?GetNPCArray@Agents@GW@@YAPAV?$Array@UNPC@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetNPCArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetNPCArray(); // GW::Agents::GetNPCByID [LibraryImport(DllName, EntryPoint = "?GetNPCByID@Agents@GW@@YAPAUNPC@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.NpcContext* GetNPCByID(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.NPC* GetNPCByID(uint value); // GW::Agents::GetObservingId [LibraryImport(DllName, EntryPoint = "?GetObservingId@Agents@GW@@YAIXZ")] - internal static partial uint GetObservingId(); + public static partial uint GetObservingId(); // GW::Agents::GetPlayerArray - // [LibraryImport(DllName, EntryPoint = "?GetPlayerArray@Agents@GW@@YAPAV?$Array@UPlayer@GW@@@2@XZ")] - // internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerArray(); + [LibraryImport(DllName, EntryPoint = "?GetPlayerArray@Agents@GW@@YAPAV?$Array@UPlayer@GW@@@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerArray(); // GW::Agents::GetPlayerByID [LibraryImport(DllName, EntryPoint = "?GetPlayerByID@Agents@GW@@YAPAUAgent@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentContext* GetPlayerByID(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.Agent* GetPlayerByID(uint value); // GW::Agents::GetPlayerNameByLoginNumber [LibraryImport(DllName, EntryPoint = "?GetPlayerNameByLoginNumber@Agents@GW@@YAPA_WI@Z")] - internal static partial ushort* GetPlayerNameByLoginNumber(uint value); + public static partial ushort* GetPlayerNameByLoginNumber(uint value); // GW::Agents::GetTargetAsAgentLiving [LibraryImport(DllName, EntryPoint = "?GetTargetAsAgentLiving@Agents@GW@@YAPAUAgentLiving@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentLivingContext* GetTargetAsAgentLiving(); + public static partial global::Daybreak.API.Interop.GuildWars.AgentLiving* GetTargetAsAgentLiving(); // GW::Agents::GetTargetId [LibraryImport(DllName, EntryPoint = "?GetTargetId@Agents@GW@@YAIXZ")] - internal static partial uint GetTargetId(); + public static partial uint GetTargetId(); // GW::Agents::InteractAgent [LibraryImport(DllName, EntryPoint = "?InteractAgent@Agents@GW@@YA_NPBUAgent@2@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool InteractAgent(global::Daybreak.API.Interop.GuildWars.AgentContext* agentContext1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool InteractAgent(global::Daybreak.API.Interop.GuildWars.Agent* agent1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::Agents::IsObserving [LibraryImport(DllName, EntryPoint = "?IsObserving@Agents@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsObserving(); + public static partial bool IsObserving(); // GW::Agents::Move [LibraryImport(DllName, EntryPoint = "?Move@Agents@GW@@YA_NMMI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Move(float value1, float value2, uint value3); + public static partial bool Move(float value1, float value2, uint value3); // GW::Agents::Move [LibraryImport(DllName, EntryPoint = "?Move@Agents@GW@@YA_NUGamePos@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Move(global::Daybreak.API.Interop.GuildWars.GamePos gamePos); + public static partial bool Move(global::Daybreak.API.Interop.GuildWars.GamePos gamePos); // GW::Agents::SendDialog [LibraryImport(DllName, EntryPoint = "?SendDialog@Agents@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendDialog(uint value); + public static partial bool SendDialog(uint value); } - internal static partial class ButtonFrame + public static partial class ButtonFrame { // GW::ButtonFrame::Click [LibraryImport(DllName, EntryPoint = "?Click@ButtonFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double Click(nint self); + public static partial double Click(nint self); // GW::ButtonFrame::Create | returns TODO: map struct GW::ButtonFrame // [LibraryImport(DllName, EntryPoint = "?Create@ButtonFrame@GW@@SAPAU12@IIIPB_W0@Z")] - // internal static partial ButtonFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); + // public static partial ButtonFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); // GW::ButtonFrame::DoubleClick [LibraryImport(DllName, EntryPoint = "?DoubleClick@ButtonFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double DoubleClick(nint self); + public static partial double DoubleClick(nint self); // GW::ButtonFrame::GetLabel [LibraryImport(DllName, EntryPoint = "?GetLabel@ButtonFrame@GW@@QAE_NPAPB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetLabel(nint self, void* ptr2); + public static partial double GetLabel(nint self, void* ptr2); - // GW::ButtonFrame::MouseAction | value2: enum GW::UI::UIPacket::ActionState (as int) + // GW::ButtonFrame::MouseAction [LibraryImport(DllName, EntryPoint = "?MouseAction@ButtonFrame@GW@@QAE_NW4ActionState@UIPacket@UI@2@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double MouseAction(nint self, int value2); + public static partial double MouseAction(nint self, global::Daybreak.API.Interop.GWCA.GW.UI.UIPacket.ActionState actionState2); // GW::ButtonFrame::SetLabel [LibraryImport(DllName, EntryPoint = "?SetLabel@ButtonFrame@GW@@QAE_NPB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetLabel(nint self, ushort* ptr2); + public static partial double SetLabel(nint self, ushort* ptr2); } - internal static partial class CameraMgr + public static partial class CameraMgr { // GW::CameraMgr::ComputeCamPos [LibraryImport(DllName, EntryPoint = "?ComputeCamPos@CameraMgr@GW@@YA?AUVec3f@2@M@Z")] - internal static partial global::System.Numerics.Vector3 ComputeCamPos(float value); + public static partial global::Daybreak.API.Interop.GuildWars.Vec3fStruct ComputeCamPos(float value); - // GW::CameraMgr::GetCamera | returns TODO: map struct GW::Camera - // [LibraryImport(DllName, EntryPoint = "?GetCamera@CameraMgr@GW@@YAPAUCamera@2@XZ")] - // internal static partial Camera* GetCamera(); + // GW::CameraMgr::GetCamera + [LibraryImport(DllName, EntryPoint = "?GetCamera@CameraMgr@GW@@YAPAUCamera@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.Camera* GetCamera(); // GW::CameraMgr::GetCameraUnlock [LibraryImport(DllName, EntryPoint = "?GetCameraUnlock@CameraMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetCameraUnlock(); + public static partial bool GetCameraUnlock(); // GW::CameraMgr::GetFieldOfView [LibraryImport(DllName, EntryPoint = "?GetFieldOfView@CameraMgr@GW@@YAMXZ")] - internal static partial float GetFieldOfView(); + public static partial float GetFieldOfView(); // GW::CameraMgr::GetYaw [LibraryImport(DllName, EntryPoint = "?GetYaw@CameraMgr@GW@@YAMXZ")] - internal static partial float GetYaw(); + public static partial float GetYaw(); // GW::CameraMgr::SetFieldOfView [LibraryImport(DllName, EntryPoint = "?SetFieldOfView@CameraMgr@GW@@YA_NM@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFieldOfView(float value); + public static partial bool SetFieldOfView(float value); // GW::CameraMgr::SetFog [LibraryImport(DllName, EntryPoint = "?SetFog@CameraMgr@GW@@YA_N_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFog([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial bool SetFog([MarshalAs(UnmanagedType.U1)] bool flag); // GW::CameraMgr::SetMaxDist [LibraryImport(DllName, EntryPoint = "?SetMaxDist@CameraMgr@GW@@YA_NM@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetMaxDist(float value); + public static partial bool SetMaxDist(float value); // GW::CameraMgr::UnlockCam [LibraryImport(DllName, EntryPoint = "?UnlockCam@CameraMgr@GW@@YA_N_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UnlockCam([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial bool UnlockCam([MarshalAs(UnmanagedType.U1)] bool flag); // GW::CameraMgr::UpdateCameraPos [LibraryImport(DllName, EntryPoint = "?UpdateCameraPos@CameraMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UpdateCameraPos(); + public static partial bool UpdateCameraPos(); } - internal static partial class Chat + public static partial class Chat { // GW::Chat::AddToChatLog [LibraryImport(DllName, EntryPoint = "?AddToChatLog@Chat@GW@@YA_NPA_WI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddToChatLog(ushort* ptr1, uint value2); + public static partial bool AddToChatLog(ushort* ptr1, uint value2); // GW::Chat::CreateCommand [LibraryImport(DllName, EntryPoint = "?CreateCommand@Chat@GW@@YAXPAUHookEntry@2@PB_WP6AXPAUHookStatus@2@1HPBQA_W@Z@Z")] - internal static partial void CreateCommand(global::Daybreak.API.Interop.HookEntry* hookEntry1, ushort* ptr2, nint callback3); + public static partial void CreateCommand(global::Daybreak.API.Interop.HookEntry* hookEntry1, ushort* ptr2, nint callback3); // GW::Chat::DeleteCommand [LibraryImport(DllName, EntryPoint = "?DeleteCommand@Chat@GW@@YAXPAUHookEntry@2@PB_W@Z")] - internal static partial void DeleteCommand(global::Daybreak.API.Interop.HookEntry* hookEntry1, ushort* ptr2); + public static partial void DeleteCommand(global::Daybreak.API.Interop.HookEntry* hookEntry1, ushort* ptr2); // GW::Chat::GetChannel [LibraryImport(DllName, EntryPoint = "?GetChannel@Chat@GW@@YA?AW4Channel@12@D@Z")] - internal static partial global::Daybreak.API.Models.Channel GetChannel(byte value); + public static partial global::Daybreak.API.Interop.GWCA.GW.Chat.Channel GetChannel(byte value); // GW::Chat::GetChannel [LibraryImport(DllName, EntryPoint = "?GetChannel@Chat@GW@@YA?AW4Channel@12@_W@Z")] - internal static partial global::Daybreak.API.Models.Channel GetChannel(ushort value); + public static partial global::Daybreak.API.Interop.GWCA.GW.Chat.Channel GetChannel(ushort value); // GW::Chat::GetChannelColors [LibraryImport(DllName, EntryPoint = "?GetChannelColors@Chat@GW@@YAXW4Channel@12@PAI1@Z")] - internal static partial void GetChannelColors(global::Daybreak.API.Models.Channel channel1, uint* ptr2, nint ptr3); + public static partial void GetChannelColors(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, uint* ptr2, nint ptr3); - // GW::Chat::GetChatLog | returns TODO: map struct GW::Chat::ChatBuffer - // [LibraryImport(DllName, EntryPoint = "?GetChatLog@Chat@GW@@YAPAUChatBuffer@12@XZ")] - // internal static partial ChatBuffer* GetChatLog(); + // GW::Chat::GetChatLog + [LibraryImport(DllName, EntryPoint = "?GetChatLog@Chat@GW@@YAPAUChatBuffer@12@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.ChatBuffer* GetChatLog(); // GW::Chat::GetDefaultColors [LibraryImport(DllName, EntryPoint = "?GetDefaultColors@Chat@GW@@YAXW4Channel@12@PAI1@Z")] - internal static partial void GetDefaultColors(global::Daybreak.API.Models.Channel channel1, uint* ptr2, nint ptr3); + public static partial void GetDefaultColors(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, uint* ptr2, nint ptr3); // GW::Chat::GetIsTyping [LibraryImport(DllName, EntryPoint = "?GetIsTyping@Chat@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsTyping(); + public static partial bool GetIsTyping(); // GW::Chat::SendChat [LibraryImport(DllName, EntryPoint = "?SendChat@Chat@GW@@YA_NDPBD@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendChat(byte value1, byte* ptr2); + public static partial bool SendChat(byte value1, byte* ptr2); // GW::Chat::SendChat [LibraryImport(DllName, EntryPoint = "?SendChat@Chat@GW@@YA_NDPB_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendChat(byte value1, ushort* ptr2); + public static partial bool SendChat(byte value1, ushort* ptr2); // GW::Chat::SendChat [LibraryImport(DllName, EntryPoint = "?SendChat@Chat@GW@@YA_NPB_W0@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendChat(ushort* ptr1, nint ptr2); + public static partial bool SendChat(ushort* ptr1, nint ptr2); // GW::Chat::SetMessageColor [LibraryImport(DllName, EntryPoint = "?SetMessageColor@Chat@GW@@YAIW4Channel@12@I@Z")] - internal static partial uint SetMessageColor(global::Daybreak.API.Models.Channel channel1, uint value2); + public static partial uint SetMessageColor(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, uint value2); // GW::Chat::SetSenderColor [LibraryImport(DllName, EntryPoint = "?SetSenderColor@Chat@GW@@YAIW4Channel@12@I@Z")] - internal static partial uint SetSenderColor(global::Daybreak.API.Models.Channel channel1, uint value2); + public static partial uint SetSenderColor(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, uint value2); // GW::Chat::SetTimestampsColor [LibraryImport(DllName, EntryPoint = "?SetTimestampsColor@Chat@GW@@YAXI@Z")] - internal static partial void SetTimestampsColor(uint value); + public static partial void SetTimestampsColor(uint value); // GW::Chat::SetTimestampsFormat [LibraryImport(DllName, EntryPoint = "?SetTimestampsFormat@Chat@GW@@YAX_N0@Z")] - internal static partial void SetTimestampsFormat([MarshalAs(UnmanagedType.U1)] bool flag1, nint ptr2); + public static partial void SetTimestampsFormat([MarshalAs(UnmanagedType.U1)] bool flag1, nint ptr2); // GW::Chat::ToggleTimestamps [LibraryImport(DllName, EntryPoint = "?ToggleTimestamps@Chat@GW@@YAX_N@Z")] - internal static partial void ToggleTimestamps([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial void ToggleTimestamps([MarshalAs(UnmanagedType.U1)] bool flag); // GW::Chat::WriteChat [LibraryImport(DllName, EntryPoint = "?WriteChat@Chat@GW@@YAXW4Channel@12@PB_W1_N@Z")] - internal static partial void WriteChat(global::Daybreak.API.Models.Channel channel1, ushort* ptr2, nint ptr3, [MarshalAs(UnmanagedType.U1)] bool flag4); + public static partial void WriteChat(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, ushort* ptr2, nint ptr3, [MarshalAs(UnmanagedType.U1)] bool flag4); // GW::Chat::WriteChatEnc [LibraryImport(DllName, EntryPoint = "?WriteChatEnc@Chat@GW@@YAXW4Channel@12@PB_W1_N@Z")] - internal static partial void WriteChatEnc(global::Daybreak.API.Models.Channel channel1, ushort* ptr2, nint ptr3, [MarshalAs(UnmanagedType.U1)] bool flag4); + public static partial void WriteChatEnc(global::Daybreak.API.Interop.GWCA.GW.Chat.Channel channel1, ushort* ptr2, nint ptr3, [MarshalAs(UnmanagedType.U1)] bool flag4); // GW::Chat::WriteChatF — varargs, requires manual interop } - internal static partial class CheckboxFrame + public static partial class CheckboxFrame { // GW::CheckboxFrame::Create | returns TODO: map struct GW::CheckboxFrame // [LibraryImport(DllName, EntryPoint = "?Create@CheckboxFrame@GW@@SAPAU12@IIIPB_W0@Z")] - // internal static partial CheckboxFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); + // public static partial CheckboxFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); // GW::CheckboxFrame::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@CheckboxFrame@GW@@UAEIXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetValue(nint self); + public static partial void GetValue(nint self); // GW::CheckboxFrame::IsChecked [LibraryImport(DllName, EntryPoint = "?IsChecked@CheckboxFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double IsChecked(nint self); + public static partial double IsChecked(nint self); // GW::CheckboxFrame::SetChecked [LibraryImport(DllName, EntryPoint = "?SetChecked@CheckboxFrame@GW@@QAE_N_N@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetChecked(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial double SetChecked(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::CheckboxFrame::SetValue [LibraryImport(DllName, EntryPoint = "?SetValue@CheckboxFrame@GW@@UAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetValue(nint self, uint value2); + public static partial double SetValue(nint self, uint value2); } - internal static partial class DropdownFrame + public static partial class DropdownFrame { // GW::DropdownFrame::AddOption [LibraryImport(DllName, EntryPoint = "?AddOption@DropdownFrame@GW@@QAE_NPB_WI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double AddOption(nint self, ushort* ptr2, uint value3); + public static partial double AddOption(nint self, ushort* ptr2, uint value3); // GW::DropdownFrame::GetCount [LibraryImport(DllName, EntryPoint = "?GetCount@DropdownFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetCount(nint self, uint* ptr2); + public static partial double GetCount(nint self, uint* ptr2); // GW::DropdownFrame::GetOptionIndex [LibraryImport(DllName, EntryPoint = "?GetOptionIndex@DropdownFrame@GW@@QAE_NIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetOptionIndex(nint self, uint value2, uint* ptr3); + public static partial double GetOptionIndex(nint self, uint value2, uint* ptr3); // GW::DropdownFrame::GetOptionValue [LibraryImport(DllName, EntryPoint = "?GetOptionValue@DropdownFrame@GW@@QAE_NIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetOptionValue(nint self, uint value2, uint* ptr3); + public static partial double GetOptionValue(nint self, uint value2, uint* ptr3); // GW::DropdownFrame::GetOptions | returns TODO: map struct vector // [LibraryImport(DllName, EntryPoint = "?GetOptions@DropdownFrame@GW@@QAE?AV?$vector@IV?$allocator@I@std@@@std@@XZ")] // [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - // internal static partial vector* GetOptions(nint self, nint ptr2, nint ptr3, nint ptr4); + // public static partial vector* GetOptions(nint self, nint ptr2, nint ptr3, nint ptr4); // GW::DropdownFrame::GetSelectedIndex [LibraryImport(DllName, EntryPoint = "?GetSelectedIndex@DropdownFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetSelectedIndex(nint self, uint* ptr2); + public static partial double GetSelectedIndex(nint self, uint* ptr2); // GW::DropdownFrame::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@DropdownFrame@GW@@UAEIXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetValue(nint self); + public static partial void GetValue(nint self); // GW::DropdownFrame::HasValueMapping [LibraryImport(DllName, EntryPoint = "?HasValueMapping@DropdownFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double HasValueMapping(nint self); + public static partial double HasValueMapping(nint self); // GW::DropdownFrame::SelectIndex [LibraryImport(DllName, EntryPoint = "?SelectIndex@DropdownFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SelectIndex(nint self, uint value2); + public static partial double SelectIndex(nint self, uint value2); // GW::DropdownFrame::SelectOption [LibraryImport(DllName, EntryPoint = "?SelectOption@DropdownFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SelectOption(nint self, uint value2); + public static partial double SelectOption(nint self, uint value2); // GW::DropdownFrame::SetValue [LibraryImport(DllName, EntryPoint = "?SetValue@DropdownFrame@GW@@UAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetValue(nint self, uint value2); + public static partial double SetValue(nint self, uint value2); } - internal static partial class EditableTextFrame + public static partial class EditableTextFrame { // GW::EditableTextFrame::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@EditableTextFrame@GW@@QAEPB_WXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetValue(nint self, ushort value2); + public static partial nint GetValue(nint self, ushort value2); // GW::EditableTextFrame::IsReadOnly [LibraryImport(DllName, EntryPoint = "?IsReadOnly@EditableTextFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double IsReadOnly(nint self); + public static partial double IsReadOnly(nint self); // GW::EditableTextFrame::SetMaxLength [LibraryImport(DllName, EntryPoint = "?SetMaxLength@EditableTextFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetMaxLength(nint self, uint value2); + public static partial double SetMaxLength(nint self, uint value2); // GW::EditableTextFrame::SetReadOnly [LibraryImport(DllName, EntryPoint = "?SetReadOnly@EditableTextFrame@GW@@QAE_N_N@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetReadOnly(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial double SetReadOnly(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::EditableTextFrame::SetValue [LibraryImport(DllName, EntryPoint = "?SetValue@EditableTextFrame@GW@@QAE_NPB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetValue(nint self, ushort* ptr2); + public static partial double SetValue(nint self, ushort* ptr2); } - internal static partial class Effect + public static partial class Effect { // GW::Effect::GetTimeElapsed [LibraryImport(DllName, EntryPoint = "?GetTimeElapsed@Effect@GW@@QBEKXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetTimeElapsed(nint self); + public static partial void GetTimeElapsed(nint self); // GW::Effect::GetTimeRemaining [LibraryImport(DllName, EntryPoint = "?GetTimeRemaining@Effect@GW@@QBEKXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetTimeRemaining(nint self); + public static partial void GetTimeRemaining(nint self); } - internal static partial class Effects + public static partial class Effects { // GW::Effects::DropBuff [LibraryImport(DllName, EntryPoint = "?DropBuff@Effects@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DropBuff(uint value); + public static partial bool DropBuff(uint value); // GW::Effects::GetAgentBuffs [LibraryImport(DllName, EntryPoint = "?GetAgentBuffs@Effects@GW@@YAPAV?$Array@UBuff@GW@@@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentBuffs(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentBuffs(); // GW::Effects::GetAgentEffects [LibraryImport(DllName, EntryPoint = "?GetAgentEffects@Effects@GW@@YAPAV?$Array@UEffect@GW@@@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentEffects(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetAgentEffects(); // GW::Effects::GetAgentEffectsArray [LibraryImport(DllName, EntryPoint = "?GetAgentEffectsArray@Effects@GW@@YAPAUAgentEffects@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentEffects* GetAgentEffectsArray(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.AgentEffects* GetAgentEffectsArray(uint value); // GW::Effects::GetAlcoholLevel [LibraryImport(DllName, EntryPoint = "?GetAlcoholLevel@Effects@GW@@YAIXZ")] - internal static partial uint GetAlcoholLevel(); + public static partial uint GetAlcoholLevel(); // GW::Effects::GetDrunkAf [LibraryImport(DllName, EntryPoint = "?GetDrunkAf@Effects@GW@@YAXMI@Z")] - internal static partial void GetDrunkAf(float value1, uint value2); + public static partial void GetDrunkAf(float value1, uint value2); // GW::Effects::GetPartyEffectsArray [LibraryImport(DllName, EntryPoint = "?GetPartyEffectsArray@Effects@GW@@YAPAV?$Array@UAgentEffects@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPartyEffectsArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPartyEffectsArray(); - // GW::Effects::GetPlayerBuffBySkillId | value: enum GW::Constants::SkillID (as int) + // GW::Effects::GetPlayerBuffBySkillId [LibraryImport(DllName, EntryPoint = "?GetPlayerBuffBySkillId@Effects@GW@@YAPAUBuff@2@W4SkillID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Buff* GetPlayerBuffBySkillId(int value); + public static partial global::Daybreak.API.Interop.GuildWars.Buff* GetPlayerBuffBySkillId(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); // GW::Effects::GetPlayerBuffs [LibraryImport(DllName, EntryPoint = "?GetPlayerBuffs@Effects@GW@@YAPAV?$Array@UBuff@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerBuffs(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerBuffs(); - // GW::Effects::GetPlayerEffectBySkillId | value: enum GW::Constants::SkillID (as int) + // GW::Effects::GetPlayerEffectBySkillId [LibraryImport(DllName, EntryPoint = "?GetPlayerEffectBySkillId@Effects@GW@@YAPAUEffect@2@W4SkillID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Effect* GetPlayerEffectBySkillId(int value); + public static partial global::Daybreak.API.Interop.GuildWars.EffectData* GetPlayerEffectBySkillId(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); // GW::Effects::GetPlayerEffects [LibraryImport(DllName, EntryPoint = "?GetPlayerEffects@Effects@GW@@YAPAV?$Array@UEffect@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerEffects(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerEffects(); // GW::Effects::GetPlayerEffectsArray [LibraryImport(DllName, EntryPoint = "?GetPlayerEffectsArray@Effects@GW@@YAPAUAgentEffects@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.AgentEffects* GetPlayerEffectsArray(); + public static partial global::Daybreak.API.Interop.GuildWars.AgentEffects* GetPlayerEffectsArray(); } - internal static partial class EventMgr + public static partial class EventMgr { - // GW::EventMgr::RegisterEventCallback | value2: enum GW::EventMgr::EventID (as int) | function3: TODO: map struct function | value4: enum GW::EventMgr::EventID (as int) + // GW::EventMgr::RegisterEventCallback | function3: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterEventCallback@EventMgr@GW@@YAXPAUHookEntry@2@W4EventID@12@ABV?$function@$$A6AXPAUHookStatus@GW@@W4EventID@EventMgr@2@PAXI@Z@std@@H@Z")] - // internal static partial void RegisterEventCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, int value2, function* function3, int value4, void* ptr5, uint value6); + // public static partial void RegisterEventCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Interop.GWCA.GW.EventMgr.EventID eventID2, function* function3, global::Daybreak.API.Interop.GWCA.GW.EventMgr.EventID eventID4, void* ptr5, uint value6); - // GW::EventMgr::RemoveEventCallback | value2: enum GW::EventMgr::EventID (as int) + // GW::EventMgr::RemoveEventCallback [LibraryImport(DllName, EntryPoint = "?RemoveEventCallback@EventMgr@GW@@YAXPAUHookEntry@2@W4EventID@12@@Z")] - internal static partial void RemoveEventCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, int value2); + public static partial void RemoveEventCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Interop.GWCA.GW.EventMgr.EventID eventID2); } - internal static partial class FriendListMgr + public static partial class FriendListMgr { // GW::FriendListMgr::AddFriend [LibraryImport(DllName, EntryPoint = "?AddFriend@FriendListMgr@GW@@YA_NPB_W0@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddFriend(ushort* ptr1, nint ptr2); + public static partial bool AddFriend(ushort* ptr1, nint ptr2); // GW::FriendListMgr::AddIgnore [LibraryImport(DllName, EntryPoint = "?AddIgnore@FriendListMgr@GW@@YA_NPB_W0@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddIgnore(ushort* ptr1, nint ptr2); + public static partial bool AddIgnore(ushort* ptr1, nint ptr2); - // GW::FriendListMgr::ChangeFriendType | friend1: TODO: map struct GW::Friend | value2: enum GW::FriendType (as int) - // [LibraryImport(DllName, EntryPoint = "?ChangeFriendType@FriendListMgr@GW@@YA_NPAUFriend@2@W4FriendType@2@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool ChangeFriendType(Friend* friend1, int value2); + // GW::FriendListMgr::ChangeFriendType + [LibraryImport(DllName, EntryPoint = "?ChangeFriendType@FriendListMgr@GW@@YA_NPAUFriend@2@W4FriendType@2@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool ChangeFriendType(global::Daybreak.API.Interop.GuildWars.Friend* friend1, global::Daybreak.API.Interop.GWCA.GW.FriendType friendType2); - // GW::FriendListMgr::GetFriend | returns TODO: map struct GW::Friend - // [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@I@Z")] - // internal static partial Friend* GetFriend(uint value); + // GW::FriendListMgr::GetFriend + [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Friend* GetFriend(uint value); - // GW::FriendListMgr::GetFriend | returns TODO: map struct GW::Friend - // [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@PBE@Z")] - // internal static partial Friend* GetFriend(byte* ptr); + // GW::FriendListMgr::GetFriend + [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@PBE@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Friend* GetFriend(byte* ptr); - // GW::FriendListMgr::GetFriend | returns TODO: map struct GW::Friend | value3: enum GW::FriendType (as int) - // [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@PB_W0W4FriendType@2@@Z")] - // internal static partial Friend* GetFriend(ushort* ptr1, nint ptr2, int value3); + // GW::FriendListMgr::GetFriend + [LibraryImport(DllName, EntryPoint = "?GetFriend@FriendListMgr@GW@@YAPAUFriend@2@PB_W0W4FriendType@2@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Friend* GetFriend(ushort* ptr1, nint ptr2, global::Daybreak.API.Interop.GWCA.GW.FriendType friendType3); // GW::FriendListMgr::GetFriendList | returns TODO: map struct GW::FriendList // [LibraryImport(DllName, EntryPoint = "?GetFriendList@FriendListMgr@GW@@YAPAUFriendList@2@XZ")] - // internal static partial FriendList* GetFriendList(); + // public static partial FriendList* GetFriendList(); - // GW::FriendListMgr::GetMyStatus | returns enum GW::FriendStatus (as int) + // GW::FriendListMgr::GetMyStatus [LibraryImport(DllName, EntryPoint = "?GetMyStatus@FriendListMgr@GW@@YA?AW4FriendStatus@2@XZ")] - internal static partial int GetMyStatus(); + public static partial global::Daybreak.API.Interop.GWCA.GW.FriendStatus GetMyStatus(); - // GW::FriendListMgr::GetNumberOfFriends | value: enum GW::FriendType (as int) + // GW::FriendListMgr::GetNumberOfFriends [LibraryImport(DllName, EntryPoint = "?GetNumberOfFriends@FriendListMgr@GW@@YAIW4FriendType@2@@Z")] - internal static partial uint GetNumberOfFriends(int value); + public static partial uint GetNumberOfFriends(global::Daybreak.API.Interop.GWCA.GW.FriendType friendType); // GW::FriendListMgr::GetNumberOfIgnores [LibraryImport(DllName, EntryPoint = "?GetNumberOfIgnores@FriendListMgr@GW@@YAIXZ")] - internal static partial uint GetNumberOfIgnores(); + public static partial uint GetNumberOfIgnores(); // GW::FriendListMgr::GetNumberOfPartners [LibraryImport(DllName, EntryPoint = "?GetNumberOfPartners@FriendListMgr@GW@@YAIXZ")] - internal static partial uint GetNumberOfPartners(); + public static partial uint GetNumberOfPartners(); // GW::FriendListMgr::GetNumberOfTraders [LibraryImport(DllName, EntryPoint = "?GetNumberOfTraders@FriendListMgr@GW@@YAIXZ")] - internal static partial uint GetNumberOfTraders(); + public static partial uint GetNumberOfTraders(); - // GW::FriendListMgr::RegisterFriendStatusCallback | function2: TODO: map struct function | friend3: TODO: map struct GW::Friend + // GW::FriendListMgr::RegisterFriendStatusCallback | function2: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterFriendStatusCallback@FriendListMgr@GW@@YAXPAUHookEntry@2@ABV?$function@$$A6AXPAUHookStatus@GW@@PBUFriend@2@1@Z@std@@@Z")] - // internal static partial void RegisterFriendStatusCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, Friend* friend3, nint ptr4); + // public static partial void RegisterFriendStatusCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, global::Daybreak.API.Interop.GuildWars.Friend* friend3, nint ptr4); - // GW::FriendListMgr::RemoveFriend | friend: TODO: map struct GW::Friend - // [LibraryImport(DllName, EntryPoint = "?RemoveFriend@FriendListMgr@GW@@YA_NPAUFriend@2@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool RemoveFriend(Friend* friend); + // GW::FriendListMgr::RemoveFriend + [LibraryImport(DllName, EntryPoint = "?RemoveFriend@FriendListMgr@GW@@YA_NPAUFriend@2@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool RemoveFriend(global::Daybreak.API.Interop.GuildWars.Friend* friend); // GW::FriendListMgr::RemoveFriendStatusCallback [LibraryImport(DllName, EntryPoint = "?RemoveFriendStatusCallback@FriendListMgr@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveFriendStatusCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveFriendStatusCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); - // GW::FriendListMgr::SetFriendListStatus | value: enum GW::FriendStatus (as int) + // GW::FriendListMgr::SetFriendListStatus [LibraryImport(DllName, EntryPoint = "?SetFriendListStatus@FriendListMgr@GW@@YA_NW4FriendStatus@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFriendListStatus(int value); + public static partial bool SetFriendListStatus(global::Daybreak.API.Interop.GWCA.GW.FriendStatus friendStatus); } - internal static partial class GameThread + public static partial class GameThread { // GW::GameThread::ClearCalls [LibraryImport(DllName, EntryPoint = "?ClearCalls@GameThread@GW@@YAXXZ")] - internal static partial void ClearCalls(); + public static partial void ClearCalls(); // GW::GameThread::EnableHooks [LibraryImport(DllName, EntryPoint = "?EnableHooks@GameThread@GW@@YAXXZ")] - internal static partial void EnableHooks(); + public static partial void EnableHooks(); // GW::GameThread::Enqueue | via C export [LibraryImport(DllName, EntryPoint = "Enqueue")] - internal static partial void Enqueue(nint function1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial void Enqueue(nint function1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::GameThread::IsInGameThread [LibraryImport(DllName, EntryPoint = "?IsInGameThread@GameThread@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsInGameThread(); + public static partial bool IsInGameThread(); // GW::GameThread::RegisterGameThreadCallback | via C export [LibraryImport(DllName, EntryPoint = "RegisterGameThreadCallback")] - internal static partial void RegisterGameThreadCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, nint function2); + public static partial void RegisterGameThreadCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, nint function2); // GW::GameThread::RemoveGameThreadCallback [LibraryImport(DllName, EntryPoint = "?RemoveGameThreadCallback@GameThread@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveGameThreadCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveGameThreadCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); } - internal static partial class GuildMgr + public static partial class GuildMgr { - // GW::GuildMgr::GetCurrentGH | returns TODO: map struct GW::Guild - // [LibraryImport(DllName, EntryPoint = "?GetCurrentGH@GuildMgr@GW@@YAPAUGuild@2@XZ")] - // internal static partial Guild* GetCurrentGH(); + // GW::GuildMgr::GetCurrentGH + [LibraryImport(DllName, EntryPoint = "?GetCurrentGH@GuildMgr@GW@@YAPAUGuild@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.Guild* GetCurrentGH(); // GW::GuildMgr::GetGuildArray - // [LibraryImport(DllName, EntryPoint = "?GetGuildArray@GuildMgr@GW@@YAPAV?$Array@PAUGuild@GW@@@2@XZ")] - // internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetGuildArray(); + [LibraryImport(DllName, EntryPoint = "?GetGuildArray@GuildMgr@GW@@YAPAV?$Array@PAUGuild@GW@@@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetGuildArray(); - // GW::GuildMgr::GetGuildInfo | returns TODO: map struct GW::Guild - // [LibraryImport(DllName, EntryPoint = "?GetGuildInfo@GuildMgr@GW@@YAPAUGuild@2@I@Z")] - // internal static partial Guild* GetGuildInfo(uint value); + // GW::GuildMgr::GetGuildInfo + [LibraryImport(DllName, EntryPoint = "?GetGuildInfo@GuildMgr@GW@@YAPAUGuild@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Guild* GetGuildInfo(uint value); - // GW::GuildMgr::GetPlayerGuild | returns TODO: map struct GW::Guild - // [LibraryImport(DllName, EntryPoint = "?GetPlayerGuild@GuildMgr@GW@@YAPAUGuild@2@XZ")] - // internal static partial Guild* GetPlayerGuild(); + // GW::GuildMgr::GetPlayerGuild + [LibraryImport(DllName, EntryPoint = "?GetPlayerGuild@GuildMgr@GW@@YAPAUGuild@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.Guild* GetPlayerGuild(); // GW::GuildMgr::GetPlayerGuildAnnouncement [LibraryImport(DllName, EntryPoint = "?GetPlayerGuildAnnouncement@GuildMgr@GW@@YAPA_WXZ")] - internal static partial ushort* GetPlayerGuildAnnouncement(); + public static partial ushort* GetPlayerGuildAnnouncement(); // GW::GuildMgr::GetPlayerGuildAnnouncer [LibraryImport(DllName, EntryPoint = "?GetPlayerGuildAnnouncer@GuildMgr@GW@@YAPA_WXZ")] - internal static partial ushort* GetPlayerGuildAnnouncer(); + public static partial ushort* GetPlayerGuildAnnouncer(); // GW::GuildMgr::GetPlayerGuildIndex [LibraryImport(DllName, EntryPoint = "?GetPlayerGuildIndex@GuildMgr@GW@@YAIXZ")] - internal static partial uint GetPlayerGuildIndex(); + public static partial uint GetPlayerGuildIndex(); // GW::GuildMgr::LeaveGH [LibraryImport(DllName, EntryPoint = "?LeaveGH@GuildMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LeaveGH(); + public static partial bool LeaveGH(); - // GW::GuildMgr::TravelGH | gHKey: TODO: map struct GW::GHKey - // [LibraryImport(DllName, EntryPoint = "?TravelGH@GuildMgr@GW@@YA_NUGHKey@2@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool TravelGH(GHKey gHKey); + // GW::GuildMgr::TravelGH + [LibraryImport(DllName, EntryPoint = "?TravelGH@GuildMgr@GW@@YA_NUGHKey@2@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool TravelGH(global::Daybreak.API.Interop.GuildWars.GHKey gHKey); // GW::GuildMgr::TravelGH [LibraryImport(DllName, EntryPoint = "?TravelGH@GuildMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool TravelGH(); + public static partial bool TravelGH(); } - internal static partial class Hook + public static partial class Hook { // GW::Hook::CreateHook [LibraryImport(DllName, EntryPoint = "?CreateHook@Hook@GW@@YAHPAPAXPAX0@Z")] - internal static partial int CreateHook(void* ptr1, void* ptr2, nint ptr3); + public static partial int CreateHook(void* ptr1, void* ptr2, nint ptr3); // GW::Hook::Deinitialize [LibraryImport(DllName, EntryPoint = "?Deinitialize@Hook@GW@@YAXXZ")] - internal static partial void Deinitialize(); + public static partial void Deinitialize(); // GW::Hook::DisableHooks [LibraryImport(DllName, EntryPoint = "?DisableHooks@Hook@GW@@YAXPAX@Z")] - internal static partial void DisableHooks(void* ptr); + public static partial void DisableHooks(void* ptr); // GW::Hook::EnableHooks [LibraryImport(DllName, EntryPoint = "?EnableHooks@Hook@GW@@YAXPAX@Z")] - internal static partial void EnableHooks(void* ptr); + public static partial void EnableHooks(void* ptr); // GW::Hook::EnterHook [LibraryImport(DllName, EntryPoint = "?EnterHook@Hook@GW@@YAXXZ")] - internal static partial void EnterHook(); + public static partial void EnterHook(); // GW::Hook::GetInHookCount [LibraryImport(DllName, EntryPoint = "?GetInHookCount@Hook@GW@@YAHXZ")] - internal static partial int GetInHookCount(); + public static partial int GetInHookCount(); // GW::Hook::Initialize [LibraryImport(DllName, EntryPoint = "?Initialize@Hook@GW@@YAXXZ")] - internal static partial void Initialize(); + public static partial void Initialize(); // GW::Hook::LeaveHook [LibraryImport(DllName, EntryPoint = "?LeaveHook@Hook@GW@@YAXXZ")] - internal static partial void LeaveHook(); + public static partial void LeaveHook(); // GW::Hook::RemoveHook [LibraryImport(DllName, EntryPoint = "?RemoveHook@Hook@GW@@YAXPAX@Z")] - internal static partial void RemoveHook(void* ptr); + public static partial void RemoveHook(void* ptr); } - internal static partial class Item + public static partial class Item { // GW::Item::GetIsMaterial [LibraryImport(DllName, EntryPoint = "?GetIsMaterial@Item@GW@@QBE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetIsMaterial(nint self); + public static partial double GetIsMaterial(nint self); // GW::Item::GetIsZcoin [LibraryImport(DllName, EntryPoint = "?GetIsZcoin@Item@GW@@QBE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetIsZcoin(nint self); + public static partial double GetIsZcoin(nint self); } - internal static partial class Items + public static partial class Items { // GW::Items::CanAccessXunlaiChest [LibraryImport(DllName, EntryPoint = "?CanAccessXunlaiChest@Items@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool CanAccessXunlaiChest(); + public static partial bool CanAccessXunlaiChest(); // GW::Items::CanInteractWithItem [LibraryImport(DllName, EntryPoint = "?CanInteractWithItem@Items@GW@@YA_NPBUItem@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool CanInteractWithItem(global::Daybreak.API.Interop.GuildWars.Item* item); + public static partial bool CanInteractWithItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct); // GW::Items::CountItemByModelId [LibraryImport(DllName, EntryPoint = "?CountItemByModelId@Items@GW@@YAIIHH@Z")] - internal static partial uint CountItemByModelId(uint value1, int value2, int value3); + public static partial uint CountItemByModelId(uint value1, int value2, int value3); // GW::Items::DepositGold [LibraryImport(DllName, EntryPoint = "?DepositGold@Items@GW@@YAII@Z")] - internal static partial uint DepositGold(uint value); + public static partial uint DepositGold(uint value); // GW::Items::DestroyItem [LibraryImport(DllName, EntryPoint = "?DestroyItem@Items@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DestroyItem(uint value); + public static partial bool DestroyItem(uint value); // GW::Items::DropGold [LibraryImport(DllName, EntryPoint = "?DropGold@Items@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DropGold(uint value); + public static partial bool DropGold(uint value); // GW::Items::DropItem [LibraryImport(DllName, EntryPoint = "?DropItem@Items@GW@@YA_NPBUItem@2@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DropItem(global::Daybreak.API.Interop.GuildWars.Item* item1, uint value2); + public static partial bool DropItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, uint value2); // GW::Items::EquipItem [LibraryImport(DllName, EntryPoint = "?EquipItem@Items@GW@@YA_NPBUItem@2@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool EquipItem(global::Daybreak.API.Interop.GuildWars.Item* item1, uint value2); + public static partial bool EquipItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, uint value2); // GW::Items::GetBag [LibraryImport(DllName, EntryPoint = "?GetBag@Items@GW@@YAPAUBag@2@W43Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Bag* GetBag(global::Daybreak.API.Interop.GuildWars.Bag bag); + public static partial global::Daybreak.API.Interop.GuildWars.BagStruct* GetBag(global::Daybreak.API.Interop.GWCA.GW.Constants.Bag bag); // GW::Items::GetBagArray [LibraryImport(DllName, EntryPoint = "?GetBagArray@Items@GW@@YAPAPAUBag@2@XZ")] - internal static partial void* GetBagArray(); + public static partial void* GetBagArray(); // GW::Items::GetBagByIndex [LibraryImport(DllName, EntryPoint = "?GetBagByIndex@Items@GW@@YAPAUBag@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Bag* GetBagByIndex(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.BagStruct* GetBagByIndex(uint value); - // GW::Items::GetCompositeModelInfo | returns TODO: map struct GW::CompositeModelInfo - // [LibraryImport(DllName, EntryPoint = "?GetCompositeModelInfo@Items@GW@@YAPBUCompositeModelInfo@2@I@Z")] - // internal static partial CompositeModelInfo* GetCompositeModelInfo(uint value); + // GW::Items::GetCompositeModelInfo + [LibraryImport(DllName, EntryPoint = "?GetCompositeModelInfo@Items@GW@@YAPBUCompositeModelInfo@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.CompositeModelInfo* GetCompositeModelInfo(uint value); // GW::Items::GetCompositeModelInfoArray | returns TODO: map struct BaseArray // [LibraryImport(DllName, EntryPoint = "?GetCompositeModelInfoArray@Items@GW@@YAABV?$BaseArray@UCompositeModelInfo@GW@@@2@XZ")] - // internal static partial BaseArray* GetCompositeModelInfoArray(); + // public static partial BaseArray* GetCompositeModelInfoArray(); - // GW::Items::GetEquipmentVisibility | returns enum GW::EquipmentStatus (as int) | value: enum GW::EquipmentType (as int) + // GW::Items::GetEquipmentVisibility [LibraryImport(DllName, EntryPoint = "?GetEquipmentVisibility@Items@GW@@YA?AW4EquipmentStatus@2@W4EquipmentType@2@@Z")] - internal static partial int GetEquipmentVisibility(int value); + public static partial global::Daybreak.API.Interop.GWCA.GW.EquipmentStatus GetEquipmentVisibility(global::Daybreak.API.Interop.GWCA.GW.EquipmentType equipmentType); // GW::Items::GetGoldAmountInStorage [LibraryImport(DllName, EntryPoint = "?GetGoldAmountInStorage@Items@GW@@YAIXZ")] - internal static partial uint GetGoldAmountInStorage(); + public static partial uint GetGoldAmountInStorage(); // GW::Items::GetGoldAmountOnCharacter [LibraryImport(DllName, EntryPoint = "?GetGoldAmountOnCharacter@Items@GW@@YAIXZ")] - internal static partial uint GetGoldAmountOnCharacter(); + public static partial uint GetGoldAmountOnCharacter(); // GW::Items::GetHoveredItem [LibraryImport(DllName, EntryPoint = "?GetHoveredItem@Items@GW@@YAPAUItem@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.Item* GetHoveredItem(); + public static partial global::Daybreak.API.Interop.GuildWars.ItemStruct* GetHoveredItem(); // GW::Items::GetInventory [LibraryImport(DllName, EntryPoint = "?GetInventory@Items@GW@@YAPAUInventory@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.Inventory* GetInventory(); + public static partial global::Daybreak.API.Interop.GuildWars.Inventory* GetInventory(); // GW::Items::GetIsStorageOpen [LibraryImport(DllName, EntryPoint = "?GetIsStorageOpen@Items@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsStorageOpen(); + public static partial bool GetIsStorageOpen(); // GW::Items::GetItemArray [LibraryImport(DllName, EntryPoint = "?GetItemArray@Items@GW@@YAPAV?$Array@PAUItem@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetItemArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetItemArray(); // GW::Items::GetItemById [LibraryImport(DllName, EntryPoint = "?GetItemById@Items@GW@@YAPAUItem@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Item* GetItemById(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.ItemStruct* GetItemById(uint value); // GW::Items::GetItemByModelId [LibraryImport(DllName, EntryPoint = "?GetItemByModelId@Items@GW@@YAPAUItem@2@IHH@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Item* GetItemByModelId(uint value1, int value2, int value3); + public static partial global::Daybreak.API.Interop.GuildWars.ItemStruct* GetItemByModelId(uint value1, int value2, int value3); // GW::Items::GetItemByModelIdAndModifiers [LibraryImport(DllName, EntryPoint = "?GetItemByModelIdAndModifiers@Items@GW@@YAPAUItem@2@IPBUItemModifier@2@IHH@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Item* GetItemByModelIdAndModifiers(uint value1, global::Daybreak.API.Interop.GuildWars.ItemModifier* itemModifier2, uint value3, int value4, int value5); + public static partial global::Daybreak.API.Interop.GuildWars.ItemStruct* GetItemByModelIdAndModifiers(uint value1, global::Daybreak.API.Interop.GuildWars.ItemModifier* itemModifier2, uint value3, int value4, int value5); // GW::Items::GetItemBySlot [LibraryImport(DllName, EntryPoint = "?GetItemBySlot@Items@GW@@YAPAUItem@2@PBUBag@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Item* GetItemBySlot(global::Daybreak.API.Interop.GuildWars.Bag* bag1, uint value2); + public static partial global::Daybreak.API.Interop.GuildWars.ItemStruct* GetItemBySlot(global::Daybreak.API.Interop.GuildWars.BagStruct* bag1, uint value2); - // GW::Items::GetItemFormula | returns TODO: map struct GW::ItemFormula - // [LibraryImport(DllName, EntryPoint = "?GetItemFormula@Items@GW@@YAPBUItemFormula@2@PBUItem@2@@Z")] - // internal static partial ItemFormula* GetItemFormula(global::Daybreak.API.Interop.GuildWars.Item* item); + // GW::Items::GetItemFormula + [LibraryImport(DllName, EntryPoint = "?GetItemFormula@Items@GW@@YAPBUItemFormula@2@PBUItem@2@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.ItemFormula* GetItemFormula(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct); - // GW::Items::GetMaterialSlot | returns enum GW::Constants::MaterialSlot (as int) + // GW::Items::GetMaterialSlot [LibraryImport(DllName, EntryPoint = "?GetMaterialSlot@Items@GW@@YA?AW4MaterialSlot@Constants@2@PBUItem@2@@Z")] - internal static partial int GetMaterialSlot(global::Daybreak.API.Interop.GuildWars.Item* item); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.MaterialSlot GetMaterialSlot(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct); // GW::Items::GetMaterialStorageStackSize [LibraryImport(DllName, EntryPoint = "?GetMaterialStorageStackSize@Items@GW@@YAIXZ")] - internal static partial uint GetMaterialStorageStackSize(); + public static partial uint GetMaterialStorageStackSize(); - // GW::Items::GetPvPItemInfo | returns TODO: map struct GW::PvPItemInfo - // [LibraryImport(DllName, EntryPoint = "?GetPvPItemInfo@Items@GW@@YAPBUPvPItemInfo@2@I@Z")] - // internal static partial PvPItemInfo* GetPvPItemInfo(uint value); + // GW::Items::GetPvPItemInfo + [LibraryImport(DllName, EntryPoint = "?GetPvPItemInfo@Items@GW@@YAPBUPvPItemInfo@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.PvPItemInfo* GetPvPItemInfo(uint value); // GW::Items::GetPvPItemInfoArray | returns TODO: map struct BaseArray // [LibraryImport(DllName, EntryPoint = "?GetPvPItemInfoArray@Items@GW@@YAABV?$BaseArray@UPvPItemInfo@GW@@@2@XZ")] - // internal static partial BaseArray* GetPvPItemInfoArray(); + // public static partial BaseArray* GetPvPItemInfoArray(); - // GW::Items::GetPvPItemUpgrade | returns TODO: map struct GW::PvPItemUpgradeInfo - // [LibraryImport(DllName, EntryPoint = "?GetPvPItemUpgrade@Items@GW@@YAPBUPvPItemUpgradeInfo@2@I@Z")] - // internal static partial PvPItemUpgradeInfo* GetPvPItemUpgrade(uint value); + // GW::Items::GetPvPItemUpgrade + [LibraryImport(DllName, EntryPoint = "?GetPvPItemUpgrade@Items@GW@@YAPBUPvPItemUpgradeInfo@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.PvPItemUpgradeInfo* GetPvPItemUpgrade(uint value); // GW::Items::GetPvPItemUpgradeEncodedDescription [LibraryImport(DllName, EntryPoint = "?GetPvPItemUpgradeEncodedDescription@Items@GW@@YA_NIPAPA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetPvPItemUpgradeEncodedDescription(uint value1, void* ptr2); + public static partial bool GetPvPItemUpgradeEncodedDescription(uint value1, void* ptr2); // GW::Items::GetPvPItemUpgradeEncodedName [LibraryImport(DllName, EntryPoint = "?GetPvPItemUpgradeEncodedName@Items@GW@@YA_NIPAPA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetPvPItemUpgradeEncodedName(uint value1, void* ptr2); + public static partial bool GetPvPItemUpgradeEncodedName(uint value1, void* ptr2); // GW::Items::GetPvPItemUpgradesArray | returns TODO: map struct BaseArray // [LibraryImport(DllName, EntryPoint = "?GetPvPItemUpgradesArray@Items@GW@@YAABV?$BaseArray@UPvPItemUpgradeInfo@GW@@@2@XZ")] - // internal static partial BaseArray* GetPvPItemUpgradesArray(); + // public static partial BaseArray* GetPvPItemUpgradesArray(); - // GW::Items::GetSalvageSessionInfo | returns TODO: map struct GW::SalvageSessionInfo - // [LibraryImport(DllName, EntryPoint = "?GetSalvageSessionInfo@Items@GW@@YAPAUSalvageSessionInfo@2@XZ")] - // internal static partial SalvageSessionInfo* GetSalvageSessionInfo(); + // GW::Items::GetSalvageSessionInfo + [LibraryImport(DllName, EntryPoint = "?GetSalvageSessionInfo@Items@GW@@YAPAUSalvageSessionInfo@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.SalvageSessionInfo* GetSalvageSessionInfo(); - // GW::Items::GetStoragePage | returns enum GW::Constants::StoragePane (as int) + // GW::Items::GetStoragePage [LibraryImport(DllName, EntryPoint = "?GetStoragePage@Items@GW@@YA?AW4StoragePane@Constants@2@XZ")] - internal static partial int GetStoragePage(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.StoragePane GetStoragePage(); // GW::Items::IdentifyItem [LibraryImport(DllName, EntryPoint = "?IdentifyItem@Items@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IdentifyItem(uint value1, uint value2); + public static partial bool IdentifyItem(uint value1, uint value2); // GW::Items::MoveItem [LibraryImport(DllName, EntryPoint = "?MoveItem@Items@GW@@YA_NPBUItem@2@0I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.Item* item1, nint ptr2, uint value3); + public static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, nint ptr2, uint value3); // GW::Items::MoveItem [LibraryImport(DllName, EntryPoint = "?MoveItem@Items@GW@@YA_NPBUItem@2@PBUBag@2@II@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.Item* item1, global::Daybreak.API.Interop.GuildWars.Bag* bag2, uint value3, uint value4); + public static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, global::Daybreak.API.Interop.GuildWars.BagStruct* bag2, uint value3, uint value4); // GW::Items::MoveItem [LibraryImport(DllName, EntryPoint = "?MoveItem@Items@GW@@YA_NPBUItem@2@W4Bag@Constants@2@II@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.Item* item1, global::Daybreak.API.Interop.GuildWars.Bag bag2, uint value3, uint value4); + public static partial bool MoveItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, global::Daybreak.API.Interop.GWCA.GW.Constants.Bag bag2, uint value3, uint value4); // GW::Items::OpenXunlaiWindow [LibraryImport(DllName, EntryPoint = "?OpenXunlaiWindow@Items@GW@@YA_N_N0@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool OpenXunlaiWindow([MarshalAs(UnmanagedType.U1)] bool flag1, nint ptr2); + public static partial bool OpenXunlaiWindow([MarshalAs(UnmanagedType.U1)] bool flag1, nint ptr2); // GW::Items::PickUpItem [LibraryImport(DllName, EntryPoint = "?PickUpItem@Items@GW@@YA_NPBUItem@2@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool PickUpItem(global::Daybreak.API.Interop.GuildWars.Item* item1, uint value2); + public static partial bool PickUpItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct1, uint value2); // GW::Items::PingWeaponSet [LibraryImport(DllName, EntryPoint = "?PingWeaponSet@Items@GW@@YA_NIII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool PingWeaponSet(uint value1, uint value2, uint value3); + public static partial bool PingWeaponSet(uint value1, uint value2, uint value3); - // GW::Items::RegisterItemClickCallback | function2: TODO: map struct function | kMouseAction3: TODO: map struct GW::UI::UIPacket::kMouseAction + // GW::Items::RegisterItemClickCallback | function2: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterItemClickCallback@Items@GW@@YAXPAUHookEntry@2@ABV?$function@$$A6AXPAUHookStatus@GW@@PAUkMouseAction@UIPacket@UI@2@PAUItem@2@@Z@std@@@Z")] - // internal static partial void RegisterItemClickCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, kMouseAction* kMouseAction3, global::Daybreak.API.Interop.GuildWars.Item* item4); + // public static partial void RegisterItemClickCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, global::Daybreak.API.Interop.GuildWars.kMouseAction* kMouseAction3, global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct4); // GW::Items::RemoveItemClickCallback [LibraryImport(DllName, EntryPoint = "?RemoveItemClickCallback@Items@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveItemClickCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveItemClickCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::Items::SalvageMaterials [LibraryImport(DllName, EntryPoint = "?SalvageMaterials@Items@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SalvageMaterials(); + public static partial bool SalvageMaterials(); // GW::Items::SalvageSessionCancel [LibraryImport(DllName, EntryPoint = "?SalvageSessionCancel@Items@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SalvageSessionCancel(); + public static partial bool SalvageSessionCancel(); // GW::Items::SalvageStart [LibraryImport(DllName, EntryPoint = "?SalvageStart@Items@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SalvageStart(uint value1, uint value2); + public static partial bool SalvageStart(uint value1, uint value2); - // GW::Items::SetEquipmentVisibility | value1: enum GW::EquipmentType (as int) | value2: enum GW::EquipmentStatus (as int) + // GW::Items::SetEquipmentVisibility [LibraryImport(DllName, EntryPoint = "?SetEquipmentVisibility@Items@GW@@YA_NW4EquipmentType@2@W4EquipmentStatus@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetEquipmentVisibility(int value1, int value2); + public static partial bool SetEquipmentVisibility(global::Daybreak.API.Interop.GWCA.GW.EquipmentType equipmentType1, global::Daybreak.API.Interop.GWCA.GW.EquipmentStatus equipmentStatus2); // GW::Items::UseItem [LibraryImport(DllName, EntryPoint = "?UseItem@Items@GW@@YA_NPBUItem@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UseItem(global::Daybreak.API.Interop.GuildWars.Item* item); + public static partial bool UseItem(global::Daybreak.API.Interop.GuildWars.ItemStruct* itemStruct); // GW::Items::UseItemByModelId [LibraryImport(DllName, EntryPoint = "?UseItemByModelId@Items@GW@@YA_NIHH@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UseItemByModelId(uint value1, int value2, int value3); + public static partial bool UseItemByModelId(uint value1, int value2, int value3); // GW::Items::WithdrawGold [LibraryImport(DllName, EntryPoint = "?WithdrawGold@Items@GW@@YAII@Z")] - internal static partial uint WithdrawGold(uint value); + public static partial uint WithdrawGold(uint value); } - internal static partial class Map + public static partial class Map { // GW::Map::CancelEnterChallenge [LibraryImport(DllName, EntryPoint = "?CancelEnterChallenge@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool CancelEnterChallenge(); + public static partial bool CancelEnterChallenge(); // GW::Map::CreateMapContext [LibraryImport(DllName, EntryPoint = "?CreateMapContext@Map@GW@@YAPAUMapContext@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.MapContext* CreateMapContext(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.MapContext* CreateMapContext(uint value); // GW::Map::DestroyMapContext [LibraryImport(DllName, EntryPoint = "?DestroyMapContext@Map@GW@@YA_NPAUMapContext@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DestroyMapContext(global::Daybreak.API.Interop.GuildWars.MapContext* mapContext); + public static partial bool DestroyMapContext(global::Daybreak.API.Interop.GuildWars.MapContext* mapContext); // GW::Map::EnterChallenge [LibraryImport(DllName, EntryPoint = "?EnterChallenge@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool EnterChallenge(); + public static partial bool EnterChallenge(); // GW::Map::GetDistrict [LibraryImport(DllName, EntryPoint = "?GetDistrict@Map@GW@@YAHXZ")] - internal static partial int GetDistrict(); + public static partial int GetDistrict(); // GW::Map::GetFoesKilled [LibraryImport(DllName, EntryPoint = "?GetFoesKilled@Map@GW@@YAIXZ")] - internal static partial uint GetFoesKilled(); + public static partial uint GetFoesKilled(); // GW::Map::GetFoesToKill [LibraryImport(DllName, EntryPoint = "?GetFoesToKill@Map@GW@@YAIXZ")] - internal static partial uint GetFoesToKill(); + public static partial uint GetFoesToKill(); // GW::Map::GetInstanceTime [LibraryImport(DllName, EntryPoint = "?GetInstanceTime@Map@GW@@YAIXZ")] - internal static partial uint GetInstanceTime(); + public static partial uint GetInstanceTime(); // GW::Map::GetInstanceType [LibraryImport(DllName, EntryPoint = "?GetInstanceType@Map@GW@@YA?AW4InstanceType@Constants@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.InstanceType GetInstanceType(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.InstanceType GetInstanceType(); // GW::Map::GetIsInCinematic [LibraryImport(DllName, EntryPoint = "?GetIsInCinematic@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsInCinematic(); + public static partial bool GetIsInCinematic(); // GW::Map::GetIsMapLoaded [LibraryImport(DllName, EntryPoint = "?GetIsMapLoaded@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsMapLoaded(); + public static partial bool GetIsMapLoaded(); - // GW::Map::GetIsMapUnlocked | value: enum GW::Constants::MapID (as int) + // GW::Map::GetIsMapUnlocked [LibraryImport(DllName, EntryPoint = "?GetIsMapUnlocked@Map@GW@@YA_NW4MapID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsMapUnlocked(int value); + public static partial bool GetIsMapUnlocked(global::Daybreak.API.Interop.GWCA.GW.Constants.MapID mapID); // GW::Map::GetIsObserving [LibraryImport(DllName, EntryPoint = "?GetIsObserving@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsObserving(); + public static partial bool GetIsObserving(); // GW::Map::GetLanguage [LibraryImport(DllName, EntryPoint = "?GetLanguage@Map@GW@@YA?AW4Language@Constants@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.Language GetLanguage(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.Language GetLanguage(); - // GW::Map::GetMapID | returns enum GW::Constants::MapID (as int) + // GW::Map::GetMapID [LibraryImport(DllName, EntryPoint = "?GetMapID@Map@GW@@YA?AW4MapID@Constants@2@XZ")] - internal static partial int GetMapID(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.MapID GetMapID(); - // GW::Map::GetMapInfo | value: enum GW::Constants::MapID (as int) + // GW::Map::GetMapInfo [LibraryImport(DllName, EntryPoint = "?GetMapInfo@Map@GW@@YAPAUAreaInfo@2@W4MapID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AreaInfo* GetMapInfo(int value); + public static partial global::Daybreak.API.Interop.GuildWars.AreaInfo* GetMapInfo(global::Daybreak.API.Interop.GWCA.GW.Constants.MapID mapID); - // GW::Map::GetMissionMapContext | returns TODO: map struct GW::MissionMapContext - // [LibraryImport(DllName, EntryPoint = "?GetMissionMapContext@Map@GW@@YAPAUMissionMapContext@2@XZ")] - // internal static partial MissionMapContext* GetMissionMapContext(); + // GW::Map::GetMissionMapContext + [LibraryImport(DllName, EntryPoint = "?GetMissionMapContext@Map@GW@@YAPAUMissionMapContext@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.MissionMapContext* GetMissionMapContext(); // GW::Map::GetMissionMapIconArray - // [LibraryImport(DllName, EntryPoint = "?GetMissionMapIconArray@Map@GW@@YAPAV?$Array@UMissionMapIcon@GW@@@2@XZ")] - // internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetMissionMapIconArray(); + [LibraryImport(DllName, EntryPoint = "?GetMissionMapIconArray@Map@GW@@YAPAV?$Array@UMissionMapIcon@GW@@@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetMissionMapIconArray(); // GW::Map::GetPathingMap // [LibraryImport(DllName, EntryPoint = "?GetPathingMap@Map@GW@@YAPAV?$Array@UPathingMap@GW@@@2@XZ")] - // internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPathingMap(); + // public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPathingMap(); // GW::Map::GetRegion [LibraryImport(DllName, EntryPoint = "?GetRegion@Map@GW@@YA?AW4ServerRegion@Constants@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.ServerRegion GetRegion(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.ServerRegion GetRegion(); - // GW::Map::GetWorldMapContext | returns TODO: map struct GW::WorldMapContext - // [LibraryImport(DllName, EntryPoint = "?GetWorldMapContext@Map@GW@@YAPAUWorldMapContext@2@XZ")] - // internal static partial WorldMapContext* GetWorldMapContext(); + // GW::Map::GetWorldMapContext + [LibraryImport(DllName, EntryPoint = "?GetWorldMapContext@Map@GW@@YAPAUWorldMapContext@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.WorldMapContext* GetWorldMapContext(); // GW::Map::LanguageFromDistrict [LibraryImport(DllName, EntryPoint = "?LanguageFromDistrict@Map@GW@@YA?AW4Language@Constants@2@W4District@42@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Language LanguageFromDistrict(global::Daybreak.API.Interop.GuildWars.District district); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.Language LanguageFromDistrict(global::Daybreak.API.Interop.GWCA.GW.Constants.District district); // GW::Map::QueryAltitude [LibraryImport(DllName, EntryPoint = "?QueryAltitude@Map@GW@@YAMPBUGamePos@2@MPAUMapContext@2@@Z")] - internal static partial float QueryAltitude(global::Daybreak.API.Interop.GuildWars.GamePos* gamePos1, float value2, global::Daybreak.API.Interop.GuildWars.MapContext* mapContext3); + public static partial float QueryAltitude(global::Daybreak.API.Interop.GuildWars.GamePos* gamePos1, float value2, global::Daybreak.API.Interop.GuildWars.MapContext* mapContext3); // GW::Map::RegionFromDistrict [LibraryImport(DllName, EntryPoint = "?RegionFromDistrict@Map@GW@@YA?AW4ServerRegion@Constants@2@W4District@42@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.ServerRegion RegionFromDistrict(global::Daybreak.API.Interop.GuildWars.District district); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.ServerRegion RegionFromDistrict(global::Daybreak.API.Interop.GWCA.GW.Constants.District district); // GW::Map::SkipCinematic [LibraryImport(DllName, EntryPoint = "?SkipCinematic@Map@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SkipCinematic(); + public static partial bool SkipCinematic(); - // GW::Map::Travel | value1: enum GW::Constants::MapID (as int) + // GW::Map::Travel [LibraryImport(DllName, EntryPoint = "?Travel@Map@GW@@YA_NW4MapID@Constants@2@W4District@42@H@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Travel(int value1, global::Daybreak.API.Interop.GuildWars.District district2, int value3); + public static partial bool Travel(global::Daybreak.API.Interop.GWCA.GW.Constants.MapID mapID1, global::Daybreak.API.Interop.GWCA.GW.Constants.District district2, int value3); - // GW::Map::Travel | value1: enum GW::Constants::MapID (as int) + // GW::Map::Travel [LibraryImport(DllName, EntryPoint = "?Travel@Map@GW@@YA_NW4MapID@Constants@2@W4ServerRegion@42@HW4Language@42@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Travel(int value1, global::Daybreak.API.Interop.GuildWars.ServerRegion serverRegion2, int value3, global::Daybreak.API.Interop.GuildWars.Language language4); + public static partial bool Travel(global::Daybreak.API.Interop.GWCA.GW.Constants.MapID mapID1, global::Daybreak.API.Interop.GWCA.GW.Constants.ServerRegion serverRegion2, int value3, global::Daybreak.API.Interop.GWCA.GW.Constants.Language language4); } - internal static partial class MemoryMgr + public static partial class MemoryMgr { // GW::MemoryMgr::GetGWVersion [LibraryImport(DllName, EntryPoint = "?GetGWVersion@MemoryMgr@GW@@YAIXZ")] - internal static partial uint GetGWVersion(); + public static partial uint GetGWVersion(); // GW::MemoryMgr::GetGWWindowHandle [LibraryImport(DllName, EntryPoint = "?GetGWWindowHandle@MemoryMgr@GW@@YAPAUHWND__@@XZ")] - internal static partial global::Daybreak.API.Interop.GWHwnd* GetGWWindowHandle(); + public static partial global::Daybreak.API.Interop.GWHwnd* GetGWWindowHandle(); // GW::MemoryMgr::GetPersonalDir [LibraryImport(DllName, EntryPoint = "?GetPersonalDir@MemoryMgr@GW@@YA_NIPA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetPersonalDir(uint value1, ushort* ptr2); + public static partial bool GetPersonalDir(uint value1, ushort* ptr2); // GW::MemoryMgr::GetSkillTimer [LibraryImport(DllName, EntryPoint = "?GetSkillTimer@MemoryMgr@GW@@YAKXZ")] - internal static partial uint GetSkillTimer(); + public static partial uint GetSkillTimer(); // GW::MemoryMgr::MemAlloc [LibraryImport(DllName, EntryPoint = "?MemAlloc@MemoryMgr@GW@@YAPAXI@Z")] - internal static partial void* MemAlloc(uint value); + public static partial void* MemAlloc(uint value); // GW::MemoryMgr::MemFree [LibraryImport(DllName, EntryPoint = "?MemFree@MemoryMgr@GW@@YAXPAX@Z")] - internal static partial void MemFree(void* ptr); + public static partial void MemFree(void* ptr); // GW::MemoryMgr::MemRealloc [LibraryImport(DllName, EntryPoint = "?MemRealloc@MemoryMgr@GW@@YAPAXPAXI@Z")] - internal static partial void* MemRealloc(void* ptr1, uint value2); + public static partial void* MemRealloc(void* ptr1, uint value2); } - internal static partial class MemoryPatcher + public static partial class MemoryPatcher { // GW::MemoryPatcher::DisableHooks [LibraryImport(DllName, EntryPoint = "?DisableHooks@MemoryPatcher@GW@@SAXXZ")] - internal static partial void DisableHooks(); + public static partial void DisableHooks(); // GW::MemoryPatcher::EnableHooks [LibraryImport(DllName, EntryPoint = "?EnableHooks@MemoryPatcher@GW@@SAXXZ")] - internal static partial void EnableHooks(); + public static partial void EnableHooks(); // GW::MemoryPatcher::Reset [LibraryImport(DllName, EntryPoint = "?Reset@MemoryPatcher@GW@@QAEXXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void Reset(nint self); + public static partial void Reset(nint self); // GW::MemoryPatcher::SetPatch [LibraryImport(DllName, EntryPoint = "?SetPatch@MemoryPatcher@GW@@QAEXIPBDI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint SetPatch(nint self, byte* ptr2, uint value3); + public static partial uint SetPatch(nint self, byte* ptr2, uint value3); // GW::MemoryPatcher::SetRedirect [LibraryImport(DllName, EntryPoint = "?SetRedirect@MemoryPatcher@GW@@QAE_NIPAX@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetRedirect(nint self, uint value2, void* ptr3); + public static partial double SetRedirect(nint self, uint value2, void* ptr3); // GW::MemoryPatcher::TogglePatch [LibraryImport(DllName, EntryPoint = "?TogglePatch@MemoryPatcher@GW@@QAE_N_N@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double TogglePatch(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial double TogglePatch(nint self, [MarshalAs(UnmanagedType.U1)] bool flag2); } - internal static partial class Merchant + public static partial class Merchant { - // GW::Merchant::GetMerchantItems | value1: enum GW::Merchant::TransactionType (as int) + // GW::Merchant::GetMerchantItems [LibraryImport(DllName, EntryPoint = "?GetMerchantItems@Merchant@GW@@YAIW4TransactionType@12@IPAI@Z")] - internal static partial uint GetMerchantItems(int value1, uint value2, uint* ptr3); + public static partial uint GetMerchantItems(global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType transactionType1, uint value2, uint* ptr3); - // GW::Merchant::RequestQuote | value1: enum GW::Merchant::TransactionType (as int) + // GW::Merchant::RequestQuote [LibraryImport(DllName, EntryPoint = "?RequestQuote@Merchant@GW@@YA_NW4TransactionType@12@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RequestQuote(int value1, uint value2); + public static partial bool RequestQuote(global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType transactionType1, uint value2); // GW::Merchant::TransactItems [LibraryImport(DllName, EntryPoint = "?TransactItems@Merchant@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool TransactItems(); + public static partial bool TransactItems(); } - internal static partial class MultiLineTextLabelFrame + public static partial class MultiLineTextLabelFrame { // GW::MultiLineTextLabelFrame::GetDecodedLabel [LibraryImport(DllName, EntryPoint = "?GetDecodedLabel@MultiLineTextLabelFrame@GW@@QAEPB_WXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetDecodedLabel(nint self, ushort value2); + public static partial nint GetDecodedLabel(nint self, ushort value2); // GW::MultiLineTextLabelFrame::GetEncodedLabel [LibraryImport(DllName, EntryPoint = "?GetEncodedLabel@MultiLineTextLabelFrame@GW@@QAEPB_WXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetEncodedLabel(nint self, ushort value2); + public static partial nint GetEncodedLabel(nint self, ushort value2); // GW::MultiLineTextLabelFrame::SetLabel [LibraryImport(DllName, EntryPoint = "?SetLabel@MultiLineTextLabelFrame@GW@@QAE_NPB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetLabel(nint self, ushort* ptr2); + public static partial double SetLabel(nint self, ushort* ptr2); } - internal static partial class PartyMgr + public static partial class PartyMgr { // GW::PartyMgr::AddHenchman [LibraryImport(DllName, EntryPoint = "?AddHenchman@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddHenchman(uint value); + public static partial bool AddHenchman(uint value); - // GW::PartyMgr::AddHero | value: enum GW::Constants::HeroID (as int) + // GW::PartyMgr::AddHero [LibraryImport(DllName, EntryPoint = "?AddHero@PartyMgr@GW@@YA_NW4HeroID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddHero(int value); + public static partial bool AddHero(global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID heroID); // GW::PartyMgr::FlagAll [LibraryImport(DllName, EntryPoint = "?FlagAll@PartyMgr@GW@@YA_NUGamePos@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool FlagAll(global::Daybreak.API.Interop.GuildWars.GamePos gamePos); + public static partial bool FlagAll(global::Daybreak.API.Interop.GuildWars.GamePos gamePos); // GW::PartyMgr::FlagHero [LibraryImport(DllName, EntryPoint = "?FlagHero@PartyMgr@GW@@YA_NIUGamePos@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool FlagHero(uint value1, global::Daybreak.API.Interop.GuildWars.GamePos gamePos2); + public static partial bool FlagHero(uint value1, global::Daybreak.API.Interop.GuildWars.GamePos gamePos2); // GW::PartyMgr::GetAgentAttributes [LibraryImport(DllName, EntryPoint = "?GetAgentAttributes@PartyMgr@GW@@YAPAUAttribute@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AttributeContext* GetAgentAttributes(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.AttributeStruct* GetAgentAttributes(uint value); // GW::PartyMgr::GetHeroAgentID [LibraryImport(DllName, EntryPoint = "?GetHeroAgentID@PartyMgr@GW@@YAII@Z")] - internal static partial uint GetHeroAgentID(uint value); + public static partial uint GetHeroAgentID(uint value); - // GW::PartyMgr::GetHeroConstData | returns TODO: map struct GW::HeroConstData | value: enum GW::Constants::HeroID (as int) - // [LibraryImport(DllName, EntryPoint = "?GetHeroConstData@PartyMgr@GW@@YAPAUHeroConstData@2@W4HeroID@Constants@2@@Z")] - // internal static partial HeroConstData* GetHeroConstData(int value); + // GW::PartyMgr::GetHeroConstData + [LibraryImport(DllName, EntryPoint = "?GetHeroConstData@PartyMgr@GW@@YAPAUHeroConstData@2@W4HeroID@Constants@2@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.HeroConstData* GetHeroConstData(global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID heroID); - // GW::PartyMgr::GetHeroInfo | value: enum GW::Constants::HeroID (as int) + // GW::PartyMgr::GetHeroInfo [LibraryImport(DllName, EntryPoint = "?GetHeroInfo@PartyMgr@GW@@YAPAUHeroInfo@2@W4HeroID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.HeroInfo* GetHeroInfo(int value); + public static partial global::Daybreak.API.Interop.GuildWars.HeroInfo* GetHeroInfo(global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID heroID); // GW::PartyMgr::GetIsHardModeUnlocked [LibraryImport(DllName, EntryPoint = "?GetIsHardModeUnlocked@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsHardModeUnlocked(); + public static partial bool GetIsHardModeUnlocked(); // GW::PartyMgr::GetIsLeader [LibraryImport(DllName, EntryPoint = "?GetIsLeader@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsLeader(); + public static partial bool GetIsLeader(); // GW::PartyMgr::GetIsPartyDefeated [LibraryImport(DllName, EntryPoint = "?GetIsPartyDefeated@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsPartyDefeated(); + public static partial bool GetIsPartyDefeated(); // GW::PartyMgr::GetIsPartyInHardMode [LibraryImport(DllName, EntryPoint = "?GetIsPartyInHardMode@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsPartyInHardMode(); + public static partial bool GetIsPartyInHardMode(); // GW::PartyMgr::GetIsPartyLoaded [LibraryImport(DllName, EntryPoint = "?GetIsPartyLoaded@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsPartyLoaded(); + public static partial bool GetIsPartyLoaded(); // GW::PartyMgr::GetIsPartyTicked [LibraryImport(DllName, EntryPoint = "?GetIsPartyTicked@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsPartyTicked(); + public static partial bool GetIsPartyTicked(); // GW::PartyMgr::GetIsPlayerTicked [LibraryImport(DllName, EntryPoint = "?GetIsPlayerTicked@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsPlayerTicked(uint value); + public static partial bool GetIsPlayerTicked(uint value); // GW::PartyMgr::GetPartyHenchmanCount [LibraryImport(DllName, EntryPoint = "?GetPartyHenchmanCount@PartyMgr@GW@@YAIXZ")] - internal static partial uint GetPartyHenchmanCount(); + public static partial uint GetPartyHenchmanCount(); // GW::PartyMgr::GetPartyHeroCount [LibraryImport(DllName, EntryPoint = "?GetPartyHeroCount@PartyMgr@GW@@YAIXZ")] - internal static partial uint GetPartyHeroCount(); + public static partial uint GetPartyHeroCount(); // GW::PartyMgr::GetPartyInfo [LibraryImport(DllName, EntryPoint = "?GetPartyInfo@PartyMgr@GW@@YAPAUPartyInfo@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.PartyInfo* GetPartyInfo(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.PartyInfo* GetPartyInfo(uint value); // GW::PartyMgr::GetPartyPlayerCount [LibraryImport(DllName, EntryPoint = "?GetPartyPlayerCount@PartyMgr@GW@@YAIXZ")] - internal static partial uint GetPartyPlayerCount(); + public static partial uint GetPartyPlayerCount(); // GW::PartyMgr::GetPartySearch [LibraryImport(DllName, EntryPoint = "?GetPartySearch@PartyMgr@GW@@YAPAUPartySearch@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.PartySearch* GetPartySearch(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.PartySearch* GetPartySearch(uint value); // GW::PartyMgr::GetPartySize [LibraryImport(DllName, EntryPoint = "?GetPartySize@PartyMgr@GW@@YAIXZ")] - internal static partial uint GetPartySize(); + public static partial uint GetPartySize(); // GW::PartyMgr::GetPetInfo [LibraryImport(DllName, EntryPoint = "?GetPetInfo@PartyMgr@GW@@YAPAUPetInfo@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.PetContext* GetPetInfo(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.PetInfo* GetPetInfo(uint value); // GW::PartyMgr::InvitePlayer [LibraryImport(DllName, EntryPoint = "?InvitePlayer@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool InvitePlayer(uint value); + public static partial bool InvitePlayer(uint value); // GW::PartyMgr::InvitePlayer [LibraryImport(DllName, EntryPoint = "?InvitePlayer@PartyMgr@GW@@YA_NPB_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool InvitePlayer(ushort* ptr); + public static partial bool InvitePlayer(ushort* ptr); // GW::PartyMgr::KickAllHeroes [LibraryImport(DllName, EntryPoint = "?KickAllHeroes@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool KickAllHeroes(); + public static partial bool KickAllHeroes(); // GW::PartyMgr::KickHenchman [LibraryImport(DllName, EntryPoint = "?KickHenchman@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool KickHenchman(uint value); + public static partial bool KickHenchman(uint value); - // GW::PartyMgr::KickHero | value: enum GW::Constants::HeroID (as int) + // GW::PartyMgr::KickHero [LibraryImport(DllName, EntryPoint = "?KickHero@PartyMgr@GW@@YA_NW4HeroID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool KickHero(int value); + public static partial bool KickHero(global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID heroID); // GW::PartyMgr::KickPlayer [LibraryImport(DllName, EntryPoint = "?KickPlayer@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool KickPlayer(uint value); + public static partial bool KickPlayer(uint value); // GW::PartyMgr::LeaveParty [LibraryImport(DllName, EntryPoint = "?LeaveParty@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LeaveParty(); + public static partial bool LeaveParty(); // GW::PartyMgr::RespondToPartyRequest [LibraryImport(DllName, EntryPoint = "?RespondToPartyRequest@PartyMgr@GW@@YA_NI_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RespondToPartyRequest(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool RespondToPartyRequest(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::PartyMgr::ReturnToOutpost [LibraryImport(DllName, EntryPoint = "?ReturnToOutpost@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ReturnToOutpost(); + public static partial bool ReturnToOutpost(); // GW::PartyMgr::SearchParty [LibraryImport(DllName, EntryPoint = "?SearchParty@PartyMgr@GW@@YA_NIPB_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SearchParty(uint value1, ushort* ptr2); + public static partial bool SearchParty(uint value1, ushort* ptr2); // GW::PartyMgr::SearchPartyCancel [LibraryImport(DllName, EntryPoint = "?SearchPartyCancel@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SearchPartyCancel(); + public static partial bool SearchPartyCancel(); // GW::PartyMgr::SearchPartyReply [LibraryImport(DllName, EntryPoint = "?SearchPartyReply@PartyMgr@GW@@YA_NI_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SearchPartyReply(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool SearchPartyReply(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::PartyMgr::SetHardMode [LibraryImport(DllName, EntryPoint = "?SetHardMode@PartyMgr@GW@@YA_N_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetHardMode([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial bool SetHardMode([MarshalAs(UnmanagedType.U1)] bool flag); // GW::PartyMgr::SetHeroBehavior [LibraryImport(DllName, EntryPoint = "?SetHeroBehavior@PartyMgr@GW@@YA_NIW4HeroBehavior@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetHeroBehavior(uint value1, global::Daybreak.API.Interop.GuildWars.Behavior behavior2); + public static partial bool SetHeroBehavior(uint value1, global::Daybreak.API.Interop.GWCA.GW.HeroBehavior heroBehavior2); // GW::PartyMgr::SetHeroTarget [LibraryImport(DllName, EntryPoint = "?SetHeroTarget@PartyMgr@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetHeroTarget(uint value1, uint value2); + public static partial bool SetHeroTarget(uint value1, uint value2); // GW::PartyMgr::SetPetBehavior [LibraryImport(DllName, EntryPoint = "?SetPetBehavior@PartyMgr@GW@@YA_NIW4HeroBehavior@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetPetBehavior(uint value1, global::Daybreak.API.Interop.GuildWars.Behavior behavior2); + public static partial bool SetPetBehavior(uint value1, global::Daybreak.API.Interop.GWCA.GW.HeroBehavior heroBehavior2); // GW::PartyMgr::SetTickToggle [LibraryImport(DllName, EntryPoint = "?SetTickToggle@PartyMgr@GW@@YAX_N@Z")] - internal static partial void SetTickToggle([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial void SetTickToggle([MarshalAs(UnmanagedType.U1)] bool flag); // GW::PartyMgr::Tick [LibraryImport(DllName, EntryPoint = "?Tick@PartyMgr@GW@@YA_N_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Tick([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial bool Tick([MarshalAs(UnmanagedType.U1)] bool flag); // GW::PartyMgr::UnflagAll [LibraryImport(DllName, EntryPoint = "?UnflagAll@PartyMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UnflagAll(); + public static partial bool UnflagAll(); // GW::PartyMgr::UnflagHero [LibraryImport(DllName, EntryPoint = "?UnflagHero@PartyMgr@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UnflagHero(uint value); + public static partial bool UnflagHero(uint value); } - internal static partial class PlayerMgr + public static partial class PlayerMgr { // GW::PlayerMgr::ChangeSecondProfession [LibraryImport(DllName, EntryPoint = "?ChangeSecondProfession@PlayerMgr@GW@@YA_NW4Profession@Constants@2@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ChangeSecondProfession(global::Daybreak.API.Interop.GuildWars.Profession profession1, uint value2); + public static partial bool ChangeSecondProfession(global::Daybreak.API.Interop.GWCA.GW.Constants.Profession profession1, uint value2); // GW::PlayerMgr::GetActiveTitle [LibraryImport(DllName, EntryPoint = "?GetActiveTitle@PlayerMgr@GW@@YAPAUTitle@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.TitleContext* GetActiveTitle(); + public static partial global::Daybreak.API.Interop.GuildWars.Title* GetActiveTitle(); - // GW::PlayerMgr::GetActiveTitleId | returns enum GW::Constants::TitleID (as int) + // GW::PlayerMgr::GetActiveTitleId [LibraryImport(DllName, EntryPoint = "?GetActiveTitleId@PlayerMgr@GW@@YA?AW4TitleID@Constants@2@XZ")] - internal static partial int GetActiveTitleId(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.TitleID GetActiveTitleId(); // GW::PlayerMgr::GetAmountOfPlayersInInstance [LibraryImport(DllName, EntryPoint = "?GetAmountOfPlayersInInstance@PlayerMgr@GW@@YAIXZ")] - internal static partial uint GetAmountOfPlayersInInstance(); + public static partial uint GetAmountOfPlayersInInstance(); // GW::PlayerMgr::GetPlayerAgentId [LibraryImport(DllName, EntryPoint = "?GetPlayerAgentId@PlayerMgr@GW@@YAII@Z")] - internal static partial uint GetPlayerAgentId(uint value); + public static partial uint GetPlayerAgentId(uint value); // GW::PlayerMgr::GetPlayerArray - // [LibraryImport(DllName, EntryPoint = "?GetPlayerArray@PlayerMgr@GW@@YAPAV?$Array@UPlayer@GW@@@2@XZ")] - // internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerArray(); + [LibraryImport(DllName, EntryPoint = "?GetPlayerArray@PlayerMgr@GW@@YAPAV?$Array@UPlayer@GW@@@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetPlayerArray(); - // GW::PlayerMgr::GetPlayerByID | returns TODO: map struct GW::Player - // [LibraryImport(DllName, EntryPoint = "?GetPlayerByID@PlayerMgr@GW@@YAPAUPlayer@2@I@Z")] - // internal static partial Player* GetPlayerByID(uint value); + // GW::PlayerMgr::GetPlayerByID + [LibraryImport(DllName, EntryPoint = "?GetPlayerByID@PlayerMgr@GW@@YAPAUPlayer@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Player* GetPlayerByID(uint value); - // GW::PlayerMgr::GetPlayerByName | returns TODO: map struct GW::Player - // [LibraryImport(DllName, EntryPoint = "?GetPlayerByName@PlayerMgr@GW@@YAPAUPlayer@2@PB_W@Z")] - // internal static partial Player* GetPlayerByName(ushort* ptr); + // GW::PlayerMgr::GetPlayerByName + [LibraryImport(DllName, EntryPoint = "?GetPlayerByName@PlayerMgr@GW@@YAPAUPlayer@2@PB_W@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Player* GetPlayerByName(ushort* ptr); // GW::PlayerMgr::GetPlayerName [LibraryImport(DllName, EntryPoint = "?GetPlayerName@PlayerMgr@GW@@YAPA_WI@Z")] - internal static partial ushort* GetPlayerName(uint value); + public static partial ushort* GetPlayerName(uint value); // GW::PlayerMgr::GetPlayerNumber [LibraryImport(DllName, EntryPoint = "?GetPlayerNumber@PlayerMgr@GW@@YAIXZ")] - internal static partial uint GetPlayerNumber(); + public static partial uint GetPlayerNumber(); - // GW::PlayerMgr::GetTitleData | value: enum GW::Constants::TitleID (as int) + // GW::PlayerMgr::GetTitleData [LibraryImport(DllName, EntryPoint = "?GetTitleData@PlayerMgr@GW@@YAPAUTitleClientData@2@W4TitleID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.TitleClientData* GetTitleData(int value); + public static partial global::Daybreak.API.Interop.GuildWars.TitleClientData* GetTitleData(global::Daybreak.API.Interop.GWCA.GW.Constants.TitleID titleID); - // GW::PlayerMgr::GetTitleTrack | value: enum GW::Constants::TitleID (as int) + // GW::PlayerMgr::GetTitleTrack [LibraryImport(DllName, EntryPoint = "?GetTitleTrack@PlayerMgr@GW@@YAPAUTitle@2@W4TitleID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.TitleContext* GetTitleTrack(int value); + public static partial global::Daybreak.API.Interop.GuildWars.Title* GetTitleTrack(global::Daybreak.API.Interop.GWCA.GW.Constants.TitleID titleID); // GW::PlayerMgr::RemoveActiveTitle [LibraryImport(DllName, EntryPoint = "?RemoveActiveTitle@PlayerMgr@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RemoveActiveTitle(); + public static partial bool RemoveActiveTitle(); - // GW::PlayerMgr::SetActiveTitle | value: enum GW::Constants::TitleID (as int) + // GW::PlayerMgr::SetActiveTitle [LibraryImport(DllName, EntryPoint = "?SetActiveTitle@PlayerMgr@GW@@YA_NW4TitleID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetActiveTitle(int value); + public static partial bool SetActiveTitle(global::Daybreak.API.Interop.GWCA.GW.Constants.TitleID titleID); // GW::PlayerMgr::SetPlayerName [LibraryImport(DllName, EntryPoint = "?SetPlayerName@PlayerMgr@GW@@YAPA_WIPB_W@Z")] - internal static partial ushort* SetPlayerName(uint value1, ushort* ptr2); + public static partial ushort* SetPlayerName(uint value1, ushort* ptr2); } - internal static partial class ProgressBar + public static partial class ProgressBar { // GW::ProgressBar::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@ProgressBar@GW@@UAEIXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetValue(nint self); + public static partial void GetValue(nint self); // GW::ProgressBar::SetColorId [LibraryImport(DllName, EntryPoint = "?SetColorId@ProgressBar@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetColorId(nint self, uint value2); + public static partial double SetColorId(nint self, uint value2); // GW::ProgressBar::SetMax [LibraryImport(DllName, EntryPoint = "?SetMax@ProgressBar@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetMax(nint self, uint value2); + public static partial double SetMax(nint self, uint value2); - // GW::ProgressBar::SetStyle | value2: enum GW::ProgressBar::ProgressBarStyle (as int) + // GW::ProgressBar::SetStyle [LibraryImport(DllName, EntryPoint = "?SetStyle@ProgressBar@GW@@QAE_NW4ProgressBarStyle@12@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetStyle(nint self, int value2); + public static partial double SetStyle(nint self, global::Daybreak.API.Interop.GWCA.GW.ProgressBarStyle progressBarStyle2); // GW::ProgressBar::SetValue [LibraryImport(DllName, EntryPoint = "?SetValue@ProgressBar@GW@@UAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetValue(nint self, uint value2); + public static partial double SetValue(nint self, uint value2); } - internal static partial class QuestMgr + public static partial class QuestMgr { // GW::QuestMgr::AbandonQuest [LibraryImport(DllName, EntryPoint = "?AbandonQuest@QuestMgr@GW@@YA_NPAUQuest@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AbandonQuest(global::Daybreak.API.Interop.GuildWars.QuestContext* questContext); + public static partial bool AbandonQuest(global::Daybreak.API.Interop.GuildWars.Quest* quest); - // GW::QuestMgr::AbandonQuestId | value: enum GW::Constants::QuestID (as int) + // GW::QuestMgr::AbandonQuestId [LibraryImport(DllName, EntryPoint = "?AbandonQuestId@QuestMgr@GW@@YA_NW4QuestID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AbandonQuestId(int value); + public static partial bool AbandonQuestId(global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID questID); // GW::QuestMgr::GetActiveQuest [LibraryImport(DllName, EntryPoint = "?GetActiveQuest@QuestMgr@GW@@YAPAUQuest@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.QuestContext* GetActiveQuest(); + public static partial global::Daybreak.API.Interop.GuildWars.Quest* GetActiveQuest(); - // GW::QuestMgr::GetActiveQuestId | returns enum GW::Constants::QuestID (as int) + // GW::QuestMgr::GetActiveQuestId [LibraryImport(DllName, EntryPoint = "?GetActiveQuestId@QuestMgr@GW@@YA?AW4QuestID@Constants@2@XZ")] - internal static partial int GetActiveQuestId(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID GetActiveQuestId(); - // GW::QuestMgr::GetQuest | value: enum GW::Constants::QuestID (as int) + // GW::QuestMgr::GetQuest [LibraryImport(DllName, EntryPoint = "?GetQuest@QuestMgr@GW@@YAPAUQuest@2@W4QuestID@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.QuestContext* GetQuest(int value); + public static partial global::Daybreak.API.Interop.GuildWars.Quest* GetQuest(global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID questID); - // GW::QuestMgr::GetQuestEntryGroupName | value1: enum GW::Constants::QuestID (as int) + // GW::QuestMgr::GetQuestEntryGroupName [LibraryImport(DllName, EntryPoint = "?GetQuestEntryGroupName@QuestMgr@GW@@YA_NW4QuestID@Constants@2@PA_WI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetQuestEntryGroupName(int value1, ushort* ptr2, uint value3); + public static partial bool GetQuestEntryGroupName(global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID questID1, ushort* ptr2, uint value3); // GW::QuestMgr::GetQuestLog [LibraryImport(DllName, EntryPoint = "?GetQuestLog@QuestMgr@GW@@YAPAV?$Array@UQuest@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetQuestLog(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetQuestLog(); // GW::QuestMgr::RequestQuestInfo [LibraryImport(DllName, EntryPoint = "?RequestQuestInfo@QuestMgr@GW@@YA_NPBUQuest@2@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RequestQuestInfo(global::Daybreak.API.Interop.GuildWars.QuestContext* questContext1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool RequestQuestInfo(global::Daybreak.API.Interop.GuildWars.Quest* quest1, [MarshalAs(UnmanagedType.U1)] bool flag2); - // GW::QuestMgr::RequestQuestInfoId | value1: enum GW::Constants::QuestID (as int) + // GW::QuestMgr::RequestQuestInfoId [LibraryImport(DllName, EntryPoint = "?RequestQuestInfoId@QuestMgr@GW@@YA_NW4QuestID@Constants@2@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RequestQuestInfoId(int value1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool RequestQuestInfoId(global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID questID1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::QuestMgr::SetActiveQuest [LibraryImport(DllName, EntryPoint = "?SetActiveQuest@QuestMgr@GW@@YA_NPAUQuest@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetActiveQuest(global::Daybreak.API.Interop.GuildWars.QuestContext* questContext); + public static partial bool SetActiveQuest(global::Daybreak.API.Interop.GuildWars.Quest* quest); - // GW::QuestMgr::SetActiveQuestId | value: enum GW::Constants::QuestID (as int) + // GW::QuestMgr::SetActiveQuestId [LibraryImport(DllName, EntryPoint = "?SetActiveQuestId@QuestMgr@GW@@YA_NW4QuestID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetActiveQuestId(int value); + public static partial bool SetActiveQuestId(global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID questID); } - internal static partial class Render + public static partial class Render { // GW::Render::EnableHooks [LibraryImport(DllName, EntryPoint = "?EnableHooks@Render@GW@@YAXXZ")] - internal static partial void EnableHooks(); + public static partial void EnableHooks(); // GW::Render::GetDevice | returns TODO: map struct IDirect3DDevice9 // [LibraryImport(DllName, EntryPoint = "?GetDevice@Render@GW@@YAPAUIDirect3DDevice9@@XZ")] - // internal static partial IDirect3DDevice9* GetDevice(); + // public static partial IDirect3DDevice9* GetDevice(); // GW::Render::GetFieldOfView [LibraryImport(DllName, EntryPoint = "?GetFieldOfView@Render@GW@@YAMXZ")] - internal static partial float GetFieldOfView(); + public static partial float GetFieldOfView(); // GW::Render::GetFrameLimit [LibraryImport(DllName, EntryPoint = "?GetFrameLimit@Render@GW@@YAIXZ")] - internal static partial uint GetFrameLimit(); + public static partial uint GetFrameLimit(); - // GW::Render::GetGraphicsRendererValue | value1: enum GW::Render::Metric (as int) + // GW::Render::GetGraphicsRendererValue [LibraryImport(DllName, EntryPoint = "?GetGraphicsRendererValue@Render@GW@@YAIW4Metric@12@I@Z")] - internal static partial uint GetGraphicsRendererValue(int value1, uint value2); + public static partial uint GetGraphicsRendererValue(global::Daybreak.API.Interop.GWCA.GW.Render.Metric metric1, uint value2); // GW::Render::GetIsFullscreen [LibraryImport(DllName, EntryPoint = "?GetIsFullscreen@Render@GW@@YAHXZ")] - internal static partial int GetIsFullscreen(); + public static partial int GetIsFullscreen(); // GW::Render::GetIsInRenderLoop [LibraryImport(DllName, EntryPoint = "?GetIsInRenderLoop@Render@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsInRenderLoop(); + public static partial bool GetIsInRenderLoop(); // GW::Render::GetRenderCallback [LibraryImport(DllName, EntryPoint = "?GetRenderCallback@Render@GW@@YAP6AXPAUIDirect3DDevice9@@@ZXZ")] - internal static partial nint GetRenderCallback(); + public static partial nint GetRenderCallback(); - // GW::Render::GetTransform | returns TODO: map struct GW::Render::Mat4x3f | value: enum GW::Render::Transform (as int) - // [LibraryImport(DllName, EntryPoint = "?GetTransform@Render@GW@@YAPAUMat4x3f@12@W4Transform@12@@Z")] - // internal static partial Mat4x3f* GetTransform(int value); + // GW::Render::GetTransform + [LibraryImport(DllName, EntryPoint = "?GetTransform@Render@GW@@YAPAUMat4x3f@12@W4Transform@12@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Mat4x3f* GetTransform(global::Daybreak.API.Interop.GWCA.GW.Render.Transform transform); // GW::Render::GetViewportHeight [LibraryImport(DllName, EntryPoint = "?GetViewportHeight@Render@GW@@YAIXZ")] - internal static partial uint GetViewportHeight(); + public static partial uint GetViewportHeight(); // GW::Render::GetViewportWidth [LibraryImport(DllName, EntryPoint = "?GetViewportWidth@Render@GW@@YAIXZ")] - internal static partial uint GetViewportWidth(); + public static partial uint GetViewportWidth(); // GW::Render::GetWindowHandle [LibraryImport(DllName, EntryPoint = "?GetWindowHandle@Render@GW@@YAPAUHWND__@@XZ")] - internal static partial global::Daybreak.API.Interop.GWHwnd* GetWindowHandle(); + public static partial global::Daybreak.API.Interop.GWHwnd* GetWindowHandle(); // GW::Render::SetFog [LibraryImport(DllName, EntryPoint = "?SetFog@Render@GW@@YA_N_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFog([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial bool SetFog([MarshalAs(UnmanagedType.U1)] bool flag); // GW::Render::SetFrameLimit [LibraryImport(DllName, EntryPoint = "?SetFrameLimit@Render@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFrameLimit(uint value); + public static partial bool SetFrameLimit(uint value); - // GW::Render::SetGraphicsRendererValue | value1: enum GW::Render::Metric (as int) + // GW::Render::SetGraphicsRendererValue [LibraryImport(DllName, EntryPoint = "?SetGraphicsRendererValue@Render@GW@@YA_NW4Metric@12@II@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetGraphicsRendererValue(int value1, uint value2, uint value3); + public static partial bool SetGraphicsRendererValue(global::Daybreak.API.Interop.GWCA.GW.Render.Metric metric1, uint value2, uint value3); // GW::Render::SetRenderCallback [LibraryImport(DllName, EntryPoint = "?SetRenderCallback@Render@GW@@YAXP6AXPAUIDirect3DDevice9@@@Z@Z")] - internal static partial void SetRenderCallback(nint callback); + public static partial void SetRenderCallback(nint callback); // GW::Render::SetResetCallback [LibraryImport(DllName, EntryPoint = "?SetResetCallback@Render@GW@@YAXP6AXPAUIDirect3DDevice9@@@Z@Z")] - internal static partial void SetResetCallback(nint callback); + public static partial void SetResetCallback(nint callback); } - internal static partial class Scanner + public static partial class Scanner { - // GW::Scanner::Find | value4: enum GW::ScannerSection (as int) + // GW::Scanner::Find [LibraryImport(DllName, EntryPoint = "?Find@Scanner@GW@@YAIPBD0HW4ScannerSection@2@@Z")] - internal static partial uint Find(byte* ptr1, nint ptr2, int value3, int value4); + public static partial uint Find(byte* ptr1, nint ptr2, int value3, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection4); // GW::Scanner::FindAssertion [LibraryImport(DllName, EntryPoint = "?FindAssertion@Scanner@GW@@YAIPBD0IH@Z")] - internal static partial uint FindAssertion(byte* ptr1, nint ptr2, uint value3, int value4); + public static partial uint FindAssertion(byte* ptr1, nint ptr2, uint value3, int value4); // GW::Scanner::FindInRange [LibraryImport(DllName, EntryPoint = "?FindInRange@Scanner@GW@@YAIPBD0HKK@Z")] - internal static partial uint FindInRange(byte* ptr1, nint ptr2, int value3, uint value4, uint value5); + public static partial uint FindInRange(byte* ptr1, nint ptr2, int value3, uint value4, uint value5); - // GW::Scanner::FindNthUseOfString | value4: enum GW::ScannerSection (as int) + // GW::Scanner::FindNthUseOfString [LibraryImport(DllName, EntryPoint = "?FindNthUseOfString@Scanner@GW@@YAIPBDIHW4ScannerSection@2@@Z")] - internal static partial uint FindNthUseOfString(byte* ptr1, uint value2, int value3, int value4); + public static partial uint FindNthUseOfString(byte* ptr1, uint value2, int value3, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection4); - // GW::Scanner::FindNthUseOfString | value4: enum GW::ScannerSection (as int) + // GW::Scanner::FindNthUseOfString [LibraryImport(DllName, EntryPoint = "?FindNthUseOfString@Scanner@GW@@YAIPB_WIHW4ScannerSection@2@@Z")] - internal static partial uint FindNthUseOfString(ushort* ptr1, uint value2, int value3, int value4); + public static partial uint FindNthUseOfString(ushort* ptr1, uint value2, int value3, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection4); - // GW::Scanner::FindUseOfString | value3: enum GW::ScannerSection (as int) + // GW::Scanner::FindUseOfString [LibraryImport(DllName, EntryPoint = "?FindUseOfString@Scanner@GW@@YAIPBDHW4ScannerSection@2@@Z")] - internal static partial uint FindUseOfString(byte* ptr1, int value2, int value3); + public static partial uint FindUseOfString(byte* ptr1, int value2, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection3); - // GW::Scanner::FindUseOfString | value3: enum GW::ScannerSection (as int) + // GW::Scanner::FindUseOfString [LibraryImport(DllName, EntryPoint = "?FindUseOfString@Scanner@GW@@YAIPB_WHW4ScannerSection@2@@Z")] - internal static partial uint FindUseOfString(ushort* ptr1, int value2, int value3); + public static partial uint FindUseOfString(ushort* ptr1, int value2, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection3); // GW::Scanner::FunctionFromNearCall [LibraryImport(DllName, EntryPoint = "?FunctionFromNearCall@Scanner@GW@@YAII_N@Z")] - internal static partial uint FunctionFromNearCall(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial uint FunctionFromNearCall(uint value1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::Scanner::GetGameTlsIndex [LibraryImport(DllName, EntryPoint = "?GetGameTlsIndex@Scanner@GW@@YAKXZ")] - internal static partial uint GetGameTlsIndex(); + public static partial uint GetGameTlsIndex(); - // GW::Scanner::GetSectionAddressRange | value1: enum GW::ScannerSection (as int) + // GW::Scanner::GetSectionAddressRange [LibraryImport(DllName, EntryPoint = "?GetSectionAddressRange@Scanner@GW@@YAXW4ScannerSection@2@PAI1@Z")] - internal static partial void GetSectionAddressRange(int value1, uint* ptr2, nint ptr3); + public static partial void GetSectionAddressRange(global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection1, uint* ptr2, nint ptr3); // GW::Scanner::Initialize | hINSTANCE__: TODO: map struct HINSTANCE__ // [LibraryImport(DllName, EntryPoint = "?Initialize@Scanner@GW@@YAXPAUHINSTANCE__@@@Z")] - // internal static partial void Initialize(HINSTANCE__* hINSTANCE__); + // public static partial void Initialize(HINSTANCE__* hINSTANCE__); // GW::Scanner::Initialize [LibraryImport(DllName, EntryPoint = "?Initialize@Scanner@GW@@YAXPBD@Z")] - internal static partial void Initialize(byte* ptr); + public static partial void Initialize(byte* ptr); - // GW::Scanner::IsValidPtr | value2: enum GW::ScannerSection (as int) + // GW::Scanner::IsValidPtr [LibraryImport(DllName, EntryPoint = "?IsValidPtr@Scanner@GW@@YA_NIW4ScannerSection@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsValidPtr(uint value1, int value2); + public static partial bool IsValidPtr(uint value1, global::Daybreak.API.Interop.GWCA.GW.ScannerSection scannerSection2); // GW::Scanner::ToFunctionStart [LibraryImport(DllName, EntryPoint = "?ToFunctionStart@Scanner@GW@@YAIII@Z")] - internal static partial uint ToFunctionStart(uint value1, uint value2); + public static partial uint ToFunctionStart(uint value1, uint value2); } - internal static partial class ScrollableFrame + public static partial class ScrollableFrame { // GW::ScrollableFrame::AddItem [LibraryImport(DllName, EntryPoint = "?AddItem@ScrollableFrame@GW@@QAE_NIIP6AXPAUInteractionMessage@UI@2@PAX1@Z@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double AddItem(nint self, uint value2, uint value3, nint callback4); + public static partial double AddItem(nint self, uint value2, uint value3, nint callback4); // GW::ScrollableFrame::ClearItems [LibraryImport(DllName, EntryPoint = "?ClearItems@ScrollableFrame@GW@@QAE_NXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double ClearItems(nint self); + public static partial double ClearItems(nint self); // GW::ScrollableFrame::Create | returns TODO: map struct GW::ScrollableFrame | scrollablePageContext4: TODO: map struct GW::ScrollableFrame::ScrollablePageContext // [LibraryImport(DllName, EntryPoint = "?Create@ScrollableFrame@GW@@SAPAU12@IIIPAUScrollablePageContext@12@PB_W@Z")] - // internal static partial ScrollableFrame* Create(uint value1, uint value2, uint value3, ScrollablePageContext* scrollablePageContext4, ushort* ptr5); + // public static partial ScrollableFrame* Create(uint value1, uint value2, uint value3, ScrollablePageContext* scrollablePageContext4, ushort* ptr5); // GW::ScrollableFrame::GetCount [LibraryImport(DllName, EntryPoint = "?GetCount@ScrollableFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetCount(nint self, uint* ptr2); + public static partial double GetCount(nint self, uint* ptr2); // GW::ScrollableFrame::GetFirstChildFrameId [LibraryImport(DllName, EntryPoint = "?GetFirstChildFrameId@ScrollableFrame@GW@@QAEIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint* GetFirstChildFrameId(nint self); + public static partial uint* GetFirstChildFrameId(nint self); // GW::ScrollableFrame::GetItemFrameId [LibraryImport(DllName, EntryPoint = "?GetItemFrameId@ScrollableFrame@GW@@QAEII@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint GetItemFrameId(nint self); + public static partial uint GetItemFrameId(nint self); // GW::ScrollableFrame::GetItemRect [LibraryImport(DllName, EntryPoint = "?GetItemRect@ScrollableFrame@GW@@QAE_NIQAM@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetItemRect(nint self, uint value2, float* ptr3); + public static partial double GetItemRect(nint self, uint value2, float* ptr3); // GW::ScrollableFrame::GetItems [LibraryImport(DllName, EntryPoint = "?GetItems@ScrollableFrame@GW@@QAEIPAII@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint* GetItems(nint self, uint value2); + public static partial uint* GetItems(nint self, uint value2); // GW::ScrollableFrame::GetLastChildFrameId [LibraryImport(DllName, EntryPoint = "?GetLastChildFrameId@ScrollableFrame@GW@@QAEIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint* GetLastChildFrameId(nint self); + public static partial uint* GetLastChildFrameId(nint self); // GW::ScrollableFrame::GetNextChildFrameId [LibraryImport(DllName, EntryPoint = "?GetNextChildFrameId@ScrollableFrame@GW@@QAEIIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint GetNextChildFrameId(nint self, uint* ptr2); + public static partial uint GetNextChildFrameId(nint self, uint* ptr2); // GW::ScrollableFrame::GetPage [LibraryImport(DllName, EntryPoint = "?GetPage@ScrollableFrame@GW@@QAEPAUFrame@UI@2@XZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetPage(nint self); + public static partial global::Daybreak.API.Interop.Frame* GetPage(nint self); // GW::ScrollableFrame::GetPrevChildFrameId [LibraryImport(DllName, EntryPoint = "?GetPrevChildFrameId@ScrollableFrame@GW@@QAEIIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial uint GetPrevChildFrameId(nint self, uint* ptr2); + public static partial uint GetPrevChildFrameId(nint self, uint* ptr2); // GW::ScrollableFrame::GetSelectedValue [LibraryImport(DllName, EntryPoint = "?GetSelectedValue@ScrollableFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetSelectedValue(nint self, uint* ptr2); + public static partial double GetSelectedValue(nint self, uint* ptr2); // GW::ScrollableFrame::GetSortHandler [LibraryImport(DllName, EntryPoint = "?GetSortHandler@ScrollableFrame@GW@@QAEP6AHII@ZXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetSortHandler(nint self, int* ptr2, uint value3, uint value4); + public static partial nint GetSortHandler(nint self, int* ptr2, uint value3, uint value4); // GW::ScrollableFrame::RemoveItem [LibraryImport(DllName, EntryPoint = "?RemoveItem@ScrollableFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double RemoveItem(nint self, uint value2); + public static partial double RemoveItem(nint self, uint value2); // GW::ScrollableFrame::SetPage | scrollablePageContext2: TODO: map struct GW::ScrollableFrame::ScrollablePageContext // [LibraryImport(DllName, EntryPoint = "?SetPage@ScrollableFrame@GW@@QAEPAUFrame@UI@2@PAUScrollablePageContext@12@@Z")] // [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - // internal static partial global::Daybreak.API.Interop.GuildWars.Frame* SetPage(nint self, ScrollablePageContext* scrollablePageContext2); + // public static partial global::Daybreak.API.Interop.Frame* SetPage(nint self, ScrollablePageContext* scrollablePageContext2); // GW::ScrollableFrame::SetSortHandler [LibraryImport(DllName, EntryPoint = "?SetSortHandler@ScrollableFrame@GW@@QAE_NP6AHII@Z@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetSortHandler(nint self, nint callback2); + public static partial double SetSortHandler(nint self, nint callback2); } - internal static partial class Skillbar + public static partial class Skillbar { - // GW::Skillbar::GetSkillById | value2: enum GW::Constants::SkillID (as int) + // GW::Skillbar::GetSkillById [LibraryImport(DllName, EntryPoint = "?GetSkillById@Skillbar@GW@@QAEPAUSkillbarSkill@2@W4SkillID@Constants@2@PAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.SkillContext* GetSkillById(nint self, int value2, uint* ptr3); + public static partial global::Daybreak.API.Interop.GuildWars.SkillbarSkillData* GetSkillById(nint self, global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID2, uint* ptr3); } - internal static partial class SkillbarMgr + public static partial class SkillbarMgr { // GW::SkillbarMgr::ChangeSecondProfession [LibraryImport(DllName, EntryPoint = "?ChangeSecondProfession@SkillbarMgr@GW@@YA_NIW4Profession@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ChangeSecondProfession(uint value1, global::Daybreak.API.Interop.GuildWars.Profession profession2); + public static partial bool ChangeSecondProfession(uint value1, global::Daybreak.API.Interop.GWCA.GW.Constants.Profession profession2); // GW::SkillbarMgr::DecodeSkillTemplate [LibraryImport(DllName, EntryPoint = "?DecodeSkillTemplate@SkillbarMgr@GW@@YA_NAAUSkillTemplate@12@PBD@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DecodeSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate1, byte* ptr2); + public static partial bool DecodeSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate1, byte* ptr2); // GW::SkillbarMgr::EncodeSkillTemplate [LibraryImport(DllName, EntryPoint = "?EncodeSkillTemplate@SkillbarMgr@GW@@YA_NABUSkillTemplate@12@PADI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool EncodeSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate1, byte* ptr2, uint value3); + public static partial bool EncodeSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate1, byte* ptr2, uint value3); // GW::SkillbarMgr::GetAttributeConstantData [LibraryImport(DllName, EntryPoint = "?GetAttributeConstantData@SkillbarMgr@GW@@YAPAUAttributeInfo@2@W4Attribute@Constants@2@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.AttributeInfo* GetAttributeConstantData(global::Daybreak.API.Interop.GuildWars.AttributeContext attributeContext); + public static partial global::Daybreak.API.Interop.GuildWars.AttributeInfo* GetAttributeConstantData(global::Daybreak.API.Interop.GWCA.GW.Constants.Attribute attribute); // GW::SkillbarMgr::GetHeroSkillbar [LibraryImport(DllName, EntryPoint = "?GetHeroSkillbar@SkillbarMgr@GW@@YAPAUSkillbar@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.SkillbarContext* GetHeroSkillbar(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.SkillbarData* GetHeroSkillbar(uint value); - // GW::SkillbarMgr::GetHoveredSkill | returns TODO: map struct GW::Skill - // [LibraryImport(DllName, EntryPoint = "?GetHoveredSkill@SkillbarMgr@GW@@YAPAUSkill@2@XZ")] - // internal static partial Skill* GetHoveredSkill(); + // GW::SkillbarMgr::GetHoveredSkill + [LibraryImport(DllName, EntryPoint = "?GetHoveredSkill@SkillbarMgr@GW@@YAPAUSkill@2@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.Skill* GetHoveredSkill(); - // GW::SkillbarMgr::GetIsSkillLearnt | value: enum GW::Constants::SkillID (as int) + // GW::SkillbarMgr::GetIsSkillLearnt [LibraryImport(DllName, EntryPoint = "?GetIsSkillLearnt@SkillbarMgr@GW@@YA_NW4SkillID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsSkillLearnt(int value); + public static partial bool GetIsSkillLearnt(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); - // GW::SkillbarMgr::GetIsSkillUnlocked | value: enum GW::Constants::SkillID (as int) + // GW::SkillbarMgr::GetIsSkillUnlocked [LibraryImport(DllName, EntryPoint = "?GetIsSkillUnlocked@SkillbarMgr@GW@@YA_NW4SkillID@Constants@2@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsSkillUnlocked(int value); + public static partial bool GetIsSkillUnlocked(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); // GW::SkillbarMgr::GetPlayerSkillbar [LibraryImport(DllName, EntryPoint = "?GetPlayerSkillbar@SkillbarMgr@GW@@YAPAUSkillbar@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.SkillbarContext* GetPlayerSkillbar(); + public static partial global::Daybreak.API.Interop.GuildWars.SkillbarData* GetPlayerSkillbar(); - // GW::SkillbarMgr::GetSkillConstantData | returns TODO: map struct GW::Skill | value: enum GW::Constants::SkillID (as int) - // [LibraryImport(DllName, EntryPoint = "?GetSkillConstantData@SkillbarMgr@GW@@YAPAUSkill@2@W4SkillID@Constants@2@@Z")] - // internal static partial Skill* GetSkillConstantData(int value); + // GW::SkillbarMgr::GetSkillConstantData + [LibraryImport(DllName, EntryPoint = "?GetSkillConstantData@SkillbarMgr@GW@@YAPAUSkill@2@W4SkillID@Constants@2@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.Skill* GetSkillConstantData(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); - // GW::SkillbarMgr::GetSkillSlot | value: enum GW::Constants::SkillID (as int) + // GW::SkillbarMgr::GetSkillSlot [LibraryImport(DllName, EntryPoint = "?GetSkillSlot@SkillbarMgr@GW@@YAHW4SkillID@Constants@2@@Z")] - internal static partial int GetSkillSlot(int value); + public static partial int GetSkillSlot(global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID skillID); // GW::SkillbarMgr::GetSkillTemplate [LibraryImport(DllName, EntryPoint = "?GetSkillTemplate@SkillbarMgr@GW@@YA_NAAUSkillTemplate@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate); + public static partial bool GetSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate); // GW::SkillbarMgr::GetSkillTemplate [LibraryImport(DllName, EntryPoint = "?GetSkillTemplate@SkillbarMgr@GW@@YA_NIAAUSkillTemplate@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetSkillTemplate(uint value1, global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate2); + public static partial bool GetSkillTemplate(uint value1, global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate2); // GW::SkillbarMgr::GetSkillbar [LibraryImport(DllName, EntryPoint = "?GetSkillbar@SkillbarMgr@GW@@YAPAUSkillbar@2@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.SkillbarContext* GetSkillbar(uint value); + public static partial global::Daybreak.API.Interop.GuildWars.SkillbarData* GetSkillbar(uint value); // GW::SkillbarMgr::GetSkillbarArray [LibraryImport(DllName, EntryPoint = "?GetSkillbarArray@SkillbarMgr@GW@@YAPAV?$Array@USkillbar@GW@@@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetSkillbarArray(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetSkillbarArray(); // GW::SkillbarMgr::LoadSkillTemplate [LibraryImport(DllName, EntryPoint = "?LoadSkillTemplate@SkillbarMgr@GW@@YA_NAAUSkillTemplate@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LoadSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate); + public static partial bool LoadSkillTemplate(global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate); // GW::SkillbarMgr::LoadSkillTemplate [LibraryImport(DllName, EntryPoint = "?LoadSkillTemplate@SkillbarMgr@GW@@YA_NIAAUSkillTemplate@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LoadSkillTemplate(uint value1, global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate2); + public static partial bool LoadSkillTemplate(uint value1, global::Daybreak.API.Interop.GuildWars.SkillTemplate* skillTemplate2); // GW::SkillbarMgr::LoadSkillTemplate [LibraryImport(DllName, EntryPoint = "?LoadSkillTemplate@SkillbarMgr@GW@@YA_NIPBD@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LoadSkillTemplate(uint value1, byte* ptr2); + public static partial bool LoadSkillTemplate(uint value1, byte* ptr2); // GW::SkillbarMgr::LoadSkillTemplate [LibraryImport(DllName, EntryPoint = "?LoadSkillTemplate@SkillbarMgr@GW@@YA_NPBD@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool LoadSkillTemplate(byte* ptr); + public static partial bool LoadSkillTemplate(byte* ptr); // GW::SkillbarMgr::UseSkill [LibraryImport(DllName, EntryPoint = "?UseSkill@SkillbarMgr@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UseSkill(uint value1, uint value2); + public static partial bool UseSkill(uint value1, uint value2); // GW::SkillbarMgr::UseSkillByID [LibraryImport(DllName, EntryPoint = "?UseSkillByID@SkillbarMgr@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UseSkillByID(uint value1, uint value2); + public static partial bool UseSkillByID(uint value1, uint value2); } - internal static partial class SkillbarSkill + public static partial class SkillbarSkill { // GW::SkillbarSkill::GetRecharge [LibraryImport(DllName, EntryPoint = "?GetRecharge@SkillbarSkill@GW@@QBEIXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetRecharge(nint self); + public static partial void GetRecharge(nint self); } - internal static partial class SliderFrame + public static partial class SliderFrame { // GW::SliderFrame::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@SliderFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetValue(nint self, uint* ptr2); + public static partial double GetValue(nint self, uint* ptr2); // GW::SliderFrame::GetValue [LibraryImport(DllName, EntryPoint = "?GetValue@SliderFrame@GW@@UAEIXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial void GetValue(nint self); + public static partial void GetValue(nint self); // GW::SliderFrame::SetValue [LibraryImport(DllName, EntryPoint = "?SetValue@SliderFrame@GW@@UAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetValue(nint self, uint value2); + public static partial double SetValue(nint self, uint value2); } - internal static partial class StoC + public static partial class StoC { - // GW::StoC::EmulatePacket | packetBase: TODO: map struct GW::Packet::StoC::PacketBase - // [LibraryImport(DllName, EntryPoint = "?EmulatePacket@StoC@GW@@YA_NPAUPacketBase@1Packet@2@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool EmulatePacket(PacketBase* packetBase); + // GW::StoC::EmulatePacket + [LibraryImport(DllName, EntryPoint = "?EmulatePacket@StoC@GW@@YA_NPAUPacketBase@1Packet@2@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool EmulatePacket(global::Daybreak.API.Interop.GuildWars.PacketBase* packetBase); - // GW::StoC::RegisterPacketCallback | function3: TODO: map struct function | packetBase4: TODO: map struct GW::Packet::StoC::PacketBase + // GW::StoC::RegisterPacketCallback | function3: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterPacketCallback@StoC@GW@@YA_NPAUHookEntry@2@IABV?$function@$$A6AXPAUHookStatus@GW@@PAUPacketBase@StoC@Packet@2@@Z@std@@H@Z")] // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool RegisterPacketCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, uint value2, function* function3, PacketBase* packetBase4); + // public static partial bool RegisterPacketCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, uint value2, function* function3, global::Daybreak.API.Interop.GuildWars.PacketBase* packetBase4); - // GW::StoC::RegisterPostPacketCallback | function3: TODO: map struct function | packetBase4: TODO: map struct GW::Packet::StoC::PacketBase + // GW::StoC::RegisterPostPacketCallback | function3: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterPostPacketCallback@StoC@GW@@YA_NPAUHookEntry@2@IABV?$function@$$A6AXPAUHookStatus@GW@@PAUPacketBase@StoC@Packet@2@@Z@std@@@Z")] // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool RegisterPostPacketCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, uint value2, function* function3, PacketBase* packetBase4); + // public static partial bool RegisterPostPacketCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, uint value2, function* function3, global::Daybreak.API.Interop.GuildWars.PacketBase* packetBase4); // GW::StoC::RemoveCallback [LibraryImport(DllName, EntryPoint = "?RemoveCallback@StoC@GW@@YAIIPAUHookEntry@2@@Z")] - internal static partial uint RemoveCallback(uint value1, global::Daybreak.API.Interop.HookEntry* hookEntry2); + public static partial uint RemoveCallback(uint value1, global::Daybreak.API.Interop.HookEntry* hookEntry2); // GW::StoC::RemoveCallbacks [LibraryImport(DllName, EntryPoint = "?RemoveCallbacks@StoC@GW@@YAIPAUHookEntry@2@@Z")] - internal static partial uint RemoveCallbacks(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial uint RemoveCallbacks(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::StoC::RemovePostCallback [LibraryImport(DllName, EntryPoint = "?RemovePostCallback@StoC@GW@@YAXIPAUHookEntry@2@@Z")] - internal static partial void RemovePostCallback(uint value1, global::Daybreak.API.Interop.HookEntry* hookEntry2); + public static partial void RemovePostCallback(uint value1, global::Daybreak.API.Interop.HookEntry* hookEntry2); } - internal static partial class TabsFrame + public static partial class TabsFrame { // GW::TabsFrame::AddTab [LibraryImport(DllName, EntryPoint = "?AddTab@TabsFrame@GW@@QAEPAUFrame@UI@2@PB_WIIP6AXPAUInteractionMessage@42@PAX2@Z2@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* AddTab(nint self, ushort* ptr2, uint value3, uint value4, nint callback5, nint ptr6); + public static partial global::Daybreak.API.Interop.Frame* AddTab(nint self, ushort* ptr2, uint value3, uint value4, nint callback5, nint ptr6); // GW::TabsFrame::ChooseTab [LibraryImport(DllName, EntryPoint = "?ChooseTab@TabsFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double ChooseTab(nint self, uint value2); + public static partial double ChooseTab(nint self, uint value2); // GW::TabsFrame::ChooseTab [LibraryImport(DllName, EntryPoint = "?ChooseTab@TabsFrame@GW@@QAE_NPAUFrame@UI@2@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double ChooseTab(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial double ChooseTab(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::TabsFrame::DisableTab [LibraryImport(DllName, EntryPoint = "?DisableTab@TabsFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double DisableTab(nint self, uint value2); + public static partial double DisableTab(nint self, uint value2); // GW::TabsFrame::EnableTab [LibraryImport(DllName, EntryPoint = "?EnableTab@TabsFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double EnableTab(nint self, uint value2); + public static partial double EnableTab(nint self, uint value2); // GW::TabsFrame::GetCurrentTab [LibraryImport(DllName, EntryPoint = "?GetCurrentTab@TabsFrame@GW@@QAEPAUFrame@UI@2@XZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetCurrentTab(nint self); + public static partial global::Daybreak.API.Interop.Frame* GetCurrentTab(nint self); // GW::TabsFrame::GetCurrentTabIndex [LibraryImport(DllName, EntryPoint = "?GetCurrentTabIndex@TabsFrame@GW@@QAE_NPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetCurrentTabIndex(nint self, uint* ptr2); + public static partial double GetCurrentTabIndex(nint self, uint* ptr2); // GW::TabsFrame::GetIsTabEnabled [LibraryImport(DllName, EntryPoint = "?GetIsTabEnabled@TabsFrame@GW@@QAE_NIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetIsTabEnabled(nint self, uint value2, uint* ptr3); + public static partial double GetIsTabEnabled(nint self, uint value2, uint* ptr3); // GW::TabsFrame::GetTabButton | returns TODO: map struct GW::ButtonFrame // [LibraryImport(DllName, EntryPoint = "?GetTabButton@TabsFrame@GW@@QAEPAUButtonFrame@2@PAUFrame@UI@2@@Z")] // [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - // internal static partial ButtonFrame* GetTabButton(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + // public static partial ButtonFrame* GetTabButton(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::TabsFrame::GetTabByLabel [LibraryImport(DllName, EntryPoint = "?GetTabByLabel@TabsFrame@GW@@QAEPAUFrame@UI@2@PB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetTabByLabel(nint self, ushort* ptr2); + public static partial global::Daybreak.API.Interop.Frame* GetTabByLabel(nint self, ushort* ptr2); // GW::TabsFrame::GetTabFrameId [LibraryImport(DllName, EntryPoint = "?GetTabFrameId@TabsFrame@GW@@QAE_NIPAI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double GetTabFrameId(nint self, uint value2, uint* ptr3); + public static partial double GetTabFrameId(nint self, uint value2, uint* ptr3); // GW::TabsFrame::RemoveTab [LibraryImport(DllName, EntryPoint = "?RemoveTab@TabsFrame@GW@@QAE_NI@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double RemoveTab(nint self, uint value2); + public static partial double RemoveTab(nint self, uint value2); } - internal static partial class TextLabelFrame + public static partial class TextLabelFrame { // GW::TextLabelFrame::Create | returns TODO: map struct GW::TextLabelFrame // [LibraryImport(DllName, EntryPoint = "?Create@TextLabelFrame@GW@@SAPAU12@IIIPB_W0@Z")] - // internal static partial TextLabelFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); + // public static partial TextLabelFrame* Create(uint value1, uint value2, uint value3, ushort* ptr4, nint ptr5); // GW::TextLabelFrame::GetDecodedLabel [LibraryImport(DllName, EntryPoint = "?GetDecodedLabel@TextLabelFrame@GW@@QAEPB_WXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetDecodedLabel(nint self, ushort value2); + public static partial nint GetDecodedLabel(nint self, ushort value2); // GW::TextLabelFrame::GetEncodedLabel [LibraryImport(DllName, EntryPoint = "?GetEncodedLabel@TextLabelFrame@GW@@QAEPB_WXZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial nint GetEncodedLabel(nint self, ushort value2); + public static partial nint GetEncodedLabel(nint self, ushort value2); + + // GW::TextLabelFrame::SetFont + [LibraryImport(DllName, EntryPoint = "?SetFont@TextLabelFrame@GW@@QAE_NI@Z")] + [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] + public static partial double SetFont(nint self, uint value2); // GW::TextLabelFrame::SetLabel [LibraryImport(DllName, EntryPoint = "?SetLabel@TextLabelFrame@GW@@QAE_NPB_W@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial double SetLabel(nint self, ushort* ptr2); + public static partial double SetLabel(nint self, ushort* ptr2); } - internal static partial class Trade + public static partial class Trade { // GW::Trade::AcceptTrade [LibraryImport(DllName, EntryPoint = "?AcceptTrade@Trade@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AcceptTrade(); + public static partial bool AcceptTrade(); // GW::Trade::CancelTrade [LibraryImport(DllName, EntryPoint = "?CancelTrade@Trade@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool CancelTrade(); + public static partial bool CancelTrade(); // GW::Trade::ChangeOffer [LibraryImport(DllName, EntryPoint = "?ChangeOffer@Trade@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ChangeOffer(); + public static partial bool ChangeOffer(); - // GW::Trade::IsItemOffered | returns TODO: map struct GW::TradeItem - // [LibraryImport(DllName, EntryPoint = "?IsItemOffered@Trade@GW@@YAPAUTradeItem@2@I@Z")] - // internal static partial TradeItem* IsItemOffered(uint value); + // GW::Trade::IsItemOffered + [LibraryImport(DllName, EntryPoint = "?IsItemOffered@Trade@GW@@YAPAUTradeItem@2@I@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.TradeItem* IsItemOffered(uint value); // GW::Trade::OfferItem [LibraryImport(DllName, EntryPoint = "?OfferItem@Trade@GW@@YA_NII@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool OfferItem(uint value1, uint value2); + public static partial bool OfferItem(uint value1, uint value2); // GW::Trade::OpenTradeWindow [LibraryImport(DllName, EntryPoint = "?OpenTradeWindow@Trade@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool OpenTradeWindow(uint value); + public static partial bool OpenTradeWindow(uint value); // GW::Trade::RemoveItem [LibraryImport(DllName, EntryPoint = "?RemoveItem@Trade@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool RemoveItem(uint value); + public static partial bool RemoveItem(uint value); // GW::Trade::SubmitOffer [LibraryImport(DllName, EntryPoint = "?SubmitOffer@Trade@GW@@YA_NI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SubmitOffer(uint value); + public static partial bool SubmitOffer(uint value); } - internal static partial class UI + public static partial class UI { // GW::UI::AddFrameUIInteractionCallback [LibraryImport(DllName, EntryPoint = "?AddFrameUIInteractionCallback@UI@GW@@YA_NPAUFrame@12@P6AXPAUInteractionMessage@12@PAX2@Z2@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool AddFrameUIInteractionCallback(global::Daybreak.API.Interop.GuildWars.Frame* frame1, nint callback2, nint ptr3); + public static partial bool AddFrameUIInteractionCallback(global::Daybreak.API.Interop.Frame* frame1, nint callback2, nint ptr3); // GW::UI::AsyncDecodeStr [LibraryImport(DllName, EntryPoint = "?AsyncDecodeStr@UI@GW@@YAXPB_WP6AXPAX0@Z1W4Language@Constants@2@@Z")] - internal static partial void AsyncDecodeStr(ushort* ptr1, nint callback2, nint ptr3, global::Daybreak.API.Interop.GuildWars.Language language4); + public static partial void AsyncDecodeStr(ushort* ptr1, nint callback2, nint ptr3, global::Daybreak.API.Interop.GWCA.GW.Constants.Language language4); // GW::UI::AsyncDecodeStr [LibraryImport(DllName, EntryPoint = "?AsyncDecodeStr@UI@GW@@YAXPB_WPA_WI@Z")] - internal static partial void AsyncDecodeStr(ushort* ptr1, ushort* ptr2, uint value3); + public static partial void AsyncDecodeStr(ushort* ptr1, ushort* ptr2, uint value3); // GW::UI::ButtonClick [LibraryImport(DllName, EntryPoint = "?ButtonClick@UI@GW@@YA_NPAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool ButtonClick(global::Daybreak.API.Interop.GuildWars.Frame* frame); + public static partial bool ButtonClick(global::Daybreak.API.Interop.Frame* frame); // GW::UI::CreateUIComponent [LibraryImport(DllName, EntryPoint = "?CreateUIComponent@UI@GW@@YAIIIIP6AXPAUInteractionMessage@12@PAX1@Z1PB_W@Z")] - internal static partial uint CreateUIComponent(uint value1, uint value2, uint value3, nint callback4, nint ptr5, ushort* ptr6); + public static partial uint CreateUIComponent(uint value1, uint value2, uint value3, nint callback4, nint ptr5, ushort* ptr6); - // GW::UI::Default_UICallback | interactionMessage1: TODO: map struct GW::UI::InteractionMessage - // [LibraryImport(DllName, EntryPoint = "?Default_UICallback@UI@GW@@YA_NPAUInteractionMessage@12@PAX1@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool Default_UICallback(InteractionMessage* interactionMessage1, void* ptr2, nint ptr3); + // GW::UI::Default_UICallback + [LibraryImport(DllName, EntryPoint = "?Default_UICallback@UI@GW@@YA_NPAUInteractionMessage@12@PAX1@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool Default_UICallback(global::Daybreak.API.Interop.GuildWars.InteractionMessage* interactionMessage1, void* ptr2, nint ptr3); // GW::UI::DestroyUIComponent [LibraryImport(DllName, EntryPoint = "?DestroyUIComponent@UI@GW@@YA_NPAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool DestroyUIComponent(global::Daybreak.API.Interop.GuildWars.Frame* frame); + public static partial bool DestroyUIComponent(global::Daybreak.API.Interop.Frame* frame); - // GW::UI::DrawOnCompass | compassPoint3: TODO: map struct GW::UI::CompassPoint - // [LibraryImport(DllName, EntryPoint = "?DrawOnCompass@UI@GW@@YA_NIIPAUCompassPoint@12@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool DrawOnCompass(uint value1, uint value2, CompassPoint* compassPoint3); + // GW::UI::DrawOnCompass + [LibraryImport(DllName, EntryPoint = "?DrawOnCompass@UI@GW@@YA_NIIPAUCompassPoint@12@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool DrawOnCompass(uint value1, uint value2, global::Daybreak.API.Interop.GuildWars.CompassPoint* compassPoint3); // GW::UI::EncStrToUInt32 [LibraryImport(DllName, EntryPoint = "?EncStrToUInt32@UI@GW@@YAIPB_W@Z")] - internal static partial uint EncStrToUInt32(ushort* ptr); + public static partial uint EncStrToUInt32(ushort* ptr); // GW::UI::GetChildFrame [LibraryImport(DllName, EntryPoint = "?GetChildFrame@UI@GW@@YAPAUFrame@12@PAU312@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetChildFrame(global::Daybreak.API.Interop.GuildWars.Frame* frame1, uint value2); + public static partial global::Daybreak.API.Interop.Frame* GetChildFrame(global::Daybreak.API.Interop.Frame* frame1, uint value2); // GW::UI::GetCommandLinePref [LibraryImport(DllName, EntryPoint = "?GetCommandLinePref@UI@GW@@YA_NPB_WPAI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetCommandLinePref(ushort* ptr1, uint* ptr2); + public static partial bool GetCommandLinePref(ushort* ptr1, uint* ptr2); // GW::UI::GetCommandLinePref [LibraryImport(DllName, EntryPoint = "?GetCommandLinePref@UI@GW@@YA_NPB_WPAPA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetCommandLinePref(ushort* ptr1, void* ptr2); + public static partial bool GetCommandLinePref(ushort* ptr1, void* ptr2); - // GW::UI::GetCurrentTooltip | returns TODO: map struct GW::UI::TooltipInfo - // [LibraryImport(DllName, EntryPoint = "?GetCurrentTooltip@UI@GW@@YAPAUTooltipInfo@12@XZ")] - // internal static partial TooltipInfo* GetCurrentTooltip(); + // GW::UI::GetCurrentTooltip + [LibraryImport(DllName, EntryPoint = "?GetCurrentTooltip@UI@GW@@YAPAUTooltipInfo@12@XZ")] + public static partial global::Daybreak.API.Interop.GuildWars.TooltipInfo* GetCurrentTooltip(); // GW::UI::GetFrameById [LibraryImport(DllName, EntryPoint = "?GetFrameById@UI@GW@@YAPAUFrame@12@I@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetFrameById(uint value); + public static partial global::Daybreak.API.Interop.Frame* GetFrameById(uint value); // GW::UI::GetFrameByLabel [LibraryImport(DllName, EntryPoint = "?GetFrameByLabel@UI@GW@@YAPAUFrame@12@PB_W@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetFrameByLabel(ushort* ptr); + public static partial global::Daybreak.API.Interop.Frame* GetFrameByLabel(ushort* ptr); // GW::UI::GetFrameContext [LibraryImport(DllName, EntryPoint = "?GetFrameContext@UI@GW@@YAPAXPAUFrame@12@@Z")] - internal static partial void* GetFrameContext(global::Daybreak.API.Interop.GuildWars.Frame* frame); + public static partial void* GetFrameContext(global::Daybreak.API.Interop.Frame* frame); // GW::UI::GetIsShiftScreenShot [LibraryImport(DllName, EntryPoint = "?GetIsShiftScreenShot@UI@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsShiftScreenShot(); + public static partial bool GetIsShiftScreenShot(); // GW::UI::GetIsUIDrawn [LibraryImport(DllName, EntryPoint = "?GetIsUIDrawn@UI@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsUIDrawn(); + public static partial bool GetIsUIDrawn(); // GW::UI::GetIsWorldMapShowing [LibraryImport(DllName, EntryPoint = "?GetIsWorldMapShowing@UI@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetIsWorldMapShowing(); + public static partial bool GetIsWorldMapShowing(); // GW::UI::GetParentFrame [LibraryImport(DllName, EntryPoint = "?GetParentFrame@UI@GW@@YAPAUFrame@12@PAU312@@Z")] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetParentFrame(global::Daybreak.API.Interop.GuildWars.Frame* frame); + public static partial global::Daybreak.API.Interop.Frame* GetParentFrame(global::Daybreak.API.Interop.Frame* frame); // GW::UI::GetPreference [LibraryImport(DllName, EntryPoint = "?GetPreference@UI@GW@@YAIW4EnumPreference@12@@Z")] - internal static partial uint GetPreference(global::Daybreak.API.Interop.GuildWars.EnumPreference enumPreference); + public static partial uint GetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.EnumPreference enumPreference); // GW::UI::GetPreference [LibraryImport(DllName, EntryPoint = "?GetPreference@UI@GW@@YAIW4NumberPreference@12@@Z")] - internal static partial uint GetPreference(global::Daybreak.API.Interop.GuildWars.NumberPreference numberPreference); + public static partial uint GetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.NumberPreference numberPreference); // GW::UI::GetPreference [LibraryImport(DllName, EntryPoint = "?GetPreference@UI@GW@@YAPA_WW4StringPreference@12@@Z")] - internal static partial ushort* GetPreference(global::Daybreak.API.Interop.GuildWars.StringPreference stringPreference); + public static partial ushort* GetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.StringPreference stringPreference); // GW::UI::GetPreference [LibraryImport(DllName, EntryPoint = "?GetPreference@UI@GW@@YA_NW4FlagPreference@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool GetPreference(global::Daybreak.API.Interop.GuildWars.FlagPreference flagPreference); + public static partial bool GetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.FlagPreference flagPreference); // GW::UI::GetPreferenceOptions [LibraryImport(DllName, EntryPoint = "?GetPreferenceOptions@UI@GW@@YAIW4EnumPreference@12@PAPAI@Z")] - internal static partial uint GetPreferenceOptions(global::Daybreak.API.Interop.GuildWars.EnumPreference enumPreference1, void* ptr2); + public static partial uint GetPreferenceOptions(global::Daybreak.API.Interop.GWCA.GW.UI.EnumPreference enumPreference1, void* ptr2); // GW::UI::GetRootFrame [LibraryImport(DllName, EntryPoint = "?GetRootFrame@UI@GW@@YAPAUFrame@12@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetRootFrame(); + public static partial global::Daybreak.API.Interop.Frame* GetRootFrame(); // GW::UI::GetSettings [LibraryImport(DllName, EntryPoint = "?GetSettings@UI@GW@@YAPAV?$Array@E@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetSettings(); + public static partial global::Daybreak.API.Interop.GuildWars.GuildWarsArray* GetSettings(); // GW::UI::GetTextLanguage [LibraryImport(DllName, EntryPoint = "?GetTextLanguage@UI@GW@@YA?AW4Language@Constants@2@XZ")] - internal static partial global::Daybreak.API.Interop.GuildWars.Language GetTextLanguage(); + public static partial global::Daybreak.API.Interop.GWCA.GW.Constants.Language GetTextLanguage(); - // GW::UI::GetWindowPosition | returns TODO: map struct GW::UI::WindowPosition | value: enum GW::UI::WindowID (as int) - // [LibraryImport(DllName, EntryPoint = "?GetWindowPosition@UI@GW@@YAPAUWindowPosition@12@W4WindowID@12@@Z")] - // internal static partial WindowPosition* GetWindowPosition(int value); + // GW::UI::GetWindowPosition + [LibraryImport(DllName, EntryPoint = "?GetWindowPosition@UI@GW@@YAPAUWindowPosition@12@W4WindowID@12@@Z")] + public static partial global::Daybreak.API.Interop.GuildWars.WindowPositionData* GetWindowPosition(global::Daybreak.API.Interop.GWCA.GW.UI.WindowID windowID); // GW::UI::IsInControllerCursorMode [LibraryImport(DllName, EntryPoint = "?IsInControllerCursorMode@UI@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsInControllerCursorMode(); + public static partial bool IsInControllerCursorMode(); // GW::UI::IsInControllerMode [LibraryImport(DllName, EntryPoint = "?IsInControllerMode@UI@GW@@YA_NXZ")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsInControllerMode(); + public static partial bool IsInControllerMode(); // GW::UI::IsValidEncStr [LibraryImport(DllName, EntryPoint = "?IsValidEncStr@UI@GW@@YA_NPB_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool IsValidEncStr(ushort* ptr); + public static partial bool IsValidEncStr(ushort* ptr); // GW::UI::Keydown [LibraryImport(DllName, EntryPoint = "?Keydown@UI@GW@@YA_NW4ControlAction@12@PAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Keydown(global::Daybreak.API.Interop.GuildWars.ControlAction controlAction1, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial bool Keydown(global::Daybreak.API.Interop.GWCA.GW.UI.ControlAction controlAction1, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::Keypress [LibraryImport(DllName, EntryPoint = "?Keypress@UI@GW@@YA_NW4ControlAction@12@PAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Keypress(global::Daybreak.API.Interop.GuildWars.ControlAction controlAction1, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial bool Keypress(global::Daybreak.API.Interop.GWCA.GW.UI.ControlAction controlAction1, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::Keyup [LibraryImport(DllName, EntryPoint = "?Keyup@UI@GW@@YA_NW4ControlAction@12@PAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool Keyup(global::Daybreak.API.Interop.GuildWars.ControlAction controlAction1, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial bool Keyup(global::Daybreak.API.Interop.GWCA.GW.UI.ControlAction controlAction1, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::RegisterCreateUIComponentCallback | function2: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterCreateUIComponentCallback@UI@GW@@YAXPAUHookEntry@2@ABV?$function@$$A6AXPAUCreateUIComponentPacket@UI@GW@@@Z@std@@H@Z")] - // internal static partial void RegisterCreateUIComponentCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2); + // public static partial void RegisterCreateUIComponentCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2); // GW::UI::RegisterFrameUIMessageCallback | function3: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterFrameUIMessageCallback@UI@GW@@YAXPAUHookEntry@2@W4UIMessage@12@ABV?$function@$$A6AXPAUHookStatus@GW@@PBUFrame@UI@2@W4UIMessage@42@PAX3@Z@std@@H@Z")] - // internal static partial void RegisterFrameUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Models.UIMessage uIMessage2, function* function3, global::Daybreak.API.Interop.GuildWars.Frame* frame4, global::Daybreak.API.Models.UIMessage uIMessage5, void* ptr6, nint ptr7); + // public static partial void RegisterFrameUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage2, function* function3, global::Daybreak.API.Interop.Frame* frame4, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage5, void* ptr6, nint ptr7); // GW::UI::RegisterKeydownCallback | function2: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterKeydownCallback@UI@GW@@YAXPAUHookEntry@2@ABV?$function@$$A6AXPAUHookStatus@GW@@I@Z@std@@@Z")] - // internal static partial void RegisterKeydownCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, uint value3); + // public static partial void RegisterKeydownCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, uint value3); // GW::UI::RegisterKeyupCallback | function2: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterKeyupCallback@UI@GW@@YAXPAUHookEntry@2@ABV?$function@$$A6AXPAUHookStatus@GW@@I@Z@std@@@Z")] - // internal static partial void RegisterKeyupCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, uint value3); + // public static partial void RegisterKeyupCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, function* function2, uint value3); // GW::UI::RegisterUIMessageCallback | function3: TODO: map struct function // [LibraryImport(DllName, EntryPoint = "?RegisterUIMessageCallback@UI@GW@@YAXPAUHookEntry@2@W4UIMessage@12@ABV?$function@$$A6AXPAUHookStatus@GW@@W4UIMessage@UI@2@PAX2@Z@std@@H@Z")] - // internal static partial void RegisterUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Models.UIMessage uIMessage2, function* function3, global::Daybreak.API.Models.UIMessage uIMessage4, void* ptr5, nint ptr6); + // public static partial void RegisterUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage2, function* function3, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage4, void* ptr5, nint ptr6); // GW::UI::RemoveCreateUIComponentCallback [LibraryImport(DllName, EntryPoint = "?RemoveCreateUIComponentCallback@UI@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveCreateUIComponentCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveCreateUIComponentCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::UI::RemoveFrameUIMessageCallback [LibraryImport(DllName, EntryPoint = "?RemoveFrameUIMessageCallback@UI@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveFrameUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveFrameUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::UI::RemoveKeydownCallback [LibraryImport(DllName, EntryPoint = "?RemoveKeydownCallback@UI@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveKeydownCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveKeydownCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::UI::RemoveKeyupCallback [LibraryImport(DllName, EntryPoint = "?RemoveKeyupCallback@UI@GW@@YAXPAUHookEntry@2@@Z")] - internal static partial void RemoveKeyupCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); + public static partial void RemoveKeyupCallback(global::Daybreak.API.Interop.HookEntry* hookEntry); // GW::UI::RemoveUIMessageCallback [LibraryImport(DllName, EntryPoint = "?RemoveUIMessageCallback@UI@GW@@YAXPAUHookEntry@2@W4UIMessage@12@@Z")] - internal static partial void RemoveUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Models.UIMessage uIMessage2); + public static partial void RemoveUIMessageCallback(global::Daybreak.API.Interop.HookEntry* hookEntry1, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage2); // GW::UI::SelectDropdownOption [LibraryImport(DllName, EntryPoint = "?SelectDropdownOption@UI@GW@@YA_NPAUFrame@12@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SelectDropdownOption(global::Daybreak.API.Interop.GuildWars.Frame* frame1, uint value2); + public static partial bool SelectDropdownOption(global::Daybreak.API.Interop.Frame* frame1, uint value2); // GW::UI::SendFrameUIMessage [LibraryImport(DllName, EntryPoint = "?SendFrameUIMessage@UI@GW@@YA_NPAUFrame@12@W4UIMessage@12@PAX2@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendFrameUIMessage(global::Daybreak.API.Interop.GuildWars.Frame* frame1, global::Daybreak.API.Models.UIMessage uIMessage2, void* ptr3, nint ptr4); + public static partial bool SendFrameUIMessage(global::Daybreak.API.Interop.Frame* frame1, global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage2, void* ptr3, nint ptr4); // GW::UI::SendUIMessage [LibraryImport(DllName, EntryPoint = "?SendUIMessage@UI@GW@@YA_NW4UIMessage@12@PAX1@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SendUIMessage(global::Daybreak.API.Models.UIMessage uIMessage1, void* ptr2, nint ptr3); + public static partial bool SendUIMessage(global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage uIMessage1, void* ptr2, nint ptr3); // GW::UI::SetCommandLinePref [LibraryImport(DllName, EntryPoint = "?SetCommandLinePref@UI@GW@@YA_NPB_WI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetCommandLinePref(ushort* ptr1, uint value2); + public static partial bool SetCommandLinePref(ushort* ptr1, uint value2); // GW::UI::SetCommandLinePref [LibraryImport(DllName, EntryPoint = "?SetCommandLinePref@UI@GW@@YA_NPB_WPA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetCommandLinePref(ushort* ptr1, ushort* ptr2); + public static partial bool SetCommandLinePref(ushort* ptr1, ushort* ptr2); // GW::UI::SetFrameDisabled [LibraryImport(DllName, EntryPoint = "?SetFrameDisabled@UI@GW@@YA_NPAUFrame@12@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFrameDisabled(global::Daybreak.API.Interop.GuildWars.Frame* frame1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool SetFrameDisabled(global::Daybreak.API.Interop.Frame* frame1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::UI::SetFrameMargins [LibraryImport(DllName, EntryPoint = "?SetFrameMargins@UI@GW@@YA_NPAUFrame@12@IQAM1I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFrameMargins(global::Daybreak.API.Interop.GuildWars.Frame* frame1, uint value2, float* ptr3, nint ptr4, uint value5); + public static partial bool SetFrameMargins(global::Daybreak.API.Interop.Frame* frame1, uint value2, float* ptr3, nint ptr4, uint value5); // GW::UI::SetFrameTitle [LibraryImport(DllName, EntryPoint = "?SetFrameTitle@UI@GW@@YA_NPAUFrame@12@PB_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFrameTitle(global::Daybreak.API.Interop.GuildWars.Frame* frame1, ushort* ptr2); + public static partial bool SetFrameTitle(global::Daybreak.API.Interop.Frame* frame1, ushort* ptr2); // GW::UI::SetFrameVisible [LibraryImport(DllName, EntryPoint = "?SetFrameVisible@UI@GW@@YA_NPAUFrame@12@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetFrameVisible(global::Daybreak.API.Interop.GuildWars.Frame* frame1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool SetFrameVisible(global::Daybreak.API.Interop.Frame* frame1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::UI::SetOpenLinks [LibraryImport(DllName, EntryPoint = "?SetOpenLinks@UI@GW@@YAX_N@Z")] - internal static partial void SetOpenLinks([MarshalAs(UnmanagedType.U1)] bool flag); + public static partial void SetOpenLinks([MarshalAs(UnmanagedType.U1)] bool flag); // GW::UI::SetPreference [LibraryImport(DllName, EntryPoint = "?SetPreference@UI@GW@@YA_NW4EnumPreference@12@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetPreference(global::Daybreak.API.Interop.GuildWars.EnumPreference enumPreference1, uint value2); + public static partial bool SetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.EnumPreference enumPreference1, uint value2); // GW::UI::SetPreference [LibraryImport(DllName, EntryPoint = "?SetPreference@UI@GW@@YA_NW4FlagPreference@12@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetPreference(global::Daybreak.API.Interop.GuildWars.FlagPreference flagPreference1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool SetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.FlagPreference flagPreference1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::UI::SetPreference [LibraryImport(DllName, EntryPoint = "?SetPreference@UI@GW@@YA_NW4NumberPreference@12@I@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetPreference(global::Daybreak.API.Interop.GuildWars.NumberPreference numberPreference1, uint value2); + public static partial bool SetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.NumberPreference numberPreference1, uint value2); // GW::UI::SetPreference [LibraryImport(DllName, EntryPoint = "?SetPreference@UI@GW@@YA_NW4StringPreference@12@PA_W@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetPreference(global::Daybreak.API.Interop.GuildWars.StringPreference stringPreference1, ushort* ptr2); + public static partial bool SetPreference(global::Daybreak.API.Interop.GWCA.GW.UI.StringPreference stringPreference1, ushort* ptr2); - // GW::UI::SetWindowPosition | value1: enum GW::UI::WindowID (as int) | windowPosition2: TODO: map struct GW::UI::WindowPosition - // [LibraryImport(DllName, EntryPoint = "?SetWindowPosition@UI@GW@@YA_NW4WindowID@12@PAUWindowPosition@12@@Z")] - // [return: MarshalAs(UnmanagedType.U1)] - // internal static partial bool SetWindowPosition(int value1, WindowPosition* windowPosition2); + // GW::UI::SetWindowPosition + [LibraryImport(DllName, EntryPoint = "?SetWindowPosition@UI@GW@@YA_NW4WindowID@12@PAUWindowPosition@12@@Z")] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool SetWindowPosition(global::Daybreak.API.Interop.GWCA.GW.UI.WindowID windowID1, global::Daybreak.API.Interop.GuildWars.WindowPositionData* windowPositionData2); - // GW::UI::SetWindowVisible | value1: enum GW::UI::WindowID (as int) + // GW::UI::SetWindowVisible [LibraryImport(DllName, EntryPoint = "?SetWindowVisible@UI@GW@@YA_NW4WindowID@12@_N@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool SetWindowVisible(int value1, [MarshalAs(UnmanagedType.U1)] bool flag2); + public static partial bool SetWindowVisible(global::Daybreak.API.Interop.GWCA.GW.UI.WindowID windowID1, [MarshalAs(UnmanagedType.U1)] bool flag2); // GW::UI::TriggerFrameRedraw [LibraryImport(DllName, EntryPoint = "?TriggerFrameRedraw@UI@GW@@YA_NPAUFrame@12@@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool TriggerFrameRedraw(global::Daybreak.API.Interop.GuildWars.Frame* frame); + public static partial bool TriggerFrameRedraw(global::Daybreak.API.Interop.Frame* frame); // GW::UI::UInt32ToEncStr [LibraryImport(DllName, EntryPoint = "?UInt32ToEncStr@UI@GW@@YA_NIPA_WI@Z")] [return: MarshalAs(UnmanagedType.U1)] - internal static partial bool UInt32ToEncStr(uint value1, ushort* ptr2, uint value3); + public static partial bool UInt32ToEncStr(uint value1, ushort* ptr2, uint value3); - internal static partial class FramePosition + public static partial class FramePosition { // GW::UI::FramePosition::GetBottomRightOnScreen [LibraryImport(DllName, EntryPoint = "?GetBottomRightOnScreen@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetBottomRightOnScreen(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetBottomRightOnScreen(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::FramePosition::GetContentBottomRight [LibraryImport(DllName, EntryPoint = "?GetContentBottomRight@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetContentBottomRight(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetContentBottomRight(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::FramePosition::GetContentTopLeft [LibraryImport(DllName, EntryPoint = "?GetContentTopLeft@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetContentTopLeft(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetContentTopLeft(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::FramePosition::GetSizeOnScreen [LibraryImport(DllName, EntryPoint = "?GetSizeOnScreen@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetSizeOnScreen(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetSizeOnScreen(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::FramePosition::GetTopLeftOnScreen [LibraryImport(DllName, EntryPoint = "?GetTopLeftOnScreen@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetTopLeftOnScreen(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetTopLeftOnScreen(nint self, global::Daybreak.API.Interop.Frame* frame2); // GW::UI::FramePosition::GetViewportScale [LibraryImport(DllName, EntryPoint = "?GetViewportScale@FramePosition@UI@GW@@QBE?AUVec2f@3@PBUFrame@23@@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* GetViewportScale(nint self, global::Daybreak.API.Interop.GuildWars.Frame* frame2); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* GetViewportScale(nint self, global::Daybreak.API.Interop.Frame* frame2); } - internal static partial class FrameRelation + public static partial class FrameRelation { // GW::UI::FrameRelation::GetFrame [LibraryImport(DllName, EntryPoint = "?GetFrame@FrameRelation@UI@GW@@QAEPAUFrame@23@XZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetFrame(nint self); + public static partial global::Daybreak.API.Interop.Frame* GetFrame(nint self); // GW::UI::FrameRelation::GetParent [LibraryImport(DllName, EntryPoint = "?GetParent@FrameRelation@UI@GW@@QBEPAUFrame@23@XZ")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::Daybreak.API.Interop.GuildWars.Frame* GetParent(nint self); + public static partial global::Daybreak.API.Interop.Frame* GetParent(nint self); } - internal static partial class WindowPosition + public static partial class WindowPosition { // GW::UI::WindowPosition::xAxis [LibraryImport(DllName, EntryPoint = "?xAxis@WindowPosition@UI@GW@@QBE?AUVec2f@3@M_N@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* xAxis(nint self, float value2, [MarshalAs(UnmanagedType.U1)] bool flag3); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* xAxis(nint self, float value2, [MarshalAs(UnmanagedType.U1)] bool flag3); // GW::UI::WindowPosition::yAxis [LibraryImport(DllName, EntryPoint = "?yAxis@WindowPosition@UI@GW@@QBE?AUVec2f@3@M_N@Z")] [UnmanagedCallConv(CallConvs = [typeof(CallConvThiscall)])] - internal static partial global::System.Numerics.Vector2* yAxis(nint self, float value2, [MarshalAs(UnmanagedType.U1)] bool flag3); + public static partial global::Daybreak.API.Interop.GuildWars.Vec2fStruct* yAxis(nint self, float value2, [MarshalAs(UnmanagedType.U1)] bool flag3); + } + } + } + + public static partial class GW + { + + public enum CallTargetType : uint + { + Following = 0x3, + Morale = 0x7, + AttackingOrTargetting = 0xA, + None = 0xFF, + } + + public enum Continent : uint + { + Kryta, + DevContinent, + Cantha, + BattleIsles, + Elona, + RealmOfTorment, + } + + public enum DyeColor : byte + { + None = 0, + Blue = 2, + Green = 3, + Purple = 4, + Red = 5, + Yellow = 6, + Brown = 7, + Orange = 8, + Silver = 9, + Black = 10, + Gray = 11, + White = 12, + Pink = 13, + } + + public enum EquipmentStatus : uint + { + AlwaysHide, + HideInTownsAndOutposts, + HideInCombatAreas, + AlwaysShow, + } + + public enum EquipmentType : uint + { + Cape = 0x0, + Helm = 0x2, + CostumeBody = 0x4, + CostumeHeadpiece = 0x6, + Unknown = 0xff, + } + + public enum FriendStatus : uint + { + Offline = 0, + Online = 1, + DND = 2, + Away = 3, + Unknown = 4, + } + + public enum FriendType : uint + { + Unknow = 0, + Friend = 1, + Ignore = 2, + Player = 3, + Trade = 4, + } + + public enum HeroBehavior : uint + { + Fight, + Guard, + AvoidCombat, + } + + public enum ObserverMatchType : uint + { + SpecialEvent, + HallOfHeroe, + MyGuildsBattle, + MyGuildsHeroesAscentGame, + TopGuildBattle, + TopGuildHeroesAscentGame, + UploadedGame, + Top1v1Battle, + Top1v1TournamentBattle, + } + + public enum PartySearchType : int + { + PartySearchType_Hunting = 0, + PartySearchType_Mission = 1, + PartySearchType_Quest = 2, + PartySearchType_Trade = 3, + PartySearchType_Guild = 4, + } + + public enum ProgressBarStyle : uint + { + kPeach, + kPink, + kGrey, + kBlue, + kGreen, + kRed, + kPurple, + kOlive, + kUnk, + } + + public enum Region : uint + { + Region_Kryta, + Region_Maguuma, + Region_Ascalon, + Region_NorthernShiverpeaks, + Region_HeroesAscent, + Region_CrystalDesert, + Region_FissureOfWoe, + Region_Presearing, + Region_Kaineng, + Region_Kurzick, + Region_Luxon, + Region_ShingJea, + Region_Kourna, + Region_Vaabi, + Region_Desolation, + Region_Istan, + Region_DomainOfAnguish, + Region_TarnishedCoast, + Region_DepthsOfTyria, + Region_FarShiverpeaks, + Region_CharrHomelands, + Region_BattleIslands, + Region_TheBattleOfJahai, + Region_TheFlightNorth, + Region_TheTenguAccords, + Region_TheRiseOfTheWhiteMantle, + Region_Swat, + Region_DevRegion, + } + + public enum RegionType : uint + { + AllianceBattle, + Arena, + ExplorableZone, + GuildBattleArea, + GuildHall, + MissionOutpost, + CooperativeMission, + CompetitiveMission, + EliteMission, + Challenge, + Outpost, + ZaishenBattle, + HeroesAscent, + City, + MissionArea, + HeroBattleOutpost, + HeroBattleArea, + EotnMission, + Dungeon, + Marketplace, + Unknown, + DevRegion, + } + + public enum ScannerSection : byte + { + Section_TEXT = 0, + Section_RDATA = 1, + Section_DATA = 2, + Section_Count = 3, + } + + public enum WorldActionId : uint + { + InteractEnemy, + InteractPlayerOrOther, + InteractNPC, + InteractItem, + InteractTrade, + InteractGadget, + } + + public static partial class Chat + { + + public enum Channel : int + { + CHANNEL_ALLIANCE = 0, + CHANNEL_ALLIES = 1, + CHANNEL_GWCA1 = 2, + CHANNEL_ALL = 3, + CHANNEL_GWCA2 = 4, + CHANNEL_MODERATOR = 5, + CHANNEL_EMOTE = 6, + CHANNEL_WARNING = 7, + CHANNEL_GWCA3 = 8, + CHANNEL_GUILD = 9, + CHANNEL_GLOBAL = 10, + CHANNEL_GROUP = 11, + CHANNEL_TRADE = 12, + CHANNEL_ADVISORY = 13, + CHANNEL_WHISPER = 14, + CHANNEL_COUNT, + CHANNEL_COMMAND, + CHANNEL_UNKNOW = -1, + } + + public static partial class TextColor + { + internal const uint ColorItemAssign = 0xFF6CC16D; + internal const uint ColorItemBasic = 0xFFFFFFFf; + internal const uint ColorItemBonus = 0xFFA0F5F8; + internal const uint ColorItemCommon = 0xFFFFFFFf; + internal const uint ColorItemCustom = 0xFFA0A0A0; + internal const uint ColorItemDull = 0xFFA0A0A0; + internal const uint ColorItemEnhance = 0xFFA0F5F8; + internal const uint ColorItemRare = 0xFFFFFD24; + internal const uint ColorItemRestrict = 0xFFF67D4D; + internal const uint ColorItemSell = 0xFFFFFF00; + internal const uint ColorItemUncommon = 0xFFB38AEC; + internal const uint ColorItemUnique = 0xFF00FF00; + internal const uint ColorItemUniquePvp = 0xFFED1C24; + internal const uint ColorLabel = 0xFFFFEAB8; + internal const uint ColorQuest = 0xFF00FF00; + internal const uint ColorSkillDull = 0xFFA0A0A0; + internal const uint ColorWarning = 0xFFED0002; + } + } + + public static partial class Constants + { + + public enum AgentType : int + { + Living = 0xDB, + Gadget = 0x200, + Item = 0x400, + } + + public enum Allegiance : byte + { + Ally_NonAttackable = 0x1, + Neutral = 0x2, + Enemy = 0x3, + Spirit_Pet = 0x4, + Minion = 0x5, + Npc_Minipet = 0x6, + } + + public enum Attribute : uint + { + FastCasting, + IllusionMagic, + DominationMagic, + InspirationMagic, // mesmer + BloodMagic, + DeathMagic, + SoulReaping, + Curses, // necro + AirMagic, + EarthMagic, + FireMagic, + WaterMagic, + EnergyStorage, // ele + HealingPrayers, + SmitingPrayers, + ProtectionPrayers, + DivineFavor, // monk + Strength, + AxeMastery, + HammerMastery, + Swordsmanship, + Tactics, // warrior + BeastMastery, + Expertise, + WildernessSurvival, + Marksmanship, // ranger + DaggerMastery = 29, + DeadlyArts, + ShadowArts, // assassin (most) + Communing, + RestorationMagic, + ChannelingMagic, // ritualist (most) + CriticalStrikes, + SpawningPower, // sin/rit primary (gw is weird) + SpearMastery, + Command, + Motivation, + Leadership, // paragon + ScytheMastery, + WindPrayers, + EarthPrayers, + Mysticism, // derv + None = 0xff, + } + + public enum AttributeByte : byte + { + FastCasting, + IllusionMagic, + DominationMagic, + InspirationMagic, // mesmer + BloodMagic, + DeathMagic, + SoulReaping, + Curses, // necro + AirMagic, + EarthMagic, + FireMagic, + WaterMagic, + EnergyStorage, // ele + HealingPrayers, + SmitingPrayers, + ProtectionPrayers, + DivineFavor, // monk + Strength, + AxeMastery, + HammerMastery, + Swordsmanship, + Tactics, // warrior + BeastMastery, + Expertise, + WildernessSurvival, + Marksmanship, // ranger + DaggerMastery = 29, + DeadlyArts, + ShadowArts, // assassin (most) + Communing, + RestorationMagic, + ChannelingMagic, // ritualist (most) + CriticalStrikes, + SpawningPower, // sin/rit primary (gw is weird) + SpearMastery, + Command, + Motivation, + Leadership, // paragon + ScytheMastery, + WindPrayers, + EarthPrayers, + Mysticism, // derv + None = 0xff, + } + + public enum Bag : byte + { + None, + Backpack, + Belt_Pouch, + Bag_1, + Bag_2, + Equipment_Pack, + Material_Storage, + Unclaimed_Items, + Storage_1, + Storage_2, + Storage_3, + Storage_4, + Storage_5, + Storage_6, + Storage_7, + Storage_8, + Storage_9, + Storage_10, + Storage_11, + Storage_12, + Storage_13, + Storage_14, + Equipped_Items, + Max, + } + + public enum BagType : int + { + None, + Inventory, + Equipped, + NotCollected, + Storage, + MaterialStorage, + } + + public enum Campaign : uint + { + Core, + Prophecies, + Factions, + Nightfall, + EyeOfTheNorth, + BonusMissionPack, + } + + public enum Difficulty : int + { + Normal, + Hard, + } + + public enum District : int + { + Current, + International, + American, + EuropeEnglish, + EuropeFrench, + EuropeGerman, + EuropeItalian, + EuropeSpanish, + EuropePolish, + EuropeRussian, + AsiaKorean, + AsiaChinese, + AsiaJapanese, + Unknown = 0xff, + } + + public enum EffectID : uint + { + black_cloud = 1, + mesmer_symbol = 4, + green_cloud = 7, + green_sparks = 8, + necro_symbol = 9, + ele_symbol = 11, + white_clouds = 13, + monk_symbol = 18, + bleeding = 23, + blind = 24, + burning = 25, + disease = 26, + poison = 27, + dazed = 28, + weakness = 29, // cracked_armor has same EffectID + assasin_symbol = 34, + ritualist_symbol = 35, + dervish_symbol = 36, + } + + public enum HeroID : uint + { + NoHero, + Norgu, + Goren, + Tahlkora, + MasterOfWhispers, + AcolyteJin, + Koss, + Dunkoro, + AcolyteSousuke, + Melonni, + ZhedShadowhoof, + GeneralMorgahn, + MargridTheSly, + Zenmai, + Olias, + Razah, + MOX, + KeiranThackeray, + Jora, + PyreFierceshot, + Anton, + Livia, + Hayda, + Kahmu, + Gwen, + Xandra, + Vekk, + Ogden, + Merc1, + Merc2, + Merc3, + Merc4, + Merc5, + Merc6, + Merc7, + Merc8, + Miku, + ZeiRi, + Devona, + GhostofAlthea, + Count, + } + + public enum InstanceType : int + { + Outpost, + Explorable, + Loading, + } + + public enum InterfaceSize : int + { + SMALL = -1, + NORMAL, + LARGE, + LARGER, + } + + public enum ItemType : byte + { + Salvage, + Axe = 2, + Bag, + Boots, + Bow, + Bundle, + Chestpiece, + Rune_Mod, + Usable, + Dye, + Materials_Zcoins, + Offhand, + Gloves, + Hammer = 15, + Headpiece, + CC_Shards, + Key, + Leggings, + Gold_Coin, + Quest_Item, + Wand, + Shield = 24, + Staff = 26, + Sword, + Kit = 29, + Trophy, + Scroll, + Daggers, + Present, + Minipet, + Scythe, + Spear, + Storybook = 43, + Costume, + Costume_Headpiece, + Unknown = 0xff, + } + + public enum Language : int + { + English, + Korean, + French, + German, + Italian, + Spanish, + TraditionalChinese, + Japanese = 8, + Polish, + Russian, + BorkBorkBork = 17, + Unknown = 0xff, + } + + public enum MapID : uint + { + None = 0, + Gladiators_Arena, + DEV_Test_Arena_1v1, + Test_map, + Warriors_Isle_outpost, + Hunters_Isle_outpost, + Wizards_Isle_outpost, + Warriors_Isle, + Hunters_Isle, + Wizards_Isle, + Bloodstone_Fen, + The_Wilds, + Aurora_Glade, + Diessa_Lowlands, + Gates_of_Kryta, + DAlessio_Seaboard, + Divinity_Coast, + Talmark_Wilderness, + The_Black_Curtain, + Sanctum_Cay, + Droknars_Forge_outpost, + The_Frost_Gate, + Ice_Caves_of_Sorrow, + Thunderhead_Keep, + Iron_Mines_of_Moladune, + Borlis_Pass, + Talus_Chute, + Griffons_Mouth, + The_Great_Northern_Wall, + Fort_Ranik, + Ruins_of_Surmia, + Xaquang_Skyway, + Nolani_Academy, + Old_Ascalon, + The_Fissure_of_Woe, + Ember_Light_Camp_outpost, + Grendich_Courthouse_outpost, + Glints_Challenge_mission, + Augury_Rock_outpost, + Sardelac_Sanitarium_outpost, + Piken_Square_outpost, + Sage_Lands, + Mamnoon_Lagoon, + Silverwood, + Ettins_Back, + Reed_Bog, + The_Falls, + Dry_Top, + Tangle_Root, + Henge_of_Denravi_outpost, + Test_Map_species_art, // "This is a debug map to allow testing of species art." + Senjis_Corner_outpost, + Burning_Isle_outpost, + Tears_of_the_Fallen, + Scoundrels_Rise, + Lions_Arch_outpost, + Cursed_Lands, + Bergen_Hot_Springs_outpost, + North_Kryta_Province, + Nebo_Terrace, + Majestys_Rest, + Twin_Serpent_Lakes, + Watchtower_Coast, + Stingray_Strand, + Kessex_Peak, + DAlessio_Arena_mission, + All_Call_Click_Point_1, + Burning_Isle, + Frozen_Isle, + Nomads_Isle, + Druids_Isle, + Isle_of_the_Dead_guild_hall, + The_Underworld, + Riverside_Province, + Tournament_6, // Shares description with HoH arena below + The_Hall_of_Heroes_arena_mission, + Broken_Tower_mission, + House_zu_Heltzer_outpost, + The_Courtyard_arena_mission, + Unholy_Temples_mission, + Burial_Mounds_mission, + Ascalon_City_outpost, + Tomb_of_the_Primeval_Kings, + The_Vault_mission, + The_Underworld_arena_mission, + Ascalon_Arena, + Sacred_Temples_mission, + Icedome, + Iron_Horse_Mine, + Anvil_Rock, + Lornars_Pass, + Snake_Dance, + Tascas_Demise, + Spearhead_Peak, + Ice_Floe, + Witmans_Folly, + Mineral_Springs, + Dreadnoughts_Drift, + Frozen_Forest, + Travelers_Vale, + Deldrimor_Bowl, + Regent_Valley, + The_Breach, + Ascalon_Foothills, + Pockmark_Flats, + Dragons_Gullet, + Flame_Temple_Corridor, + Eastern_Frontier, + The_Scar, + The_Amnoon_Oasis_outpost, + Diviners_Ascent, + Vulture_Drifts, + The_Arid_Sea, + Prophets_Path, + Salt_Flats, + Skyward_Reach, + Dunes_of_Despair, + Thirsty_River, + Elona_Reach, + Augury_Rock_mission, + The_Dragons_Lair, + Perdition_Rock, + Ring_of_Fire, + Abaddons_Mouth, + Hells_Precipice, + Titans_Tears, + Golden_Gates_mission, + Scarred_Earth2, + The_Eternal_Grove, + Lutgardis_Conservatory_outpost, + Vasburg_Armory_outpost, + Serenity_Temple_outpost, + Ice_Tooth_Cave_outpost, + Beacons_Perch_outpost, + Yaks_Bend_outpost, + Frontier_Gate_outpost, + Beetletun_outpost, + Fishermens_Haven_outpost, + Temple_of_the_Ages, + Ventaris_Refuge_outpost, + Druids_Overlook_outpost, + Maguuma_Stade_outpost, + Quarrel_Falls_outpost, + Ascalon_Academy_outpost, // not in live game + Gyala_Hatchery, + The_Catacombs, + Lakeside_County, + The_Northlands, + Ascalon_City_pre_searing, // ? + Ascalon_Academy_PvP_battle_mission_1, + Ascalon_Academy_PvP_battle_mission_2, + Ascalon_Academy_explorable, + Heroes_Audience_outpost, + Seekers_Passage_outpost, + Destinys_Gorge_outpost, + Camp_Rankor_outpost, + The_Granite_Citadel_outpost, + Marhans_Grotto_outpost, + Port_Sledge_outpost, + Copperhammer_Mines_outpost, + Green_Hills_County, + Wizards_Folly, + Regent_Valley_pre_Searing, + The_Barradin_Estate_outpost, + Ashford_Abbey_outpost, + Foibles_Fair_outpost, + Fort_Ranik_pre_Searing_outpost, + Burning_Isle_mission, + Druids_Isle_mission, + Frozen_Isle_mission = 170, + Warriors_Isle_mission, + Hunters_Isle_mission, + Wizards_Isle_mission, + Nomads_Isle_mission, + Isle_of_the_Dead_guild_hall_mission, + Frozen_Isle_outpost, + Nomads_Isle_outpost, + Druids_Isle_outpost, + Isle_of_the_Dead_guild_hall_outpost, + Fort_Koga_mission, + Shiverpeak_Arena, + Amnoon_Arena_mission, + Deldrimor_Arena_mission, + The_Crag_mission, + The_Underworld_gvg_mission, // UW guild hall not in live game + The_Underworld_guild_hall, + The_Underworld_guild_hall_preview, + Random_Arenas_outpost, + Team_Arenas_outpost, + Sorrows_Furnace, + Grenths_Footprint, + All_Call_Click_Point_2, + Cavalon_outpost, + Kaineng_Center_outpost, + Drazach_Thicket, + Jaya_Bluffs, + Shenzun_Tunnels, + Archipelagos, + Maishang_Hills, + Mount_Qinkai, + Melandrus_Hope, + Rheas_Crater, + Silent_Surf, + Unwaking_Waters_mission, + Morostav_Trail, + Deldrimor_War_Camp_outpost, + Dragons_Thieves, + Heroes_Crypt_mission, + Mourning_Veil_Falls, + Ferndale, + Pongmei_Valley, + Monastery_Overlook1, + Zen_Daijun_outpost_mission, + Minister_Chos_Estate_outpost_mission, + Vizunah_Square_mission, + Nahpui_Quarter_outpost_mission, + Tahnnakai_Temple_outpost_mission, + Arborstone_outpost_mission, + Boreas_Seabed_outpost_mission, + Sunjiang_District_outpost_mission, + Fort_Aspenwood_mission, + The_Eternal_Grove_outpost_mission, + The_Jade_Quarry_mission, + Gyala_Hatchery_outpost_mission, + Raisu_Palace_outpost_mission, + Imperial_Sanctum_outpost_mission, + Unwaking_Waters, + Grenz_Frontier_mission, + The_Ancestral_Lands_mission, + Amatz_Basin, + Kaanai_Canyon_mission, + Shadows_Passage, + Raisu_Palace, + The_Aurios_Mines, + Panjiang_Peninsula, + Kinya_Province, + Haiju_Lagoon, + Sunqua_Vale, + Wajjun_Bazaar, + Bukdek_Byway, + The_Undercity, + Shing_Jea_Monastery_outpost, + Shing_Jea_Arena, + Arborstone_explorable, + Minister_Chos_Estate_explorable, + Zen_Daijun_explorable, + Boreas_Seabed_explorable, + Great_Temple_of_Balthazar_outpost, + Tsumei_Village_outpost, + Seitung_Harbor_outpost, + Ran_Musu_Gardens_outpost, + Linnok_Courtyard, + Dwayna_Vs_Grenth, + Dwaynas_Camp, + Grenths_Camp, + Sunjiang_District_explorable, + Minister_Chos_Estate_cinematic, + Zen_Daijun_cinematic, + The_Jade_Quarry_Kurzick_cinematic, + Nahpui_Quarter_cinematic, + Tahnnaka_Temple_cinematic, + Arborstone_cinematic, + Boreas_Seabed_cinematic, + Sunjiang_District_cinematic, + Nahpui_Quarter_explorable, + Urgozs_Warren, + The_Eternal_Grove_cinematic, + Gyala_Hatchery_cinematic, + Tahnnakai_Temple_explorable, + Raisu_Palace_cinematic, + Imperial_Sanctum_cinematic, + Altrumm_Ruins, + Zos_Shivros_Channel, + Dragons_Throat, + Isle_of_Weeping_Stone_outpost, + Isle_of_Jade_outpost, + Harvest_Temple_outpost, + Breaker_Hollow_outpost, + Leviathan_Pits_outpost, + Isle_of_the_Nameless, + Zaishen_Challenge_outpost, + Zaishen_Elite_outpost, + Maatu_Keep_outpost, + Zin_Ku_Corridor_outpost, + Monastery_Overlook2, + Brauer_Academy_outpost, + Durheim_Archives_outpost, + Bai_Paasu_Reach_outpost, + Seafarers_Rest_outpost, + Bejunkan_Pier, + Vizunah_Square_Local_Quarter_outpost, + Vizunah_Square_Foreign_Quarter_outpost, + Fort_Aspenwood_Luxon_outpost, + Fort_Aspenwood_Kurzick_outpost, + The_Jade_Quarry_Luxon_outpost, + The_Jade_Quarry_Kurzick_outpost, + Unwaking_Waters_Luxon_outpost, + Unwaking_Waters_Kurzick_outpost, + Saltspray_Beach_mission, + Etnaran_Keys_mission, + Raisu_Pavilion, + Kaineng_Docks, + The_Marketplace_outpost, + Vizunah_Square_Local_Quarter_cinematic, + Vizunah_Square_Foreign_Quarter_cinematic, + The_Jade_Quarry_Luxon_cinematic, + The_Deep, + Ascalon_Arena_mission, + Annihilation_mission, + Kill_Count_Training_mission, + Priest_Annihilation_Training, + Obelisk_Annihilation_Training_mission, + Saoshang_Trail, + Shiverpeak_Arena_mission, + Travel_Battle_Isles, + Travel_Tyria, + Travel_Cantha, + DAlessio_Arena_mission3 = 318, + Amnoon_Arena_mission3, + Fort_Koga_mission3, + Heroes_Crypt_mission3, + Shiverpeak_Arena_mission3, + Fort_Aspenwood_Kurzick_cinematic, + Fort_Aspenwood_Luxon_cinematic, + The_Harvest_Ceremony_Kurzick_cinematic, // same cinematic but different teleport destination + The_Harvest_Ceremony_Luxon_cinematic, // same cinematic but different teleport destination + Imperial_Sanctum_explorable, + Saltspray_Beach_Luxon_outpost, + Saltspray_Beach_Kurzick_outpost, + Heroes_Ascent_outpost, + Grenz_Frontier_Luxon_outpost, + Grenz_Frontier_Kurzick_outpost, + The_Ancestral_Lands_Luxon_outpost, + The_Ancestral_Lands_Kurzick_outpost, + Etnaran_Keys_Luxon_outpost, + Etnaran_Keys_Kurzick_outpost, + Kaanai_Canyon_Luxon_outpost, + Kaanai_Canyon_Kurzick_outpost, + DAlessio_Arena_mission2, + Amnoon_Arena_mission2, + Fort_Koga_mission2, + Heroes_Crypt_mission2, + Shiverpeak_Arena_mission2, + The_Hall_of_Heroes, + The_Courtyard, + Scarred_Earth, + The_Underworld_PvP, + Tanglewood_Copse_outpost, + Saint_Anjekas_Shrine_outpost, + Eredon_Terrace_outpost, + Divine_Path, + Brawlers_Pit_mission, + Petrified_Arena_mission, + Seabed_Arena_mission, + Isle_of_Weeping_Stone_mission, + Isle_of_Jade_mission, + Imperial_Isle_mission, + Isle_of_Meditation_mission, + Imperial_Isle_outpost, + Isle_of_Meditation_outpost, + Isle_of_Weeping_Stone, + Isle_of_Jade, + Imperial_Isle, + Isle_of_Meditation, + Random_Arenas_Test, + Shing_Jea_Arena_mission, + All_Skills, // "This is a debug map which forces download of all skill effects" + Dragon_Arena, + Jahai_Bluffs, + Kamadan_mission, + Marga_Coast, + Fahranur_mission, + Sunward_Marches, + Vortex_Elona, // Vortex travel icon on the Elona world map + Barbarous_Shore, + Camp_Hojanu_outpost, + Bahdok_Caverns, + Wehhan_Terraces_outpost, + Dejarin_Estate, + Arkjok_Ward, + Yohlon_Haven_outpost, + Gandara_the_Moon_Fortress, + Vortex_Realm_of_Torment, // Vortex travel icon on the Realm of Torment world map + The_Floodplain_of_Mahnkelon, + Lions_Arch_Sunspears_in_Kryta, + Turais_Procession, + Sunspear_Sanctuary_outpost, + Aspenwood_Gate_Kurzick_outpost, + Aspenwood_Gate_Luxon_outpost, + Jade_Flats_Kurzick_outpost, + Jade_Flats_Luxon_outpost, + Yatendi_Canyons, + Chantry_of_Secrets_outpost, + Garden_of_Seborhin, + Holdings_of_Chokhin, + Mihanu_Township_outpost, + Vehjin_Mines, + Basalt_Grotto_outpost, + Forum_Highlands, + Kaineng_Center_Sunspears_in_Cantha, + Sebelkeh_Basilica, // Not in live game + Resplendent_Makuun, + Honur_Hill_outpost, + Wilderness_of_Bahdza, + Sun_Docks_cinematic, // Arriving in Elona? + Vehtendi_Valley, + Yahnur_Market_outpost, + The_Hidden_City_of_Ahdashim = 413, + The_Kodash_Bazaar_outpost, + Lions_Gate, + Monastery_Overlook_cinematic, // Factions opening cutscene + Bejunkan_Pier_cinematic, + Lions_Gate_cinematic, + The_Mirror_of_Lyss, + Secure_the_Refuge, + Venta_Cemetery, + Kamadan_Jewel_of_Istan_explorable, + The_Tribunal, + Kodonur_Crossroads, + Rilohn_Refuge, + Pogahn_Passage, + Moddok_Crevice, + Tihark_Orchard, + Consulate, + Plains_of_Jarin, + Sunspear_Great_Hall_outpost, + Cliffs_of_Dohjok, + Dzagonur_Bastion, + Dasha_Vestibule, + Grand_Court_of_Sebelkeh, + Command_Post, + Jokos_Domain, + Bone_Palace_outpost, + The_Ruptured_Heart, + The_Mouth_of_Torment_outpost, + The_Shattered_Ravines, + Lair_of_the_Forgotten_outpost, + Poisoned_Outcrops, + The_Sulfurous_Wastes, + The_Ebony_Citadel_of_Mallyx_mission, + The_Alkali_Pan, + A_Land_of_Heroes, + Crystal_Overlook, + Kamadan_Jewel_of_Istan_outpost, + Gate_of_Torment_outpost, + Gate_of_Anguish_elite_mission, + Secure_the_Refuge_cinematic, + Evacuation_cinematic, + Test_Map_solo_areas, // "This is a debug map to allow multiplayer testing of current solo areas." + Nightfallen_Garden, + Churrhir_Fields, + Beknur_Harbor_outpost, + Kodonur_Crossroads_cinematic, + Rilohn_Refuge_cinematic, + Pogahn_Passage_cinematic, + The_Underworld2, + Heart_of_Abaddon, + The_Underworld3, + Nightfallen_Coast, + Nightfallen_Jahai, + Depths_of_Madness, + Rollerbeetle_Racing, + Domain_of_Fear, + Gate_of_Fear_outpost, + Domain_of_Pain, + Bloodstone_Fen_quest, + Domain_of_Secrets, + Gate_of_Secrets_outpost, + Domain_of_Anguish, + Ooze_Pit_mission, + Jennurs_Horde, + Nundu_Bay, + Gate_of_Desolation, + Champions_Dawn_outpost, + Ruins_of_Morah, + Fahranur_The_First_City, + Bjora_Marches, + Zehlon_Reach, + Lahtenda_Bog, + Arbor_Bay, + Issnur_Isles, + Beknur_Harbor, + Mehtani_Keys, + Kodlonu_Hamlet_outpost, + Island_of_Shehkah, + Jokanur_Diggings, + Blacktide_Den, + Consulate_Docks, + Gate_of_Pain, + Gate_of_Madness, + Abaddons_Gate, + Sunspear_Arena, + Travel_Elona, // Boat travel icon in Elona + Ice_Cliff_Chasms, + Bokka_Amphitheatre, + Riven_Earth, + The_Astralarium_outpost, + Throne_of_Secrets, + Churranu_Island_Arena_mission, + Shing_Jea_Monastery_mission, + Haiju_Lagoon_mission, + Jaya_Bluffs_mission, + Seitung_Harbor_mission, + Tsumei_Village_mission, + Seitung_Harbor_mission_2, + Tsumei_Village_mission_2, + Minister_Chos_Estate_mission_2, + Drakkar_Lake, + Island_of_Shehkah_cinematic, // Nightfall opening cutscene + Jokanur_Diggings_cinematic, + Blacktide_Den_cinematic, + Consulate_Docks_cinematic, + Tihark_Orchard_cinematic, + Dzagonur_Bastion_cinematic, + Hidden_City_of_Ahdashim_cinematic, + Grand_Court_of_Sebelkeh_cinematic, + Jennurs_Horde_cinematic, + Nundu_Bay_cinematic, + Gates_of_Desolation_cinematic, + Ruins_of_Morah_cinematic, + Domain_of_Pain_cinematic, + Gate_of_Madness_cinematic, + Abaddons_Gate_cinematic, + Uncharted_Isle_outpost, + Isle_of_Wurms_outpost, + Uncharted_Isle, + Isle_of_Wurms, + Uncharted_Isle_mission, + Isle_of_Wurms_mission, + Ahmtur_Arena_mission, // Not in live game + Sunspear_Arena_mission, + Corrupted_Isle_outpost, + Isle_of_Solitude_outpost, + Corrupted_Isle, + Isle_of_Solitude, + Corrupted_Isle_mission, + Isle_of_Solitude_mission, + Sun_Docks, + Chahbek_Village, + Remains_of_Sahlahja, + Jaga_Moraine, + Bombardment_mission, + Norrhart_Domains, + Hero_Battles_outpost, + The_Beachhead_mission, + The_Crossing_mission, + Desert_Sands_mission, + Varajar_Fells, + Dajkah_Inlet, + The_Shadow_Nexus, + Chahbek_Village_cutscene, + Throne_Of_Secrets_outpost, // Not in live game + Sparkfly_Swamp, + Gate_of_the_Nightfallen_Lands_outpost, + Cathedral_of_Flames_Level_1, + The_Troubled_Keeper, + Fortress_of_Jahai, + Halls_of_Chokhin, + Citadel_of_Dzagon, + Dynastic_Tombs, + Verdant_Cascades, + Cathedral_of_Flames_Level_2, + Cathedral_of_Flames_Level_3, + Magus_Stones, + Catacombs_of_Kathandrax_Level_1, + Catacombs_of_Kathandrax_Level_2, + Alcazia_Tangle, + Rragars_Menagerie_Level_1, + Rragars_Menagerie_Level_2, + Rragars_Menagerie_Level_3, + Ooze_Pit, + Slavers_Exile_Level_1, + Oolas_Lab_Level_1, + Oolas_Lab_Level_2, + Oolas_Lab_Level_3, + Shards_of_Orr_Level_1, + Shards_of_Orr_Level_2, + Shards_of_Orr_Level_3, + Arachnis_Haunt_Level_1, + Arachnis_Haunt_Level_2, + Five_Team_Test = 592, // "5 team test" + Fetid_River_mission, + Overlook_mission, // Heroes Ascent unused/prototype map + Cemetery_mission, // Heroes Ascent unused/prototype map + Forgotten_Shrines_mission, + Track_mission, // Heroes Ascent unused/prototype map + Antechamber_mission, + Collision_mission, // Heroes Ascent unused/prototype map + The_Hall_of_Heroes2, // Actual HA hall of heroes? Unused? + Vloxen_Excavations_Level_1 = 604, + Vloxen_Excavations_Level_2, + Vloxen_Excavations_Level_3, + Heart_of_the_Shiverpeaks_Level_1, + Heart_of_the_Shiverpeaks_Level_2, + Heart_of_the_Shiverpeaks_Level_3, + Bloodstone_Caves_Level_1 = 612, + Bloodstone_Caves_Level_2, + Bloodstone_Caves_Level_3, + Bogroot_Growths_Level_1, + Bogroot_Growths_Level_2, + Ravens_Point_Level_1, + Ravens_Point_Level_2, + Ravens_Point_Level_3, + Slavers_Exile_Level_2, + Slavers_Exile_Level_3, + Slavers_Exile_Level_4, + Slavers_Exile_Level_5, + Vloxs_Falls, + Battledepths_Level_1, + Battledepths_Level_2, + Battledepths_Level_3, + Sepulchre_of_Dragrimmar_Level_1, + Sepulchre_of_Dragrimmar_Level_2, + Frostmaws_Burrows_Level_1, + Frostmaws_Burrows_Level_2, + Frostmaws_Burrows_Level_3, + Frostmaws_Burrows_Level_4, + Frostmaws_Burrows_Level_5, + Darkrime_Delves_Level_1, + Darkrime_Delves_Level_2, + Darkrime_Delves_Level_3, + Gadds_Encampment_outpost, + Umbral_Grotto_outpost, + Rata_Sum_outpost, + Tarnished_Haven_outpost, + Eye_of_the_North_outpost, + Sifhalla_outpost, + Gunnars_Hold_outpost, + Olafstead_outpost, + Hall_of_Monuments, + Dalada_Uplands, + Doomlore_Shrine_outpost, + Grothmar_Wardowns, + Longeyes_Ledge_outpost, + Sacnoth_Valley, + Central_Transfer_Chamber_outpost, + Curse_of_the_Nornbear, + Blood_Washes_Blood, + A_Gate_Too_Far_Level_1, + A_Gate_Too_Far_Level_2, + A_Gate_Too_Far_Level_3, + The_Elusive_Golemancer_Level_1, + The_Elusive_Golemancer_Level_2, + The_Elusive_Golemancer_Level_3, + Finding_the_Bloodstone_Level_1, + Finding_the_Bloodstone_Level_2, + Finding_the_Bloodstone_Level_3, + Genius_Operated_Living_Enchanted_Manifestation, + Against_the_Charr, + Warband_of_Brothers_Level_1, + Warband_of_Brothers_Level_2, + Warband_of_Brothers_Level_3, + Assault_on_the_Stronghold, + Destructions_Depths_Level_1, + Destructions_Depths_Level_2, + Destructions_Depths_Level_3, + A_Time_for_Heroes, + Warband_Training, + Boreal_Station_outpost, + Catacombs_of_Kathandrax_Level_3, + Hall_of_Primordus, // Unused explorable area + Attack_of_the_Nornbear, + Cinematic_Cave_Norn_Cursed, + Cinematic_Steppe_Interrogation, + Cinematic_Interior_Research, + Cinematic_Eye_Vision_A, + Cinematic_Eye_Vision_B, + Cinematic_Eye_Vision_C, + Cinematic_Eye_Vision_D, + Polymock_Coliseum, + Polymock_Glacier, + Polymock_Crossing, + Cinematic_Mountain_Resolution, + Cold_as_Ice, + Beneath_Lions_Arch, + Tunnels_Below_Cantha, + Caverns_Below_Kamadan, + Cinematic_Mountain_Dwarfs, + Service_In_Defense_of_the_Eye, + Mano_a_Norn_o, + Service_Practice_Dummy, + Hero_Tutorial, + Prototype_Map, + The_Norn_Fighting_Tournament = 700, + Secret_Lair_of_the_Snowmen, + Norn_Brawling_Championship, + Kilroys_Punchout_Training, + Fronis_Irontoes_Lair_mission, + The_Justiciars_End, + Designer_Test_Map, + The_Great_Norn_Alemoot, + Varajar_Fells_Bear_Club_quest, + The_Crossing_mission2, // Unused RA arena? + Epilogue, + Insidious_Remnants, + The_Beachhead_mission2, // Unused RA arena? + Bombardment_mission2, // Unused RA arena? + Desert_Sands_mission2, // Unused RA arena? + MISSION_CINEMATIC_MISSION_PACK_TYRIA_INTRODUCTION, + The_Battlefield_cinematic, + Attack_on_Jaliss_Camp, + The_Hierophants_Stronghold_cinematic, + The_Asura_Plan_cinematic, + Creature_Test_Map, + Costume_Brawl_outpost, + Whitefury_Rapids_mission, + Kysten_Shore_mission, + Deepway_Ruins_mission, + Plikkup_Works_mission, + Kilroys_Punchout_Tournament, + Special_Ops_Flame_Temple_Corridor, + Special_Ops_Dragons_Gullet, + Special_Ops_Grendich_Courthouse, + Encounter_in_the_Depths_hom_cinematic, + Into_the_North_hom_cinematic, + Arrival_at_the_Eye_hom_cinematic, + Joras_Curse_hom_cinematic, + The_Nornbear_hom_cinematic, + Blood_Washes_Blood_hom_cinematic, + Joras_Redemption_hom_cinematic, + Sign_of_the_Raven_hom_cinematic, + Olaf_and_Ogden_hom_cinematic, + Audience_with_the_King_hom_cinematic, + The_Battlefield_hom_cinematic, + The_Charr_Prisoner_hom_cinematic, + The_Warband_hom_cinematic, + Questions_and_Answers_hom_cinematic, + The_Hierophants_Stronghold_hom_cinematic, + Revolution_hom_cinematic, + The_Asura_Plan_hom_cinematic, + Bookah_hom_cinematic, + Oola_hom_cinematic, + Gadd_hom_cinematic, + At_the_Bloodstone_hom_cinematic, + Before_the_Battle_hom_cinematic, + Price_of_Victory_hom_cinematic, + The_Great_Dwarf_hom_cinematic, + The_Great_Destroyer_hom_cinematic, + Ogdens_Benediction_hom_cinematic, + Asura_Gate_Tyria, + Asura_Gate_Cantha, + Asura_Gate_Elona, + Finding_the_Bloodstone_mission, + Genius_Operated_Living_Enchanted_Manifestation_mission, + Against_the_Charr_mission, + Warband_of_brothers_mission, + Assault_on_the_Stronghold_mission, + Destructions_Depths_mission, + A_Time_for_Heroes_mission, + Curse_of_the_Nornbear_mission, + Blood_Washes_Blood_mission, + A_Gate_Too_Far_mission, + The_Elusive_Golemancer_mission, + The_Tengu_Accords, + The_Battle_of_Jahai, + The_Flight_North, + The_Rise_of_the_White_Mantle, + Battle_Isles_Marketplace, // Xunlai Marketplace? + MISSION_CINEMATIC_MISSION_PACK_CANTHA_INTRODUCTION, + Mission_Pack_Test, + MISSION_CINEMATIC_MISSION_PACK_ELONA_INTRODUCTION, + MISSION_CINEMATIC_MISSION_PACK_GWX_INTRODUCTION, + Piken_Square_pre_Searing_outpost, + Secret_Lair_of_the_Snowmen2 = 781, // ? + Secret_Lair_of_the_Snowmen3, // ? + Droknars_Forge_cinematic, // ? + Isle_of_the_Nameless_PvP, + Rollerbeetle_Racing_HeroBattles, + Dragon_Arena_gvg, + Dwayna_vs_Grenth_gvg, + Temple_of_the_Ages_ROX, + Wajjun_Bazaar_POX, + Bokka_Amphitheatre_NOX, + Secret_Underground_Lair, + Golem_Tutorial_Simulation, + Snowball_Dominance, + Zaishen_Menagerie_Grounds, + Zaishen_Menagerie_outpost, + Codex_Arena_outpost, + The_Underworld_Something_Wicked_This_Way_Comes = 806, + The_Underworld_Dont_Fear_the_Reapers, + Lions_Arch_Halloween_outpost, + Lions_Arch_Wintersday_outpost, + Lions_Arch_Canthan_New_Year_outpost, + Ascalon_City_Wintersday_outpost, + Droknars_Forge_Halloween_outpost, + Droknars_Forge_Wintersday_outpost, + Tomb_of_the_Primeval_Kings_Halloween_outpost, + Shing_Jea_Monastery_Dragon_Festival_outpost, + Shing_Jea_Monastery_Canthan_New_Year_outpost, + Kaineng_Center_Canthan_New_Year_outpost, + Kamadan_Jewel_of_Istan_Halloween_outpost, + Kamadan_Jewel_of_Istan_Wintersday_outpost, + Kamadan_Jewel_of_Istan_Canthan_New_Year_outpost, + Eye_of_the_North_outpost_Wintersday_outpost, + Tester_HUB, + DAlessio_Arena_mission4, + Amnoon_Arena_mission4, + Churranu_Island_Arena_mission2, + Fort_Koga_mission4, + Petrified_Arena_mission2, + Heroes_Crypt_mission4, + Seabed_Arena_mission2, + Deldrimor_Arena_mission2, + Brawlers_Pit_mission2, + The_Crag_mission2, + Sunspear_Arena_mission2, + Shing_Jea_Arena_mission2, + Ascalon_Arena_mission2, + Shiverpeak_Arena_mission4, + War_in_Kryta_Talmark_Wilderness, + War_in_Kryta_Trial_of_Zinn, + War_in_Kryta_Divinity_Coast, + War_in_Kryta_Lions_Arch_Keep, + War_in_Kryta_DAlessio_Seaboard, + War_in_Kryta_The_Battle_for_Lions_Arch, + War_in_Kryta_Riverside_Province, + War_in_Kryta_Lions_Arch, + War_in_Kryta_The_Mausoleum, + War_in_Kryta_Rise, + War_in_Kryta_Shadows_in_the_Jungle, + War_in_Kryta_A_Vengeance_of_Blades, + War_in_Kryta_Auspicious_Beginnings, + Beetletun_explorable, // Is this part of War in Kryta? or Rise? + Aurora_Glade2, // explorable + Majestys_Rest2, + Watchtower_Coast2, + Olafstead_cinematic, + The_Great_Snowball_Fight_of_the_Gods__Operation_Crush_Spirits, + The_Great_Snowball_Fight_of_the_Gods__Fighting_in_a_Winter_Wonderland, + Embark_Beach, + Regent_Valley_1059_AE, + Lakeside_County_1059_AE, + Dragons_Throat_area__What_Waits_in_Shadow = 860, + Kaineng_Center_Winds_of_Change__A_Chance_Encounter, + The_Marketplace_area__Tracking_the_Corruption, + Bukdek_Byway_Winds_of_Change__Cantha_Courier_Crisis, + Tsumei_Village_Winds_of_Change__A_Treatys_a_Treaty, + Seitung_Harbor_area__Deadly_Cargo, + Tahnnakai_Temple_Winds_of_Change__The_Rescue_Attempt, + Wajjun_Bazaar_Winds_of_Change__Violence_in_the_Streets, + Scarred_Psyche_mission, + Shadows_Passage_Winds_of_Change__Calling_All_Thugs, + Altrumm_Ruins__Finding_Jinnai, + Shing_Jea_Monastery__Raid_on_Shing_Jea_Monastery, + Kaineng_Center_Winds_of_Change__Raid_on_Kaineng_Center, + Wajjun_Bazaar_Winds_of_Change__Ministry_of_Oppression, + The_Final_Confrontation, + Lakeside_County_1070_AE, + Ashford_Catacombs_1070_AE, + Count = 0x370, + } + + public enum MaterialSlot : uint + { + Bone, + IronIngot, + TannedHideSquare, + Scale, + ChitinFragment, + BoltofCloth, + WoodPlank, + GraniteSlab = 8, + PileofGlitteringDust, + PlantFiber, + Feather, + FurSquare, + BoltofLinen, + BoltofDamask, + BoltofSilk, + GlobofEctoplasm, + SteelIngot, + DeldrimorSteelIngot, + MonstrousClaw, + MonstrousEye, + MonstrousFang, + Ruby, + Sapphire, + Diamond, + OnyxGemstone, + LumpofCharcoal, + ObsidianShard, + TemperedGlassVial = 29, + LeatherSquare, + ElonianLeatherSquare, + VialofInk, + RollofParchment, + RollofVellum, + SpiritwoodPlank, + AmberChunk, + JadeiteShard, + BronzeZCoin, + SilverZCoin, + GoldZCoin, + Count, + } + + public enum Profession : uint + { + None, + Warrior, + Ranger, + Monk, + Necromancer, + Mesmer, + Elementalist, + Assassin, + Ritualist, + Paragon, + Dervish, + } + + public enum ProfessionByte : byte + { + None, + Warrior, + Ranger, + Monk, + Necromancer, + Mesmer, + Elementalist, + Assassin, + Ritualist, + Paragon, + Dervish, + } + + public enum QuestID : uint + { + None = 0, + UW_Chamber = 101, + UW_Wastes, + UW_UWG, + UW_Mnt, + UW_Pits, + UW_Planes, + UW_Pools, + UW_Escort, + UW_Restore, + UW_Vale, + Fow_Defend = 202, + Fow_ArmyOfDarknesses, + Fow_WailingLord, + Fow_Griffons, + Fow_Slaves, + Fow_Restore, + Fow_Hunt, + Fow_Forgemaster, + Fow_Tos = 211, + Fow_Toc, + Fow_Khobay = 224, + Doa_DeathbringerCompany = 749, + Doa_RiftBetweenUs = 752, + Doa_ToTheRescue = 753, + Doa_City = 751, + Doa_BreachingStygianVeil = 742, + Doa_BroodWars = 755, + Doa_FoundryBreakout = 743, + Doa_FoundryOfFailedCreations = 744, + The_Last_Hierophant = 917, + ZaishenMission_The_Great_Northern_Wall = 936, + ZaishenMission_Fort_Ranik = 937, + ZaishenMission_Ruins_of_Surmia = 938, + ZaishenMission_Nolani_Academy = 939, + ZaishenMission_Borlis_Pass = 940, + ZaishenMission_The_Frost_Gate = 941, + ZaishenMission_Gates_of_Kryta = 942, + ZaishenMission_DAlessio_Seaboard = 943, + ZaishenMission_Divinity_Coast = 944, + ZaishenMission_The_Wilds = 945, + ZaishenMission_Bloodstone_Fen = 946, + ZaishenMission_Aurora_Glade = 947, + ZaishenMission_Riverside_Province = 948, + ZaishenMission_Sanctum_Cay = 949, + ZaishenMission_Dunes_of_Despair = 950, + ZaishenMission_Thirsty_River = 951, + ZaishenMission_Elona_Reach = 952, + ZaishenMission_Augury_Rock = 953, + ZaishenMission_The_Dragons_Lair = 954, + ZaishenMission_Ice_Caves_of_Sorrow = 955, + ZaishenMission_Iron_Mines_of_Moladune = 956, + ZaishenMission_Thunderhead_Keep = 957, + ZaishenMission_Ring_of_Fire = 958, + ZaishenMission_Abaddons_Mouth = 959, + ZaishenMission_Hells_Precipice = 960, + ZaishenMission_Minister_Chos_Estate = 1119, + ZaishenMission_Zen_Daijun = 961, + ZaishenMission_Vizunah_Square = 962, + ZaishenMission_Nahpui_Quarter = 963, + ZaishenMission_Tahnnakai_Temple = 964, + ZaishenMission_Arborstone = 965, + ZaishenMission_Boreas_Seabed = 966, + ZaishenMission_Sunjiang_District = 967, + ZaishenMission_The_Eternal_Grove = 968, + ZaishenMission_Gyala_Hatchery = 970, + ZaishenMission_Unwaking_Waters = 969, + ZaishenMission_Raisu_Palace = 971, + ZaishenMission_Imperial_Sanctum = 972, + ZaishenMission_Chahbek_Village = 978, + ZaishenMission_Jokanur_Diggings = 979, + ZaishenMission_Blacktide_Den = 980, + ZaishenMission_Consulate_Docks = 981, + ZaishenMission_Venta_Cemetery = 982, + ZaishenMission_Kodonur_Crossroads = 983, + ZaishenMission_Pogahn_Passage = 1181, + ZaishenMission_Rilohn_Refuge = 984, + ZaishenMission_Moddok_Crevice = 985, + ZaishenMission_Tihark_Orchard = 986, + ZaishenMission_Dasha_Vestibule = 988, + ZaishenMission_Dzagonur_Bastion = 987, + ZaishenMission_Grand_Court_of_Sebelkeh = 989, + ZaishenMission_Jennurs_Horde = 990, + ZaishenMission_Nundu_Bay = 991, + ZaishenMission_Gate_of_Desolation = 992, + ZaishenMission_Ruins_of_Morah = 993, + ZaishenMission_Gate_of_Pain = 994, + ZaishenMission_Gate_of_Madness = 995, + ZaishenMission_Abaddons_Gate = 996, + ZaishenMission_Finding_the_Bloodstone = 1000, + ZaishenMission_The_Elusive_Golemancer = 1001, + ZaishenMission_G_O_L_E_M = 1002, + ZaishenMission_Against_the_Charr = 1003, + ZaishenMission_Warband_of_Brothers = 1004, + ZaishenMission_Assault_on_the_Stronghold = 1005, + ZaishenMission_Curse_of_the_Nornbear = 1006, + ZaishenMission_A_Gate_Too_Far = 1008, + ZaishenMission_Blood_Washes_Blood = 1007, + ZaishenMission_Destructions_Depths = 1009, + ZaishenMission_A_Time_for_Heroes = 1010, + ZaishenBounty_Urgoz = 1025, + ZaishenBounty_Ilsundur_Lord_of_Fire = 1048, + ZaishenBounty_Chung_The_Attuned = 1026, + ZaishenBounty_Mungri_Magicbox = 1029, + ZaishenBounty_The_Stygian_Lords = 1046, + ZaishenBounty_Rragar_Maneater = 1049, + ZaishenBounty_Murakai_Lady_of_the_Night = 1050, + ZaishenBounty_Prismatic_Ooze = 1051, + ZaishenBounty_Havok_Soulwail = 1052, + ZaishenBounty_Frostmaw_the_Kinslayer = 1053, + ZaishenBounty_Remnant_of_Antiquities = 1054, + ZaishenBounty_Plague_of_Destruction = 1055, + ZaishenBounty_Zoldark_the_Unholy = 1056, + ZaishenBounty_Khabuus = 1057, + ZaishenBounty_Zhim_Monns = 1058, + ZaishenBounty_Eldritch_Ettin = 1059, + ZaishenBounty_Fendi_Nin = 1060, + ZaishenBounty_TPS_Regulator_Golem = 1061, + ZaishenBounty_Arachni = 1062, + ZaishenBounty_Forgewight = 1063, + ZaishenBounty_Selvetarm = 1064, + ZaishenBounty_Justiciar_Thommis = 1065, + ZaishenBounty_Rand_Stormweaver = 1066, + ZaishenBounty_Duncan_the_Black = 1067, + ZaishenBounty_Fronis_Irontoe = 1068, + ZaishenBounty_Magmus = 1070, + ZaishenBounty_Lord_Khobay = 1086, + ZaishenVanquish_Dejarin_Estate = 1201, + ZaishenVanquish_Watchtower_Coast = 1202, + ZaishenVanquish_Arbor_Bay = 1203, + ZaishenVanquish_Barbarous_Shore = 1204, + ZaishenVanquish_Deldrimor_Bowl = 1205, + ZaishenVanquish_Boreas_Seabed = 1206, + ZaishenVanquish_Cliffs_of_Dohjok = 1207, + ZaishenVanquish_Diessa_Lowlands = 1208, + ZaishenVanquish_Bukdek_Byway = 1209, + ZaishenVanquish_Bjora_Marches = 1210, + ZaishenVanquish_Crystal_Overlook = 1211, + ZaishenVanquish_Diviners_Ascent = 1212, + ZaishenVanquish_Dalada_Uplands = 1213, + ZaishenVanquish_Drazach_Thicket = 1214, + ZaishenVanquish_Fahranur_the_First_City = 1215, + ZaishenVanquish_Dragons_Gullet = 1216, + ZaishenVanquish_Ferndale = 1217, + ZaishenVanquish_Forum_Highlands = 1218, + ZaishenVanquish_Dreadnoughts_Drift = 1219, + ZaishenVanquish_Drakkar_Lake = 1220, + ZaishenVanquish_Dry_Top = 1221, + ZaishenVanquish_Tears_of_the_Fallen = 1222, + ZaishenVanquish_Gyala_Hatchery = 1223, + ZaishenVanquish_Ettins_Back = 1224, + ZaishenVanquish_Gandara_the_Moon_Fortress = 1225, + ZaishenVanquish_Grothmar_Wardowns = 1226, + ZaishenVanquish_Flame_Temple_Corridor = 1227, + ZaishenVanquish_Haiju_Lagoon = 1228, + ZaishenVanquish_Frozen_Forest = 1229, + ZaishenVanquish_Garden_of_Seborhin = 1230, + ZaishenVanquish_Grenths_Footprint = 1231, + ZaishenVanquish_Jaya_Bluffs = 1232, + ZaishenVanquish_Holdings_of_Chokhin = 1233, + ZaishenVanquish_Ice_Cliff_Chasms = 1234, + ZaishenVanquish_Griffons_Mouth = 1235, + ZaishenVanquish_Kinya_Province = 1236, + ZaishenVanquish_Issnur_Isles = 1237, + ZaishenVanquish_Jaga_Moraine = 1238, + ZaishenVanquish_Ice_Floe = 1239, + ZaishenVanquish_Maishang_Hills = 1240, + ZaishenVanquish_Jahai_Bluffs = 1241, + ZaishenVanquish_Riven_Earth = 1242, + ZaishenVanquish_Icedome = 1243, + ZaishenVanquish_Minister_Chos_Estate = 1244, + ZaishenVanquish_Mehtani_Keys = 1245, + ZaishenVanquish_Sacnoth_Valley = 1246, + ZaishenVanquish_Iron_Horse_Mine = 1247, + ZaishenVanquish_Morostav_Trail = 1248, + ZaishenVanquish_Plains_of_Jarin = 1249, + ZaishenVanquish_Sparkfly_Swamp = 1250, + ZaishenVanquish_Kessex_Peak = 1251, + ZaishenVanquish_Mourning_Veil_Falls = 1252, + ZaishenVanquish_The_Alkali_Pan = 1253, + ZaishenVanquish_Varajar_Fells = 1254, + ZaishenVanquish_Lornars_Pass = 1255, + ZaishenVanquish_Pongmei_Valley = 1256, + ZaishenVanquish_The_Floodplain_of_Mahnkelon = 1257, + ZaishenVanquish_Verdant_Cascades = 1258, + ZaishenVanquish_Majestys_Rest = 1259, + ZaishenVanquish_Raisu_Palace = 1260, + ZaishenVanquish_The_Hidden_City_of_Ahdashim = 1261, + ZaishenVanquish_Rheas_Crater = 1262, + ZaishenVanquish_Mamnoon_Lagoon = 1263, + ZaishenVanquish_Shadows_Passage = 1264, + ZaishenVanquish_The_Mirror_of_Lyss = 1265, + ZaishenVanquish_Saoshang_Trail = 1266, + ZaishenVanquish_Nebo_Terrace = 1267, + ZaishenVanquish_Shenzun_Tunnels = 1268, + ZaishenVanquish_The_Ruptured_Heart = 1269, + ZaishenVanquish_Salt_Flats = 1270, + ZaishenVanquish_North_Kryta_Province = 1271, + ZaishenVanquish_Silent_Surf = 1272, + ZaishenVanquish_The_Shattered_Ravines = 1273, + ZaishenVanquish_Scoundrels_Rise = 1274, + ZaishenVanquish_Old_Ascalon = 1275, + ZaishenVanquish_Sunjiang_District = 1276, + ZaishenVanquish_The_Sulphurous_Wastes = 1277, + ZaishenVanquish_Magus_Stones = 1278, + ZaishenVanquish_Perdition_Rock = 1279, + ZaishenVanquish_Sunqua_Vale = 1280, + ZaishenVanquish_Turais_Procession = 1281, + ZaishenVanquish_Norrhart_Domains = 1282, + ZaishenVanquish_Pockmark_Flats = 1283, + ZaishenVanquish_Tahnnakai_Temple = 1284, + ZaishenVanquish_Vehjin_Mines = 1285, + ZaishenVanquish_Poisoned_Outcrops = 1286, + ZaishenVanquish_Prophets_Path = 1287, + ZaishenVanquish_The_Eternal_Grove = 1288, + ZaishenVanquish_Tascas_Demise = 1289, + ZaishenVanquish_Respendent_Makuun = 1290, + ZaishenVanquish_Reed_Bog = 1291, + ZaishenVanquish_Unwaking_Waters = 1292, + ZaishenVanquish_Stingray_Strand = 1293, + ZaishenVanquish_Sunward_Marches = 1294, + ZaishenVanquish_Regent_Valley = 1295, + ZaishenVanquish_Wajjun_Bazaar = 1296, + ZaishenVanquish_Yatendi_Canyons = 1297, + ZaishenVanquish_Twin_Serpent_Lakes = 1298, + ZaishenVanquish_Sage_Lands = 1299, + ZaishenVanquish_Xaquang_Skyway = 1300, + ZaishenVanquish_Zehlon_Reach = 1301, + ZaishenVanquish_Tangle_Root = 1302, + ZaishenVanquish_Silverwood = 1303, + ZaishenVanquish_Zen_Daijun = 1304, + ZaishenVanquish_The_Arid_Sea = 1305, + ZaishenVanquish_Nahpui_Quarter = 1306, + ZaishenVanquish_Skyward_Reach = 1307, + ZaishenVanquish_The_Scar = 1308, + ZaishenVanquish_The_Black_Curtain = 1309, + ZaishenVanquish_Panjiang_Peninsula = 1310, + ZaishenVanquish_Snake_Dance = 1311, + ZaishenVanquish_Travelers_Vale = 1312, + ZaishenVanquish_The_Breach = 1313, + ZaishenVanquish_Lahtenda_Bog = 1314, + ZaishenVanquish_Spearhead_Peak = 1315, + } + + public enum ServerRegion : int + { + International = -2, + America = 0, + Korea, + Europe, + China, + Japan, + Unknown = 0xff, + } + + public enum SkillID : uint + { + No_Skill = 0, + Healing_Signet, + Resurrection_Signet, + Signet_of_Capture, + BAMPH, + Power_Block, + Mantra_of_Earth, + Mantra_of_Flame, + Mantra_of_Frost, + Mantra_of_Lightning, + Hex_Breaker, + Distortion, + Mantra_of_Celerity, + Mantra_of_Recovery, + Mantra_of_Persistence, + Mantra_of_Inscriptions, + Mantra_of_Concentration, + Mantra_of_Resolve, + Mantra_of_Signets, + Fragility, + Confusion, + Inspired_Enchantment, + Inspired_Hex, + Power_Spike, + Power_Leak, + Power_Drain, + Empathy, + Shatter_Delusions, + Backfire, + Blackout, + Diversion, + Conjure_Phantasm, + Illusion_of_Weakness, + Illusionary_Weaponry, + Sympathetic_Visage, + Ignorance, + Arcane_Conundrum, + Illusion_of_Haste, + Channeling, + Energy_Surge, + Ether_Feast, + Ether_Lord, + Energy_Burn, + Clumsiness, + Phantom_Pain, + Ethereal_Burden, + Guilt, + Ineptitude, + Spirit_of_Failure, + Mind_Wrack, + Wastrels_Worry, + Shame, + Panic, + Migraine, + Crippling_Anguish, + Fevered_Dreams, + Soothing_Images, + Cry_of_Frustration, + Signet_of_Midnight, + Signet_of_Weariness, + Signet_of_Illusions_beta_version, + Leech_Signet, + Signet_of_Humility, + Keystone_Signet, + Mimic, + Arcane_Mimicry, + Spirit_Shackles, + Shatter_Hex, + Drain_Enchantment, + Shatter_Enchantment, + Disappear, + Unnatural_Signet_alpha_version, + Elemental_Resistance, + Physical_Resistance, + Echo, + Arcane_Echo, + Imagined_Burden, + Chaos_Storm, + Epidemic, + Energy_Drain, + Energy_Tap, + Arcane_Thievery, + Mantra_of_Recall, + Animate_Bone_Horror, + Animate_Bone_Fiend, + Animate_Bone_Minions, + Grenths_Balance, + Veratas_Gaze, + Veratas_Aura, + Deathly_Chill, + Veratas_Sacrifice, + Well_of_Power, + Well_of_Blood, + Well_of_Suffering, + Well_of_the_Profane, + Putrid_Explosion, + Soul_Feast, + Necrotic_Traversal, + Consume_Corpse, + Parasitic_Bond, + Soul_Barbs, + Barbs, + Shadow_Strike, + Price_of_Failure, + Death_Nova, + Deathly_Swarm, + Rotting_Flesh, + Virulence, + Suffering, + Life_Siphon, + Unholy_Feast, + Awaken_the_Blood, + Desecrate_Enchantments, + Tainted_Flesh, + Aura_of_the_Lich, + Blood_Renewal, + Dark_Aura, + Enfeeble, + Enfeebling_Blood, + Blood_is_Power, + Blood_of_the_Master, + Spiteful_Spirit, + Malign_Intervention, + Insidious_Parasite, + Spinal_Shivers, + Wither, + Life_Transfer, + Mark_of_Subversion, + Soul_Leech, + Defile_Flesh, + Demonic_Flesh, + Barbed_Signet, + Plague_Signet, + Dark_Pact, + Order_of_Pain, + Faintheartedness, + Shadow_of_Fear, + Rigor_Mortis, + Dark_Bond, + Infuse_Condition, + Malaise, + Rend_Enchantments, + Lingering_Curse, + Strip_Enchantment, + Chilblains, + Signet_of_Agony, + Offering_of_Blood, + Dark_Fury, + Order_of_the_Vampire, + Plague_Sending, + Mark_of_Pain, + Feast_of_Corruption, + Taste_of_Death, + Vampiric_Gaze, + Plague_Touch, + Vile_Touch, + Vampiric_Touch, + Blood_Ritual, + Touch_of_Agony, + Weaken_Armor, + Windborne_Speed, + Lightning_Storm, + Gale, + Whirlwind, + Elemental_Attunement, + Armor_of_Earth, + Kinetic_Armor, + Eruption, + Magnetic_Aura, + Earth_Attunement, + Earthquake, + Stoning, + Stone_Daggers, + Grasping_Earth, + Aftershock, + Ward_Against_Elements, + Ward_Against_Melee, + Ward_Against_Foes, + Ether_Prodigy, + Incendiary_Bonds, + Aura_of_Restoration, + Ether_Renewal, + Conjure_Flame, + Inferno, + Fire_Attunement, + Mind_Burn, + Fireball, + Meteor, + Flame_Burst, + Rodgorts_Invocation, + Mark_of_Rodgort, + Immolate, + Meteor_Shower, + Phoenix, + Flare, + Lava_Font, + Searing_Heat, + Fire_Storm, + Glyph_of_Elemental_Power, + Glyph_of_Energy, + Glyph_of_Lesser_Energy, + Glyph_of_Concentration, + Glyph_of_Sacrifice, + Glyph_of_Renewal, + Rust, + Lightning_Surge, + Armor_of_Frost, + Conjure_Frost, + Water_Attunement, + Mind_Freeze, + Ice_Prison, + Ice_Spikes, + Frozen_Burst, + Shard_Storm, + Ice_Spear, + Maelstrom, + Iron_Mist, + Crystal_Wave, + Obsidian_Flesh, + Obsidian_Flame, + Blinding_Flash, + Conjure_Lightning, + Lightning_Strike, + Chain_Lightning, + Enervating_Charge, + Air_Attunement, + Mind_Shock, + Glimmering_Mark, + Thunderclap, + Lightning_Orb, + Lightning_Javelin, + Shock, + Lightning_Touch, + Swirling_Aura, + Deep_Freeze, + Blurred_Vision, + Mist_Form, + Water_Trident, + Armor_of_Mist, + Ward_Against_Harm, + Smite, + Life_Bond, + Balthazars_Spirit, + Strength_of_Honor, + Life_Attunement, + Protective_Spirit, + Divine_Intervention, + Symbol_of_Wrath, + Retribution, + Holy_Wrath, + Essence_Bond, + Scourge_Healing, + Banish, + Scourge_Sacrifice, + Vigorous_Spirit, + Watchful_Spirit, + Blessed_Aura, + Aegis, + Guardian, + Shield_of_Deflection, + Aura_of_Faith, + Shield_of_Regeneration, + Shield_of_Judgment, + Protective_Bond, + Pacifism, + Amity, + Peace_and_Harmony, + Judges_Insight, + Unyielding_Aura, + Mark_of_Protection, + Life_Barrier, + Zealots_Fire, + Balthazars_Aura, + Spell_Breaker, + Healing_Seed, + Mend_Condition, + Restore_Condition, + Mend_Ailment, + Purge_Conditions, + Divine_Healing, + Heal_Area, + Orison_of_Healing, + Word_of_Healing, + Dwaynas_Kiss, + Divine_Boon, + Healing_Hands, + Heal_Other, + Heal_Party, + Healing_Breeze, + Vital_Blessing, + Mending, + Live_Vicariously, + Infuse_Health, + Signet_of_Devotion, + Signet_of_Judgment, + Purge_Signet, + Bane_Signet, + Blessed_Signet, + Martyr, + Shielding_Hands, + Contemplation_of_Purity, + Remove_Hex, + Smite_Hex, + Convert_Hexes, + Light_of_Dwayna, + Resurrect, + Rebirth, + Reversal_of_Fortune, + Succor, + Holy_Veil, + Divine_Spirit, + Draw_Conditions, + Holy_Strike, + Healing_Touch, + Restore_Life, + Vengeance, + To_the_Limit, + Battle_Rage, + Defy_Pain, + Rush, + Hamstring, + Wild_Blow, + Power_Attack, + Desperation_Blow, + Thrill_of_Victory, + Distracting_Blow, + Protectors_Strike, + Griffons_Sweep, + Pure_Strike, + Skull_Crack, + Cyclone_Axe, + Hammer_Bash, + Bulls_Strike, + I_Will_Avenge_You, + Axe_Rake, + Cleave, + Executioners_Strike, + Dismember, + Eviscerate, + Penetrating_Blow, + Disrupting_Chop, + Swift_Chop, + Axe_Twist, + For_Great_Justice, + Flurry, + Defensive_Stance, + Frenzy, + Endure_Pain, + Watch_Yourself, + Sprint, + Belly_Smash, + Mighty_Blow, + Crushing_Blow, + Crude_Swing, + Earth_Shaker, + Devastating_Hammer, + Irresistible_Blow, + Counter_Blow, + Backbreaker, + Heavy_Blow, + Staggering_Blow, + Dolyak_Signet, + Warriors_Cunning, + Shield_Bash, + Charge, + Victory_Is_Mine, + Fear_Me, + Shields_Up, + I_Will_Survive, + Dont_Believe_Their_Lies, + Berserker_Stance, + Balanced_Stance, + Gladiators_Defense, + Deflect_Arrows, + Warriors_Endurance, + Dwarven_Battle_Stance, + Disciplined_Stance, + Wary_Stance, + Shield_Stance, + Bulls_Charge, + Bonettis_Defense, + Hundred_Blades, + Sever_Artery, + Galrath_Slash, + Gash, + Final_Thrust, + Seeking_Blade, + Riposte, + Deadly_Riposte, + Flourish, + Savage_Slash, + Hunters_Shot, + Pin_Down, + Crippling_Shot, + Power_Shot, + Barrage, + Dual_Shot, + Quick_Shot, + Penetrating_Attack, + Distracting_Shot, + Precision_Shot, + Splinter_Shot_monster_skill, + Determined_Shot, + Called_Shot, + Poison_Arrow, + Oath_Shot, + Debilitating_Shot, + Point_Blank_Shot, + Concussion_Shot, + Punishing_Shot, + Call_of_Ferocity, + Charm_Animal, + Call_of_Protection, + Call_of_Elemental_Protection, + Call_of_Vitality, + Call_of_Haste, + Call_of_Healing, + Call_of_Resilience, + Call_of_Feeding, + Call_of_the_Hunter, + Call_of_Brutality, + Call_of_Disruption, + Revive_Animal, + Symbiotic_Bond, + Throw_Dirt, + Dodge, + Savage_Shot, + Antidote_Signet, + Incendiary_Arrows, + Melandrus_Arrows, + Marksmans_Wager, + Ignite_Arrows, + Read_the_Wind, + Kindle_Arrows, + Choking_Gas, + Apply_Poison, + Comfort_Animal, + Bestial_Pounce, + Maiming_Strike, + Feral_Lunge, + Scavenger_Strike, + Melandrus_Assault, + Ferocious_Strike, + Predators_Pounce, + Brutal_Strike, + Disrupting_Lunge, + Troll_Unguent, + Otyughs_Cry, + Escape, + Practiced_Stance, + Whirling_Defense, + Melandrus_Resilience, + Dryders_Defenses, + Lightning_Reflexes, + Tigers_Fury, + Storm_Chaser, + Serpents_Quickness, + Dust_Trap, + Barbed_Trap, + Flame_Trap, + Healing_Spring, + Spike_Trap, + Winter, + Winnowing, + Edge_of_Extinction, + Greater_Conflagration, + Conflagration, + Fertile_Season, + Symbiosis, + Primal_Echoes, + Predatory_Season, + Frozen_Soil, + Favorable_Winds, + High_Winds, + Energizing_Wind, + Quickening_Zephyr, + Natures_Renewal, + Muddy_Terrain, + Bleeding, + Blind, + Burning, + Crippled, + Deep_Wound, + Disease, + Poison, + Dazed, + Weakness, + Cleansed, + Eruption_environment, + Fire_Storm_environment, + Vital_Blessing_monster_skill, + Fount_Of_Maguuma, + Healing_Fountain, + Icy_Ground, + Maelstrom_environment, + Mursaat_Tower_skill, + Quicksand_environment_effect, + Curse_of_the_Bloodstone, + Chain_Lightning_environment, + Obelisk_Lightning, + Tar, + Siege_Attack, + Resurrect_Party, + Scepter_of_Orrs_Aura, + Scepter_of_Orrs_Power, + Burden_Totem, + Splinter_Mine_skill, + Entanglement, + Dwarven_Powder_Keg, + Seed_of_Resurrection, + Deafening_Roar, + Brutal_Mauling, + Crippling_Attack, + Charm_Animal_monster_skill, + Breaking_Charm, + Charr_Buff, + Claim_Resource, + Claim_Resource1, + Claim_Resource2, + Claim_Resource3, + Claim_Resource4, + Claim_Resource5, + Claim_Resource6, + Claim_Resource7, + Dozen_Shot, + Nibble, + Claim_Resource8, + Claim_Resource9, + Reflection, + Spectral_Agony, + Giant_Stomp, + Agnars_Rage, + Healing_Breeze_Agnars_Rage, + Crystal_Haze, + Crystal_Bonds, + Jagged_Crystal_Skin, + Crystal_Hibernation, + Stun_Immunity, + Invulnerability, + Hunger_of_the_Lich, + Embrace_the_Pain, + Life_Vortex, + Oracle_Link, + Guardian_Pacify, + Soul_Vortex, + Soul_Vortex2, + Spectral_Agony1, + Natural_Resistance, + Natural_Resistance1, + Guild_Lord_Aura, + Critical_Hit_Probability, + Stun_on_Critical_Hit, + Blood_Splattering, + Inanimate_Object, + Undead_sensitivity_to_Light, + Energy_Boost, + Health_Drain, + Immunity_to_Critical_Hits, + Titans_get_plus_Health_regen_and_set_enemies_on_fire_each_time_he_is_hit, + Undying, + Resurrect_Gargoyle, + Seal_Regen, + Lightning_Orb1, + Wurm_Siege_Dunes_of_Despair, + Wurm_Siege, + Claim_Resource10, + Shiver_Touch, + Spontaneous_Combustion, + Vanish, + Victory_or_Death, + Mark_of_Insecurity, + Disrupting_Dagger, + Deadly_Paradox, + Teleport_Players, + Quest_skill_for_Coastal_Exam, + Holy_Blessing, + Statues_Blessing, + Siege_Attack1, + Siege_Attack2, + Domain_of_Skill_Damage, + Domain_of_Energy_Draining, + Domain_of_Elements, + Domain_of_Health_Draining, + Domain_of_Slow, + Divine_Fire, + Swamp_Water, + Janthirs_Gaze, + Fake_Spell, + Charm_Animal_monster, + Stormcaller_skill, + Knock, + Quest_Skill, + Rurik_Must_Live, + Blessing_of_the_Kurzicks, + Lichs_Phylactery, + Restore_Life_monster_skill, + Chimera_of_Intensity, + Life_Draining = 657, + Jaundiced_Gaze = 763, + Wail_of_Doom, + Heros_Insight, + Gaze_of_Contempt, + Berserkers_Insight, + Slayers_Insight, + Vipers_Defense, + Return, + Aura_of_Displacement, + Generous_Was_Tsungrai, + Mighty_Was_Vorizun, + To_the_Death, + Death_Blossom, + Twisting_Fangs, + Horns_of_the_Ox, + Falling_Spider, + Black_Lotus_Strike, + Fox_Fangs, + Moebius_Strike, + Jagged_Strike, + Unsuspecting_Strike, + Entangling_Asp, + Mark_of_Death, + Iron_Palm, + Resilient_Weapon, + Blind_Was_Mingson, + Grasping_Was_Kuurong, + Vengeful_Was_Khanhei, + Flesh_of_My_Flesh, + Splinter_Weapon, + Weapon_of_Warding, + Wailing_Weapon, + Nightmare_Weapon, + Sorrows_Flame, + Sorrows_Fist, + Blast_Furnace, + Beguiling_Haze, + Enduring_Toxin, + Shroud_of_Silence, + Expose_Defenses, + Power_Leech, + Arcane_Languor, + Animate_Vampiric_Horror, + Cultists_Fervor, + Reapers_Mark = 808, + Shatterstone, + Protectors_Defense, + Run_as_One, + Defiant_Was_Xinrae, + Lyssas_Aura, + Shadow_Refuge, + Scorpion_Wire, + Mirrored_Stance, + Discord, + Well_of_Weariness, + Vampiric_Spirit, + Depravity, + Icy_Veins, + Weaken_Knees, + Burning_Speed, + Lava_Arrows, + Bed_of_Coals, + Shadow_Form, + Siphon_Strength, + Vile_Miasma, + Veratas_Promise, + Ray_of_Judgment, + Primal_Rage, + Animate_Flesh_Golem, + Borrowed_Energy, + Reckless_Haste, + Blood_Bond, + Ride_the_Lightning, + Energy_Boon, + Dwaynas_Sorrow, + Retreat, + Poisoned_Heart, + Fetid_Ground, + Arc_Lightning, + Gust, + Churning_Earth, + Liquid_Flame, + Steam, + Boon_Signet, + Reverse_Hex, + Lacerating_Chop, + Fierce_Blow, + Sun_and_Moon_Slash, + Splinter_Shot, + Melandrus_Shot, + Snare, + Chomper, + Kilroy_Stonekin, + Adventurers_Insight, + Dancing_Daggers, + Conjure_Nightmare, + Signet_of_Disruption, + Dissipation, + Ravenous_Gaze, + Order_of_Apostasy, + Oppressive_Gaze, + Lightning_Hammer, + Vapor_Blade, + Healing_Light, + Aim_True, + Coward, + Pestilence, + Shadowsong, + Shadowsong_attack, + Resurrect_monster_skill, + Consuming_Flames, + Chains_of_Enslavement, + Signet_of_Shadows, + Lyssas_Balance, + Visions_of_Regret, + Illusion_of_Pain, + Stolen_Speed, + Ether_Signet, + Signet_of_Disenchantment, + Vocal_Minority, + Searing_Flames, + Shield_Guardian, + Restful_Breeze, + Signet_of_Rejuvenation, + Whirling_Axe, + Forceful_Blow, + Headshot, + None_Shall_Pass, + Quivering_Blade, + Seeking_Arrows, + Rampagers_Insight, + Hunters_Insight, + Amulet_of_Protection, + Oath_of_Healing, + Overload, + Images_of_Remorse, + Shared_Burden, + Soul_Bind, + Blood_of_the_Aggressor, + Icy_Prism, + Furious_Axe, + Auspicious_Blow, + On_Your_Knees, + Dragon_Slash, + Marauders_Shot, + Focused_Shot, + Spirit_Rift, + Union, + Blessing_of_the_Kurzicks1, + Tranquil_Was_Tanasen, + Consume_Soul, + Spirit_Light, + Lamentation, + Rupture_Soul, + Spirit_to_Flesh, + Spirit_Burn, + Destruction, + Dissonance, + Dissonance_attack, + Disenchantment, + Disenchantment_attack, + Recall, + Sharpen_Daggers, + Shameful_Fear, + Shadow_Shroud, + Shadow_of_Haste, + Auspicious_Incantation, + Power_Return, + Complicate, + Shatter_Storm, + Unnatural_Signet, + Rising_Bile, + Envenom_Enchantments, + Shockwave, + Ward_of_Stability, + Icy_Shackles, + Cry_of_Lament, + Blessed_Light, + Withdraw_Hexes, + Extinguish, + Signet_of_Strength, + REMOVE_With_Haste, + Trappers_Focus, + Brambles, + Desperate_Strike, + Way_of_the_Fox, + Shadowy_Burden, + Siphon_Speed, + Deaths_Charge, + Power_Flux, + Expel_Hexes, + Rip_Enchantment, + Energy_Font, + Spell_Shield, + Healing_Whisper, + Ethereal_Light, + Release_Enchantments, + Lacerate, + Spirit_Transfer, + Restoration, + Vengeful_Weapon, + Archemorus_Strike, + Spear_of_Archemorus_Level_1, + Spear_of_Archemorus_Level_2, + Spear_of_Archemorus_Level_3, + Spear_of_Archemorus_Level_4, + Spear_of_Archemorus_Level_5, + Argos_Cry, + Jade_Fury, + Blinding_Powder, + Mantis_Touch, + Exhausting_Assault, + Repeating_Strike, + Way_of_the_Lotus, + Mark_of_Instability, + Mistrust, + Feast_of_Souls, + Recuperation, + Shelter, + Weapon_of_Shadow, + Torch_Enchantment, + Caltrops, + Nine_Tail_Strike, + Way_of_the_Empty_Palm, + Temple_Strike, + Golden_Phoenix_Strike, + Expunge_Enchantments, + Deny_Hexes, + Triple_Chop, + Enraged_Smash, + Renewing_Smash, + Tiger_Stance, + Standing_Slash, + Famine, + Torch_Hex, + Torch_Degeneration_Hex, + Blinding_Snow, + Avalanche_skill, + Snowball, + Mega_Snowball, + Yuletide, + Ice_Skates, + Ice_Fort, + Yellow_Snow, + Hidden_Rock, + Snow_Down_the_Shirt, + Mmmm_Snowcone, + Holiday_Blues, + Icicles, + Ice_Breaker, + Lets_Get_Em, + Flurry_of_Ice, + Snowball_NPC, + Undying1, + Critical_Eye, + Critical_Strike, + Blades_of_Steel, + Jungle_Strike, + Wild_Strike, + Leaping_Mantis_Sting, + Black_Mantis_Thrust, + Disrupting_Stab, + Golden_Lotus_Strike, + Critical_Defenses, + Way_of_Perfection, + Dark_Apostasy, + Locusts_Fury, + Shroud_of_Distress, + Heart_of_Shadow, + Impale, + Seeping_Wound, + Assassins_Promise, + Signet_of_Malice, + Dark_Escape, + Crippling_Dagger, + Star_Strike, + Spirit_Walk, + Unseen_Fury, + Flashing_Blades, + Dash, + Dark_Prison, + Palm_Strike, + Assassin_of_Lyssa, + Mesmer_of_Lyssa, + Revealed_Enchantment, + Revealed_Hex, + Disciple_of_Energy, + Empathy_Koro, + Accumulated_Pain, + Psychic_Distraction, + Ancestors_Visage, + Recurring_Insecurity, + Kitahs_Burden, + Psychic_Instability, + Chaotic_Power, + Hex_Eater_Signet, + Celestial_Haste, + Feedback, + Arcane_Larceny, + Chaotic_Ward, + Favor_of_the_Gods, + Dark_Aura_blessing, + Spoil_Victor, + Lifebane_Strike, + Bitter_Chill, + Taste_of_Pain, + Defile_Enchantments, + Shivers_of_Dread, + Star_Servant, + Necromancer_of_Grenth, + Ritualist_of_Grenth, + Vampiric_Swarm, + Blood_Drinker, + Vampiric_Bite, + Wallows_Bite, + Enfeebling_Touch, + Disciple_of_Ice, + Teinais_Wind, + Shock_Arrow, + Unsteady_Ground, + Sliver_Armor, + Ash_Blast, + Dragons_Stomp, + Unnatural_Resistance, + Second_Wind, + Cloak_of_Faith, + Smoldering_Embers, + Double_Dragon, + Disciple_of_the_Air, + Teinais_Heat, + Breath_of_Fire, + Star_Burst, + Glyph_of_Essence, + Teinais_Prison, + Mirror_of_Ice, + Teinais_Crystals, + Celestial_Storm, + Monk_of_Dwayna, + Aura_of_the_Grove, + Cathedral_Collapse, + Miasma, + Acid_Trap, + Shield_of_Saint_Viktor, + Urn_of_Saint_Viktor_Level_1, + Urn_of_Saint_Viktor_Level_2, + Urn_of_Saint_Viktor_Level_3, + Urn_of_Saint_Viktor_Level_4, + Urn_of_Saint_Viktor_Level_5, + Aura_of_Light, + Kirins_Wrath, + Spirit_Bond, + Air_of_Enchantment, + Warriors_Might, + Heavens_Delight, + Healing_Burst, + Kareis_Healing_Circle, + Jameis_Gaze, + Gift_of_Health, + Battle_Fervor, + Life_Sheath, + Star_Shine, + Disciple_of_Fire, + Empathic_Removal, + Warrior_of_Balthazar, + Resurrection_Chant, + Word_of_Censure, + Spear_of_Light, + Stonesoul_Strike, + Shielding_Branches, + Drunken_Blow, + Leviathans_Sweep, + Jaizhenju_Strike, + Penetrating_Chop, + Yeti_Smash, + Disciple_of_the_Earth, + Ranger_of_Melandru, + Storm_of_Swords, + You_Will_Die, + Auspicious_Parry, + Strength_of_the_Oak, + Silverwing_Slash, + Destroy_Enchantment, + Shove, + Base_Defense, + Carrier_Defense, + The_Chalice_of_Corruption, + Song_of_the_Mists = 1151, + Demonic_Agility, + Blessing_of_the_Kirin, + Emperor_Degen, + Juggernaut_Toss, + Aura_of_the_Juggernaut, + Star_Shards, + Turtle_Shell = 1172, + Exposed_Underbelly, + Cathedral_Collapse1, + Blood_of_zu_Heltzer, + Afflicted_Soul_Explosion, + Invincibility, + Last_Stand, + Dark_Chain_Lightning, + Seadragon_Health_Trigger, + Corrupted_Breath, + Renewing_Corruption, + Corrupted_Dragon_Spores, + Corrupted_Dragon_Scales, + Construct_Possession, + Siege_Turtle_Attack_The_Eternal_Grove, + Siege_Turtle_Attack_Fort_Aspenwood, + Siege_Turtle_Attack_Gyala_Hatchery, + Of_Royal_Blood, + Passage_to_Tahnnakai, + Sundering_Attack, + Zojuns_Shot, + Consume_Spirit, + Predatory_Bond, + Heal_as_One, + Zojuns_Haste, + Needling_Shot, + Broad_Head_Arrow, + Glass_Arrows, + Archers_Signet, + Savage_Pounce, + Enraged_Lunge, + Bestial_Mauling, + Energy_Drain_effect, + Poisonous_Bite, + Pounce, + Celestial_Stance, + Sheer_Exhaustion, + Bestial_Fury, + Life_Drain, + Vipers_Nest, + Equinox, + Tranquility, + Acute_Weakness, + Clamor_of_Souls, + Ritual_Lord = 1217, + Cruel_Was_Daoshen, + Protective_Was_Kaolai, + Attuned_Was_Songkai, + Resilient_Was_Xiko, + Lively_Was_Naomei, + Anguished_Was_Lingwah, + Draw_Spirit, + Channeled_Strike, + Spirit_Boon_Strike, + Essence_Strike, + Spirit_Siphon, + Explosive_Growth, + Boon_of_Creation, + Spirit_Channeling, + Armor_of_Unfeeling, + Soothing_Memories, + Mend_Body_and_Soul, + Dulled_Weapon, + Binding_Chains, + Painful_Bond, + Signet_of_Creation, + Signet_of_Spirits, + Soul_Twisting, + Celestial_Summoning, + Archemorus_Strike_Celestial_Summoning, + Shield_of_Saint_Viktor_Celestial_Summoning, + Ghostly_Haste, + Gaze_from_Beyond, + Ancestors_Rage, + Pain, + Pain_attack, + Displacement, + Preservation, + Life, + Earthbind, + Bloodsong, + Bloodsong_attack, + Wanderlust, + Wanderlust_attack, + Spirit_Light_Weapon, + Brutal_Weapon, + Guided_Weapon, + Meekness, + Frigid_Armor, + Healing_Ring, + Renew_Life, + Doom, + Wielders_Boon, + Soothing, + Vital_Weapon, + Weapon_of_Quickening, + Signet_of_Rage, + Fingers_of_Chaos, + Echoing_Banishment, + Suicidal_Impulse, + Impossible_Odds, + Battle_Scars, + Riposting_Shadows, + Meditation_of_the_Reaper, + Battle_Cry, + Elemental_Defense_Zone, + Melee_Defense_Zone, + Blessed_Water, + Defiled_Water, + Stone_Spores, + Turret_Arrow, + Blood_Flower_skill, + Fire_Flower_skill, + Poison_Arrow_flower, + Haiju_Lagoon_Water, + Aspect_of_Exhaustion, + Aspect_of_Exposure, + Aspect_of_Surrender, + Aspect_of_Death, + Aspect_of_Soothing, + Aspect_of_Pain, + Aspect_of_Lethargy, + Aspect_of_Depletion_energy_loss, + Aspect_of_Failure, + Aspect_of_Shadows, + Scorpion_Aspect, + Aspect_of_Fear, + Aspect_of_Depletion_energy_depletion_damage, + Aspect_of_Decay, + Aspect_of_Torment, + Nightmare_Aspect, + Spiked_Coral, + Shielding_Urn_skill, + Extensive_Plague_Exposure, + Forests_Binding, + Exploding_Spores, + Suicide_Energy, + Suicide_Health, + Nightmare_Refuge, + Oni_Health_Lock, + Oni_Shadow_Health_Lock, + Signet_of_Attainment, + Rage_of_the_Sea, + Meditation_of_the_Reaper1, + Fireball_obelisk = 1318, + Final_Thrust1, + Sugar_Rush_medium = 1323, + Torment_Slash, + Spirit_of_the_Festival, + Trade_Winds, + Dragon_Blast, + Imperial_Majesty, + Monster_doesnt_get_death_penalty, + Twisted_Spikes, + Marble_Trap, + Shadow_Tripwire, + Extend_Conditions, + Hypochondria, + Wastrels_Demise, + Spiritual_Pain, + Drain_Delusions, + Persistence_of_Memory, + Symbols_of_Inspiration, + Symbolic_Celerity, + Frustration, + Tease, + Ether_Phantom, + Web_of_Disruption, + Enchanters_Conundrum, + Signet_of_Illusions, + Discharge_Enchantment, + Hex_Eater_Vortex, + Mirror_of_Disenchantment, + Simple_Thievery, + Animate_Shambling_Horror, + Order_of_Undeath, + Putrid_Flesh, + Feast_for_the_Dead, + Jagged_Bones, + Contagion, + Bloodletting, + Ulcerous_Lungs, + Pain_of_Disenchantment, + Mark_of_Fury, + Recurring_Scourge, + Corrupt_Enchantment, + Signet_of_Sorrow, + Signet_of_Suffering, + Signet_of_Lost_Souls, + Well_of_Darkness, + Blinding_Surge, + Chilling_Winds, + Lightning_Bolt, + Storm_Djinns_Haste, + Stone_Striker, + Sandstorm, + Stone_Sheath, + Ebon_Hawk, + Stoneflesh_Aura, + Glyph_of_Restoration, + Ether_Prism, + Master_of_Magic, + Glowing_Gaze, + Savannah_Heat, + Flame_Djinns_Haste, + Freezing_Gust, + Rocky_Ground, + Sulfurous_Haze, + Siege_Attack3, + Sentry_Trap_skill, + Caltrops_monster, + Sacred_Branch, + Light_of_Seborhin, + Judges_Intervention, + Supportive_Spirit, + Watchful_Healing, + Healers_Boon, + Healers_Covenant, + Balthazars_Pendulum, + Words_of_Comfort, + Light_of_Deliverance, + Scourge_Enchantment, + Shield_of_Absorption, + Reversal_of_Damage, + Mending_Touch, + Critical_Chop, + Agonizing_Chop, + Flail, + Charging_Strike, + Headbutt, + Lions_Comfort, + Rage_of_the_Ntouka, + Mokele_Smash, + Overbearing_Smash, + Signet_of_Stamina, + Youre_All_Alone, + Burst_of_Aggression, + Enraging_Charge, + Crippling_Slash, + Barbarous_Slice, + Vial_of_Purified_Water, + Disarm_Trap, + Feeding_Frenzy_skill, + Quake_Of_Ahdashim, + Shield_of_Madness, + Create_Light_of_Seborhin, + Unlock_Cell, + Stop_Pump, + Shield_of_Madness1 = 1426, + Shield_of_Ether, + Shield_of_Iron, + Shield_of_Strength, + Wave_of_Torment, + Corsairs_Net = 1433, + Corrupted_Healing, + Corrupted_Roots, + Corrupted_Strength, + Desert_Wurm_disguise, + Junundu_Feast, + Junundu_Strike, + Junundu_Smash, + Junundu_Siege, + Junundu_Tunnel, + Leave_Junundu, + Summon_Torment, + Signal_Flare, + The_Elixir_of_Strength, + Ehzah_from_Above, + Last_Rites_of_Torment = 1449, + Abaddons_Conspiracy, + Hungers_Bite, + From_Hell, + Pains_Embrace, + Call_to_the_Torment, + Command_of_Torment, + Abaddons_Favor, + Abaddons_Chosen, + Enchantment_Collapse, + Call_of_Sacrifice, + Enemies_Must_Die, + Earth_Vortex, + Frost_Vortex, + Rough_Current, + Turbulent_Flow, + Prepared_Shot, + Burning_Arrow, + Arcing_Shot, + Strike_as_One, + Crossfire, + Barbed_Arrows, + Scavengers_Focus, + Toxicity, + Quicksand, + Storms_Embrace, + Trappers_Speed, + Tripwire, + Kournan_Guardsman, + Renewing_Surge, + Offering_of_Spirit, + Spirits_Gift, + Death_Pact_Signet, + Reclaim_Essence, + Banishing_Strike, + Mystic_Sweep, + Eremites_Attack, + Reap_Impurities, + Twin_Moon_Sweep, + Victorious_Sweep, + Irresistible_Sweep, + Pious_Assault, + Mystic_Twister, + REMOVE_Wind_Prayers_skill, + Grenths_Fingers, + REMOVE_Boon_of_the_Gods, + Aura_of_Thorns, + Balthazars_Rage, + Dust_Cloak, + Staggering_Force, + Pious_Renewal, + Mirage_Cloak, + REMOVE_Balthazars_Rage, + Arcane_Zeal, + Mystic_Vigor, + Watchful_Intervention, + Vow_of_Piety, + Vital_Boon, + Heart_of_Holy_Flame, + Extend_Enchantments, + Faithful_Intervention, + Sand_Shards, + Intimidating_Aura_beta_version, + Lyssas_Haste, + Guiding_Hands, + Fleeting_Stability, + Armor_of_Sanctity, + Mystic_Regeneration, + Vow_of_Silence, + Avatar_of_Balthazar, + Avatar_of_Dwayna, + Avatar_of_Grenth, + Avatar_of_Lyssa, + Avatar_of_Melandru, + Meditation, + Eremites_Zeal, + Natural_Healing, + Imbue_Health, + Mystic_Healing, + Dwaynas_Touch, + Pious_Restoration, + Signet_of_Pious_Light, + Intimidating_Aura, + Mystic_Sandstorm, + Winds_of_Disenchantment, + Rending_Touch, + Crippling_Sweep, + Wounding_Strike, + Wearying_Strike, + Lyssas_Assault, + Chilling_Victory, + Conviction, + Enchanted_Haste, + Pious_Concentration, + Pious_Haste, + Whirling_Charge, + Test_of_Faith, + Blazing_Spear, + Mighty_Throw, + Cruel_Spear, + Harriers_Toss, + Unblockable_Throw, + Spear_of_Lightning, + Wearying_Spear, + Anthem_of_Fury, + Crippling_Anthem, + Defensive_Anthem, + Godspeed, + Anthem_of_Flame, + Go_for_the_Eyes, + Anthem_of_Envy, + Song_of_Power, + Zealous_Anthem, + Aria_of_Zeal, + Lyric_of_Zeal, + Ballad_of_Restoration, + Chorus_of_Restoration, + Aria_of_Restoration, + Song_of_Concentration, + Anthem_of_Guidance, + Energizing_Chorus, + Song_of_Purification, + Hexbreaker_Aria, + Brace_Yourself, + Awe, + Enduring_Harmony, + Blazing_Finale, + Burning_Refrain, + Finale_of_Restoration, + Mending_Refrain, + Purifying_Finale, + Bladeturn_Refrain, + Glowing_Signet, + REMOVE_Leadership_skill, + Leaders_Zeal, + Leaders_Comfort, + Signet_of_Synergy, + Angelic_Protection, + Angelic_Bond, + Cautery_Signet, + Stand_Your_Ground, + Lead_the_Way, + Make_Haste, + We_Shall_Return, + Never_Give_Up, + Help_Me, + Fall_Back, + Incoming, + Theyre_on_Fire, + Never_Surrender, + Its_Just_a_Flesh_Wound, + Barbed_Spear, + Vicious_Attack, + Stunning_Strike, + Merciless_Spear, + Disrupting_Throw, + Wild_Throw, + Curse_of_the_Staff_of_the_Mists, + Aura_of_the_Staff_of_the_Mists, + Power_of_the_Staff_of_the_Mists, + Scepter_of_Ether, + Summoning_of_the_Scepter, + Rise_From_Your_Grave, + Sugar_Rush_long, // 5 minutes + Corsair_disguise, + REMOVE_Queen_Wail, + REMOVE_Queen_Armor, + Queen_Heal, + Queen_Wail, + Queen_Armor, + Queen_Bite, + Queen_Thump, + Queen_Siege, + Junundu_Tunnel_monster_skill, + Skin_of_Stone, + Dervish_of_the_Mystic, + Dervish_of_the_Wind, + Paragon_of_Leadership, + Paragon_of_Motivation, + Dervish_of_the_Blade, + Paragon_of_Command, + Paragon_of_the_Spear, + Dervish_of_the_Earth, + Master_of_DPS, + Malicious_Strike, + Shattering_Assault, + Golden_Skull_Strike, + Black_Spider_Strike, + Golden_Fox_Strike, + Deadly_Haste, + Assassins_Remedy, + Foxs_Promise, + Feigned_Neutrality, + Hidden_Caltrops, + Assault_Enchantments, + Wastrels_Collapse, + Lift_Enchantment, + Augury_of_Death, + Signet_of_Toxic_Shock, + Signet_of_Twilight, + Way_of_the_Assassin, + Shadow_Walk, + Deaths_Retreat, + Shadow_Prison, + Swap, + Shadow_Meld, + Price_of_Pride, + Air_of_Disenchantment, + Signet_of_Clumsiness, + Symbolic_Posture, + Toxic_Chill, + Well_of_Silence, + Glowstone, + Mind_Blast, + Elemental_Flame, + Invoke_Lightning, + Battle_Cry1, + Mending_Shrine_Bonus, + Energy_Shrine_Bonus, + Northern_Health_Shrine_Bonus, + Southern_Health_Shrine_Bonus, + Siege_Attack_Bombardment, + Curse_of_Silence, + To_the_Pain_Hero_Battles, + Edge_of_Reason, + Depths_of_Madness_environment_effect, + Cower_in_Fear, + Dreadful_Pain, + Veiled_Nightmare, + Base_Protection, + Kournan_Siege_Flame, + Drake_Skin, + Skale_Vigor, + Pahnai_Salad_item_effect, + Pensive_Guardian, + Scribes_Insight, + Holy_Haste, + Glimmer_of_Light, + Zealous_Benediction, + Defenders_Zeal, + Signet_of_Mystic_Wrath, + Signet_of_Removal, + Dismiss_Condition, + Divert_Hexes, + Counterattack, + Magehunter_Strike, + Soldiers_Strike, + Decapitate, + Magehunters_Smash, + Soldiers_Stance, + Soldiers_Defense, + Frenzied_Defense, + Steady_Stance, + Steelfang_Slash, + Sunspear_Battle_Call, + Untouchable, + Earth_Shattering_Blow, + Corrupt_Power, + Words_of_Madness_Qwytzylkak, + Gaze_of_MoavuKaal, + Presence_of_the_Skale_Lord, + Madness_Dart, + The_Apocrypha_is_changing_to_another_form, + Reform_Carvings = 1715, + Sunspear_Siege = 1717, + Soul_Torture, + Screaming_Shot, + Keen_Arrow, + Rampage_as_One, + Forked_Arrow, + Disrupting_Accuracy, + Experts_Dexterity, + Roaring_Winds, + Magebane_Shot, + Natural_Stride, + Hekets_Rampage, + Smoke_Trap, + Infuriating_Heat, + Vocal_Was_Sogolon, + Destructive_Was_Glaive, + Wielders_Strike, + Gaze_of_Fury, + Gaze_of_Fury_attack, + Spirits_Strength, + Wielders_Zeal, + Sight_Beyond_Sight, + Renewing_Memories, + Wielders_Remedy, + Ghostmirror_Light, + Signet_of_Ghostly_Might, + Signet_of_Binding, + Caretakers_Charge, + Anguish, + Anguish_attack, + Empowerment, + Recovery, + Weapon_of_Fury, + Xinraes_Weapon, + Warmongers_Weapon, + Weapon_of_Remedy, + Rending_Sweep, + Onslaught, + Mystic_Corruption, + Grenths_Grasp, + Veil_of_Thorns, + Harriers_Grasp, + Vow_of_Strength, + Ebon_Dust_Aura, + Zealous_Vow, + Heart_of_Fury, + Zealous_Renewal, + Attackers_Insight, + Rending_Aura, + Featherfoot_Grace, + Reapers_Sweep, + Harriers_Haste, + Focused_Anger, + Natural_Temper, + Song_of_Restoration, + Lyric_of_Purification, + Soldiers_Fury, + Aggressive_Refrain, + Energizing_Finale, + Signet_of_Aggression, + Remedy_Signet, + Signet_of_Return, + Make_Your_Time, + Cant_Touch_This, + Find_Their_Weakness, + The_Power_Is_Yours, + Slayers_Spear, + Swift_Javelin, + Natures_Speed, + Weapon_of_Mastery, + Accelerated_Growth, + Forge_the_Way, + Anthem_of_Aggression, + Skale_Hunt, + Mandragor_Hunt, + Skree_Battle, + Insect_Hunt, + Corsair_Bounty, + Plant_Hunt, + Undead_Hunt, + Eternal_Suffering, + Eternal_Suffering1, + Eternal_Suffering2, + Eternal_Languor, + Eternal_Languor1, + Eternal_Languor2, + Eternal_Lethargy, + Eternal_Lethargy1, + Eternal_Lethargy2, + Thirst_of_the_Drought = 1808, + Thirst_of_the_Drought1, + Thirst_of_the_Drought2, + Thirst_of_the_Drought3, + Thirst_of_the_Drought4, + Lightbringer, + Lightbringers_Gaze, + Lightbringer_Signet, + Sunspear_Rebirth_Signet, + Wisdom, + Maddened_Strike, + Maddened_Stance, + Spirit_Form_Remains_of_Sahlahja, + Gods_Blessing, + Monster_Hunt, + Monster_Hunt1, + Monster_Hunt2, + Monster_Hunt3, + Elemental_Hunt, + Elemental_Hunt1, + Skree_Battle1, + Insect_Hunt1, + Insect_Hunt2, + Demon_Hunt, + Minotaur_Hunt, + Plant_Hunt1, + Plant_Hunt2, + Skale_Hunt1, + Skale_Hunt2, + Heket_Hunt, + Heket_Hunt1, + Kournan_Bounty, + Mandragor_Hunt1, + Mandragor_Hunt2, + Corsair_Bounty1, + Kournan_Bounty1, + Dhuum_Battle, + Menzies_Battle, + Elemental_Hunt2, + Monolith_Hunt, + Monolith_Hunt1, + Margonite_Battle, + Monster_Hunt4, + Titan_Hunt, + Mandragor_Hunt3, + Giant_Hunt, + Undead_Hunt1, + Kournan_Siege, + Lose_your_Head, + Wandering_Mind, + Altar_Buff = 1859, + Sugar_Rush_short, // 3 minutes + Choking_Breath, + Junundu_Bite, + Blinding_Breath, + Burning_Breath, + Junundu_Wail, + Capture_Point, + Approaching_the_Vortex, + Avatar_of_Sweetness = 1871, + Corrupted_Lands = 1873, + Words_of_Madness = 1875, + Unknown_Junundu_Ability, + Torment_Slash_Smothering_Tendrils = 1880, + Bonds_of_Torment, + Shadow_Smash, + Bonds_of_Torment_effect, + Consume_Torment, + Banish_Enchantment, + Summoning_Shadows, + Lightbringers_Insight, + Repressive_Energy = 1889, + Enduring_Torment, + Shroud_of_Darkness, + Demonic_Miasma, + Enraged, + Touch_of_Aaaaarrrrrrggghhh, + Wild_Smash, + Unyielding_Anguish, + Jadoths_Storm_of_Judgment, + Anguish_Hunt, + Avatar_of_Holiday_Cheer, + Side_Step, + Jack_Frost, + Avatar_of_Grenth_snow_fighting_skill, + Avatar_of_Dwayna_snow_fighting_skill, + Steady_Aim, + Rudis_Red_Nose, + Charm_Animal_White_Mantle = 1910, + Volatile_Charr_Crystal, + Hard_mode, + Claim_Resource_Heroes_Ascent, + Hard_mode1, + Hard_Mode_NPC_Buff, + Sugar_Jolt_short, // 2 minutes + Rollerbeetle_Racer, + Ram, + Harden_Shell, + Rollerbeetle_Dash, + Super_Rollerbeetle, + Rollerbeetle_Echo, + Distracting_Lunge, + Rollerbeetle_Blast, + Spit_Rocks, + Lunar_Blessing, + Lucky_Aura, + Spiritual_Possession, + Water, + Pig_Form, + Beetle_Metamorphosis, + Sugar_Jolt_long = 1933, + Golden_Egg_skill, + Torturous_Embers, + Test_Buff, + Infernal_Rage, + Putrid_Flames, + Shroud_of_Ash, + Flame_Call, + Torturers_Inferno, + Whirling_Fires, + Charr_Siege_Attack_What_Must_Be_Done, + Charr_Siege_Attack_Against_the_Charr, + Birthday_Cupcake_skill, + Blessing_of_the_Luxons = 1947, + Shadow_Sanctuary_luxon, + Ether_Nightmare_luxon, + Signet_of_Corruption_luxon, + Elemental_Lord_luxon, + Selfless_Spirit_luxon, + Triple_Shot_luxon, + Save_Yourselves_luxon, + Aura_of_Holy_Might_luxon, + Spear_of_Fury_luxon = 1957, + Attribute_Balance, + Monster_Hunt5, + Monster_Hunt6, + Mandragor_Hunt4, + Mandragor_Hunt5, + Giant_Hunt1, + Giant_Hunt2, + Skree_Battle2, + Skree_Battle3, + Insect_Hunt3, + Insect_Hunt4, + Minotaur_Hunt1, + Minotaur_Hunt2, + Corsair_Bounty2, + Corsair_Bounty3, + Plant_Hunt3, + Plant_Hunt4, + Skale_Hunt3, + Skale_Hunt4, + Heket_Hunt2, + Heket_Hunt3, + Kournan_Bounty2, + Kournan_Bounty3, + Undead_Hunt2, + Undead_Hunt3, + Fire_Dart, + Ice_Dart, + Poison_Dart, + Vampiric_Assault, + Lotus_Strike, + Golden_Fang_Strike, + Way_of_the_Mantis, + Falling_Lotus_Strike, + Sadists_Signet, + Signet_of_Distraction, + Signet_of_Recall, + Power_Lock, + Waste_Not_Want_Not, + Sum_of_All_Fears, + Withering_Aura, + Cacophony, + Winters_Embrace, + Earthen_Shackles, + Ward_of_Weakness, + Glyph_of_Swiftness, + Cure_Hex, + Smite_Condition, + Smiters_Boon, + Castigation_Signet, + Purifying_Veil, + Pulverizing_Smash, + Keen_Chop, + Knee_Cutter, + Grapple, + Radiant_Scythe, + Grenths_Aura, + Signet_of_Pious_Restraint, + Farmers_Scythe, + Energetic_Was_Lee_Sa, + Anthem_of_Weariness, + Anthem_of_Disruption, + Burning_Ground, + Freezing_Ground, + Poison_Ground, + Fire_Jet, + Ice_Jet, + Poison_Jet, + Lava_Pool, + Water_Pool, + Fire_Spout, + Ice_Spout, + Poison_Spout, + Dhuum_Battle1, + Dhuum_Battle2, + Elemental_Hunt3, + Elemental_Hunt4, + Monolith_Hunt2, + Monolith_Hunt3, + Margonite_Battle1, + Margonite_Battle2, + Menzies_Battle1, + Menzies_Battle2, + Anguish_Hunt1, + Titan_Hunt1, + Titan_Hunt2, + Monster_Hunt7, + Monster_Hunt8, + Sarcophagus_Spores, + Exploding_Barrel, + Greater_Hard_Mode_NPC_Buff, + Fire_Boulder, + Dire_Snowball, + Boulder, + Summon_Spirits_luxon, + Shadow_Fang, + Calculated_Risk, + Shrinking_Armor, + Aneurysm, + Wandering_Eye, + Foul_Feast, + Putrid_Bile, + Shell_Shock, + Glyph_of_Immolation, + Patient_Spirit, + Healing_Ribbon, + Aura_of_Stability, + Spotless_Mind, + Spotless_Soul, + Disarm, + I_Meant_to_Do_That, + Rapid_Fire, + Sloth_Hunters_Shot, + Aura_Slicer, + Zealous_Sweep, + Pure_Was_Li_Ming, + Weapon_of_Aggression, + Chest_Thumper, + Hasty_Refrain, + Drain_Minion, + Cracked_Armor, + Berserk, + Fleshreavers_Escape, + Chomp, + Twisting_Jaws, + Burning_Immunity, + Mandragors_Charge, + Rock_Slide, + Avalanche_effect, + Snaring_Web, + Ceiling_Collapse, + Trample, + Wurm_Bile, + Ground_Cover, + Shadow_Sanctuary_kurzick, + Ether_Nightmare_kurzick, + Signet_of_Corruption_kurzick, + Elemental_Lord_kurzick, + Selfless_Spirit_kurzick, + Triple_Shot_kurzick, + Save_Yourselves_kurzick, + Aura_of_Holy_Might_kurzick, + Spear_of_Fury_kurzick, + Summon_Spirits_kurzick, + Critical_Agility, + Cry_of_Pain, + Necrosis, + Intensity, + Seed_of_Life, + Call_of_the_Eye, + Whirlwind_Attack, + Never_Rampage_Alone, + Eternal_Aura, + Vampirism, + Vampirism_attack, + Theres_Nothing_to_Fear, + Ursan_Rage_Blood_Washes_Blood, + Ursan_Strike_Blood_Washes_Blood, + Sneak_Attack = 2116, + Firebomb_Explosion, + Firebomb, + Shield_of_Fire, + Respawn, + Marked_For_Death, + Spirit_World_Retreat, + Long_Claws, + Shattered_Spirit, + Spirit_Roar, + Spirit_Senses, + Unseen_Aggression, + Volfen_Pounce_Curse_of_the_Nornbear, + Volfen_Claw_Curse_of_the_Nornbear, + Volfen_Bloodlust_Curse_of_the_Nornbear = 2131, + Volfen_Agility_Curse_of_the_Nornbear, + Volfen_Blessing_Curse_of_the_Nornbear, + Charging_Spirit, + Trampling_Ox, + Smoke_Powder_Defense, + Confusing_Images, + Hexers_Vigor, + Masochism, + Piercing_Trap, + Companionship, + Feral_Aggression, + Disrupting_Shot, + Volley, + Expert_Focus, + Pious_Fury, + Crippling_Victory, + Sundering_Weapon, + Weapon_of_Renewal, + Maiming_Spear, + Temporal_Sheen, + Flux_Overload, + A_pool_of_water, + Phase_Shield_effect, + Phase_Shield_monster_skill, + Vitality_Transfer, + Golem_Strike, + Bloodstone_Slash, + Energy_Blast_golem, + Chaotic_Energy, + Golem_Fire_Shield, + The_Way_of_Duty, + The_Way_of_Kinship, + Diamondshard_Mist_environment_effect, + Diamondshard_Grave, + The_Way_of_Strength, + Diamondshard_Mist, + Raven_Blessing_A_Gate_Too_Far, + Raven_Flight_A_Gate_Too_Far = 2170, + Raven_Shriek_A_Gate_Too_Far, + Raven_Swoop_A_Gate_Too_Far, + Raven_Talons_A_Gate_Too_Far, + Aspect_of_Oak, + Long_Claws1, + Tremor, + Rage_of_the_Jotun, + Thundering_Roar, + Sundering_Soulcrush, + Pyroclastic_Shot, + Explosive_Force, + Rolling_Shift = 2184, + Powder_Keg_Explosion, + Signet_of_Deadly_Corruption, + Way_of_the_Master, + Defile_Defenses, + Angorodons_Gaze, + Magnetic_Surge, + Slippery_Ground, + Glowing_Ice, + Energy_Blast, + Distracting_Strike, + Symbolic_Strike, + Soldiers_Speed, + Body_Blow, + Body_Shot, + Poison_Tip_Signet, + Signet_of_Mystic_Speed, + Shield_of_Force, + Mending_Grip, + Spiritleech_Aura, + Rejuvenation, + Agony, + Ghostly_Weapon, + Inspirational_Speech, + Burning_Shield, + Holy_Spear, + Spear_Swipe, + Alkars_Alchemical_Acid, + Light_of_Deldrimor, + Ear_Bite, + Low_Blow, + Brawling_Headbutt, + Dont_Trip, + By_Urals_Hammer, + Drunken_Master, + Great_Dwarf_Weapon, + Great_Dwarf_Armor, + Breath_of_the_Great_Dwarf, + Snow_Storm, + Black_Powder_Mine, + Summon_Mursaat, + Summon_Ruby_Djinn, + Summon_Ice_Imp, + Summon_Naga_Shaman, + Deft_Strike, + Signet_of_Infection, + Tryptophan_Signet, + Ebon_Battle_Standard_of_Courage, + Ebon_Battle_Standard_of_Wisdom, + Ebon_Battle_Standard_of_Honor, + Ebon_Vanguard_Sniper_Support, + Ebon_Vanguard_Assassin_Support, + Well_of_Ruin, + Atrophy, + Spear_of_Redemption, + Gelatinous_Material_Explosion = 2240, + Gelatinous_Corpse_Consumption, + Gelatinous_Mutation, + Gelatinous_Absorption, + Unstable_Ooze_Explosion, + Golem_Shrapnel, + Unstable_Aura, + Unstable_Pulse, + Polymock_Power_Drain, + Polymock_Block, + Polymock_Glyph_of_Concentration, + Polymock_Ether_Signet, + Polymock_Glyph_of_Power, + Polymock_Overload, + Polymock_Glyph_Destabilization, + Polymock_Mind_Wreck, + Order_of_Unholy_Vigor, + Order_of_the_Lich, + Master_of_Necromancy, + Animate_Undead, + Polymock_Deathly_Chill, + Polymock_Rising_Bile, + Polymock_Rotting_Flesh, + Polymock_Lightning_Strike, + Polymock_Lightning_Orb, + Polymock_Lightning_Djinns_Haste, + Polymock_Flare, + Polymock_Immolate, + Polymock_Meteor, + Polymock_Ice_Spear, + Polymock_Icy_Prison, + Polymock_Mind_Freeze, + Polymock_Ice_Shard_Storm, + Polymock_Frozen_Trident, + Polymock_Smite, + Polymock_Smite_Hex, + Polymock_Bane_Signet, + Polymock_Stone_Daggers, + Polymock_Obsidian_Flame, + Polymock_Earthquake, + Polymock_Frozen_Armor, + Polymock_Glyph_Freeze, + Polymock_Fireball, + Polymock_Rodgorts_Invocation, + Polymock_Calculated_Risk, + Polymock_Recurring_Insecurity, + Polymock_Backfire, + Polymock_Guilt, + Polymock_Lamentation, + Polymock_Spirit_Rift, + Polymock_Painful_Bond, + Polymock_Signet_of_Clumsiness, + Polymock_Migraine, + Polymock_Glowing_Gaze, + Polymock_Searing_Flames, + Polymock_Signet_of_Revenge, + Polymock_Signet_of_Smiting, + Polymock_Stoning, + Polymock_Eruption, + Polymock_Shock_Arrow, + Polymock_Mind_Shock, + Polymock_Piercing_Light_Spear, + Polymock_Mind_Blast, + Polymock_Savannah_Heat, + Polymock_Diversion, + Polymock_Lightning_Blast, + Polymock_Poisoned_Ground, + Polymock_Icy_Bonds, + Polymock_Sandstorm, + Polymock_Banish, + Mergoyle_Form, + Skale_Form, + Gargoyle_Form, + Ice_Imp_Form, + Fire_Imp_Form, + Kappa_Form, + Aloe_Seed_Form, + Earth_Elemental_Form, + Fire_Elemental_Form, + Ice_Elemental_Form, + Mirage_Iboga_Form, + Wind_Rider_Form, + Naga_Shaman_Form, + Mantis_Dreamweaver_Form, + Ruby_Djinn_Form, + Gaki_Form, + Stone_Rain_Form, + Mursaat_Elementalist_Form, + Crystal_Shield, + Crystal_Snare, + Paranoid_Indignation, + Searing_Breath, + Kraks_Charge, + Brawling, + Brawling_Block, + Brawling_Jab, + Brawling_Jab1, + Brawling_Straight_Right, + Brawling_Hook, + Brawling_Hook1, + Brawling_Uppercut, + Brawling_Combo_Punch, + Brawling_Headbutt_Brawling_skill, + STAND_UP, + Call_of_Destruction, + Flame_Jet, + Lava_Ground, + Lava_Wave, + Spirit_Shield = 2349, + Summoning_Lord, + Charm_Animal_Ashlyn_Spiderfriend, + Charr_Siege_Attack_Assault_on_the_Stronghold, + Finish_Him, + Dodge_This, + I_Am_the_Strongest, + I_Am_Unstoppable, + A_Touch_of_Guile, + You_Move_Like_a_Dwarf, + You_Are_All_Weaklings, + Feel_No_Pain, + Club_of_a_Thousand_Bears, + Talon_Strike = 2363, + Lava_Blast, + Thunderfist_Strike, + Alkars_Concoction = 2367, + Murakais_Consumption, + Murakais_Censure, + Murakais_Calamity, + Murakais_Storm_of_Souls, + Edification, + Heart_of_the_Norn, + Ursan_Blessing, + Ursan_Strike, + Ursan_Rage, + Ursan_Roar, + Ursan_Force, + Volfen_Blessing, + Volfen_Claw, + Volfen_Pounce, + Volfen_Bloodlust, + Volfen_Agility, + Raven_Blessing, + Raven_Talons, + Raven_Swoop, + Raven_Shriek, + Raven_Flight, + Totem_of_Man, + Filthy_Explosion, + Murakais_Call, + Spawn_Pods, + Enraged_Blast, + Spawn_Hatchling, + Ursan_Roar_Blood_Washes_Blood, + Ursan_Force_Blood_Washes_Blood, + Ursan_Aura, + Consume_Flames, + Aura_of_the_Great_Destroyer, + Destroy_the_Humans, + Charr_Flame_Keeper_Form, + Titan_Form, + Skeletal_Mage_Form, + Smoke_Wraith_Form, + Bone_Dragon_Form, + Dwarven_Arcanist_Form = 2407, + Dolyak_Rider_Form, + Extract_Inscription, + Charr_Shaman_Form, + Mindbender, + Smooth_Criminal, + Technobabble, + Radiation_Field, + Asuran_Scan, + Air_of_Superiority, + Mental_Block, + Pain_Inverter, + Healing_Salve, + Ebon_Escape, + Weakness_Trap, + Winds, + Dwarven_Stability, + Stout_Hearted, + Inscribed_Ettin_Aura, + Decipher_Inscriptions, + Rebel_Yell, + Asuran_Flame_Staff = 2429, + Aura_of_the_Bloodstone, + Aura_of_the_Bloodstone1, + Aura_of_the_Bloodstone2, + Haunted_Ground, + Asuran_Bodyguard, + Asuran_Bodyguard1, + Asuran_Bodyguard2, + Energy_Channel, + Hunt_Rampage, + Boss_Bounty = 2440, + Hunt_Point_Bonus, + Hunt_Point_Bonus1, + Hunt_Point_Bonus2, + Time_Attack, + Dwarven_Raider, + Dwarven_Raider1, + Dwarven_Raider2, + Dwarven_Raider3, + Great_Dwarfs_Blessing, + Hunt_Rampage1, + Boss_Bounty1 = 2452, + Hunt_Point_Bonus3, + Hunt_Point_Bonus4, + Time_Attack1 = 2456, + Vanguard_Patrol, + Vanguard_Patrol1, + Vanguard_Patrol2, + Vanguard_Patrol3, + Vanguard_Commendation, + Hunt_Rampage2, + Boss_Bounty2 = 2464, + Norn_Hunting_Party = 2469, + Norn_Hunting_Party1, + Norn_Hunting_Party2, + Norn_Hunting_Party3, + Strength_of_the_Norn, + Hunt_Rampage3, + Asuran_Bodyguard3 = 2481, + Desperate_Howl, + Gloat, + Metamorphosis, + Inner_Fire, + Elemental_Shift, + Dryders_Feast, + Fungal_Explosion, + Blood_Rage, + Parasitic_Bite, + False_Death, + Ooze_Combination, + Ooze_Division, + Bear_Form, + Sweeping_Strikes, + Spore_Explosion, + Dormant_Husk, + Monkey_See_Monkey_Do, + Feeding_Frenzy, + Tengus_Mimicry, + Tongue_Lash, + Soulrending_Shriek, + Unreliable, + Siege_Devourer, + Siege_Devourer_Feast, + Devourer_Bite, + Siege_Devourer_Swipe, + Devourer_Siege, + HYAHHHHH, + HYAHHHHH1, + HYAHHHHH2, + HYAHHHHH3, + Dismount_Siege_Devourer, + The_Masters_Mark, + The_Snipers_Spear, + Mount, + Reverse_Polarity_Fire_Shield, + Tengus_Gaze, + Fix_Monster_Attributes, + Armor_of_Salvation_item_effect, + Grail_of_Might_item_effect, + Essence_of_Celerity_item_effect, + Stone_Dwarf_Transformation, + Forgewights_Blessing, + Selvetarms_Blessing, + Thommiss_Blessing, + Duncans_Defense, + Rands_Attack = 2529, + Selvetarms_Attack, + Thommiss_Attack, + Create_Spore, + Invigorating_Mist = 2536, + Courageous_Was_Saidra, + Animate_Undead_Palawa_Joko, + Order_of_Unholy_Vigor_Palawa_Joko, + Order_of_the_Lich_Palawa_Joko, + Golem_Boosters, + Charm_Animal_monster1, + Wurm_Siege_Eye_of_the_North, + Tongue_Whip, + Lit_Torch, + Dishonorable, + Hard_Mode_Dungeon_Boss, + Veteran_Asuran_Bodyguard, + Veteran_Dwarven_Raider, + Veteran_Vanguard_Patrol, + Veteran_Norn_Hunting_Party, + Dwarven_Raider4 = 2565, + Dwarven_Raider5, + Dwarven_Raider6, + Dwarven_Raider7, + Great_Dwarfs_Blessing1 = 2570, + Boss_Bounty3, + Hunt_Point_Bonus5 = 2574, + Hunt_Point_Bonus6, + Hunt_Rampage4, + Time_Attack2, + Vanguard_Patrol4, + Boss_Bounty4 = 2583, + Hunt_Point_Bonus7 = 2585, + Vanguard_Commendation1 = 2589, + Norn_Hunting_Party4 = 2591, + Norn_Hunting_Party5, + Norn_Hunting_Party6, + Norn_Hunting_Party7, + Boss_Bounty5 = 2596, + Strength_of_the_Norn1 = 2598, + Hunt_Point_Bonus8, + Hunt_Point_Bonus9 = 2601, + Hunt_Rampage5, + Time_Attack3, + Candy_Corn_skill, + Candy_Apple_skill, + Anton_Costume_Brawl_disguise, + Erys_Vasburg_Costume_Brawl_disguise, + Olias_Costume_Brawl_disguise, + Argo_Costume_Brawl_disguise, + Mhenlo_Costume_Brawl_disguise, + Lukas_Costume_Brawl_disguise, + Aidan_Costume_Brawl_disguise, + Kahmu_Costume_Brawl_disguise, + Razah_Costume_Brawl_disguise, + Morgahn_Costume_Brawl_disguise, + Nika_Costume_Brawl_disguise, + Seaguard_Hala_Costume_Brawl_disguise, + Livia_Costume_Brawl_disguise, + Cynn_Costume_Brawl_disguise, + Tahlkora_Costume_Brawl_disguise, + Devona_Costume_Brawl_disguise, + Zho_Costume_Brawl_disguise, + Melonni_Costume_Brawl_disguise, + Xandra_Costume_Brawl_disguise, + Hayda_Costume_Brawl_disguise, + UNUSED_Complicate, + UNUSED_Reapers_Mark, + UNUSED_Enfeeble, + UNUSED_Desecrate_Enchantments, + UNUSED_Signet_of_Lost_Souls, + UNUSED_Insidious_Parasite, + UNUSED_Searing_Flames, + UNUSED_Glowing_Gaze, + UNUSED_Steam, + UNUSED_Flame_Djinns_Haste, + UNUSED_Liquid_Flame, + UNUSED_Blessed_Light, + UNUSED_Shield_of_Absorption, + UNUSED_Smite_Condition, + UNUSED_Crippling_Slash, + UNUSED_Sun_and_Moon_Slash, + UNUSED_Enraging_Charge, + UNUSED_Tiger_Stance, + UNUSED_Burning_Arrow, + UNUSED_Natural_Stride, + UNUSED_Falling_Lotus_Strike, + UNUSED_Anthem_of_Weariness, + UNUSED_Pious_Fury, + Pie_Induced_Ecstasy, + Charm_Animal_Charr_Demolisher, + Togo_disguise, + Turai_Ossa_disguise, + Gwen_disguise, + Saul_DAlessio_disguise, + Dragon_Empire_Rage, + Call_to_the_Spirit_Realm, + Call_of_Haste_PvP, + Hide, + Feign_Death, + Flee, + Throw_Rock, + Nightmarish_Aura, + Siege_Strike, + Spike_Trap_spell, + Barbed_Bomb, + Fire_and_Brimstone, + Balm_Bomb, + Explosives, + Rations, + Form_Up_and_Advance, + Advance, + Spectral_Agony_Saul_DAlessio, + Stun_Bomb, + Banner_of_the_Unseen, + Signet_of_the_Unseen, + For_Elona, + Giant_Stomp_Turai_Ossa, + Whirlwind_Attack_Turai_Ossa, + Junundu_Siege1, + Distortion_Gwen, + Shared_Burden_Gwen, + Sum_of_All_Fears_Gwen, + Castigation_Signet_Saul_DAlessio, + Unnatural_Signet_Saul_DAlessio, + Dragon_Slash_Turai_Ossa, + Essence_Strike_Togo, + Spirit_Burn_Togo, + Spirit_Rift_Togo, + Mend_Body_and_Soul_Togo, + Offering_of_Spirit_Togo, + Disenchantment_Togo, + Fire_Dart1, + Corrupted_Haiju_Lagoon_Water = 2698, + Journey_to_the_North, + Rat_Form = 2701, + Ox_Form, + Tiger_Form, + Rabbit_Form, + Dragon_Form, + Snake_Form, + Horse_Form, + Sheep_Form, + Monkey_Form, + Rooster_Form, + Dog_Form, + Party_Time, + Victory_is_Ours, + Dark_Soul_Explosion, + Chaotic_Soul_Explosion, + Fiery_Soul_Explosion, + Rejuvenating_Soul_Explosion, + Plague_Spring, + Unbalancing_Soul_Explosion, + Shadowy_Soul_Explosion, + Ethereal_Soul_Explosion, + Redemption_of_Purity, + Purify_Energy, + Purifying_Flame, + Purifying_Prayer, + Strength_of_Purity, + Spring_of_Purity, + Way_of_the_Pure, + Purify_Soul, + Aura_of_Purity, + Anthem_of_Purity, + Falkens_Fire_Fist, + Falken_Quick, + Mind_Wrack_PvP, + Quickening_Terrain, + Massive_Damage, + Minion_Apocalypse, + Combat_Costume_Assassin = 2739, + Combat_Costume_Mesmer, + Combat_Costume_Necromancer, + Combat_Costume_Elementalist, + Combat_Costume_Monk, + Combat_Costume_Warrior, + Combat_Costume_Ranger, + Combat_Costume_Dervish, + Combat_Costume_Ritualist, + Combat_Costume_Paragon, + Jade_Brotherhood_Bomb = 2755, + Mad_Kings_Fan, + Candy_Corn_Strike = 2758, + Rocket_Propelled_Gobstopper, + Rain_of_Terror_spell, + Cry_of_Madness, + Sugar_Infusion, + Feast_of_Vengeance, + Animate_Candy_Minions, + Taste_of_Undeath, + Scourge_of_Candy, + Motivating_Insults, + Mad_King_Pony_Support, + Its_Good_to_Be_King, + Maddening_Laughter, + Mad_Kings_Influence, + Hidden_Talent = 2792, + Couriers_Haste, + Xinraes_Revenge, + Meek_Shall_Inherit = 2810, + Inverse_Ninja_Law = 2813, + Abyssal_Form = 2839, + Asura_Form, + Awakened_Head_Form, + Spider_Form, + Charr_Form, + Golem_Form, + Hellhound_Form, + Norn_Form, + Ooze_Form, + Rift_Warden_Form, + Yeti_Form = 2850, + Snowman_Form, + Energy_Drain_PvP, + Energy_Tap_PvP, + PvP_effect, + Ward_Against_Melee_PvP, + Lightning_Orb_PvP, + Aegis_PvP, + Watch_Yourself_PvP, + Enfeeble_PvP, + Ether_Renewal_PvP, + Penetrating_Attack_PvP, + Shadow_Form_PvP, + Discord_PvP, + Sundering_Attack_PvP, + Ritual_Lord_PvP, + Flesh_of_My_Flesh_PvP, + Ancestors_Rage_PvP, + Splinter_Weapon_PvP, + Assassins_Remedy_PvP, + Blinding_Surge_PvP, + Light_of_Deliverance_PvP, + Death_Pact_Signet_PvP, + Mystic_Sweep_PvP, + Eremites_Attack_PvP, + Harriers_Toss_PvP, + Defensive_Anthem_PvP, + Ballad_of_Restoration_PvP, + Song_of_Restoration_PvP, + Incoming_PvP, + Never_Surrender_PvP, + Mantra_of_Inscriptions_PvP = 2882, + For_Great_Justice_PvP, + Mystic_Regeneration_PvP, + Enfeebling_Blood_PvP, + Summoning_Sickness, + Signet_of_Judgment_PvP, + Chilling_Victory_PvP, + Unyielding_Aura_PvP = 2891, + Spirit_Bond_PvP, + Weapon_of_Warding_PvP, + Bamph_Lite, + Smiters_Boon_PvP, + Battle_Fervor_Deactivating_ROX, + Cloak_of_Faith_Deactivating_ROX, + Dark_Aura_Deactivating_ROX, + Chaotic_Power_Deactivating_ROX, + Strength_of_the_Oak_Deactivating_ROX, + Sinister_Golem_Form, + Reactor_Blast, + Reactor_Blast_Timer, + Jade_Brotherhood_Disguise, + Internal_Power_Engaged, + Target_Acquisition, + NOX_Beam, + NOX_Field_Dash, + NOXion_Buster, + Countdown, + Bit_Golem_Breaker, + Bit_Golem_Rectifier, + Bit_Golem_Crash, + Bit_Golem_Force, + NOX_Phantom = 2916, + NOX_Thunder, + NOX_Lock_On, + NOX_Driver, + NOX_Fire, + NOX_Knuckle, + NOX_Divider_Drive, + Yo_Ho_Ho_and_a_Bottle_of_Grog, + Oath_of_Protection, + Sloth_Hunters_Shot_PvP, + Bamph_Lifesteal, + Shrine_Backlash, + UNUSED_Amulet_of_Protection, + UNUSED_Eviscerate, + UNUSED_Rush, + UNUSED_Lions_Comfort, + UNUSED_Melandrus_Shot, + UNUSED_Sloth_Hunters_Shot, + UNUSED_Reversal_of_Damage, + UNUSED_Empathic_Removal, + UNUSED_Castigation_Signet, + UNUSED_Wail_of_Doom, + UNUSED_Rip_Enchantment, + UNUSED_Foul_Feast, + UNUSED_Plague_Sending, + UNUSED_Overload, + UNUSED_Wastrels_Worry, + UNUSED_Lyssas_Aura, + UNUSED_Empathy, + UNUSED_Shatterstone, + UNUSED_Glowing_Ice, + UNUSED_Freezing_Gust, + UNUSED_Glyph_of_Immolation, + UNUSED_Glyph_of_Restoration, + UNUSED_Hidden_Caltrops, + UNUSED_Black_Spider_Strike, + UNUSED_Caretakers_Charge, + UNUSED_Signet_of_Mystic_Speed, + UNUSED_Signet_of_Rage, + UNUSED_Signet_of_Judgement, + UNUSED_Vigorous_Spirit, + Western_Health_Shrine_Bonus, + Eastern_Health_Shrine_Bonus, + Experts_Dexterity_PvP, + Delayed_Blast_BAMPH = 2961, + Grentch_Form, + Snowball1 = 2964, + Signet_of_Spirits_PvP, + Signet_of_Ghostly_Might_PvP, + Avatar_of_Grenth_PvP, + Oversized_Tonic_Warning, + Read_the_Wind_PvP, + Mursaat_Form, + Blue_Rock_Candy_Rush, + Green_Rock_Candy_Rush, + Red_Rock_Candy_Rush, + Archer_Form, + Avatar_of_Balthazar_Form, + Champion_of_Balthazar_Form, + Priest_of_Balthazar_Form, + The_Black_Beast_of_Arrgh_Form, + Crystal_Guardian_Form, + Crystal_Spider_Form, + Bone_Dragon_Form1, + Saltspray_Dragon_Form, + Eye_of_Janthir_Form, + Footman_Form, + Ghostly_Hero_Form, + Guild_Lord_Form, + Gwen_Doll_Form, + Black_Moa_Form, + Black_Moa_Chick_Form, + Moa_Bird_Form, + White_Moa_Form, + Rainbow_Phoenix_Form, + Brown_Rabbit_Form, + White_Rabbit_Form, + Seer_Form, + Swarm_of_Bees_Form, + Seed_of_Resurrection1, + Fragility_PvP, + Strength_of_Honor_PvP, + Gunthers_Gaze, + Warriors_Endurance_PvP = 3002, + Armor_of_Unfeeling_PvP, + Signet_of_Creation_PvP, + Union_PvP, + Shadowsong_PvP, + Pain_PvP, + Destruction_PvP, + Soothing_PvP, + Displacement_PvP, + Preservation_PvP, + Life_PvP, + Recuperation_PvP, + Dissonance_PvP, + Earthbind_PvP, + Shelter_PvP, + Disenchantment_PvP, + Restoration_PvP, + Bloodsong_PvP, + Wanderlust_PvP, + Savannah_Heat_PvP, + Gaze_of_Fury_PvP, + Anguish_PvP, + Empowerment_PvP, + Recovery_PvP, + Go_for_the_Eyes_PvP, + Brace_Yourself_PvP, + Blazing_Finale_PvP, + Bladeturn_Refrain_PvP, + Signet_of_Return_PvP, + Cant_Touch_This_PvP, + Stand_Your_Ground_PvP, + We_Shall_Return_PvP, + Find_Their_Weakness_PvP, + Never_Give_Up_PvP, + Help_Me_PvP, + Fall_Back_PvP, + Agony_PvP, + Rejuvenation_PvP, + Anthem_of_Disruption_PvP, + Shadowsong_Master_Riyo, + Pain1, + Wanderlust1, + Spirit_Siphon_Master_Riyo, + Comfort_Animal_PvP, + Melandrus_Assault_PvP = 3047, + Shroud_of_Distress_PvP, + Unseen_Fury_PvP, + Predatory_Bond_PvP, + Enraged_Lunge_PvP, + Conviction_PvP, + Signet_of_Deadly_Corruption_PvP, + Masochism_PvP, + Pain_attack_Togo, + Pain_attack_Togo1, + Pain_attack_Togo2, + Unholy_Feast_PvP, + Signet_of_Agony_PvP, + Escape_PvP, + Death_Blossom_PvP, + Finale_of_Restoration_PvP, + Mantra_of_Resolve_PvP, + Lesser_Hard_Mode_NPC_Buff, + Charm_Animal1, + Charm_Animal2, + Henchman, + Charm_Animal_Codex, + Agent_of_the_Mad_King, + Sugar_Rush_Agent_of_the_Mad_King, + Sticky_Ground, + Sugar_Shock, + The_Mad_Kings_Influence, + Bone_Spike, + Flurry_of_Splinters, + Everlasting_Mobstopper_skill, + Weakened_by_Dhuum, + Curse_of_Dhuum, + Dhuums_Rest_Reaper_skill, + Dhuum_skill, + Summon_Champion, + Summon_Minions, + Touch_of_Dhuum, + Reaping_of_Dhuum, + Judgment_of_Dhuum, + Weight_of_Dhuum_hex, + Dhuums_Rest, + Spiritual_Healing, + Encase_Skeletal, + Reversal_of_Death, + Ghostly_Fury, + Henchman_Form_Pudash, + Henchman_Form_Dahlia, + Henchman_Form_Disenmaedel, + Henchman_Form_Errol_Hyl, + Henchman_Form_Lulu_Xan, + Henchman_Form_Tannaros, + Henchman_Form_Cassie_Santi, + Henchman_Form_Redemptor_Frohs, + Henchman_Form_Julyia, + Henchman_Form_Bellicus, + Henchman_Form_Dirk_Shadowrise, + Henchman_Form_Vincent_Evan, + Henchman_Form_Luzy_Fiera, + Henchman_Form_Motoko_Kai, + Henchman_Form_Hinata, + Henchman_Form_Kah_Xan, + Henchman_Form_Narcissia, + Henchman_Form_Zen_Siert, + Henchman_Form_Blenkeh, + Henchman_Form_Aurora_Allesandra, + Henchman_Form_Teena_the_Raptor, + Henchman_Form_Lora_Lanaya, + Henchman_Form_Adepte, + Henchman_Form_Haldibarn_Earendul, + Henchman_Form_Daky, + Henchman_Form_Syn_Spellstrike, + Henchman_Form_Divinus_Tutela, + Henchman_Form_Blahks, + Henchman_Form_Erick, + Henchman_Form_Ghavin, + Henchman_Form_Hobba_Inaste, + Henchman_Form_Bacchi_Coi, + Henchman_Form_Suzu, + Henchman_Form_Rollo_Lowlo, + Henchman_Form_Fuu_Rin, + Henchman_Form_Nuno, + Henchman_Form_Alsacien, + Henchman_Form_Uto_Wrotki, + Henchman_Form_Khai_Kemnebi, + Henchman_Form_Cole, + Weight_of_Dhuum = 3133, + Spirit_Form_disguise, + Spiritual_Healing_Reaper_skill, + Ghostly_Fury_Reaper_skill, + Reindeer_Form, + Reindeer_Form1, + Reindeer_Form2, + Staggering_Blow_PvP, + Lightning_Reflexes_PvP, + Fierce_Blow_PvP, + Renewing_Smash_PvP, + Heal_as_One_PvP, + Glass_Arrows_PvP, + Protective_Was_Kaolai_PvP, + Keen_Arrow_PvP, + Anthem_of_Envy_PvP, + Mending_Refrain_PvP, + Lesser_Flame_Sentinel_Resistance, + Empathy_PvP, + Crippling_Anguish_PvP, + Pain_attack_Signet_of_Spirits, + Pain_attack_Signet_of_Spirits1, + Pain_attack_Signet_of_Spirits2, + Soldiers_Stance_PvP, + Destructive_Was_Glaive_PvP, + Charm_Drake = 3159, + Theres_not_enough_time = 3162, + Keirans_Sniper_Shot, + Falken_Punch, + Golem_Pilebunker, + Drunken_Stumbling, + Koros_Gaze = 3170, + Ebon_Vanguard_Assassin_Support_NPC, + Ebon_Vanguard_Battle_Standard_of_Power, + Loose_Magic, + Well_Supplied, + Guild_Monument_Protected, + Strong_Natural_Resistance, + Elite_Regeneration, + Elite_Regeneration1, + Mantra_of_Signets_PvP, + Shatter_Delusions_PvP, + Illusionary_Weaponry_PvP, + Panic_PvP, + Migraine_PvP, + Accumulated_Pain_PvP, + Psychic_Instability_PvP, + Shared_Burden_PvP, + Stolen_Speed_PvP, + Unnatural_Signet_PvP, + Spiritual_Pain_PvP, + Frustration_PvP, + Mistrust_PvP, + Enchanters_Conundrum_PvP, + Signet_of_Clumsiness_PvP, + Mirror_of_Disenchantment_PvP, + Wandering_Eye_PvP, + Calculated_Risk_PvP, + Adoration, + Impending_Dhuum, + Sacrifice_Pawn, + Isaiahs_Balance, + Toriimos_Burning_Fury, + Oath_of_Protection1, + Defy_Pain_PvP = 3204, + Entourage, + Spectral_Infusion, + Entourage_Buffer, + Wastrels_Demise_PvP, + Shiro_Tagachi_Costume_Brawl_disguise = 3210, + Dunham_Costume_Brawl_disguise, + Palawa_Joko_Costume_Brawl_disguise, + Lawrence_Crafton_Costume_Brawl_disguise, + Saul_DAlessio_Costume_Brawl_disguise, + Turai_Ossa_Costume_Brawl_disguise, + Lieutenant_Thackeray_Costume_Brawl_disguise, + Gehraz_Costume_Brawl_disguise, + Master_Togo_Costume_Brawl_disguise, + Egil_Fireteller_Costume_Brawl_disguise, + Mysterious_Assassin_Costume_Brawl_disguise, + Gwen_Costume_Brawl_disguise, + Eve_Costume_Brawl_disguise, + Elementalist_Aziure_Costume_Brawl_disguise, + Jamei_Costume_Brawl_disguise, + Jora_Costume_Brawl_disguise, + Margrid_the_Sly_Costume_Brawl_disguise, + Varesh_Ossa_Costume_Brawl_disguise, + Headmaster_Quin_Costume_Brawl_disguise, + Kormir_Costume_Brawl_disguise, + Barbed_Signet_PvP = 3231, + Heal_Party_PvP, + Spoil_Victor_PvP, + Visions_of_Regret_PvP, + Keirans_Sniper_Shot_Hearts_of_the_North, + Gravestone_Marker, + Terminal_Velocity, + Relentless_Assault, + Natures_Blessing, + Find_Their_Weakness_Thackeray, + Theres_Nothing_to_Fear_Thackeray, + Coming_of_Spring, + Promise_of_Death, + Withering_Blade, + Deaths_Embrace, + Venom_Fang, + Survivors_Will, + Keiran_Thackeray_disguise, + Rain_of_Arrows, + Fox_Fangs_PvP = 3251, + Wild_Strike_PvP, + Ultra_Snowball, + Blizzard, + Ultra_Snowball1 = 3259, + Ultra_Snowball2, + Ultra_Snowball3, + Ultra_Snowball4, + Banishing_Strike_PvP, + Twin_Moon_Sweep_PvP, + Irresistible_Sweep_PvP, + Pious_Assault_PvP, + Ebon_Dust_Aura_PvP, + Heart_of_Holy_Flame_PvP, + Guiding_Hands_PvP, + Avatar_of_Dwayna_PvP, + Avatar_of_Melandru_PvP, + Mystic_Healing_PvP, + Signet_of_Pious_Restraint_PvP, + Vanguard_Initiate, + Victorious_Renewal = 3282, + A_Dying_Curse, + Rage_of_the_Djinn = 3288, + Fevered_Dreams_PvP, + Stun_Grenade, + Fragmentation_Grenade, + Tear_Gas, + Land_Mine, + Riot_Shield, + Club_Strike, + Bludgeon, + Tango_Down, + Ill_Be_Back, + Phased_Plasma_Burst, + Plasma_Shot, + Annihilator_Bash, + Sky_Net, + Damage_Assessment, + Going_Commando, + Koss_Form = 3306, + Dunkoro_Form, + Melonni_Form, + Acolyte_Jin_Form, + Acolyte_Sousuke_Form, + Tahlkora_Form, + Zhed_Shadowhoof_Form, + Margrid_the_Sly_Form, + Master_of_Whispers_Form, + Goren_Form, + Norgu_Form, + Morgahn_Form, + Razah_Form, + Olias_Form, + Zenmai_Form, + Ogden_Form, + Vekk_Form, + Gwen_Form, + Xandra_Form, + Kahmu_Form, + Jora_Form, + Pyre_Fierceshot_Form, + Anton_Form, + Hayda_Form, + Livia_Form, + Keiran_Thackeray_Form, + Miku_Form, + MOX_Form, + Shiro_Tagachi_Form, + Prince_Rurik_Form = 3336, + Margonite_Form, + Destroyer_Form, + Queen_Salma_Form, + Slightly_Mad_King_Thorn_Form, + Kuunavang_Form, + Lone_Wolf, + Stand_Together, + Unyielding_Spirit, + Reckless_Advance, + Aura_of_Thorns_PvP, + Dust_Cloak_PvP, + Lyssas_Haste_PvP, + Knight_Form, + Lord_Archer_Form, + Bodyguard_Form, + Guild_Thief_Form, + Ghostly_Priest_Form, + Flame_Sentinel_Form, + Solidarity = 3356, + There_Can_Be_Only_One, + Fight_Against_Despair, + Deaths_Succor, + Battle_of_Attrition, + Fight_or_Flight, + Renewing_Escape, + Battle_Frenzy, + The_Way_of_One, + Onslaught_PvP, + Heart_of_Fury_PvP, + Wounding_Strike_PvP, + Pious_Fury_PvP, + Party_Mode, + Smash_of_the_Titans, + Mirror_Shatter, + Illusion_of_Haste_PvP = 3373, + Illusion_of_Pain_PvP, + Aura_of_Restoration_PvP, + Shapeshift, + GOLEM_disguise, + Phase_Shield, + Reactor_Burst, + Ill_Be_Back1, + Annihilator_Strike, + Annihilator_Beam, + Annihilator_Knuckle, + Annihilator_Toss, + Web_of_Disruption_PvP = 3386, + Chain_Combo, + All_In = 3390, + Jack_of_All_Trades, + Amateur_Hour, + Odrans_Razor, + Like_a_Boss, + The_Boss, + Lightning_Hammer_PvP, + Elemental_Flame_PvP, + Slippery_Ground_PvP, + Disguised_when_using_everlasting_tonics_except_Everlasting_Legionnaire_Tonic, + Disguised_when_using_non_everlasting_tonics, + Disguised_verification_requested, + Tonic_Tipsiness, + Parting_Gift, + Gift_of_Battle, + Rolling_Start, + Disguised_when_using_Everlasting_Legionnaire_Tonic, + Time_Ward = 3422, + Soul_Taker, + Over_the_Limit, + Judgement_Strike, + Seven_Weapon_Stance, + Together_as_one, + Shadow_Theft, + Weapons_of_Three_Forges, + Vow_of_Revolution, + Heroic_Refrain, + Reforged_Mode = 0xD6A, + Dhuums_Covenant_Broken, + Count = 0xD6c, + } + + public enum SkillType : int + { + Bounty = 1, + Scroll = 2, + Stance = 3, + Hex = 4, + Spell = 5, + Enchantment = 6, + Signet = 7, + Condition = 8, + Well = 9, + Skill = 10, + Ward = 11, + Glyph = 12, + Title = 13, + Attack = 14, + Shout = 15, + Skill2 = 16, + Passive = 17, + Environmental = 18, + Preparation = 19, + PetAttack = 20, + Trap = 21, + Ritual = 22, + EnvironmentalTrap = 23, + ItemSpell = 24, + WeaponSpell = 25, + Form = 26, + Chant = 27, + EchoRefrain = 28, + Disguise = 29, + } + + public enum StoragePane : byte + { + Storage_1, + Storage_2, + Storage_3, + Storage_4, + Storage_5, + Storage_6, + Storage_7, + Storage_8, + Storage_9, + Storage_10, + Storage_11, + Storage_12, + Storage_13, + Storage_14, + Material_Storage, + } + + public enum Tick : int + { + NOT_READY, + READY, + } + + public enum TitleID : uint + { + Hero, + TyrianCarto, + CanthanCarto, + Gladiator, + Champion, + Kurzick, + Luxon, + Drunkard, + Deprecated_SkillHunter, // Pre hard mode update version + Survivor, + KoaBD, + Deprecated_TreasureHunter, // Old title, non-account bound + Deprecated_Wisdom, // Old title, non-account bound + ProtectorTyria, + ProtectorCantha, + Lucky, + Unlucky, + Sunspear, + ElonianCarto, + ProtectorElona, + Lightbringer, + LDoA, + Commander, + Gamer, + SkillHunterTyria, + VanquisherTyria, + SkillHunterCantha, + VanquisherCantha, + SkillHunterElona, + VanquisherElona, + LegendaryCarto, + LegendaryGuardian, + LegendarySkillHunter, + LegendaryVanquisher, + Sweets, + GuardianTyria, + GuardianCantha, + GuardianElona, + Asuran, + Deldrimor, + Vanguard, + Norn, + MasterOfTheNorth, + Party, + Zaishen, + TreasureHunter, + Wisdom, + Codex, + None = 0xff, + } + internal const uint SkillMax = 0xd69; + + public static partial class Camera + { + internal const float DEFAULT_DIST = 750.0f; + internal const float FIRST_PERSON_DIST = 2.0f; + } + + public static partial class DialogID + { + internal const int FactionMissionOutpost = 0x80000B; + internal const int FerryDocksToKaineng = 136; // Mhenlo + internal const int FerryDocksToLA = 137; // Mhenlo + internal const int FerryGateToLA = 133; // Lionguard Neiro + internal const int FerryKamadanToDocks = 133; // Assistant Hahnna + internal const int FowCraftArmor = 127; + internal const int NightfallMissionOutpost = 0x85; + internal const int ProfChangeAssassin = 0x784; + internal const int ProfChangeDervish = 0xA84; + internal const int ProfChangeEle = 0x684; + internal const int ProfChangeMesmer = 0x584; + internal const int ProfChangeMonk = 0x384; + internal const int ProfChangeNecro = 0x484; + internal const int ProfChangeParagon = 0x984; + internal const int ProfChangeRanger = 0x284; + internal const int ProfChangeRitualist = 0x884; + internal const int ProfChangeWarrior = 0x184; + internal const int UwTeleEnquire = 127; // "where can you teleport us to" + internal const int UwTeleLab = 141; + internal const int UwTeleMnt = 142; + internal const int UwTelePits = 143; + internal const int UwTelePlanes = 139; + internal const int UwTelePools = 144; + internal const int UwTeleVale = 145; + internal const int UwTeleWastes = 140; + } + + public static partial class HealthbarHeight + { + internal const uint Large = 26; + internal const uint Larger = 30; + internal const uint Normal = 22; + internal const uint Small = 24; + } + + public static partial class ItemID + { + internal const int Absinthe = 6367; + internal const int AgedDwarvenAle = 24593; + internal const int AgedHuntersAle = 31145; + internal const int AmberChunk = 6532; + internal const int Apples = 28431; + internal const int ArmbraceOfTruth = 21127; + internal const int BRC = 31151; + internal const int BattleIsleIcedTea = 36682; + internal const int BoltofCloth = 925; + internal const int BoltofDamask = 927; + internal const int BoltofLinen = 926; + internal const int BoltofSilk = 928; + internal const int Bone = 921; + internal const int BossKey = 25416; + internal const int BottleOfJuniberryGin = 19172; + internal const int BottleOfVabbianWine = 19173; + internal const int ChitinFragment = 954; + internal const int ChocolateBunny = 22644; + internal const int Cider = 28435; + internal const int ConsArmor = 24860; + internal const int ConsEssence = 24859; + internal const int ConsGrail = 24861; + internal const int Corns = 28432; + internal const int CremeBrulee = 15528; + internal const int CrystallineSword = 399; + internal const int Cupcakes = 22269; + internal const int DSR = 32823; + internal const int DeldrimorSteelIngot = 950; + internal const int Diamond = 935; + internal const int DungeonKey = 25410; + internal const int DwarvenAle = 5585; + internal const int Dye = 146; + internal const int ELGwen = 36442; + internal const int ELMargo = 36456; + internal const int ELMiku = 36451; + internal const int ELZenmai = 36493; + internal const int Eggnog = 6375; + internal const int Eggs = 22752; + internal const int ElixirOfValor = 21227; // party-wide + internal const int ElonianLeatherSquare = 943; + internal const int EnchantedTorch = 503; + internal const int EternalBlade = 1045; + internal const int Feather = 933; + internal const int FlaskOfFirewater = 2513; + internal const int FourLeafClover = 22191; // party-wide + internal const int Fruitcake = 21492; + internal const int FurSquare = 941; + internal const int GRC = 31152; + internal const int GakiSummon = 30960; + internal const int GhastlyStone = 32557; + internal const int GhostInTheBox = 6368; + internal const int GlobofEctoplasm = 930; + internal const int GoldCoin = 2510; + internal const int GoldCoins = 2511; + internal const int GraniteSlab = 955; + internal const int Grog = 30855; + internal const int Honeycomb = 26784; // party-wide + internal const int HuntersAle = 910; + internal const int IdentificationKit = 2989; + internal const int IdentificationKit_Superior = 5899; + internal const int ImperialGuardSummon = 30210; + internal const int IronIngot = 948; + internal const int IstaniFireOil = 16339; + internal const int JadeiteShard = 6533; + internal const int JarOfHoney = 31150; + internal const int Kabobs = 17060; + internal const int Keg = 31146; + internal const int KrytalLokum = 35125; + internal const int KrytanBrandy = 35124; + internal const int LeatherSquare = 942; + internal const int LegionnaireStone = 37810; + internal const int LightOfSeborhin = 15531; + internal const int Lockpick = 22751; + internal const int LumpofCharcoal = 922; + internal const int LunarDog = 29435; + internal const int LunarDragon = 29429; + internal const int LunarHorse = 29431; + internal const int LunarMonkey = 29433; + internal const int LunarOx = 29426; + internal const int LunarPig = 29424; + internal const int LunarRabbit = 29428; + internal const int LunarRat = 29425; + internal const int LunarRooster = 29434; + internal const int LunarSheep = 29432; + internal const int LunarSnake = 29430; + internal const int LunarTiger = 29427; + internal const int LunarToken = 21833; + internal const int MandragorRootCake = 19170; + internal const int MargoniteGem = 21128; + internal const int MiniDhuum = 32822; + internal const int MinistreatOfPurity = 30208; + internal const int Mobstopper = 32558; + internal const int MonstrousClaw = 923; + internal const int MonstrousEye = 931; + internal const int MonstrousFang = 932; + internal const int OathOfPurity = 30206; // party-wide + internal const int ObsidianEdge = 1900; + internal const int ObsidianShard = 945; + internal const int OnyxGemstone = 936; + internal const int PahnaiSalad = 17062; + internal const int PeppermintCandyCane = 6370; + internal const int PhantomKey = 5882; + internal const int Pies = 28436; + internal const int PileofGlitteringDust = 929; + internal const int PlantFiber = 934; + internal const int Powerstone = 24862; + internal const int PumpkinCookie = 28433; + internal const int RRC = 31153; + internal const int RainbowCandyCane = 21489; // party-wide + internal const int RedBeanCake = 15479; + internal const int RefinedJelly = 19039; + internal const int ResScroll = 26501; + internal const int ResScrolls = 26501; + internal const int Ricewine = 15477; + internal const int RollofParchment = 951; + internal const int RollofVellum = 952; + internal const int Ruby = 937; + internal const int SalvageKit = 2992; + internal const int SalvageKit_Expert = 2991; + internal const int SalvageKit_Superior = 5900; + internal const int Sapphire = 938; + internal const int Scale = 953; + internal const int ScrollOfAdventurersInsight = 5853; + internal const int ScrollOfBerserkersInsight = 5595; + internal const int ScrollOfHerosInsight = 5594; + internal const int ScrollOfHuntersInsight = 5976; + internal const int ScrollOfRampagersInsight = 5975; + internal const int ScrollOfSlayersInsight = 5611; + internal const int ScrollOfTheLightbringer = 21233; + internal const int SealOfTheDragonEmpire = 30211; // party-wide + internal const int ShamrockAle = 22190; + internal const int ShiningBladeRations = 35127; + internal const int SkalefinSoup = 17061; + internal const int SpikedEggnog = 6366; + internal const int SpiritwoodPlank = 956; + internal const int SteelIngot = 949; + internal const int StygianGem = 21129; + internal const int SugaryBlueDrink = 21812; + internal const int TannedHideSquare = 940; + internal const int TemperedGlassVial = 939; + internal const int TenguSummon = 30209; + internal const int TitanGem = 21130; + internal const int TormentGem = 21131; + internal const int TurtleSummon = 30966; + internal const int UnholyText = 2619; + internal const int VialofInk = 944; + internal const int VoltaicSpear = 2071; + internal const int WarhornSummon = 35126; + internal const int Warsupplies = 35121; + internal const int WintergreenCandyCane = 21488; + internal const int WitchsBrew = 6049; + internal const int WoodPlank = 946; + internal const int ZehtukasJug = 19171; + } + + public static partial class Preference + { + + public enum CharSortOrder : uint + { + None, + Alphabetize, + PvPRP, + } + } + + public static partial class Range + { + internal const float Adjacent = 166.0f; + internal const float Area = 322.0f; + internal const float Compass = 5000.0f; + internal const float Earshot = 1012.0f; + internal const float Nearby = 252.0f; + internal const float Spellcast = 1248.0f; + internal const float Spirit = 2512.0f; + internal const float SpiritExtended = 3500.0f; + internal const float Touch = 144.0f; + } + } + + public static partial class EventMgr + { + + public enum EventID : int + { + kRecvPing = 0x8, + kSendFriendState = 0x26, + kRecvFriendState = 0x2c, + kNone = 0xffff, + } + } + + public static partial class Merchant + { + + public enum TransactionType : uint + { + AccountName, + MerchantBuy, + CollectorBuy, + CrafterBuy, + WeaponsmithCustomize, + Services, + DonateFaction, + Unused, + GuildRegistration, + GuildCape, + SkillTrainer, + MerchantSell, + TraderBuy, + TraderSell, + UnlockHero, + UnlockItem, + UnlockSkill, + } + } + + public static partial class Render + { + + public enum Metric : uint + { + Metric0, + Metric1, + Metric2, + Metric3, + FullscreenGamma, + MultiSampling, + PosX, + PosY, + RefreshRate, + ShaderQuality, + SizeX, + SizeY, + TextureFiltering, + Metric13, + Metric14, + Vsync, + ScreenBorderless, + Metric17, + Metric18, + Metric19, + Metric20, + Metric21, + MonitorRefreshRate, + TextureMaxCX, + TextureMaxCY, + Metric25, + Count, + } + + public enum Transform : int + { + TRANSFORM_PROJECTION_MATRIX = 0, + TRANSFORM_MODEL_MATRIX = 1, + TRANSFORM_COUNT = 5, + } + } + + public static partial class UI + { + + public enum ControlAction : uint + { + ControlAction_None = 0, + ControlAction_Screenshot = 0xAE, + ControlAction_CloseAllPanels = 0x85, + ControlAction_ToggleInventoryWindow = 0x8B, + ControlAction_OpenScoreChart = 0xBD, + ControlAction_OpenTemplateManager = 0xD3, + ControlAction_OpenSaveEquipmentTemplate = 0xD4, + ControlAction_OpenSaveSkillTemplate = 0xD5, + ControlAction_OpenParty = 0xBF, + ControlAction_OpenGuild = 0xBA, + ControlAction_OpenFriends = 0xB9, + ControlAction_ToggleAllBags = 0xB8, + ControlAction_OpenMissionMap = 0xB6, + ControlAction_OpenBag2 = 0xB5, + ControlAction_OpenBag1 = 0xB4, + ControlAction_OpenBelt = 0xB3, + ControlAction_OpenBackpack = 0xB2, + ControlAction_OpenSkillsAndAttributes = 0x8F, + ControlAction_OpenQuestLog = 0x8E, + ControlAction_OpenWorldMap = 0x8C, + ControlAction_OpenOptions = 0x8D, + ControlAction_OpenHero = 0x8A, + ControlAction_CycleEquipment = 0x86, + ControlAction_ActivateWeaponSet1 = 0x81, + ControlAction_ActivateWeaponSet2, + ControlAction_ActivateWeaponSet3, + ControlAction_ActivateWeaponSet4, + ControlAction_DropItem = 0xCD, // drops bundle item >> flags, ashes, etc + ControlAction_ChatReply = 0xBE, + ControlAction_OpenChat = 0xA1, + ControlAction_OpenAlliance = 0x88, + ControlAction_ReverseCamera = 0x90, + ControlAction_StrafeLeft = 0x91, + ControlAction_StrafeRight = 0x92, + ControlAction_TurnLeft = 0xA2, + ControlAction_TurnRight = 0xA3, + ControlAction_MoveBackward = 0xAC, + ControlAction_MoveForward = 0xAD, + ControlAction_CancelAction = 0xAF, + ControlAction_Interact = 0x80, + ControlAction_ReverseDirection = 0xB1, + ControlAction_Autorun = 0xB7, + ControlAction_Follow = 0xCC, + ControlAction_TargetPartyMember1 = 0x96, + ControlAction_TargetPartyMember2, + ControlAction_TargetPartyMember3, + ControlAction_TargetPartyMember4, + ControlAction_TargetPartyMember5, + ControlAction_TargetPartyMember6, + ControlAction_TargetPartyMember7, + ControlAction_TargetPartyMember8, + ControlAction_TargetPartyMember9 = 0xC6, + ControlAction_TargetPartyMember10, + ControlAction_TargetPartyMember11, + ControlAction_TargetPartyMember12, + ControlAction_TargetNearestItem = 0xC3, + ControlAction_TargetNextItem = 0xC4, + ControlAction_TargetPreviousItem = 0xC5, + ControlAction_TargetPartyMemberNext = 0xCA, + ControlAction_TargetPartyMemberPrevious = 0xCB, + ControlAction_TargetAllyNearest = 0xBC, + ControlAction_ClearTarget = 0xE3, + ControlAction_TargetSelf = 0xA0, // also 0x96 + ControlAction_TargetPriorityTarget = 0x9F, + ControlAction_TargetNearestEnemy = 0x93, + ControlAction_TargetNextEnemy = 0x95, + ControlAction_TargetPreviousEnemy = 0x9E, + ControlAction_ShowOthers = 0x89, + ControlAction_ShowTargets = 0x94, + ControlAction_CameraZoomIn = 0xCE, + ControlAction_CameraZoomOut = 0xCF, + ControlAction_ClearPartyCommands = 0xDB, + ControlAction_CommandParty = 0xD6, + ControlAction_CommandHero1, + ControlAction_CommandHero2, + ControlAction_CommandHero3, + ControlAction_CommandHero4 = 0x102, + ControlAction_CommandHero5, + ControlAction_CommandHero6, + ControlAction_CommandHero7, + ControlAction_OpenHero1PetCommander = 0xE0, + ControlAction_OpenHero2PetCommander, + ControlAction_OpenHero3PetCommander, + ControlAction_OpenHero4PetCommander = 0xFE, + ControlAction_OpenHero5PetCommander, + ControlAction_OpenHero6PetCommander, + ControlAction_OpenHero7PetCommander, + ControlAction_OpenHeroCommander1 = 0xDC, + ControlAction_OpenHeroCommander2, + ControlAction_OpenHeroCommander3, + ControlAction_OpenPetCommander, + ControlAction_OpenHeroCommander4 = 0x126, + ControlAction_OpenHeroCommander5, + ControlAction_OpenHeroCommander6, + ControlAction_OpenHeroCommander7, + ControlAction_Hero1Skill1 = 0xE5, + ControlAction_Hero1Skill2, + ControlAction_Hero1Skill3, + ControlAction_Hero1Skill4, + ControlAction_Hero1Skill5, + ControlAction_Hero1Skill6, + ControlAction_Hero1Skill7, + ControlAction_Hero1Skill8, + ControlAction_Hero2Skill1, + ControlAction_Hero2Skill2, + ControlAction_Hero2Skill3, + ControlAction_Hero2Skill4, + ControlAction_Hero2Skill5, + ControlAction_Hero2Skill6, + ControlAction_Hero2Skill7, + ControlAction_Hero2Skill8, + ControlAction_Hero3Skill1, + ControlAction_Hero3Skill2, + ControlAction_Hero3Skill3, + ControlAction_Hero3Skill4, + ControlAction_Hero3Skill5, + ControlAction_Hero3Skill6, + ControlAction_Hero3Skill7, + ControlAction_Hero3Skill8, + ControlAction_Hero4Skill1 = 0x106, + ControlAction_Hero4Skill2, + ControlAction_Hero4Skill3, + ControlAction_Hero4Skill4, + ControlAction_Hero4Skill5, + ControlAction_Hero4Skill6, + ControlAction_Hero4Skill7, + ControlAction_Hero4Skill8, + ControlAction_Hero5Skill1, + ControlAction_Hero5Skill2, + ControlAction_Hero5Skill3, + ControlAction_Hero5Skill4, + ControlAction_Hero5Skill5, + ControlAction_Hero5Skill6, + ControlAction_Hero5Skill7, + ControlAction_Hero5Skill8, + ControlAction_Hero6Skill1, + ControlAction_Hero6Skill2, + ControlAction_Hero6Skill3, + ControlAction_Hero6Skill4, + ControlAction_Hero6Skill5, + ControlAction_Hero6Skill6, + ControlAction_Hero6Skill7, + ControlAction_Hero6Skill8, + ControlAction_Hero7Skill1, + ControlAction_Hero7Skill2, + ControlAction_Hero7Skill3, + ControlAction_Hero7Skill4, + ControlAction_Hero7Skill5, + ControlAction_Hero7Skill6, + ControlAction_Hero7Skill7, + ControlAction_Hero7Skill8, + ControlAction_UseSkill1 = 0xA4, + ControlAction_UseSkill2, + ControlAction_UseSkill3, + ControlAction_UseSkill4, + ControlAction_UseSkill5, + ControlAction_UseSkill6, + ControlAction_UseSkill7, + ControlAction_UseSkill8, + ControlAction_ToggleGamepadCursorMode = 0x13d, // right dpad + } + + public enum EnumPreference : uint + { + CharSortOrder, + AntiAliasing, // multi sampling + Reflections, + ShaderQuality, + ShadowQuality, + TerrainQuality, + InterfaceSize, + FrameLimiter, + Count = 0x8, + } + + public enum FlagPreference : uint + { + FlagPref_0x0, + FlagPref_0x1, + FlagPref_0x2, + FlagPref_0x3, + ChannelAlliance, + FlagPref_0x5, + ChannelEmotes, + ChannelGuild, + ChannelLocal, + ChannelGroup, + ChannelTrade, + FlagPref_0xb, + FlagPref_0xc, + FlagPref_0xd, + FlagPref_0xe, + FlagPref_0xf, + FlagPref_0x10, + ShowTextInSkillFloaters, + ShowKRGBRatingsInGame, + FlagPref_0x13, + AutoHideUIOnLoginScreen, + DoubleClickToInteract, + InvertMouseControlOfCamera, + DisableMouseWalking, + AutoCameraInObserveMode, + AutoHideUIInObserveMode, + FlagPref_0x1a, + FlagPref_0x1b, + FlagPref_0x1c, + FlagPref_0x1d, + FlagPref_0x1e, + FlagPref_0x1f, + FlagPref_0x20, + FlagPref_0x21, + FlagPref_0x22, + FlagPref_0x23, + FlagPref_0x24, + FlagPref_0x25, + FlagPref_0x26, + FlagPref_0x27, + FlagPref_0x28, + FlagPref_0x29, + FlagPref_0x2a, + FlagPref_0x2b, + FlagPref_0x2c, + RememberAccountName, + IsWindowed, + FlagPref_0x2f, + FlagPref_0x30, + ShowSpendAttributesButton, // The game uses this hacky method of showing the "spend attributes" button next to the exp bar. + ConciseSkillDescriptions, + DoNotShowSkillTipsOnEffectMonitor, + DoNotShowSkillTipsOnSkillBars, + FlagPref_0x35, + FlagPref_0x36, + MuteWhenGuildWarsIsInBackground, + FlagPref_0x38, + AutoTargetFoes, + AutoTargetNPCs, + AlwaysShowNearbyNamesPvP, + FadeDistantNameTags, + FlagPref_0x3d, + FlagPref_0x3e, + FlagPref_0x3f, + FlagPref_0x40, + WaitForVSync, + FlagPref_0x42, + FlagPref_0x43, + FlagPref_0x44, + DoNotCloseWindowsOnEscape, + ShowMinimapOnWorldMap, + FlagPref_0x47, + FlagPref_0x48, + FlagPref_0x49, + FlagPref_0x4a, + FlagPref_0x4b, + FlagPref_0x4c, + FlagPref_0x4d, + FlagPref_0x4e, + FlagPref_0x4f, + FlagPref_0x50, + FlagPref_0x51, + HighResolutionPlayerTextures, + FlagPref_0x53, + EnhancedDrawDistance, + WhispersFromFriendsEtcOnly, + ShowChatTimestamps, + ShowCollapsedBags, + ItemRarityBorder, + AlwaysShowAllyNames, + AlwaysShowFoeNames, + FlagPref_0x5b, + LockCompassRotation, + EnableGamepad, + DpiScaling, + FlagPref_0x5f, + FlagPref_0x60, + HdSkillIcons, + HdBloom, + FlagPref_0x63, + Ssao, + FlagPref_0x65, + FlagPref_0x66, + FlagPref_0x67, + FlagPref_0x68, + FlagPref_0x69, + FlagPref_0x6a, + FlagPref_0x6b, + Count, + } + + public enum NumberCommandLineParameter : uint + { + Unk1, + Unk2, + Unk3, + FPS, + Count, + } + + public enum NumberPreference : uint + { + AutoTournPartySort, + ChatState, + ChatTab, + DistrictLastVisitedLanguage, + DistrictLastVisitedLanguage2, + DistrictLastVisitedNonInternationalLanguage, + DistrictLastVisitedNonInternationalLanguage2, + FloaterScale, + FullscreenGamma, + InventoryBag, + Language, + LanguageAudio, + LastDevice, + Refresh, + ScreenSizeX, + ScreenSizeY, + SkillListFilterRarity, + SkillListSortMethod, + SkillListViewMode, + SoundQuality, + StorageBagPage, + TextureLod, + TexFilterMode, + VolBackground, + VolDialog, + VolEffect, + VolMusic, + VolUi, + Vote, + WindowPosX, + WindowPosY, + WindowSizeX, + WindowSizeY, + SealedSeed, + SealedCount, + CameraFov, + CameraRotationSpeed, + ScreenBorderless, + VolMaster, + ClockMode, + MobileUiScale, + GamepadCursorSpeed, + LastLoginMethod, + Count = 0x2b, + } + + public enum StringPreference : uint + { + Unk1, + Unk2, + LastCharacterName, + Count = 0x3, + } + + public enum TooltipType : uint + { + None = 0x0, + EncString1 = 0x4, + EncString2 = 0x6, + Item = 0x8, + WeaponSet = 0xC, + Skill = 0x14, + Attribute = 0x4000, + } + + public enum UIMessage : uint + { + kNone = 0x0, + kFrameMessage_0x1, + kFrameMessage_0x2, + kFrameMessage_0x3, + kFrameMessage_0x4, + kFrameMessage_0x5, + kFrameMessage_0x6, + kFrameMessage_0x7, + kResize, // 0x8 + kInitFrame, // 0x9 + kFrameMessage_0xa, + kDestroyFrame, // 0xb + kFrameDisabledChange, // wparam = is_enabled + kFrameMessage_0xd, + kFrameMessage_0xe, + kFrameMessage_0xf, + kFrameMessage_0x10, + kFrameMessage_0x11, + kFrameMessage_0x12, + kFrameMessage_0x13, + kFrameMessage_0x14, + kFrameMessage_0x15, + kFrameMessage_0x16, + kFrameMessage_0x17, + kFrameMessage_0x18, + kFrameMessage_0x19, + kFrameMessage_0x1a, + kFrameMessage_0x1b, + kFrameMessage_0x1c, + kFrameMessage_0x1d, + kKeyDown = 0x20, // wparam = UIPacket::kKeyAction* - Updated from 0x1e to 0x20 + kSetFocus, // 0x1f, wparam = 1 or 0 + kKeyUp, // 0x20, wparam = UIPacket::kKeyAction* + kFrameMessage_0x21, // 0x21 + kMouseClick, // 0x22, wparam = UIPacket::kMouseClick* + kFrameMessage_0x23, // 0x23 + kMouseCoordsClick, // 0x24, wparam = UIPacket::kMouseCoordsClick* + kFrameMessage_0x25, // 0x25 + kMouseUp, // 0x26, wparam = UIPacket::kMouseCoordsClick* + kFrameMessage_0x27, // 0x27 + kFrameMessage_0x28, // 0x28 + kFrameMessage_0x29, // 0x29 + kFrameMessage_0x2a, // 0x2a + kFrameMessage_0x2b, // 0x2b + kToggleButtonDown, // 0x2c + kFrameMessage_0x2d, // 0x2d + kMouseClick2 = 0x31, // 0x2e, wparam = UIPacket::kMouseAction* + kMouseAction, // 0x2f, wparam = UIPacket::kMouseAction* + kRenderFrame_0x30, // 0x30 + kRenderFrame_0x31 = 0x35, // 0x31 + kFrameVisibilityChanged, // 0x32, wparam = is_visible + kSetLayout, // 0x33 + kMeasureContent, // 0x34 + kFrameMessage_0x35, // 0x35 + kFrameMessage_0x36, // 0x36 + kRefreshContent, // 0x37 + kFrameMessage_0x38, + kFrameMessage_0x39, + kFrameMessage_0x3a, + kFrameMessage_0x3b, + kFrameMessage_0x3c = 0x44, + kFrameMessage_0x3d, + kFrameMessage_0x3e, + kFrameMessage_0x3f, + kFrameMessage_0x40, + kFrameMessage_0x41, + kFrameMessage_0x42, + kRenderFrame_0x43, // 0x43 + kFrameMessage_0x44 = 0x52, + kFrameMessage_0x45, + kFrameMessage_0x46 = 0x56, + kFrameMessage_0x47, // 0x47, Multiple uses depending on frame + kFrameMessage_0x48, // 0x48, Multiple uses depending on frame + kFrameMessage_0x49, // 0x49, Multiple uses depending on frame + kFrameMessage_0x4a, // 0x4a, Multiple uses depending on frame + kFrameMessage_0x4b, // 0x4b, Multiple uses depending on frame + kFrameMessage_0x4c, // 0x4c, Multiple uses depending on frame + kFrameMessage_0x4d, // 0x4d, Multiple uses depending on frame + kFrameMessage_0x4e, // 0x4e, Multiple uses depending on frame + kFrameMessage_0x4f, // 0x4f, Multiple uses depending on frame + kFrameMessage_0x50, // 0x50, Multiple uses depending on frame + kFrameMessage_0x51, // 0x51, Multiple uses depending on frame + kFrameMessage_0x52, // 0x52, Multiple uses depending on frame + kFrameMessage_0x53, // 0x53, Multiple uses depending on frame + kFrameMessage_0x54, // 0x54, Multiple uses depending on frame + kFrameMessage_0x55, // 0x55, Multiple uses depending on frame + kFrameMessage_0x56, // 0x56, Multiple uses depending on frame + kFrameMessage_0x57, // 0x57, Multiple uses depending on frame + kMessage_0x10000000 = 0x10000000, + kMessage_0x10000001, + kMessage_0x10000002, + kMessage_0x10000003, + kMessage_0x10000004, + kMessage_0x10000005, + kMessage_0x10000006, + kAgentUpdate, // 0x10000007, wparam = uint32_t agent_id + kAgentDestroy, // 0x10000008, wparam = uint32_t agent_id + kUpdateAgentEffects, // 0x10000009 + kMessage_0x1000000a, + kMessage_0x1000000b, + kDialogueMessage, // 0x1000000c + kMessage_0x1000000d, + kMessage_0x1000000e, + kMessage_0x1000000f, + kMessage_0x10000010, + kMessage_0x10000011, + kMessage_0x10000012, + kMessage_0x10000013, + kMessage_0x10000014, + kMessage_0x10000015, + kMessage_0x10000016, + kAgentSpeechBubble, // 0x10000017 + kMessage_0x10000018, + kShowAgentNameTag, // 0x10000019, wparam = AgentNameTagInfo* + kHideAgentNameTag, // 0x1000001A + kSetAgentNameTagAttribs, // 0x1000001B, wparam = AgentNameTagInfo* + kMessage_0x1000001c, + kSetAgentProfession, // 0x1000001D, wparam = UIPacket::kSetAgentProfession* + kMessage_0x1000001e, + kMessage_0x1000001f, + kChangeTarget, // 0x10000020, wparam = UIPacket::kChangeTarget* + kMessage_0x10000021, + kMessage_0x10000022, + kMessage_0x10000023, + kAgentSkillActivated, // 0x10000024, kAgentSkillPacket + kAgentSkillActivatedInstantly, // 0x10000025, kAgentSkillPacket + kAgentSkillCancelled, // 0x10000026, kAgentSkillPacket + kAgentSkillStartedCast, // 0x10000027, wparam = UIPacket::kAgentStartCasting* + kMessage_0x10000028, + kShowMapEntryMessage, // 0x10000029, wparam = { wchar_t* title, wchar_t* subtitle } + kSetCurrentPlayerData, // 0x1000002A, fired after setting the worldcontext player name + kMessage_0x1000002b, + kMessage_0x1000002c, + kMessage_0x1000002d, + kMessage_0x1000002e, + kMessage_0x1000002f, + kMessage_0x10000030, + kMessage_0x10000031, + kMessage_0x10000032, + kMessage_0x10000033, + kPostProcessingEffect, // 0x10000034, Triggered when drunk. wparam = UIPacket::kPostProcessingEffect + kMessage_0x10000035, + kMessage_0x10000036, + kMessage_0x10000037, + kHeroAgentAdded, // 0x10000038, hero assigned to agent/inventory/ai mode + kHeroDataAdded, // 0x10000039, hero info received from server (name, level etc) + kMessage_0x1000003a, + kMessage_0x1000003b, + kMessage_0x1000003c, + kMessage_0x1000003d, + kMessage_0x1000003e, + kMessage_0x1000003f, + kShowXunlaiChest, // 0x10000040 + kMessage_0x10000041, + kMessage_0x10000042, + kMessage_0x10000043, + kMessage_0x10000044, + kMessage_0x10000045, + kMinionCountUpdated, // 0x10000046 + kMoraleChange, // 0x10000047, wparam = {agent id, morale percent } + kMessage_0x10000048, + kMessage_0x10000049, + kMessage_0x1000004a, + kMessage_0x1000004b, + kMessage_0x1000004c, + kMessage_0x1000004d, + kMessage_0x1000004e, + kMessage_0x1000004f, + kLoginStateChanged, // 0x10000050, wparam = {bool is_logged_in, bool unk } + kMessage_0x10000051, + kMessage_0x10000052, + kMessage_0x10000053, + kMessage_0x10000054, + kEffectAdd, // 0x10000055, wparam = {agent_id, GW::Effect*} + kEffectRenew, // 0x10000056, wparam = GW::Effect* + kEffectRemove, // 0x10000057, wparam = effect id + kMessage_0x10000058, + kMessage_0x10000059, + kMessage_0x1000005a, + kSkillActivated, // 0x1000005b, wparam ={ uint32_t agent_id , uint32_t skill_id } + kMessage_0x1000005c, + kMessage_0x1000005d, + kUpdateSkillbar, // 0x1000005E, wparam ={ uint32_t agent_id , ... } + kUpdateSkillsAvailable, // 0x1000005f, Triggered on a skill unlock, profession change or map load + kMessage_0x10000060, + kMessage_0x10000061, + kMessage_0x10000062, + kMessage_0x10000063, + kPlayerTitleChanged, // 0x10000064, wparam = { uint32_t player_id, uint32_t title_id } + kTitleProgressUpdated, // 0x10000065, wparam = title_id + kExperienceGained, // 0x10000066, wparam = experience amount + kMessage_0x10000067, + kMessage_0x10000068, + kMessage_0x10000069, + kMessage_0x1000006a, + kMessage_0x1000006b, + kMessage_0x1000006c, + kMessage_0x1000006d, + kMessage_0x1000006e, + kMessage_0x1000006f, + kMessage_0x10000070, + kMessage_0x10000071, + kMessage_0x10000072, + kMessage_0x10000073, + kMessage_0x10000074, + kMessage_0x10000075, + kMessage_0x10000076, + kMessage_0x10000077, + kMessage_0x10000078, + kMessage_0x10000079, + kMessage_0x1000007a, + kMessage_0x1000007b, + kMessage_0x1000007c, + kMessage_0x1000007d, + kMessage_0x1000007e, + kWriteToChatLog, // 0x1000007F, wparam = UIPacket::kWriteToChatLog* + kWriteToChatLogWithSender, // 0x10000080, wparam = UIPacket::kWriteToChatLogWithSender* + kAllyOrGuildMessage, // 0x10000081, wparam = UIPacket::kAllyOrGuildMessage* + kPlayerChatMessage, // 0x10000082, wparam = UIPacket::kPlayerChatMessage* + kMessage_0x10000083, + kFloatingWindowMoved, // 0x10000084, wparam = frame_id + kMessage_0x10000085, + kMessage_0x10000086, + kMessage_0x10000087, + kMessage_0x10000088, + kMessage_0x10000089, + kMessage_0x1000008a, + kFriendUpdated, // 0x1000008B, wparam = { GW::Friend*, ... } + kMapLoaded, // 0x1000008C + kMessage_0x1000008d, + kMessage_0x1000008e, + kMessage_0x1000008f, + kMessage_0x10000090, + kMessage_0x10000091, + kOpenWhisper, // 0x10000092, wparam = wchar* name + kMessage_0x10000093, + kMessage_0x10000094, + kMessage_0x10000095, + kMessage_0x10000096, + kMessage_0x10000097, + kLoadMapContext, // 0x10000098, wparam = UIPacket::kLoadMapContext + kMessage_0x10000099, + kMessage_0x1000009a, + kMessage_0x1000009b, + kDialogueMessageUpdated, // 0x1000009c + kLogout, // 0x1000009D, wparam = { bool unknown, bool character_select } + kCompassDraw, // 0x1000009E, wparam = UIPacket::kCompassDraw* + kMessage_0x1000009f, + kMessage_0x100000a0, + kMessage_0x100000a1, + kOnScreenMessage, // 0x100000A2, wparam = wchar_** encoded_string + kDialogButton, // 0x100000A3, wparam = DialogButtonInfo* + kMessage_0x100000a4, + kMessage_0x100000a5, + kDialogBody, // 0x100000A6, wparam = DialogBodyInfo* + kMessage_0x100000a7, + kMessage_0x100000a8, + kMessage_0x100000a9, + kMessage_0x100000aa, + kMessage_0x100000ab, + kMessage_0x100000ac, + kMessage_0x100000ad, + kMessage_0x100000ae, + kMessage_0x100000af, + kMessage_0x100000b0, + kMessage_0x100000b1, + kMessage_0x100000b2, + kTargetNPCPartyMember, // 0x100000B3, wparam = { uint32_t unk, uint32_t agent_id } + kTargetPlayerPartyMember, // 0x100000B4, wparam = { uint32_t unk, uint32_t player_number } + kVendorWindow, // 0x100000B5, wparam = UIPacket::kVendorWindow + kMessage_0x100000b6, + kMessage_0x100000b7, + kMessage_0x100000b8, + kVendorItems, // 0x100000B9, wparam = UIPacket::kVendorItems + kMessage_0x100000ba, + kVendorTransComplete, // 0x100000BB, wparam = *TransactionType + kMessage_0x100000bc, + kVendorQuote, // 0x100000BD, wparam = UIPacket::kVendorQuote + kMessage_0x100000be, + kMessage_0x100000bf, + kMessage_0x100000c0, + kMessage_0x100000c1, + kStartMapLoad, // 0x100000C2, wparam = { uint32_t map_id, ...} + kMessage_0x100000c3, + kMessage_0x100000c4, + kMessage_0x100000c5, + kMessage_0x100000c6, + kWorldMapUpdated, // 0x100000C7, Triggered when an area in the world map has been discovered/updated + kMessage_0x100000c8, + kMessage_0x100000c9, + kMessage_0x100000ca, + kMessage_0x100000cb, + kMessage_0x100000cc, + kMessage_0x100000cd, + kMessage_0x100000ce, + kMessage_0x100000cf, + kMessage_0x100000d0, + kMessage_0x100000d1, + kMessage_0x100000d2, + kMessage_0x100000d3, + kMessage_0x100000d4, + kMessage_0x100000d5, + kMessage_0x100000d6, + kMessage_0x100000d7, + kMessage_0x100000d8, + kMessage_0x100000d9, + kGuildMemberUpdated, // 0x100000DA, wparam = { GuildPlayer::name_ptr } + kMessage_0x100000db, + kMessage_0x100000dc, + kMessage_0x100000dd, + kMessage_0x100000de, + kMessage_0x100000df, + kMessage_0x100000e0, + kShowHint, // 0x100000E1, wparam = { uint32_t icon_type, wchar_t* message_enc } + kMessage_0x100000e2, + kMessage_0x100000e3, + kMessage_0x100000e4, + kMessage_0x100000e5, + kMessage_0x100000e6, + kMessage_0x100000e7, + kMessage_0x100000e8, + kWeaponSetSwapComplete, // 0x100000E9, wparam = UIPacket::kWeaponSwap* + kWeaponSetSwapCancel, // 0x100000EA + kWeaponSetUpdated, // 0x100000EB + kUpdateGoldCharacter, // 0x100000EC, wparam = { uint32_t unk, uint32_t gold_character } + kUpdateGoldStorage, // 0x100000ED, wparam = { uint32_t unk, uint32_t gold_storage } + kInventorySlotUpdated, // 0x100000EE, Triggered when an item is moved into a slot + kEquipmentSlotUpdated, // 0x100000EF, Triggered when an item is moved into a slot + kMessage_0x100000f0, + kInventorySlotCleared, // 0x100000F1, Triggered when an item has been removed from a slot + kEquipmentSlotCleared, // 0x100000F2, Triggered when an item has been removed from a slot + kMessage_0x100000f3, + kMessage_0x100000f4, + kMessage_0x100000f5, + kMessage_0x100000f6, + kMessage_0x100000f7, + kMessage_0x100000f8, + kMessage_0x100000f9, + kPvPWindowContent, // 0x100000FA + kMessage_0x100000fb, + kMessage_0x100000fc, + kMessage_0x100000fd, + kMessage_0x100000fe, + kMessage_0x100000ff, + kMessage_0x10000100, + kMessage_0x10000101, + kPreStartSalvage, // 0x10000102, { uint32_t item_id, uint32_t kit_id } + kTomeSkillSelection, // 0x10000103, wparam = UIPacket::kTomeSkillSelection* + kMessage_0x10000104, + kTradePlayerUpdated, // 0x10000105, wparam = GW::TraderPlayer* + kItemUpdated, // 0x10000106, wparam = UIPacket::kItemUpdated* + kMessage_0x10000107, + kMessage_0x10000108, + kMessage_0x10000109, + kMessage_0x1000010a, + kMessage_0x1000010b, + kMessage_0x1000010c, + kMessage_0x1000010d, + kMessage_0x1000010e, + kMessage_0x1000010f, + kMessage_0x10000110, + kMapChange, // 0x10000111, wparam = map id + kMessage_0x10000112, + kMessage_0x10000113, + kMessage_0x10000114, + kCalledTargetChange, // 0x10000115, wparam = { player_number, target_id } + kMessage_0x10000116, + kMessage_0x10000117, + kMessage_0x10000118, + kErrorMessage, // 0x10000119, wparam = { int error_index, wchar_t* error_encoded_string } + kPartyHardModeChanged, // 0x1000011A, wparam = { int is_hard_mode } + kPartyAddHenchman, // 0x1000011B + kPartyRemoveHenchman, // 0x1000011C + kMessage_0x1000011d, + kPartyAddHero, // 0x1000011E + kPartyRemoveHero, // 0x1000011F + kMessage_0x10000120, + kMessage_0x10000121, + kMessage_0x10000122, + kMessage_0x10000123, + kPartyAddPlayer, // 0x10000124 + kMessage_0x10000125, + kPartyRemovePlayer, // 0x10000126 + kMessage_0x10000127, + kMessage_0x10000128, + kMessage_0x10000129, + kDisableEnterMissionBtn, // 0x1000012A, wparam = boolean (1 = disabled, 0 = enabled) + kMessage_0x1000012b, + kMessage_0x1000012c, + kShowCancelEnterMissionBtn, // 0x1000012D + kMessage_0x1000012e, + kPartyDefeated, // 0x1000012F + kMessage_0x10000130, + kMessage_0x10000131, + kMessage_0x10000132, + kPartySearchCreated, // 0x10000133, wparam = GW::PartySearch* + kPartySearchIdChanged, // 0x10000134, wparam = uint32_t* party_search_id + kPartySearchRemoved, // 0x10000135, wparam = uint32_t* party_search_id + kPartySearchUpdated, // 0x10000136, wparam = GW::PartySearch* + kPartySearchInviteReceived, // 0x10000137, wparam = UIPacket::kPartySearchInviteReceived* + kMessage_0x10000138, + kPartySearchInviteSent, // 0x10000139 + kPartyShowConfirmDialog, // 0x1000013A, wparam = UIPacket::kPartyShowConfirmDialog + kMessage_0x1000013b, + kMessage_0x1000013c, + kMessage_0x1000013d, + kMessage_0x1000013e, + kMessage_0x1000013f, + kPreferenceEnumChanged, // 0x10000140, wparam = UiPacket::kPreferenceEnumChanged + kPreferenceFlagChanged, // 0x10000141, wparam = UiPacket::kPreferenceFlagChanged + kPreferenceValueChanged, // 0x10000142, wparam = UiPacket::kPreferenceValueChanged + kUIPositionChanged, // 0x10000143, wparam = UIPacket::kUIPositionChanged + kPreBuildLoginScene, // 0x10000144, Called with no args right before login scene is drawn + kMessage_0x10000145, + kMessage_0x10000146, + kMessage_0x10000147, + kMessage_0x10000148, + kMessage_0x10000149, + kMessage_0x1000014a, + kMessage_0x1000014b, + kMessage_0x1000014c, + kMessage_0x1000014d, + kQuestAdded, // 0x1000014E, wparam = { quest_id, ... } + kQuestDetailsChanged, // 0x1000014F, wparam = { quest_id, ... } + kQuestRemoved, // 0x10000150, wparam = { quest_id, ... } + kClientActiveQuestChanged, // 0x10000151, wparam = { quest_id, ... }. Triggered when the game requests the current quest to change + kMessage_0x10000152, + kServerActiveQuestChanged, // 0x10000153, wparam = UIPacket::kServerActiveQuestChanged*. Triggered when the server requests the current quest to change + kUnknownQuestRelated, // 0x10000154 + kMessage_0x10000155, + kDungeonComplete, // 0x10000156 + kMissionComplete, // 0x10000157 + kMessage_0x10000158, + kVanquishComplete, // 0x10000159 + kObjectiveAdd, // 0x1000015A, wparam = UIPacket::kObjectiveAdd* + kObjectiveComplete, // 0x1000015B, wparam = UIPacket::kObjectiveComplete* + kObjectiveUpdated, // 0x1000015C, wparam = UIPacket::kObjectiveUpdated* + kMessage_0x1000015d, + kMessage_0x1000015e, + kMessage_0x1000015f, + kMessage_0x10000160, + kMessage_0x10000161, + kMessage_0x10000162, + kMessage_0x10000163, + kMessage_0x10000164, + kTradeSessionStart, // 0x10000165, wparam = { trade_state, player_number } + kMessage_0x10000166, + kMessage_0x10000167, + kMessage_0x10000168, + kMessage_0x10000169, + kMessage_0x1000016a, + kTradeSessionUpdated, // 0x1000016b, no args + kMessage_0x1000016c, + kMessage_0x1000016d, + kMessage_0x1000016e, + kMessage_0x1000016f, + kMessage_0x10000170, + kMessage_0x10000171, + kMessage_0x10000172, + kMessage_0x10000173, + kMessage_0x10000174, + kCheckUIState, // 0x10000175 + kMessage_0x10000176, + kMessage_0x10000177, + kMessage_0x10000178, + kMessage_0x10000178_1, // added to GW 2026-02-26 + kMessage_0x10000178_2, // added to GW 2026-02-26 + kMessage_0x10000178_3, // added to GW 2026-02-26 + kDestroyUIPositionOverlay, // 0x10000179 + kEnableUIPositionOverlay, // 0x1000017a, wparam = uint32_t enable + kMessage_0x1000017b, + kGuildHall, // 0x1000017C, wparam = gh key (uint32_t[4]) + kMessage_0x1000017d, + kLeaveGuildHall, // 0x1000017E + kTravel, // 0x1000017F + kOpenWikiUrl, // 0x10000180, wparam = char* url + kMessage_0x10000181, + kMessage_0x10000182, + kSetPreGameContext_Value0, // wparam = uint32_t value + kMessage_0x10000184, + kGetPreGameContext_Value0, // lparam = *uint32_t value_out + kSetPreGameContext_Value1, // wparam = uint32_t value , added to GW 2026-02-06 + kGetPreGameContext_Value1, // lparam = *uint32_t value_out, added to GW 2026-02-06 + kMessage_0x10000186, + kMessage_0x10000187, + kMessage_0x10000188, + kMessage_0x10000189, + kMessage_0x1000018a, + kMessage_0x1000018b, + kMessage_0x1000018c, + kMessage_0x1000018d, + kAppendMessageToChat, // 0x1000018E, wparam = wchar_t* message + kMessage_0x1000018f, + kMessage_0x10000190, + kMessage_0x10000191, + kMessage_0x10000192, + kMessage_0x10000193, + kMessage_0x10000194, + kMessage_0x10000195, + kMessage_0x10000196, + kMessage_0x10000197, + kMessage_0x10000198, + kMessage_0x10000199, + kMessage_0x1000019a, + kMessage_0x1000019b, + kHideHeroPanel, // 0x1000019C, wparam = hero_id + kShowHeroPanel, // 0x1000019D, wparam = hero_id + kMessage_0x1000019e, + kMessage_0x1000019f, + kMessage_0x100001a0, + kGetInventoryAgentId, // 0x100001A1, wparam = 0, lparam = uint32_t* agent_id_out. Used to fetch which agent is selected + kEquipItem, // 0x100001A2, wparam = { item_id, agent_id } + kMoveItem, // 0x100001A3, wparam = { item_id, to_bag, to_slot, bool prompt } + kMessage_0x100001a4, + kMessage_0x100001a5, + kInitiateTrade, // 0x100001A6 + kMessage_0x100001a7, + kMessage_0x100001a8, + kMessage_0x100001a9, + kMessage_0x100001aa, + kMessage_0x100001ab, + kMessage_0x100001ac, + kMessage_0x100001ad, + kMessage_0x100001ae, + kMessage_0x100001af, + kMessage_0x100001b0, + kMessage_0x100001b1, + kMessage_0x100001b2, + kMessage_0x100001b3, + kMessage_0x100001b4, + kMessage_0x100001b5, + kInventoryAgentChanged, // 0x100001B6, Triggered when inventory needs updating due to agent change; no args + kMessage_0x100001b7, + kMessage_0x100001b8, + kMessage_0x100001b9, + kMessage_0x100001ba, + kMessage_0x100001bb, + kMessage_0x100001bc, + kMessage_0x100001bd, + kPromptSaveTemplate, // 0x100001be + kOpenTemplate, // 0x100001Bf, wparam = GW::UI::ChatTemplate* + kSendLoadSkillTemplate = 0x30000000 | 0x3, // wparam = SkillbarMgr::SkillTemplate* + kSendPingWeaponSet = 0x30000000 | 0x4, // wparam = UIPacket::kSendPingWeaponSet* + kSendMoveItem = 0x30000000 | 0x5, // wparam = UIPacket::kSendMoveItem* + kSendMerchantRequestQuote = 0x30000000 | 0x6, // wparam = UIPacket::kSendMerchantRequestQuote* + kSendMerchantTransactItem = 0x30000000 | 0x7, // wparam = UIPacket::kSendMerchantTransactItem* + kSendUseItem = 0x30000000 | 0x8, // wparam = UIPacket::kSendUseItem* + kSendSetActiveQuest = 0x30000000 | 0x9, // wparam = uint32_t quest_id + kSendAbandonQuest = 0x30000000 | 0xA, // wparam = uint32_t quest_id + kSendChangeTarget = 0x30000000 | 0xB, // wparam = UIPacket::kSendChangeTarget* // e.g. tell the gw client to focus on a different target + kSendCallTarget = 0x30000000 | 0x13, // wparam = { uint32_t call_type, uint32_t agent_id } // also used to broadcast morale, death penalty, "I'm following X", etc + kSendDialog = 0x30000000 | 0x16, // wparam = dialog_id // internal use + kStartWhisper = 0x30000000 | 0x17, // wparam = UIPacket::kStartWhisper* + kGetSenderColor = 0x30000000 | 0x18, // wparam = UIPacket::kGetColor* // Get chat sender color depending on channel, output object passed by reference + kGetMessageColor = 0x30000000 | 0x19, // wparam = UIPacket::kGetColor* // Get chat message color depending on channel, output object passed by reference + kSendChatMessage = 0x30000000 | 0x1B, // wparam = UIPacket::kSendChatMessage* + kLogChatMessage = 0x30000000 | 0x1D, // wparam = UIPacket::kLogChatMessage*. Triggered when a message wants to be added to the persistent chat log. + kRecvWhisper = 0x30000000 | 0x1E, // wparam = UIPacket::kRecvWhisper* + kPrintChatMessage = 0x30000000 | 0x1F, // wparam = UIPacket::kPrintChatMessage*. Triggered when a message wants to be added to the in-game chat window. + kSendWorldAction = 0x30000000 | 0x20, // wparam = UIPacket::kSendWorldAction* + kSetRendererValue = 0x30000000 | 0x21, // wparam = UIPacket::kSetRendererValue + kIdentifyItem = 0x30000000 | 0x22, // wparam = UIPacket::kUseKitOnItem + kSalvageItem = 0x30000000 | 0x23, // wparam = UIPacket::kUseKitOnItem + } + + public enum WindowID : uint + { + WindowID_Dialogue1 = 0x0, + WindowID_Dialogue2 = 0x1, + WindowID_MissionGoals = 0x2, + WindowID_DropBundle = 0x3, + WindowID_Chat = 0x4, + WindowID_InGameClock = 0x6, + WindowID_Compass = 0x7, + WindowID_DamageMonitor = 0x8, + WindowID_PerformanceMonitor = 0xB, + WindowID_EffectsMonitor = 0xC, + WindowID_Hints = 0xD, + WindowID_MissionStatusAndScoreDisplay = 0xF, + WindowID_Notifications = 0x11, + WindowID_Skillbar = 0x14, + WindowID_SkillMonitor = 0x15, + WindowID_UpkeepMonitor = 0x17, + WindowID_SkillWarmup = 0x18, + WindowID_Menu = 0x1A, + WindowID_EnergyBar = 0x1C, + WindowID_ExperienceBar = 0x1D, + WindowID_HealthBar = 0x1E, + WindowID_TargetDisplay = 0x1F, + WindowID_MissionProgress = 0xE, + WindowID_TradeButton = 0x21, + WindowID_WeaponBar = 0x22, + WindowID_Hero1 = 0x33, + WindowID_Hero2 = 0x34, + WindowID_Hero3 = 0x35, + WindowID_Hero = 0x36, + WindowID_SkillsAndAttributes = 0x38, + WindowID_Friends = 0x3A, + WindowID_Guild = 0x3B, + WindowID_Help = 0x3D, + WindowID_Inventory = 0x3E, + WindowID_VaultBox = 0x3F, + WindowID_InventoryBags = 0x40, + WindowID_MissionMap = 0x42, + WindowID_Observe = 0x44, + WindowID_Options = 0x45, + WindowID_PartyWindow = 0x48, // NB: state flag is ignored for party window, but position is still good + WindowID_PartySearch = 0x49, + WindowID_QuestLog = 0x4F, + WindowID_Merchant = 0x5C, + WindowID_Hero4 = 0x5E, + WindowID_Hero5 = 0x5F, + WindowID_Hero6 = 0x60, + WindowID_Hero7 = 0x61, + WindowID_Count = 0x69, + } + + public static partial class UIPacket + { + + public enum ActionState : uint + { + MouseDown = 0x6, + MouseUp = 0x7, + MouseClick = 0x8, + MouseDoubleClick = 0x9, + DragRelease = 0xb, + KeyDown = 0xe, + } } } } } +} + +namespace Daybreak.API.Interop.GuildWars +{ + /// + /// TLink<T> - doubly-linked list node (8 bytes: 2 pointers). + /// Used in Agent structs for linked list chaining. + /// + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public struct TLink + { + public nint PrevLink; + public nint NextNode; + } + + /// + /// Inline array of 54 AttributeStruct elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(54)] + public unsafe struct AttributeStructArray54 + { + private global::Daybreak.API.Interop.GuildWars.AttributeStruct _element0; + } + + /// + /// Inline array of 23 BagStructPtr elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(23)] + public unsafe struct BagStructPtrArray23 + { + private global::Daybreak.API.Interop.GuildWars.BagStruct* _element0; + } + + /// + /// Inline array of 1 ChatMessagePtr elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(1)] + public unsafe struct ChatMessagePtrArray1 + { + private global::Daybreak.API.Interop.GuildWars.ChatMessage* _element0; + } + + /// + /// Inline array of 2 ObserverMatchTeam elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(2)] + public unsafe struct ObserverMatchTeamArray2 + { + private global::Daybreak.API.Interop.GuildWars.ObserverMatchTeam _element0; + } + + /// + /// Inline array of 4 PathingTrapezoidPtr elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(4)] + public unsafe struct PathingTrapezoidPtrArray4 + { + private global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* _element0; + } + + /// + /// Inline array of 8 SkillbarSkillData elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(8)] + public unsafe struct SkillbarSkillDataArray8 + { + private global::Daybreak.API.Interop.GuildWars.SkillbarSkillData _element0; + } + + /// + /// Inline array of 4 WeaponSet elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(4)] + public unsafe struct WeaponSetArray4 + { + private global::Daybreak.API.Interop.GuildWars.WeaponSet _element0; + } + + /// + /// Inline array of 12 Attribute elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(12)] + public unsafe struct AttributeArray12 + { + private global::Daybreak.API.Interop.GWCA.GW.Constants.Attribute _element0; + } + + /// + /// Inline array of 8 SkillID elements. + /// + [global::System.Runtime.CompilerServices.InlineArray(8)] + public unsafe struct SkillIDArray8 + { + private global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID _element0; + } + + + public enum LogLevel : int + { + LEVEL_TRACE, + LEVEL_DEBUG, + LEVEL_INFO, + LEVEL_WARN, + LEVEL_ERR, + LEVEL_CRITICAL, + } + + public enum CallTargetType : uint + { + Following = 0x3, + Morale = 0x7, + AttackingOrTargetting = 0xA, + None = 0xFF, + } + + public enum Continent : uint + { + Kryta, + DevContinent, + Cantha, + BattleIsles, + Elona, + RealmOfTorment, + } + + public enum DyeColor : byte + { + None = 0, + Blue = 2, + Green = 3, + Purple = 4, + Red = 5, + Yellow = 6, + Brown = 7, + Orange = 8, + Silver = 9, + Black = 10, + Gray = 11, + White = 12, + Pink = 13, + } + + public enum EquipmentStatus : uint + { + AlwaysHide, + HideInTownsAndOutposts, + HideInCombatAreas, + AlwaysShow, + } + + public enum EquipmentType : uint + { + Cape = 0x0, + Helm = 0x2, + CostumeBody = 0x4, + CostumeHeadpiece = 0x6, + Unknown = 0xff, + } + + public enum FriendStatus : uint + { + Offline = 0, + Online = 1, + DND = 2, + Away = 3, + Unknown = 4, + } + + public enum FriendType : uint + { + Unknow = 0, + Friend = 1, + Ignore = 2, + Player = 3, + Trade = 4, + } + + public enum HeroBehavior : uint + { + Fight, + Guard, + AvoidCombat, + } + + public enum ObserverMatchType : uint + { + SpecialEvent, + HallOfHeroe, + MyGuildsBattle, + MyGuildsHeroesAscentGame, + TopGuildBattle, + TopGuildHeroesAscentGame, + UploadedGame, + Top1v1Battle, + Top1v1TournamentBattle, + } + + public enum PartySearchType : int + { + PartySearchType_Hunting = 0, + PartySearchType_Mission = 1, + PartySearchType_Quest = 2, + PartySearchType_Trade = 3, + PartySearchType_Guild = 4, + } + + public enum ProgressBarStyle : uint + { + kPeach, + kPink, + kGrey, + kBlue, + kGreen, + kRed, + kPurple, + kOlive, + kUnk, + } + + public enum Region : uint + { + Region_Kryta, + Region_Maguuma, + Region_Ascalon, + Region_NorthernShiverpeaks, + Region_HeroesAscent, + Region_CrystalDesert, + Region_FissureOfWoe, + Region_Presearing, + Region_Kaineng, + Region_Kurzick, + Region_Luxon, + Region_ShingJea, + Region_Kourna, + Region_Vaabi, + Region_Desolation, + Region_Istan, + Region_DomainOfAnguish, + Region_TarnishedCoast, + Region_DepthsOfTyria, + Region_FarShiverpeaks, + Region_CharrHomelands, + Region_BattleIslands, + Region_TheBattleOfJahai, + Region_TheFlightNorth, + Region_TheTenguAccords, + Region_TheRiseOfTheWhiteMantle, + Region_Swat, + Region_DevRegion, + } + + public enum RegionType : uint + { + AllianceBattle, + Arena, + ExplorableZone, + GuildBattleArea, + GuildHall, + MissionOutpost, + CooperativeMission, + CompetitiveMission, + EliteMission, + Challenge, + Outpost, + ZaishenBattle, + HeroesAscent, + City, + MissionArea, + HeroBattleOutpost, + HeroBattleArea, + EotnMission, + Dungeon, + Marketplace, + Unknown, + DevRegion, + } + + public enum ScannerSection : byte + { + Section_TEXT = 0, + Section_RDATA = 1, + Section_DATA = 2, + Section_Count = 3, + } + + public enum WorldActionId : uint + { + InteractEnemy, + InteractPlayerOrOther, + InteractNPC, + InteractItem, + InteractTrade, + InteractGadget, + } + + public enum AgentType : int + { + Living = 0xDB, + Gadget = 0x200, + Item = 0x400, + } + + public enum Allegiance : byte + { + Ally_NonAttackable = 0x1, + Neutral = 0x2, + Enemy = 0x3, + Spirit_Pet = 0x4, + Minion = 0x5, + Npc_Minipet = 0x6, + } + + public enum Attribute : uint + { + FastCasting, + IllusionMagic, + DominationMagic, + InspirationMagic, + BloodMagic, + DeathMagic, + SoulReaping, + Curses, + AirMagic, + EarthMagic, + FireMagic, + WaterMagic, + EnergyStorage, + HealingPrayers, + SmitingPrayers, + ProtectionPrayers, + DivineFavor, + Strength, + AxeMastery, + HammerMastery, + Swordsmanship, + Tactics, + BeastMastery, + Expertise, + WildernessSurvival, + Marksmanship, + DaggerMastery = 29, + DeadlyArts, + ShadowArts, + Communing, + RestorationMagic, + ChannelingMagic, + CriticalStrikes, + SpawningPower, + SpearMastery, + Command, + Motivation, + Leadership, + ScytheMastery, + WindPrayers, + EarthPrayers, + Mysticism, + None = 0xff, + } + + public enum AttributeByte : byte + { + FastCasting, + IllusionMagic, + DominationMagic, + InspirationMagic, + BloodMagic, + DeathMagic, + SoulReaping, + Curses, + AirMagic, + EarthMagic, + FireMagic, + WaterMagic, + EnergyStorage, + HealingPrayers, + SmitingPrayers, + ProtectionPrayers, + DivineFavor, + Strength, + AxeMastery, + HammerMastery, + Swordsmanship, + Tactics, + BeastMastery, + Expertise, + WildernessSurvival, + Marksmanship, + DaggerMastery = 29, + DeadlyArts, + ShadowArts, + Communing, + RestorationMagic, + ChannelingMagic, + CriticalStrikes, + SpawningPower, + SpearMastery, + Command, + Motivation, + Leadership, + ScytheMastery, + WindPrayers, + EarthPrayers, + Mysticism, + None = 0xff, + } + + public enum Bag : byte + { + None, + Backpack, + Belt_Pouch, + Bag_1, + Bag_2, + Equipment_Pack, + Material_Storage, + Unclaimed_Items, + Storage_1, + Storage_2, + Storage_3, + Storage_4, + Storage_5, + Storage_6, + Storage_7, + Storage_8, + Storage_9, + Storage_10, + Storage_11, + Storage_12, + Storage_13, + Storage_14, + Equipped_Items, + Max, + } + + public enum BagType : int + { + None, + Inventory, + Equipped, + NotCollected, + Storage, + MaterialStorage, + } + + public enum Campaign : uint + { + Core, + Prophecies, + Factions, + Nightfall, + EyeOfTheNorth, + BonusMissionPack, + } + + public enum Difficulty : int + { + Normal, + Hard, + } + + public enum District : int + { + Current, + International, + American, + EuropeEnglish, + EuropeFrench, + EuropeGerman, + EuropeItalian, + EuropeSpanish, + EuropePolish, + EuropeRussian, + AsiaKorean, + AsiaChinese, + AsiaJapanese, + Unknown = 0xff, + } + + public enum EffectID : uint + { + black_cloud = 1, + mesmer_symbol = 4, + green_cloud = 7, + green_sparks = 8, + necro_symbol = 9, + ele_symbol = 11, + white_clouds = 13, + monk_symbol = 18, + bleeding = 23, + blind = 24, + burning = 25, + disease = 26, + poison = 27, + dazed = 28, + weakness = 29, + assasin_symbol = 34, + ritualist_symbol = 35, + dervish_symbol = 36, + } + + public enum HeroID : uint + { + NoHero, + Norgu, + Goren, + Tahlkora, + MasterOfWhispers, + AcolyteJin, + Koss, + Dunkoro, + AcolyteSousuke, + Melonni, + ZhedShadowhoof, + GeneralMorgahn, + MargridTheSly, + Zenmai, + Olias, + Razah, + MOX, + KeiranThackeray, + Jora, + PyreFierceshot, + Anton, + Livia, + Hayda, + Kahmu, + Gwen, + Xandra, + Vekk, + Ogden, + Merc1, + Merc2, + Merc3, + Merc4, + Merc5, + Merc6, + Merc7, + Merc8, + Miku, + ZeiRi, + Devona, + GhostofAlthea, + Count, + } + + public enum InstanceType : int + { + Outpost, + Explorable, + Loading, + } + + public enum InterfaceSize : int + { + SMALL = -1, + NORMAL, + LARGE, + LARGER, + } + + public enum ItemType : byte + { + Salvage, + Axe = 2, + Bag, + Boots, + Bow, + Bundle, + Chestpiece, + Rune_Mod, + Usable, + Dye, + Materials_Zcoins, + Offhand, + Gloves, + Hammer = 15, + Headpiece, + CC_Shards, + Key, + Leggings, + Gold_Coin, + Quest_Item, + Wand, + Shield = 24, + Staff = 26, + Sword, + Kit = 29, + Trophy, + Scroll, + Daggers, + Present, + Minipet, + Scythe, + Spear, + Storybook = 43, + Costume, + Costume_Headpiece, + Unknown = 0xff, + } + + public enum Language : int + { + English, + Korean, + French, + German, + Italian, + Spanish, + TraditionalChinese, + Japanese = 8, + Polish, + Russian, + BorkBorkBork = 17, + Unknown = 0xff, + } + + public enum MapID : uint + { + None = 0, + Gladiators_Arena, + DEV_Test_Arena_1v1, + Test_map, + Warriors_Isle_outpost, + Hunters_Isle_outpost, + Wizards_Isle_outpost, + Warriors_Isle, + Hunters_Isle, + Wizards_Isle, + Bloodstone_Fen, + The_Wilds, + Aurora_Glade, + Diessa_Lowlands, + Gates_of_Kryta, + DAlessio_Seaboard, + Divinity_Coast, + Talmark_Wilderness, + The_Black_Curtain, + Sanctum_Cay, + Droknars_Forge_outpost, + The_Frost_Gate, + Ice_Caves_of_Sorrow, + Thunderhead_Keep, + Iron_Mines_of_Moladune, + Borlis_Pass, + Talus_Chute, + Griffons_Mouth, + The_Great_Northern_Wall, + Fort_Ranik, + Ruins_of_Surmia, + Xaquang_Skyway, + Nolani_Academy, + Old_Ascalon, + The_Fissure_of_Woe, + Ember_Light_Camp_outpost, + Grendich_Courthouse_outpost, + Glints_Challenge_mission, + Augury_Rock_outpost, + Sardelac_Sanitarium_outpost, + Piken_Square_outpost, + Sage_Lands, + Mamnoon_Lagoon, + Silverwood, + Ettins_Back, + Reed_Bog, + The_Falls, + Dry_Top, + Tangle_Root, + Henge_of_Denravi_outpost, + Test_Map_species_art, + Senjis_Corner_outpost, + Burning_Isle_outpost, + Tears_of_the_Fallen, + Scoundrels_Rise, + Lions_Arch_outpost, + Cursed_Lands, + Bergen_Hot_Springs_outpost, + North_Kryta_Province, + Nebo_Terrace, + Majestys_Rest, + Twin_Serpent_Lakes, + Watchtower_Coast, + Stingray_Strand, + Kessex_Peak, + DAlessio_Arena_mission, + All_Call_Click_Point_1, + Burning_Isle, + Frozen_Isle, + Nomads_Isle, + Druids_Isle, + Isle_of_the_Dead_guild_hall, + The_Underworld, + Riverside_Province, + Tournament_6, + The_Hall_of_Heroes_arena_mission, + Broken_Tower_mission, + House_zu_Heltzer_outpost, + The_Courtyard_arena_mission, + Unholy_Temples_mission, + Burial_Mounds_mission, + Ascalon_City_outpost, + Tomb_of_the_Primeval_Kings, + The_Vault_mission, + The_Underworld_arena_mission, + Ascalon_Arena, + Sacred_Temples_mission, + Icedome, + Iron_Horse_Mine, + Anvil_Rock, + Lornars_Pass, + Snake_Dance, + Tascas_Demise, + Spearhead_Peak, + Ice_Floe, + Witmans_Folly, + Mineral_Springs, + Dreadnoughts_Drift, + Frozen_Forest, + Travelers_Vale, + Deldrimor_Bowl, + Regent_Valley, + The_Breach, + Ascalon_Foothills, + Pockmark_Flats, + Dragons_Gullet, + Flame_Temple_Corridor, + Eastern_Frontier, + The_Scar, + The_Amnoon_Oasis_outpost, + Diviners_Ascent, + Vulture_Drifts, + The_Arid_Sea, + Prophets_Path, + Salt_Flats, + Skyward_Reach, + Dunes_of_Despair, + Thirsty_River, + Elona_Reach, + Augury_Rock_mission, + The_Dragons_Lair, + Perdition_Rock, + Ring_of_Fire, + Abaddons_Mouth, + Hells_Precipice, + Titans_Tears, + Golden_Gates_mission, + Scarred_Earth2, + The_Eternal_Grove, + Lutgardis_Conservatory_outpost, + Vasburg_Armory_outpost, + Serenity_Temple_outpost, + Ice_Tooth_Cave_outpost, + Beacons_Perch_outpost, + Yaks_Bend_outpost, + Frontier_Gate_outpost, + Beetletun_outpost, + Fishermens_Haven_outpost, + Temple_of_the_Ages, + Ventaris_Refuge_outpost, + Druids_Overlook_outpost, + Maguuma_Stade_outpost, + Quarrel_Falls_outpost, + Ascalon_Academy_outpost, + Gyala_Hatchery, + The_Catacombs, + Lakeside_County, + The_Northlands, + Ascalon_City_pre_searing, + Ascalon_Academy_PvP_battle_mission_1, + Ascalon_Academy_PvP_battle_mission_2, + Ascalon_Academy_explorable, + Heroes_Audience_outpost, + Seekers_Passage_outpost, + Destinys_Gorge_outpost, + Camp_Rankor_outpost, + The_Granite_Citadel_outpost, + Marhans_Grotto_outpost, + Port_Sledge_outpost, + Copperhammer_Mines_outpost, + Green_Hills_County, + Wizards_Folly, + Regent_Valley_pre_Searing, + The_Barradin_Estate_outpost, + Ashford_Abbey_outpost, + Foibles_Fair_outpost, + Fort_Ranik_pre_Searing_outpost, + Burning_Isle_mission, + Druids_Isle_mission, + Frozen_Isle_mission = 170, + Warriors_Isle_mission, + Hunters_Isle_mission, + Wizards_Isle_mission, + Nomads_Isle_mission, + Isle_of_the_Dead_guild_hall_mission, + Frozen_Isle_outpost, + Nomads_Isle_outpost, + Druids_Isle_outpost, + Isle_of_the_Dead_guild_hall_outpost, + Fort_Koga_mission, + Shiverpeak_Arena, + Amnoon_Arena_mission, + Deldrimor_Arena_mission, + The_Crag_mission, + The_Underworld_gvg_mission, + The_Underworld_guild_hall, + The_Underworld_guild_hall_preview, + Random_Arenas_outpost, + Team_Arenas_outpost, + Sorrows_Furnace, + Grenths_Footprint, + All_Call_Click_Point_2, + Cavalon_outpost, + Kaineng_Center_outpost, + Drazach_Thicket, + Jaya_Bluffs, + Shenzun_Tunnels, + Archipelagos, + Maishang_Hills, + Mount_Qinkai, + Melandrus_Hope, + Rheas_Crater, + Silent_Surf, + Unwaking_Waters_mission, + Morostav_Trail, + Deldrimor_War_Camp_outpost, + Dragons_Thieves, + Heroes_Crypt_mission, + Mourning_Veil_Falls, + Ferndale, + Pongmei_Valley, + Monastery_Overlook1, + Zen_Daijun_outpost_mission, + Minister_Chos_Estate_outpost_mission, + Vizunah_Square_mission, + Nahpui_Quarter_outpost_mission, + Tahnnakai_Temple_outpost_mission, + Arborstone_outpost_mission, + Boreas_Seabed_outpost_mission, + Sunjiang_District_outpost_mission, + Fort_Aspenwood_mission, + The_Eternal_Grove_outpost_mission, + The_Jade_Quarry_mission, + Gyala_Hatchery_outpost_mission, + Raisu_Palace_outpost_mission, + Imperial_Sanctum_outpost_mission, + Unwaking_Waters, + Grenz_Frontier_mission, + The_Ancestral_Lands_mission, + Amatz_Basin, + Kaanai_Canyon_mission, + Shadows_Passage, + Raisu_Palace, + The_Aurios_Mines, + Panjiang_Peninsula, + Kinya_Province, + Haiju_Lagoon, + Sunqua_Vale, + Wajjun_Bazaar, + Bukdek_Byway, + The_Undercity, + Shing_Jea_Monastery_outpost, + Shing_Jea_Arena, + Arborstone_explorable, + Minister_Chos_Estate_explorable, + Zen_Daijun_explorable, + Boreas_Seabed_explorable, + Great_Temple_of_Balthazar_outpost, + Tsumei_Village_outpost, + Seitung_Harbor_outpost, + Ran_Musu_Gardens_outpost, + Linnok_Courtyard, + Dwayna_Vs_Grenth, + Dwaynas_Camp, + Grenths_Camp, + Sunjiang_District_explorable, + Minister_Chos_Estate_cinematic, + Zen_Daijun_cinematic, + The_Jade_Quarry_Kurzick_cinematic, + Nahpui_Quarter_cinematic, + Tahnnaka_Temple_cinematic, + Arborstone_cinematic, + Boreas_Seabed_cinematic, + Sunjiang_District_cinematic, + Nahpui_Quarter_explorable, + Urgozs_Warren, + The_Eternal_Grove_cinematic, + Gyala_Hatchery_cinematic, + Tahnnakai_Temple_explorable, + Raisu_Palace_cinematic, + Imperial_Sanctum_cinematic, + Altrumm_Ruins, + Zos_Shivros_Channel, + Dragons_Throat, + Isle_of_Weeping_Stone_outpost, + Isle_of_Jade_outpost, + Harvest_Temple_outpost, + Breaker_Hollow_outpost, + Leviathan_Pits_outpost, + Isle_of_the_Nameless, + Zaishen_Challenge_outpost, + Zaishen_Elite_outpost, + Maatu_Keep_outpost, + Zin_Ku_Corridor_outpost, + Monastery_Overlook2, + Brauer_Academy_outpost, + Durheim_Archives_outpost, + Bai_Paasu_Reach_outpost, + Seafarers_Rest_outpost, + Bejunkan_Pier, + Vizunah_Square_Local_Quarter_outpost, + Vizunah_Square_Foreign_Quarter_outpost, + Fort_Aspenwood_Luxon_outpost, + Fort_Aspenwood_Kurzick_outpost, + The_Jade_Quarry_Luxon_outpost, + The_Jade_Quarry_Kurzick_outpost, + Unwaking_Waters_Luxon_outpost, + Unwaking_Waters_Kurzick_outpost, + Saltspray_Beach_mission, + Etnaran_Keys_mission, + Raisu_Pavilion, + Kaineng_Docks, + The_Marketplace_outpost, + Vizunah_Square_Local_Quarter_cinematic, + Vizunah_Square_Foreign_Quarter_cinematic, + The_Jade_Quarry_Luxon_cinematic, + The_Deep, + Ascalon_Arena_mission, + Annihilation_mission, + Kill_Count_Training_mission, + Priest_Annihilation_Training, + Obelisk_Annihilation_Training_mission, + Saoshang_Trail, + Shiverpeak_Arena_mission, + Travel_Battle_Isles, + Travel_Tyria, + Travel_Cantha, + DAlessio_Arena_mission3 = 318, + Amnoon_Arena_mission3, + Fort_Koga_mission3, + Heroes_Crypt_mission3, + Shiverpeak_Arena_mission3, + Fort_Aspenwood_Kurzick_cinematic, + Fort_Aspenwood_Luxon_cinematic, + The_Harvest_Ceremony_Kurzick_cinematic, + The_Harvest_Ceremony_Luxon_cinematic, + Imperial_Sanctum_explorable, + Saltspray_Beach_Luxon_outpost, + Saltspray_Beach_Kurzick_outpost, + Heroes_Ascent_outpost, + Grenz_Frontier_Luxon_outpost, + Grenz_Frontier_Kurzick_outpost, + The_Ancestral_Lands_Luxon_outpost, + The_Ancestral_Lands_Kurzick_outpost, + Etnaran_Keys_Luxon_outpost, + Etnaran_Keys_Kurzick_outpost, + Kaanai_Canyon_Luxon_outpost, + Kaanai_Canyon_Kurzick_outpost, + DAlessio_Arena_mission2, + Amnoon_Arena_mission2, + Fort_Koga_mission2, + Heroes_Crypt_mission2, + Shiverpeak_Arena_mission2, + The_Hall_of_Heroes, + The_Courtyard, + Scarred_Earth, + The_Underworld_PvP, + Tanglewood_Copse_outpost, + Saint_Anjekas_Shrine_outpost, + Eredon_Terrace_outpost, + Divine_Path, + Brawlers_Pit_mission, + Petrified_Arena_mission, + Seabed_Arena_mission, + Isle_of_Weeping_Stone_mission, + Isle_of_Jade_mission, + Imperial_Isle_mission, + Isle_of_Meditation_mission, + Imperial_Isle_outpost, + Isle_of_Meditation_outpost, + Isle_of_Weeping_Stone, + Isle_of_Jade, + Imperial_Isle, + Isle_of_Meditation, + Random_Arenas_Test, + Shing_Jea_Arena_mission, + All_Skills, + Dragon_Arena, + Jahai_Bluffs, + Kamadan_mission, + Marga_Coast, + Fahranur_mission, + Sunward_Marches, + Vortex_Elona, + Barbarous_Shore, + Camp_Hojanu_outpost, + Bahdok_Caverns, + Wehhan_Terraces_outpost, + Dejarin_Estate, + Arkjok_Ward, + Yohlon_Haven_outpost, + Gandara_the_Moon_Fortress, + Vortex_Realm_of_Torment, + The_Floodplain_of_Mahnkelon, + Lions_Arch_Sunspears_in_Kryta, + Turais_Procession, + Sunspear_Sanctuary_outpost, + Aspenwood_Gate_Kurzick_outpost, + Aspenwood_Gate_Luxon_outpost, + Jade_Flats_Kurzick_outpost, + Jade_Flats_Luxon_outpost, + Yatendi_Canyons, + Chantry_of_Secrets_outpost, + Garden_of_Seborhin, + Holdings_of_Chokhin, + Mihanu_Township_outpost, + Vehjin_Mines, + Basalt_Grotto_outpost, + Forum_Highlands, + Kaineng_Center_Sunspears_in_Cantha, + Sebelkeh_Basilica, + Resplendent_Makuun, + Honur_Hill_outpost, + Wilderness_of_Bahdza, + Sun_Docks_cinematic, + Vehtendi_Valley, + Yahnur_Market_outpost, + The_Hidden_City_of_Ahdashim = 413, + The_Kodash_Bazaar_outpost, + Lions_Gate, + Monastery_Overlook_cinematic, + Bejunkan_Pier_cinematic, + Lions_Gate_cinematic, + The_Mirror_of_Lyss, + Secure_the_Refuge, + Venta_Cemetery, + Kamadan_Jewel_of_Istan_explorable, + The_Tribunal, + Kodonur_Crossroads, + Rilohn_Refuge, + Pogahn_Passage, + Moddok_Crevice, + Tihark_Orchard, + Consulate, + Plains_of_Jarin, + Sunspear_Great_Hall_outpost, + Cliffs_of_Dohjok, + Dzagonur_Bastion, + Dasha_Vestibule, + Grand_Court_of_Sebelkeh, + Command_Post, + Jokos_Domain, + Bone_Palace_outpost, + The_Ruptured_Heart, + The_Mouth_of_Torment_outpost, + The_Shattered_Ravines, + Lair_of_the_Forgotten_outpost, + Poisoned_Outcrops, + The_Sulfurous_Wastes, + The_Ebony_Citadel_of_Mallyx_mission, + The_Alkali_Pan, + A_Land_of_Heroes, + Crystal_Overlook, + Kamadan_Jewel_of_Istan_outpost, + Gate_of_Torment_outpost, + Gate_of_Anguish_elite_mission, + Secure_the_Refuge_cinematic, + Evacuation_cinematic, + Test_Map_solo_areas, + Nightfallen_Garden, + Churrhir_Fields, + Beknur_Harbor_outpost, + Kodonur_Crossroads_cinematic, + Rilohn_Refuge_cinematic, + Pogahn_Passage_cinematic, + The_Underworld2, + Heart_of_Abaddon, + The_Underworld3, + Nightfallen_Coast, + Nightfallen_Jahai, + Depths_of_Madness, + Rollerbeetle_Racing, + Domain_of_Fear, + Gate_of_Fear_outpost, + Domain_of_Pain, + Bloodstone_Fen_quest, + Domain_of_Secrets, + Gate_of_Secrets_outpost, + Domain_of_Anguish, + Ooze_Pit_mission, + Jennurs_Horde, + Nundu_Bay, + Gate_of_Desolation, + Champions_Dawn_outpost, + Ruins_of_Morah, + Fahranur_The_First_City, + Bjora_Marches, + Zehlon_Reach, + Lahtenda_Bog, + Arbor_Bay, + Issnur_Isles, + Beknur_Harbor, + Mehtani_Keys, + Kodlonu_Hamlet_outpost, + Island_of_Shehkah, + Jokanur_Diggings, + Blacktide_Den, + Consulate_Docks, + Gate_of_Pain, + Gate_of_Madness, + Abaddons_Gate, + Sunspear_Arena, + Travel_Elona, + Ice_Cliff_Chasms, + Bokka_Amphitheatre, + Riven_Earth, + The_Astralarium_outpost, + Throne_of_Secrets, + Churranu_Island_Arena_mission, + Shing_Jea_Monastery_mission, + Haiju_Lagoon_mission, + Jaya_Bluffs_mission, + Seitung_Harbor_mission, + Tsumei_Village_mission, + Seitung_Harbor_mission_2, + Tsumei_Village_mission_2, + Minister_Chos_Estate_mission_2, + Drakkar_Lake, + Island_of_Shehkah_cinematic, + Jokanur_Diggings_cinematic, + Blacktide_Den_cinematic, + Consulate_Docks_cinematic, + Tihark_Orchard_cinematic, + Dzagonur_Bastion_cinematic, + Hidden_City_of_Ahdashim_cinematic, + Grand_Court_of_Sebelkeh_cinematic, + Jennurs_Horde_cinematic, + Nundu_Bay_cinematic, + Gates_of_Desolation_cinematic, + Ruins_of_Morah_cinematic, + Domain_of_Pain_cinematic, + Gate_of_Madness_cinematic, + Abaddons_Gate_cinematic, + Uncharted_Isle_outpost, + Isle_of_Wurms_outpost, + Uncharted_Isle, + Isle_of_Wurms, + Uncharted_Isle_mission, + Isle_of_Wurms_mission, + Ahmtur_Arena_mission, + Sunspear_Arena_mission, + Corrupted_Isle_outpost, + Isle_of_Solitude_outpost, + Corrupted_Isle, + Isle_of_Solitude, + Corrupted_Isle_mission, + Isle_of_Solitude_mission, + Sun_Docks, + Chahbek_Village, + Remains_of_Sahlahja, + Jaga_Moraine, + Bombardment_mission, + Norrhart_Domains, + Hero_Battles_outpost, + The_Beachhead_mission, + The_Crossing_mission, + Desert_Sands_mission, + Varajar_Fells, + Dajkah_Inlet, + The_Shadow_Nexus, + Chahbek_Village_cutscene, + Throne_Of_Secrets_outpost, + Sparkfly_Swamp, + Gate_of_the_Nightfallen_Lands_outpost, + Cathedral_of_Flames_Level_1, + The_Troubled_Keeper, + Fortress_of_Jahai, + Halls_of_Chokhin, + Citadel_of_Dzagon, + Dynastic_Tombs, + Verdant_Cascades, + Cathedral_of_Flames_Level_2, + Cathedral_of_Flames_Level_3, + Magus_Stones, + Catacombs_of_Kathandrax_Level_1, + Catacombs_of_Kathandrax_Level_2, + Alcazia_Tangle, + Rragars_Menagerie_Level_1, + Rragars_Menagerie_Level_2, + Rragars_Menagerie_Level_3, + Ooze_Pit, + Slavers_Exile_Level_1, + Oolas_Lab_Level_1, + Oolas_Lab_Level_2, + Oolas_Lab_Level_3, + Shards_of_Orr_Level_1, + Shards_of_Orr_Level_2, + Shards_of_Orr_Level_3, + Arachnis_Haunt_Level_1, + Arachnis_Haunt_Level_2, + Five_Team_Test = 592, + Fetid_River_mission, + Overlook_mission, + Cemetery_mission, + Forgotten_Shrines_mission, + Track_mission, + Antechamber_mission, + Collision_mission, + The_Hall_of_Heroes2, + Vloxen_Excavations_Level_1 = 604, + Vloxen_Excavations_Level_2, + Vloxen_Excavations_Level_3, + Heart_of_the_Shiverpeaks_Level_1, + Heart_of_the_Shiverpeaks_Level_2, + Heart_of_the_Shiverpeaks_Level_3, + Bloodstone_Caves_Level_1 = 612, + Bloodstone_Caves_Level_2, + Bloodstone_Caves_Level_3, + Bogroot_Growths_Level_1, + Bogroot_Growths_Level_2, + Ravens_Point_Level_1, + Ravens_Point_Level_2, + Ravens_Point_Level_3, + Slavers_Exile_Level_2, + Slavers_Exile_Level_3, + Slavers_Exile_Level_4, + Slavers_Exile_Level_5, + Vloxs_Falls, + Battledepths_Level_1, + Battledepths_Level_2, + Battledepths_Level_3, + Sepulchre_of_Dragrimmar_Level_1, + Sepulchre_of_Dragrimmar_Level_2, + Frostmaws_Burrows_Level_1, + Frostmaws_Burrows_Level_2, + Frostmaws_Burrows_Level_3, + Frostmaws_Burrows_Level_4, + Frostmaws_Burrows_Level_5, + Darkrime_Delves_Level_1, + Darkrime_Delves_Level_2, + Darkrime_Delves_Level_3, + Gadds_Encampment_outpost, + Umbral_Grotto_outpost, + Rata_Sum_outpost, + Tarnished_Haven_outpost, + Eye_of_the_North_outpost, + Sifhalla_outpost, + Gunnars_Hold_outpost, + Olafstead_outpost, + Hall_of_Monuments, + Dalada_Uplands, + Doomlore_Shrine_outpost, + Grothmar_Wardowns, + Longeyes_Ledge_outpost, + Sacnoth_Valley, + Central_Transfer_Chamber_outpost, + Curse_of_the_Nornbear, + Blood_Washes_Blood, + A_Gate_Too_Far_Level_1, + A_Gate_Too_Far_Level_2, + A_Gate_Too_Far_Level_3, + The_Elusive_Golemancer_Level_1, + The_Elusive_Golemancer_Level_2, + The_Elusive_Golemancer_Level_3, + Finding_the_Bloodstone_Level_1, + Finding_the_Bloodstone_Level_2, + Finding_the_Bloodstone_Level_3, + Genius_Operated_Living_Enchanted_Manifestation, + Against_the_Charr, + Warband_of_Brothers_Level_1, + Warband_of_Brothers_Level_2, + Warband_of_Brothers_Level_3, + Assault_on_the_Stronghold, + Destructions_Depths_Level_1, + Destructions_Depths_Level_2, + Destructions_Depths_Level_3, + A_Time_for_Heroes, + Warband_Training, + Boreal_Station_outpost, + Catacombs_of_Kathandrax_Level_3, + Hall_of_Primordus, + Attack_of_the_Nornbear, + Cinematic_Cave_Norn_Cursed, + Cinematic_Steppe_Interrogation, + Cinematic_Interior_Research, + Cinematic_Eye_Vision_A, + Cinematic_Eye_Vision_B, + Cinematic_Eye_Vision_C, + Cinematic_Eye_Vision_D, + Polymock_Coliseum, + Polymock_Glacier, + Polymock_Crossing, + Cinematic_Mountain_Resolution, + Cold_as_Ice, + Beneath_Lions_Arch, + Tunnels_Below_Cantha, + Caverns_Below_Kamadan, + Cinematic_Mountain_Dwarfs, + Service_In_Defense_of_the_Eye, + Mano_a_Norn_o, + Service_Practice_Dummy, + Hero_Tutorial, + Prototype_Map, + The_Norn_Fighting_Tournament = 700, + Secret_Lair_of_the_Snowmen, + Norn_Brawling_Championship, + Kilroys_Punchout_Training, + Fronis_Irontoes_Lair_mission, + The_Justiciars_End, + Designer_Test_Map, + The_Great_Norn_Alemoot, + Varajar_Fells_Bear_Club_quest, + The_Crossing_mission2, + Epilogue, + Insidious_Remnants, + The_Beachhead_mission2, + Bombardment_mission2, + Desert_Sands_mission2, + MISSION_CINEMATIC_MISSION_PACK_TYRIA_INTRODUCTION, + The_Battlefield_cinematic, + Attack_on_Jaliss_Camp, + The_Hierophants_Stronghold_cinematic, + The_Asura_Plan_cinematic, + Creature_Test_Map, + Costume_Brawl_outpost, + Whitefury_Rapids_mission, + Kysten_Shore_mission, + Deepway_Ruins_mission, + Plikkup_Works_mission, + Kilroys_Punchout_Tournament, + Special_Ops_Flame_Temple_Corridor, + Special_Ops_Dragons_Gullet, + Special_Ops_Grendich_Courthouse, + Encounter_in_the_Depths_hom_cinematic, + Into_the_North_hom_cinematic, + Arrival_at_the_Eye_hom_cinematic, + Joras_Curse_hom_cinematic, + The_Nornbear_hom_cinematic, + Blood_Washes_Blood_hom_cinematic, + Joras_Redemption_hom_cinematic, + Sign_of_the_Raven_hom_cinematic, + Olaf_and_Ogden_hom_cinematic, + Audience_with_the_King_hom_cinematic, + The_Battlefield_hom_cinematic, + The_Charr_Prisoner_hom_cinematic, + The_Warband_hom_cinematic, + Questions_and_Answers_hom_cinematic, + The_Hierophants_Stronghold_hom_cinematic, + Revolution_hom_cinematic, + The_Asura_Plan_hom_cinematic, + Bookah_hom_cinematic, + Oola_hom_cinematic, + Gadd_hom_cinematic, + At_the_Bloodstone_hom_cinematic, + Before_the_Battle_hom_cinematic, + Price_of_Victory_hom_cinematic, + The_Great_Dwarf_hom_cinematic, + The_Great_Destroyer_hom_cinematic, + Ogdens_Benediction_hom_cinematic, + Asura_Gate_Tyria, + Asura_Gate_Cantha, + Asura_Gate_Elona, + Finding_the_Bloodstone_mission, + Genius_Operated_Living_Enchanted_Manifestation_mission, + Against_the_Charr_mission, + Warband_of_brothers_mission, + Assault_on_the_Stronghold_mission, + Destructions_Depths_mission, + A_Time_for_Heroes_mission, + Curse_of_the_Nornbear_mission, + Blood_Washes_Blood_mission, + A_Gate_Too_Far_mission, + The_Elusive_Golemancer_mission, + The_Tengu_Accords, + The_Battle_of_Jahai, + The_Flight_North, + The_Rise_of_the_White_Mantle, + Battle_Isles_Marketplace, + MISSION_CINEMATIC_MISSION_PACK_CANTHA_INTRODUCTION, + Mission_Pack_Test, + MISSION_CINEMATIC_MISSION_PACK_ELONA_INTRODUCTION, + MISSION_CINEMATIC_MISSION_PACK_GWX_INTRODUCTION, + Piken_Square_pre_Searing_outpost, + Secret_Lair_of_the_Snowmen2 = 781, + Secret_Lair_of_the_Snowmen3, + Droknars_Forge_cinematic, + Isle_of_the_Nameless_PvP, + Rollerbeetle_Racing_HeroBattles, + Dragon_Arena_gvg, + Dwayna_vs_Grenth_gvg, + Temple_of_the_Ages_ROX, + Wajjun_Bazaar_POX, + Bokka_Amphitheatre_NOX, + Secret_Underground_Lair, + Golem_Tutorial_Simulation, + Snowball_Dominance, + Zaishen_Menagerie_Grounds, + Zaishen_Menagerie_outpost, + Codex_Arena_outpost, + The_Underworld_Something_Wicked_This_Way_Comes = 806, + The_Underworld_Dont_Fear_the_Reapers, + Lions_Arch_Halloween_outpost, + Lions_Arch_Wintersday_outpost, + Lions_Arch_Canthan_New_Year_outpost, + Ascalon_City_Wintersday_outpost, + Droknars_Forge_Halloween_outpost, + Droknars_Forge_Wintersday_outpost, + Tomb_of_the_Primeval_Kings_Halloween_outpost, + Shing_Jea_Monastery_Dragon_Festival_outpost, + Shing_Jea_Monastery_Canthan_New_Year_outpost, + Kaineng_Center_Canthan_New_Year_outpost, + Kamadan_Jewel_of_Istan_Halloween_outpost, + Kamadan_Jewel_of_Istan_Wintersday_outpost, + Kamadan_Jewel_of_Istan_Canthan_New_Year_outpost, + Eye_of_the_North_outpost_Wintersday_outpost, + Tester_HUB, + DAlessio_Arena_mission4, + Amnoon_Arena_mission4, + Churranu_Island_Arena_mission2, + Fort_Koga_mission4, + Petrified_Arena_mission2, + Heroes_Crypt_mission4, + Seabed_Arena_mission2, + Deldrimor_Arena_mission2, + Brawlers_Pit_mission2, + The_Crag_mission2, + Sunspear_Arena_mission2, + Shing_Jea_Arena_mission2, + Ascalon_Arena_mission2, + Shiverpeak_Arena_mission4, + War_in_Kryta_Talmark_Wilderness, + War_in_Kryta_Trial_of_Zinn, + War_in_Kryta_Divinity_Coast, + War_in_Kryta_Lions_Arch_Keep, + War_in_Kryta_DAlessio_Seaboard, + War_in_Kryta_The_Battle_for_Lions_Arch, + War_in_Kryta_Riverside_Province, + War_in_Kryta_Lions_Arch, + War_in_Kryta_The_Mausoleum, + War_in_Kryta_Rise, + War_in_Kryta_Shadows_in_the_Jungle, + War_in_Kryta_A_Vengeance_of_Blades, + War_in_Kryta_Auspicious_Beginnings, + Beetletun_explorable, + Aurora_Glade2, + Majestys_Rest2, + Watchtower_Coast2, + Olafstead_cinematic, + The_Great_Snowball_Fight_of_the_Gods__Operation_Crush_Spirits, + The_Great_Snowball_Fight_of_the_Gods__Fighting_in_a_Winter_Wonderland, + Embark_Beach, + Regent_Valley_1059_AE, + Lakeside_County_1059_AE, + Dragons_Throat_area__What_Waits_in_Shadow = 860, + Kaineng_Center_Winds_of_Change__A_Chance_Encounter, + The_Marketplace_area__Tracking_the_Corruption, + Bukdek_Byway_Winds_of_Change__Cantha_Courier_Crisis, + Tsumei_Village_Winds_of_Change__A_Treatys_a_Treaty, + Seitung_Harbor_area__Deadly_Cargo, + Tahnnakai_Temple_Winds_of_Change__The_Rescue_Attempt, + Wajjun_Bazaar_Winds_of_Change__Violence_in_the_Streets, + Scarred_Psyche_mission, + Shadows_Passage_Winds_of_Change__Calling_All_Thugs, + Altrumm_Ruins__Finding_Jinnai, + Shing_Jea_Monastery__Raid_on_Shing_Jea_Monastery, + Kaineng_Center_Winds_of_Change__Raid_on_Kaineng_Center, + Wajjun_Bazaar_Winds_of_Change__Ministry_of_Oppression, + The_Final_Confrontation, + Lakeside_County_1070_AE, + Ashford_Catacombs_1070_AE, + Count = 0x370, + } + + public enum MaterialSlot : uint + { + Bone, + IronIngot, + TannedHideSquare, + Scale, + ChitinFragment, + BoltofCloth, + WoodPlank, + GraniteSlab = 8, + PileofGlitteringDust, + PlantFiber, + Feather, + FurSquare, + BoltofLinen, + BoltofDamask, + BoltofSilk, + GlobofEctoplasm, + SteelIngot, + DeldrimorSteelIngot, + MonstrousClaw, + MonstrousEye, + MonstrousFang, + Ruby, + Sapphire, + Diamond, + OnyxGemstone, + LumpofCharcoal, + ObsidianShard, + TemperedGlassVial = 29, + LeatherSquare, + ElonianLeatherSquare, + VialofInk, + RollofParchment, + RollofVellum, + SpiritwoodPlank, + AmberChunk, + JadeiteShard, + BronzeZCoin, + SilverZCoin, + GoldZCoin, + Count, + } + + public enum Profession : uint + { + None, + Warrior, + Ranger, + Monk, + Necromancer, + Mesmer, + Elementalist, + Assassin, + Ritualist, + Paragon, + Dervish, + } + + public enum ProfessionByte : byte + { + None, + Warrior, + Ranger, + Monk, + Necromancer, + Mesmer, + Elementalist, + Assassin, + Ritualist, + Paragon, + Dervish, + } + + public enum QuestID : uint + { + None = 0, + UW_Chamber = 101, + UW_Wastes, + UW_UWG, + UW_Mnt, + UW_Pits, + UW_Planes, + UW_Pools, + UW_Escort, + UW_Restore, + UW_Vale, + Fow_Defend = 202, + Fow_ArmyOfDarknesses, + Fow_WailingLord, + Fow_Griffons, + Fow_Slaves, + Fow_Restore, + Fow_Hunt, + Fow_Forgemaster, + Fow_Tos = 211, + Fow_Toc, + Fow_Khobay = 224, + Doa_DeathbringerCompany = 749, + Doa_RiftBetweenUs = 752, + Doa_ToTheRescue = 753, + Doa_City = 751, + Doa_BreachingStygianVeil = 742, + Doa_BroodWars = 755, + Doa_FoundryBreakout = 743, + Doa_FoundryOfFailedCreations = 744, + The_Last_Hierophant = 917, + ZaishenMission_The_Great_Northern_Wall = 936, + ZaishenMission_Fort_Ranik = 937, + ZaishenMission_Ruins_of_Surmia = 938, + ZaishenMission_Nolani_Academy = 939, + ZaishenMission_Borlis_Pass = 940, + ZaishenMission_The_Frost_Gate = 941, + ZaishenMission_Gates_of_Kryta = 942, + ZaishenMission_DAlessio_Seaboard = 943, + ZaishenMission_Divinity_Coast = 944, + ZaishenMission_The_Wilds = 945, + ZaishenMission_Bloodstone_Fen = 946, + ZaishenMission_Aurora_Glade = 947, + ZaishenMission_Riverside_Province = 948, + ZaishenMission_Sanctum_Cay = 949, + ZaishenMission_Dunes_of_Despair = 950, + ZaishenMission_Thirsty_River = 951, + ZaishenMission_Elona_Reach = 952, + ZaishenMission_Augury_Rock = 953, + ZaishenMission_The_Dragons_Lair = 954, + ZaishenMission_Ice_Caves_of_Sorrow = 955, + ZaishenMission_Iron_Mines_of_Moladune = 956, + ZaishenMission_Thunderhead_Keep = 957, + ZaishenMission_Ring_of_Fire = 958, + ZaishenMission_Abaddons_Mouth = 959, + ZaishenMission_Hells_Precipice = 960, + ZaishenMission_Minister_Chos_Estate = 1119, + ZaishenMission_Zen_Daijun = 961, + ZaishenMission_Vizunah_Square = 962, + ZaishenMission_Nahpui_Quarter = 963, + ZaishenMission_Tahnnakai_Temple = 964, + ZaishenMission_Arborstone = 965, + ZaishenMission_Boreas_Seabed = 966, + ZaishenMission_Sunjiang_District = 967, + ZaishenMission_The_Eternal_Grove = 968, + ZaishenMission_Gyala_Hatchery = 970, + ZaishenMission_Unwaking_Waters = 969, + ZaishenMission_Raisu_Palace = 971, + ZaishenMission_Imperial_Sanctum = 972, + ZaishenMission_Chahbek_Village = 978, + ZaishenMission_Jokanur_Diggings = 979, + ZaishenMission_Blacktide_Den = 980, + ZaishenMission_Consulate_Docks = 981, + ZaishenMission_Venta_Cemetery = 982, + ZaishenMission_Kodonur_Crossroads = 983, + ZaishenMission_Pogahn_Passage = 1181, + ZaishenMission_Rilohn_Refuge = 984, + ZaishenMission_Moddok_Crevice = 985, + ZaishenMission_Tihark_Orchard = 986, + ZaishenMission_Dasha_Vestibule = 988, + ZaishenMission_Dzagonur_Bastion = 987, + ZaishenMission_Grand_Court_of_Sebelkeh = 989, + ZaishenMission_Jennurs_Horde = 990, + ZaishenMission_Nundu_Bay = 991, + ZaishenMission_Gate_of_Desolation = 992, + ZaishenMission_Ruins_of_Morah = 993, + ZaishenMission_Gate_of_Pain = 994, + ZaishenMission_Gate_of_Madness = 995, + ZaishenMission_Abaddons_Gate = 996, + ZaishenMission_Finding_the_Bloodstone = 1000, + ZaishenMission_The_Elusive_Golemancer = 1001, + ZaishenMission_G_O_L_E_M = 1002, + ZaishenMission_Against_the_Charr = 1003, + ZaishenMission_Warband_of_Brothers = 1004, + ZaishenMission_Assault_on_the_Stronghold = 1005, + ZaishenMission_Curse_of_the_Nornbear = 1006, + ZaishenMission_A_Gate_Too_Far = 1008, + ZaishenMission_Blood_Washes_Blood = 1007, + ZaishenMission_Destructions_Depths = 1009, + ZaishenMission_A_Time_for_Heroes = 1010, + ZaishenBounty_Urgoz = 1025, + ZaishenBounty_Ilsundur_Lord_of_Fire = 1048, + ZaishenBounty_Chung_The_Attuned = 1026, + ZaishenBounty_Mungri_Magicbox = 1029, + ZaishenBounty_The_Stygian_Lords = 1046, + ZaishenBounty_Rragar_Maneater = 1049, + ZaishenBounty_Murakai_Lady_of_the_Night = 1050, + ZaishenBounty_Prismatic_Ooze = 1051, + ZaishenBounty_Havok_Soulwail = 1052, + ZaishenBounty_Frostmaw_the_Kinslayer = 1053, + ZaishenBounty_Remnant_of_Antiquities = 1054, + ZaishenBounty_Plague_of_Destruction = 1055, + ZaishenBounty_Zoldark_the_Unholy = 1056, + ZaishenBounty_Khabuus = 1057, + ZaishenBounty_Zhim_Monns = 1058, + ZaishenBounty_Eldritch_Ettin = 1059, + ZaishenBounty_Fendi_Nin = 1060, + ZaishenBounty_TPS_Regulator_Golem = 1061, + ZaishenBounty_Arachni = 1062, + ZaishenBounty_Forgewight = 1063, + ZaishenBounty_Selvetarm = 1064, + ZaishenBounty_Justiciar_Thommis = 1065, + ZaishenBounty_Rand_Stormweaver = 1066, + ZaishenBounty_Duncan_the_Black = 1067, + ZaishenBounty_Fronis_Irontoe = 1068, + ZaishenBounty_Magmus = 1070, + ZaishenBounty_Lord_Khobay = 1086, + ZaishenVanquish_Dejarin_Estate = 1201, + ZaishenVanquish_Watchtower_Coast = 1202, + ZaishenVanquish_Arbor_Bay = 1203, + ZaishenVanquish_Barbarous_Shore = 1204, + ZaishenVanquish_Deldrimor_Bowl = 1205, + ZaishenVanquish_Boreas_Seabed = 1206, + ZaishenVanquish_Cliffs_of_Dohjok = 1207, + ZaishenVanquish_Diessa_Lowlands = 1208, + ZaishenVanquish_Bukdek_Byway = 1209, + ZaishenVanquish_Bjora_Marches = 1210, + ZaishenVanquish_Crystal_Overlook = 1211, + ZaishenVanquish_Diviners_Ascent = 1212, + ZaishenVanquish_Dalada_Uplands = 1213, + ZaishenVanquish_Drazach_Thicket = 1214, + ZaishenVanquish_Fahranur_the_First_City = 1215, + ZaishenVanquish_Dragons_Gullet = 1216, + ZaishenVanquish_Ferndale = 1217, + ZaishenVanquish_Forum_Highlands = 1218, + ZaishenVanquish_Dreadnoughts_Drift = 1219, + ZaishenVanquish_Drakkar_Lake = 1220, + ZaishenVanquish_Dry_Top = 1221, + ZaishenVanquish_Tears_of_the_Fallen = 1222, + ZaishenVanquish_Gyala_Hatchery = 1223, + ZaishenVanquish_Ettins_Back = 1224, + ZaishenVanquish_Gandara_the_Moon_Fortress = 1225, + ZaishenVanquish_Grothmar_Wardowns = 1226, + ZaishenVanquish_Flame_Temple_Corridor = 1227, + ZaishenVanquish_Haiju_Lagoon = 1228, + ZaishenVanquish_Frozen_Forest = 1229, + ZaishenVanquish_Garden_of_Seborhin = 1230, + ZaishenVanquish_Grenths_Footprint = 1231, + ZaishenVanquish_Jaya_Bluffs = 1232, + ZaishenVanquish_Holdings_of_Chokhin = 1233, + ZaishenVanquish_Ice_Cliff_Chasms = 1234, + ZaishenVanquish_Griffons_Mouth = 1235, + ZaishenVanquish_Kinya_Province = 1236, + ZaishenVanquish_Issnur_Isles = 1237, + ZaishenVanquish_Jaga_Moraine = 1238, + ZaishenVanquish_Ice_Floe = 1239, + ZaishenVanquish_Maishang_Hills = 1240, + ZaishenVanquish_Jahai_Bluffs = 1241, + ZaishenVanquish_Riven_Earth = 1242, + ZaishenVanquish_Icedome = 1243, + ZaishenVanquish_Minister_Chos_Estate = 1244, + ZaishenVanquish_Mehtani_Keys = 1245, + ZaishenVanquish_Sacnoth_Valley = 1246, + ZaishenVanquish_Iron_Horse_Mine = 1247, + ZaishenVanquish_Morostav_Trail = 1248, + ZaishenVanquish_Plains_of_Jarin = 1249, + ZaishenVanquish_Sparkfly_Swamp = 1250, + ZaishenVanquish_Kessex_Peak = 1251, + ZaishenVanquish_Mourning_Veil_Falls = 1252, + ZaishenVanquish_The_Alkali_Pan = 1253, + ZaishenVanquish_Varajar_Fells = 1254, + ZaishenVanquish_Lornars_Pass = 1255, + ZaishenVanquish_Pongmei_Valley = 1256, + ZaishenVanquish_The_Floodplain_of_Mahnkelon = 1257, + ZaishenVanquish_Verdant_Cascades = 1258, + ZaishenVanquish_Majestys_Rest = 1259, + ZaishenVanquish_Raisu_Palace = 1260, + ZaishenVanquish_The_Hidden_City_of_Ahdashim = 1261, + ZaishenVanquish_Rheas_Crater = 1262, + ZaishenVanquish_Mamnoon_Lagoon = 1263, + ZaishenVanquish_Shadows_Passage = 1264, + ZaishenVanquish_The_Mirror_of_Lyss = 1265, + ZaishenVanquish_Saoshang_Trail = 1266, + ZaishenVanquish_Nebo_Terrace = 1267, + ZaishenVanquish_Shenzun_Tunnels = 1268, + ZaishenVanquish_The_Ruptured_Heart = 1269, + ZaishenVanquish_Salt_Flats = 1270, + ZaishenVanquish_North_Kryta_Province = 1271, + ZaishenVanquish_Silent_Surf = 1272, + ZaishenVanquish_The_Shattered_Ravines = 1273, + ZaishenVanquish_Scoundrels_Rise = 1274, + ZaishenVanquish_Old_Ascalon = 1275, + ZaishenVanquish_Sunjiang_District = 1276, + ZaishenVanquish_The_Sulphurous_Wastes = 1277, + ZaishenVanquish_Magus_Stones = 1278, + ZaishenVanquish_Perdition_Rock = 1279, + ZaishenVanquish_Sunqua_Vale = 1280, + ZaishenVanquish_Turais_Procession = 1281, + ZaishenVanquish_Norrhart_Domains = 1282, + ZaishenVanquish_Pockmark_Flats = 1283, + ZaishenVanquish_Tahnnakai_Temple = 1284, + ZaishenVanquish_Vehjin_Mines = 1285, + ZaishenVanquish_Poisoned_Outcrops = 1286, + ZaishenVanquish_Prophets_Path = 1287, + ZaishenVanquish_The_Eternal_Grove = 1288, + ZaishenVanquish_Tascas_Demise = 1289, + ZaishenVanquish_Respendent_Makuun = 1290, + ZaishenVanquish_Reed_Bog = 1291, + ZaishenVanquish_Unwaking_Waters = 1292, + ZaishenVanquish_Stingray_Strand = 1293, + ZaishenVanquish_Sunward_Marches = 1294, + ZaishenVanquish_Regent_Valley = 1295, + ZaishenVanquish_Wajjun_Bazaar = 1296, + ZaishenVanquish_Yatendi_Canyons = 1297, + ZaishenVanquish_Twin_Serpent_Lakes = 1298, + ZaishenVanquish_Sage_Lands = 1299, + ZaishenVanquish_Xaquang_Skyway = 1300, + ZaishenVanquish_Zehlon_Reach = 1301, + ZaishenVanquish_Tangle_Root = 1302, + ZaishenVanquish_Silverwood = 1303, + ZaishenVanquish_Zen_Daijun = 1304, + ZaishenVanquish_The_Arid_Sea = 1305, + ZaishenVanquish_Nahpui_Quarter = 1306, + ZaishenVanquish_Skyward_Reach = 1307, + ZaishenVanquish_The_Scar = 1308, + ZaishenVanquish_The_Black_Curtain = 1309, + ZaishenVanquish_Panjiang_Peninsula = 1310, + ZaishenVanquish_Snake_Dance = 1311, + ZaishenVanquish_Travelers_Vale = 1312, + ZaishenVanquish_The_Breach = 1313, + ZaishenVanquish_Lahtenda_Bog = 1314, + ZaishenVanquish_Spearhead_Peak = 1315, + } + + public enum ServerRegion : int + { + International = -2, + America = 0, + Korea, + Europe, + China, + Japan, + Unknown = 0xff, + } + + public enum SkillID : uint + { + No_Skill = 0, + Healing_Signet, + Resurrection_Signet, + Signet_of_Capture, + BAMPH, + Power_Block, + Mantra_of_Earth, + Mantra_of_Flame, + Mantra_of_Frost, + Mantra_of_Lightning, + Hex_Breaker, + Distortion, + Mantra_of_Celerity, + Mantra_of_Recovery, + Mantra_of_Persistence, + Mantra_of_Inscriptions, + Mantra_of_Concentration, + Mantra_of_Resolve, + Mantra_of_Signets, + Fragility, + Confusion, + Inspired_Enchantment, + Inspired_Hex, + Power_Spike, + Power_Leak, + Power_Drain, + Empathy, + Shatter_Delusions, + Backfire, + Blackout, + Diversion, + Conjure_Phantasm, + Illusion_of_Weakness, + Illusionary_Weaponry, + Sympathetic_Visage, + Ignorance, + Arcane_Conundrum, + Illusion_of_Haste, + Channeling, + Energy_Surge, + Ether_Feast, + Ether_Lord, + Energy_Burn, + Clumsiness, + Phantom_Pain, + Ethereal_Burden, + Guilt, + Ineptitude, + Spirit_of_Failure, + Mind_Wrack, + Wastrels_Worry, + Shame, + Panic, + Migraine, + Crippling_Anguish, + Fevered_Dreams, + Soothing_Images, + Cry_of_Frustration, + Signet_of_Midnight, + Signet_of_Weariness, + Signet_of_Illusions_beta_version, + Leech_Signet, + Signet_of_Humility, + Keystone_Signet, + Mimic, + Arcane_Mimicry, + Spirit_Shackles, + Shatter_Hex, + Drain_Enchantment, + Shatter_Enchantment, + Disappear, + Unnatural_Signet_alpha_version, + Elemental_Resistance, + Physical_Resistance, + Echo, + Arcane_Echo, + Imagined_Burden, + Chaos_Storm, + Epidemic, + Energy_Drain, + Energy_Tap, + Arcane_Thievery, + Mantra_of_Recall, + Animate_Bone_Horror, + Animate_Bone_Fiend, + Animate_Bone_Minions, + Grenths_Balance, + Veratas_Gaze, + Veratas_Aura, + Deathly_Chill, + Veratas_Sacrifice, + Well_of_Power, + Well_of_Blood, + Well_of_Suffering, + Well_of_the_Profane, + Putrid_Explosion, + Soul_Feast, + Necrotic_Traversal, + Consume_Corpse, + Parasitic_Bond, + Soul_Barbs, + Barbs, + Shadow_Strike, + Price_of_Failure, + Death_Nova, + Deathly_Swarm, + Rotting_Flesh, + Virulence, + Suffering, + Life_Siphon, + Unholy_Feast, + Awaken_the_Blood, + Desecrate_Enchantments, + Tainted_Flesh, + Aura_of_the_Lich, + Blood_Renewal, + Dark_Aura, + Enfeeble, + Enfeebling_Blood, + Blood_is_Power, + Blood_of_the_Master, + Spiteful_Spirit, + Malign_Intervention, + Insidious_Parasite, + Spinal_Shivers, + Wither, + Life_Transfer, + Mark_of_Subversion, + Soul_Leech, + Defile_Flesh, + Demonic_Flesh, + Barbed_Signet, + Plague_Signet, + Dark_Pact, + Order_of_Pain, + Faintheartedness, + Shadow_of_Fear, + Rigor_Mortis, + Dark_Bond, + Infuse_Condition, + Malaise, + Rend_Enchantments, + Lingering_Curse, + Strip_Enchantment, + Chilblains, + Signet_of_Agony, + Offering_of_Blood, + Dark_Fury, + Order_of_the_Vampire, + Plague_Sending, + Mark_of_Pain, + Feast_of_Corruption, + Taste_of_Death, + Vampiric_Gaze, + Plague_Touch, + Vile_Touch, + Vampiric_Touch, + Blood_Ritual, + Touch_of_Agony, + Weaken_Armor, + Windborne_Speed, + Lightning_Storm, + Gale, + Whirlwind, + Elemental_Attunement, + Armor_of_Earth, + Kinetic_Armor, + Eruption, + Magnetic_Aura, + Earth_Attunement, + Earthquake, + Stoning, + Stone_Daggers, + Grasping_Earth, + Aftershock, + Ward_Against_Elements, + Ward_Against_Melee, + Ward_Against_Foes, + Ether_Prodigy, + Incendiary_Bonds, + Aura_of_Restoration, + Ether_Renewal, + Conjure_Flame, + Inferno, + Fire_Attunement, + Mind_Burn, + Fireball, + Meteor, + Flame_Burst, + Rodgorts_Invocation, + Mark_of_Rodgort, + Immolate, + Meteor_Shower, + Phoenix, + Flare, + Lava_Font, + Searing_Heat, + Fire_Storm, + Glyph_of_Elemental_Power, + Glyph_of_Energy, + Glyph_of_Lesser_Energy, + Glyph_of_Concentration, + Glyph_of_Sacrifice, + Glyph_of_Renewal, + Rust, + Lightning_Surge, + Armor_of_Frost, + Conjure_Frost, + Water_Attunement, + Mind_Freeze, + Ice_Prison, + Ice_Spikes, + Frozen_Burst, + Shard_Storm, + Ice_Spear, + Maelstrom, + Iron_Mist, + Crystal_Wave, + Obsidian_Flesh, + Obsidian_Flame, + Blinding_Flash, + Conjure_Lightning, + Lightning_Strike, + Chain_Lightning, + Enervating_Charge, + Air_Attunement, + Mind_Shock, + Glimmering_Mark, + Thunderclap, + Lightning_Orb, + Lightning_Javelin, + Shock, + Lightning_Touch, + Swirling_Aura, + Deep_Freeze, + Blurred_Vision, + Mist_Form, + Water_Trident, + Armor_of_Mist, + Ward_Against_Harm, + Smite, + Life_Bond, + Balthazars_Spirit, + Strength_of_Honor, + Life_Attunement, + Protective_Spirit, + Divine_Intervention, + Symbol_of_Wrath, + Retribution, + Holy_Wrath, + Essence_Bond, + Scourge_Healing, + Banish, + Scourge_Sacrifice, + Vigorous_Spirit, + Watchful_Spirit, + Blessed_Aura, + Aegis, + Guardian, + Shield_of_Deflection, + Aura_of_Faith, + Shield_of_Regeneration, + Shield_of_Judgment, + Protective_Bond, + Pacifism, + Amity, + Peace_and_Harmony, + Judges_Insight, + Unyielding_Aura, + Mark_of_Protection, + Life_Barrier, + Zealots_Fire, + Balthazars_Aura, + Spell_Breaker, + Healing_Seed, + Mend_Condition, + Restore_Condition, + Mend_Ailment, + Purge_Conditions, + Divine_Healing, + Heal_Area, + Orison_of_Healing, + Word_of_Healing, + Dwaynas_Kiss, + Divine_Boon, + Healing_Hands, + Heal_Other, + Heal_Party, + Healing_Breeze, + Vital_Blessing, + Mending, + Live_Vicariously, + Infuse_Health, + Signet_of_Devotion, + Signet_of_Judgment, + Purge_Signet, + Bane_Signet, + Blessed_Signet, + Martyr, + Shielding_Hands, + Contemplation_of_Purity, + Remove_Hex, + Smite_Hex, + Convert_Hexes, + Light_of_Dwayna, + Resurrect, + Rebirth, + Reversal_of_Fortune, + Succor, + Holy_Veil, + Divine_Spirit, + Draw_Conditions, + Holy_Strike, + Healing_Touch, + Restore_Life, + Vengeance, + To_the_Limit, + Battle_Rage, + Defy_Pain, + Rush, + Hamstring, + Wild_Blow, + Power_Attack, + Desperation_Blow, + Thrill_of_Victory, + Distracting_Blow, + Protectors_Strike, + Griffons_Sweep, + Pure_Strike, + Skull_Crack, + Cyclone_Axe, + Hammer_Bash, + Bulls_Strike, + I_Will_Avenge_You, + Axe_Rake, + Cleave, + Executioners_Strike, + Dismember, + Eviscerate, + Penetrating_Blow, + Disrupting_Chop, + Swift_Chop, + Axe_Twist, + For_Great_Justice, + Flurry, + Defensive_Stance, + Frenzy, + Endure_Pain, + Watch_Yourself, + Sprint, + Belly_Smash, + Mighty_Blow, + Crushing_Blow, + Crude_Swing, + Earth_Shaker, + Devastating_Hammer, + Irresistible_Blow, + Counter_Blow, + Backbreaker, + Heavy_Blow, + Staggering_Blow, + Dolyak_Signet, + Warriors_Cunning, + Shield_Bash, + Charge, + Victory_Is_Mine, + Fear_Me, + Shields_Up, + I_Will_Survive, + Dont_Believe_Their_Lies, + Berserker_Stance, + Balanced_Stance, + Gladiators_Defense, + Deflect_Arrows, + Warriors_Endurance, + Dwarven_Battle_Stance, + Disciplined_Stance, + Wary_Stance, + Shield_Stance, + Bulls_Charge, + Bonettis_Defense, + Hundred_Blades, + Sever_Artery, + Galrath_Slash, + Gash, + Final_Thrust, + Seeking_Blade, + Riposte, + Deadly_Riposte, + Flourish, + Savage_Slash, + Hunters_Shot, + Pin_Down, + Crippling_Shot, + Power_Shot, + Barrage, + Dual_Shot, + Quick_Shot, + Penetrating_Attack, + Distracting_Shot, + Precision_Shot, + Splinter_Shot_monster_skill, + Determined_Shot, + Called_Shot, + Poison_Arrow, + Oath_Shot, + Debilitating_Shot, + Point_Blank_Shot, + Concussion_Shot, + Punishing_Shot, + Call_of_Ferocity, + Charm_Animal, + Call_of_Protection, + Call_of_Elemental_Protection, + Call_of_Vitality, + Call_of_Haste, + Call_of_Healing, + Call_of_Resilience, + Call_of_Feeding, + Call_of_the_Hunter, + Call_of_Brutality, + Call_of_Disruption, + Revive_Animal, + Symbiotic_Bond, + Throw_Dirt, + Dodge, + Savage_Shot, + Antidote_Signet, + Incendiary_Arrows, + Melandrus_Arrows, + Marksmans_Wager, + Ignite_Arrows, + Read_the_Wind, + Kindle_Arrows, + Choking_Gas, + Apply_Poison, + Comfort_Animal, + Bestial_Pounce, + Maiming_Strike, + Feral_Lunge, + Scavenger_Strike, + Melandrus_Assault, + Ferocious_Strike, + Predators_Pounce, + Brutal_Strike, + Disrupting_Lunge, + Troll_Unguent, + Otyughs_Cry, + Escape, + Practiced_Stance, + Whirling_Defense, + Melandrus_Resilience, + Dryders_Defenses, + Lightning_Reflexes, + Tigers_Fury, + Storm_Chaser, + Serpents_Quickness, + Dust_Trap, + Barbed_Trap, + Flame_Trap, + Healing_Spring, + Spike_Trap, + Winter, + Winnowing, + Edge_of_Extinction, + Greater_Conflagration, + Conflagration, + Fertile_Season, + Symbiosis, + Primal_Echoes, + Predatory_Season, + Frozen_Soil, + Favorable_Winds, + High_Winds, + Energizing_Wind, + Quickening_Zephyr, + Natures_Renewal, + Muddy_Terrain, + Bleeding, + Blind, + Burning, + Crippled, + Deep_Wound, + Disease, + Poison, + Dazed, + Weakness, + Cleansed, + Eruption_environment, + Fire_Storm_environment, + Vital_Blessing_monster_skill, + Fount_Of_Maguuma, + Healing_Fountain, + Icy_Ground, + Maelstrom_environment, + Mursaat_Tower_skill, + Quicksand_environment_effect, + Curse_of_the_Bloodstone, + Chain_Lightning_environment, + Obelisk_Lightning, + Tar, + Siege_Attack, + Resurrect_Party, + Scepter_of_Orrs_Aura, + Scepter_of_Orrs_Power, + Burden_Totem, + Splinter_Mine_skill, + Entanglement, + Dwarven_Powder_Keg, + Seed_of_Resurrection, + Deafening_Roar, + Brutal_Mauling, + Crippling_Attack, + Charm_Animal_monster_skill, + Breaking_Charm, + Charr_Buff, + Claim_Resource, + Claim_Resource1, + Claim_Resource2, + Claim_Resource3, + Claim_Resource4, + Claim_Resource5, + Claim_Resource6, + Claim_Resource7, + Dozen_Shot, + Nibble, + Claim_Resource8, + Claim_Resource9, + Reflection, + Spectral_Agony, + Giant_Stomp, + Agnars_Rage, + Healing_Breeze_Agnars_Rage, + Crystal_Haze, + Crystal_Bonds, + Jagged_Crystal_Skin, + Crystal_Hibernation, + Stun_Immunity, + Invulnerability, + Hunger_of_the_Lich, + Embrace_the_Pain, + Life_Vortex, + Oracle_Link, + Guardian_Pacify, + Soul_Vortex, + Soul_Vortex2, + Spectral_Agony1, + Natural_Resistance, + Natural_Resistance1, + Guild_Lord_Aura, + Critical_Hit_Probability, + Stun_on_Critical_Hit, + Blood_Splattering, + Inanimate_Object, + Undead_sensitivity_to_Light, + Energy_Boost, + Health_Drain, + Immunity_to_Critical_Hits, + Titans_get_plus_Health_regen_and_set_enemies_on_fire_each_time_he_is_hit, + Undying, + Resurrect_Gargoyle, + Seal_Regen, + Lightning_Orb1, + Wurm_Siege_Dunes_of_Despair, + Wurm_Siege, + Claim_Resource10, + Shiver_Touch, + Spontaneous_Combustion, + Vanish, + Victory_or_Death, + Mark_of_Insecurity, + Disrupting_Dagger, + Deadly_Paradox, + Teleport_Players, + Quest_skill_for_Coastal_Exam, + Holy_Blessing, + Statues_Blessing, + Siege_Attack1, + Siege_Attack2, + Domain_of_Skill_Damage, + Domain_of_Energy_Draining, + Domain_of_Elements, + Domain_of_Health_Draining, + Domain_of_Slow, + Divine_Fire, + Swamp_Water, + Janthirs_Gaze, + Fake_Spell, + Charm_Animal_monster, + Stormcaller_skill, + Knock, + Quest_Skill, + Rurik_Must_Live, + Blessing_of_the_Kurzicks, + Lichs_Phylactery, + Restore_Life_monster_skill, + Chimera_of_Intensity, + Life_Draining = 657, + Jaundiced_Gaze = 763, + Wail_of_Doom, + Heros_Insight, + Gaze_of_Contempt, + Berserkers_Insight, + Slayers_Insight, + Vipers_Defense, + Return, + Aura_of_Displacement, + Generous_Was_Tsungrai, + Mighty_Was_Vorizun, + To_the_Death, + Death_Blossom, + Twisting_Fangs, + Horns_of_the_Ox, + Falling_Spider, + Black_Lotus_Strike, + Fox_Fangs, + Moebius_Strike, + Jagged_Strike, + Unsuspecting_Strike, + Entangling_Asp, + Mark_of_Death, + Iron_Palm, + Resilient_Weapon, + Blind_Was_Mingson, + Grasping_Was_Kuurong, + Vengeful_Was_Khanhei, + Flesh_of_My_Flesh, + Splinter_Weapon, + Weapon_of_Warding, + Wailing_Weapon, + Nightmare_Weapon, + Sorrows_Flame, + Sorrows_Fist, + Blast_Furnace, + Beguiling_Haze, + Enduring_Toxin, + Shroud_of_Silence, + Expose_Defenses, + Power_Leech, + Arcane_Languor, + Animate_Vampiric_Horror, + Cultists_Fervor, + Reapers_Mark = 808, + Shatterstone, + Protectors_Defense, + Run_as_One, + Defiant_Was_Xinrae, + Lyssas_Aura, + Shadow_Refuge, + Scorpion_Wire, + Mirrored_Stance, + Discord, + Well_of_Weariness, + Vampiric_Spirit, + Depravity, + Icy_Veins, + Weaken_Knees, + Burning_Speed, + Lava_Arrows, + Bed_of_Coals, + Shadow_Form, + Siphon_Strength, + Vile_Miasma, + Veratas_Promise, + Ray_of_Judgment, + Primal_Rage, + Animate_Flesh_Golem, + Borrowed_Energy, + Reckless_Haste, + Blood_Bond, + Ride_the_Lightning, + Energy_Boon, + Dwaynas_Sorrow, + Retreat, + Poisoned_Heart, + Fetid_Ground, + Arc_Lightning, + Gust, + Churning_Earth, + Liquid_Flame, + Steam, + Boon_Signet, + Reverse_Hex, + Lacerating_Chop, + Fierce_Blow, + Sun_and_Moon_Slash, + Splinter_Shot, + Melandrus_Shot, + Snare, + Chomper, + Kilroy_Stonekin, + Adventurers_Insight, + Dancing_Daggers, + Conjure_Nightmare, + Signet_of_Disruption, + Dissipation, + Ravenous_Gaze, + Order_of_Apostasy, + Oppressive_Gaze, + Lightning_Hammer, + Vapor_Blade, + Healing_Light, + Aim_True, + Coward, + Pestilence, + Shadowsong, + Shadowsong_attack, + Resurrect_monster_skill, + Consuming_Flames, + Chains_of_Enslavement, + Signet_of_Shadows, + Lyssas_Balance, + Visions_of_Regret, + Illusion_of_Pain, + Stolen_Speed, + Ether_Signet, + Signet_of_Disenchantment, + Vocal_Minority, + Searing_Flames, + Shield_Guardian, + Restful_Breeze, + Signet_of_Rejuvenation, + Whirling_Axe, + Forceful_Blow, + Headshot, + None_Shall_Pass, + Quivering_Blade, + Seeking_Arrows, + Rampagers_Insight, + Hunters_Insight, + Amulet_of_Protection, + Oath_of_Healing, + Overload, + Images_of_Remorse, + Shared_Burden, + Soul_Bind, + Blood_of_the_Aggressor, + Icy_Prism, + Furious_Axe, + Auspicious_Blow, + On_Your_Knees, + Dragon_Slash, + Marauders_Shot, + Focused_Shot, + Spirit_Rift, + Union, + Blessing_of_the_Kurzicks1, + Tranquil_Was_Tanasen, + Consume_Soul, + Spirit_Light, + Lamentation, + Rupture_Soul, + Spirit_to_Flesh, + Spirit_Burn, + Destruction, + Dissonance, + Dissonance_attack, + Disenchantment, + Disenchantment_attack, + Recall, + Sharpen_Daggers, + Shameful_Fear, + Shadow_Shroud, + Shadow_of_Haste, + Auspicious_Incantation, + Power_Return, + Complicate, + Shatter_Storm, + Unnatural_Signet, + Rising_Bile, + Envenom_Enchantments, + Shockwave, + Ward_of_Stability, + Icy_Shackles, + Cry_of_Lament, + Blessed_Light, + Withdraw_Hexes, + Extinguish, + Signet_of_Strength, + REMOVE_With_Haste, + Trappers_Focus, + Brambles, + Desperate_Strike, + Way_of_the_Fox, + Shadowy_Burden, + Siphon_Speed, + Deaths_Charge, + Power_Flux, + Expel_Hexes, + Rip_Enchantment, + Energy_Font, + Spell_Shield, + Healing_Whisper, + Ethereal_Light, + Release_Enchantments, + Lacerate, + Spirit_Transfer, + Restoration, + Vengeful_Weapon, + Archemorus_Strike, + Spear_of_Archemorus_Level_1, + Spear_of_Archemorus_Level_2, + Spear_of_Archemorus_Level_3, + Spear_of_Archemorus_Level_4, + Spear_of_Archemorus_Level_5, + Argos_Cry, + Jade_Fury, + Blinding_Powder, + Mantis_Touch, + Exhausting_Assault, + Repeating_Strike, + Way_of_the_Lotus, + Mark_of_Instability, + Mistrust, + Feast_of_Souls, + Recuperation, + Shelter, + Weapon_of_Shadow, + Torch_Enchantment, + Caltrops, + Nine_Tail_Strike, + Way_of_the_Empty_Palm, + Temple_Strike, + Golden_Phoenix_Strike, + Expunge_Enchantments, + Deny_Hexes, + Triple_Chop, + Enraged_Smash, + Renewing_Smash, + Tiger_Stance, + Standing_Slash, + Famine, + Torch_Hex, + Torch_Degeneration_Hex, + Blinding_Snow, + Avalanche_skill, + Snowball, + Mega_Snowball, + Yuletide, + Ice_Skates, + Ice_Fort, + Yellow_Snow, + Hidden_Rock, + Snow_Down_the_Shirt, + Mmmm_Snowcone, + Holiday_Blues, + Icicles, + Ice_Breaker, + Lets_Get_Em, + Flurry_of_Ice, + Snowball_NPC, + Undying1, + Critical_Eye, + Critical_Strike, + Blades_of_Steel, + Jungle_Strike, + Wild_Strike, + Leaping_Mantis_Sting, + Black_Mantis_Thrust, + Disrupting_Stab, + Golden_Lotus_Strike, + Critical_Defenses, + Way_of_Perfection, + Dark_Apostasy, + Locusts_Fury, + Shroud_of_Distress, + Heart_of_Shadow, + Impale, + Seeping_Wound, + Assassins_Promise, + Signet_of_Malice, + Dark_Escape, + Crippling_Dagger, + Star_Strike, + Spirit_Walk, + Unseen_Fury, + Flashing_Blades, + Dash, + Dark_Prison, + Palm_Strike, + Assassin_of_Lyssa, + Mesmer_of_Lyssa, + Revealed_Enchantment, + Revealed_Hex, + Disciple_of_Energy, + Empathy_Koro, + Accumulated_Pain, + Psychic_Distraction, + Ancestors_Visage, + Recurring_Insecurity, + Kitahs_Burden, + Psychic_Instability, + Chaotic_Power, + Hex_Eater_Signet, + Celestial_Haste, + Feedback, + Arcane_Larceny, + Chaotic_Ward, + Favor_of_the_Gods, + Dark_Aura_blessing, + Spoil_Victor, + Lifebane_Strike, + Bitter_Chill, + Taste_of_Pain, + Defile_Enchantments, + Shivers_of_Dread, + Star_Servant, + Necromancer_of_Grenth, + Ritualist_of_Grenth, + Vampiric_Swarm, + Blood_Drinker, + Vampiric_Bite, + Wallows_Bite, + Enfeebling_Touch, + Disciple_of_Ice, + Teinais_Wind, + Shock_Arrow, + Unsteady_Ground, + Sliver_Armor, + Ash_Blast, + Dragons_Stomp, + Unnatural_Resistance, + Second_Wind, + Cloak_of_Faith, + Smoldering_Embers, + Double_Dragon, + Disciple_of_the_Air, + Teinais_Heat, + Breath_of_Fire, + Star_Burst, + Glyph_of_Essence, + Teinais_Prison, + Mirror_of_Ice, + Teinais_Crystals, + Celestial_Storm, + Monk_of_Dwayna, + Aura_of_the_Grove, + Cathedral_Collapse, + Miasma, + Acid_Trap, + Shield_of_Saint_Viktor, + Urn_of_Saint_Viktor_Level_1, + Urn_of_Saint_Viktor_Level_2, + Urn_of_Saint_Viktor_Level_3, + Urn_of_Saint_Viktor_Level_4, + Urn_of_Saint_Viktor_Level_5, + Aura_of_Light, + Kirins_Wrath, + Spirit_Bond, + Air_of_Enchantment, + Warriors_Might, + Heavens_Delight, + Healing_Burst, + Kareis_Healing_Circle, + Jameis_Gaze, + Gift_of_Health, + Battle_Fervor, + Life_Sheath, + Star_Shine, + Disciple_of_Fire, + Empathic_Removal, + Warrior_of_Balthazar, + Resurrection_Chant, + Word_of_Censure, + Spear_of_Light, + Stonesoul_Strike, + Shielding_Branches, + Drunken_Blow, + Leviathans_Sweep, + Jaizhenju_Strike, + Penetrating_Chop, + Yeti_Smash, + Disciple_of_the_Earth, + Ranger_of_Melandru, + Storm_of_Swords, + You_Will_Die, + Auspicious_Parry, + Strength_of_the_Oak, + Silverwing_Slash, + Destroy_Enchantment, + Shove, + Base_Defense, + Carrier_Defense, + The_Chalice_of_Corruption, + Song_of_the_Mists = 1151, + Demonic_Agility, + Blessing_of_the_Kirin, + Emperor_Degen, + Juggernaut_Toss, + Aura_of_the_Juggernaut, + Star_Shards, + Turtle_Shell = 1172, + Exposed_Underbelly, + Cathedral_Collapse1, + Blood_of_zu_Heltzer, + Afflicted_Soul_Explosion, + Invincibility, + Last_Stand, + Dark_Chain_Lightning, + Seadragon_Health_Trigger, + Corrupted_Breath, + Renewing_Corruption, + Corrupted_Dragon_Spores, + Corrupted_Dragon_Scales, + Construct_Possession, + Siege_Turtle_Attack_The_Eternal_Grove, + Siege_Turtle_Attack_Fort_Aspenwood, + Siege_Turtle_Attack_Gyala_Hatchery, + Of_Royal_Blood, + Passage_to_Tahnnakai, + Sundering_Attack, + Zojuns_Shot, + Consume_Spirit, + Predatory_Bond, + Heal_as_One, + Zojuns_Haste, + Needling_Shot, + Broad_Head_Arrow, + Glass_Arrows, + Archers_Signet, + Savage_Pounce, + Enraged_Lunge, + Bestial_Mauling, + Energy_Drain_effect, + Poisonous_Bite, + Pounce, + Celestial_Stance, + Sheer_Exhaustion, + Bestial_Fury, + Life_Drain, + Vipers_Nest, + Equinox, + Tranquility, + Acute_Weakness, + Clamor_of_Souls, + Ritual_Lord = 1217, + Cruel_Was_Daoshen, + Protective_Was_Kaolai, + Attuned_Was_Songkai, + Resilient_Was_Xiko, + Lively_Was_Naomei, + Anguished_Was_Lingwah, + Draw_Spirit, + Channeled_Strike, + Spirit_Boon_Strike, + Essence_Strike, + Spirit_Siphon, + Explosive_Growth, + Boon_of_Creation, + Spirit_Channeling, + Armor_of_Unfeeling, + Soothing_Memories, + Mend_Body_and_Soul, + Dulled_Weapon, + Binding_Chains, + Painful_Bond, + Signet_of_Creation, + Signet_of_Spirits, + Soul_Twisting, + Celestial_Summoning, + Archemorus_Strike_Celestial_Summoning, + Shield_of_Saint_Viktor_Celestial_Summoning, + Ghostly_Haste, + Gaze_from_Beyond, + Ancestors_Rage, + Pain, + Pain_attack, + Displacement, + Preservation, + Life, + Earthbind, + Bloodsong, + Bloodsong_attack, + Wanderlust, + Wanderlust_attack, + Spirit_Light_Weapon, + Brutal_Weapon, + Guided_Weapon, + Meekness, + Frigid_Armor, + Healing_Ring, + Renew_Life, + Doom, + Wielders_Boon, + Soothing, + Vital_Weapon, + Weapon_of_Quickening, + Signet_of_Rage, + Fingers_of_Chaos, + Echoing_Banishment, + Suicidal_Impulse, + Impossible_Odds, + Battle_Scars, + Riposting_Shadows, + Meditation_of_the_Reaper, + Battle_Cry, + Elemental_Defense_Zone, + Melee_Defense_Zone, + Blessed_Water, + Defiled_Water, + Stone_Spores, + Turret_Arrow, + Blood_Flower_skill, + Fire_Flower_skill, + Poison_Arrow_flower, + Haiju_Lagoon_Water, + Aspect_of_Exhaustion, + Aspect_of_Exposure, + Aspect_of_Surrender, + Aspect_of_Death, + Aspect_of_Soothing, + Aspect_of_Pain, + Aspect_of_Lethargy, + Aspect_of_Depletion_energy_loss, + Aspect_of_Failure, + Aspect_of_Shadows, + Scorpion_Aspect, + Aspect_of_Fear, + Aspect_of_Depletion_energy_depletion_damage, + Aspect_of_Decay, + Aspect_of_Torment, + Nightmare_Aspect, + Spiked_Coral, + Shielding_Urn_skill, + Extensive_Plague_Exposure, + Forests_Binding, + Exploding_Spores, + Suicide_Energy, + Suicide_Health, + Nightmare_Refuge, + Oni_Health_Lock, + Oni_Shadow_Health_Lock, + Signet_of_Attainment, + Rage_of_the_Sea, + Meditation_of_the_Reaper1, + Fireball_obelisk = 1318, + Final_Thrust1, + Sugar_Rush_medium = 1323, + Torment_Slash, + Spirit_of_the_Festival, + Trade_Winds, + Dragon_Blast, + Imperial_Majesty, + Monster_doesnt_get_death_penalty, + Twisted_Spikes, + Marble_Trap, + Shadow_Tripwire, + Extend_Conditions, + Hypochondria, + Wastrels_Demise, + Spiritual_Pain, + Drain_Delusions, + Persistence_of_Memory, + Symbols_of_Inspiration, + Symbolic_Celerity, + Frustration, + Tease, + Ether_Phantom, + Web_of_Disruption, + Enchanters_Conundrum, + Signet_of_Illusions, + Discharge_Enchantment, + Hex_Eater_Vortex, + Mirror_of_Disenchantment, + Simple_Thievery, + Animate_Shambling_Horror, + Order_of_Undeath, + Putrid_Flesh, + Feast_for_the_Dead, + Jagged_Bones, + Contagion, + Bloodletting, + Ulcerous_Lungs, + Pain_of_Disenchantment, + Mark_of_Fury, + Recurring_Scourge, + Corrupt_Enchantment, + Signet_of_Sorrow, + Signet_of_Suffering, + Signet_of_Lost_Souls, + Well_of_Darkness, + Blinding_Surge, + Chilling_Winds, + Lightning_Bolt, + Storm_Djinns_Haste, + Stone_Striker, + Sandstorm, + Stone_Sheath, + Ebon_Hawk, + Stoneflesh_Aura, + Glyph_of_Restoration, + Ether_Prism, + Master_of_Magic, + Glowing_Gaze, + Savannah_Heat, + Flame_Djinns_Haste, + Freezing_Gust, + Rocky_Ground, + Sulfurous_Haze, + Siege_Attack3, + Sentry_Trap_skill, + Caltrops_monster, + Sacred_Branch, + Light_of_Seborhin, + Judges_Intervention, + Supportive_Spirit, + Watchful_Healing, + Healers_Boon, + Healers_Covenant, + Balthazars_Pendulum, + Words_of_Comfort, + Light_of_Deliverance, + Scourge_Enchantment, + Shield_of_Absorption, + Reversal_of_Damage, + Mending_Touch, + Critical_Chop, + Agonizing_Chop, + Flail, + Charging_Strike, + Headbutt, + Lions_Comfort, + Rage_of_the_Ntouka, + Mokele_Smash, + Overbearing_Smash, + Signet_of_Stamina, + Youre_All_Alone, + Burst_of_Aggression, + Enraging_Charge, + Crippling_Slash, + Barbarous_Slice, + Vial_of_Purified_Water, + Disarm_Trap, + Feeding_Frenzy_skill, + Quake_Of_Ahdashim, + Shield_of_Madness, + Create_Light_of_Seborhin, + Unlock_Cell, + Stop_Pump, + Shield_of_Madness1 = 1426, + Shield_of_Ether, + Shield_of_Iron, + Shield_of_Strength, + Wave_of_Torment, + Corsairs_Net = 1433, + Corrupted_Healing, + Corrupted_Roots, + Corrupted_Strength, + Desert_Wurm_disguise, + Junundu_Feast, + Junundu_Strike, + Junundu_Smash, + Junundu_Siege, + Junundu_Tunnel, + Leave_Junundu, + Summon_Torment, + Signal_Flare, + The_Elixir_of_Strength, + Ehzah_from_Above, + Last_Rites_of_Torment = 1449, + Abaddons_Conspiracy, + Hungers_Bite, + From_Hell, + Pains_Embrace, + Call_to_the_Torment, + Command_of_Torment, + Abaddons_Favor, + Abaddons_Chosen, + Enchantment_Collapse, + Call_of_Sacrifice, + Enemies_Must_Die, + Earth_Vortex, + Frost_Vortex, + Rough_Current, + Turbulent_Flow, + Prepared_Shot, + Burning_Arrow, + Arcing_Shot, + Strike_as_One, + Crossfire, + Barbed_Arrows, + Scavengers_Focus, + Toxicity, + Quicksand, + Storms_Embrace, + Trappers_Speed, + Tripwire, + Kournan_Guardsman, + Renewing_Surge, + Offering_of_Spirit, + Spirits_Gift, + Death_Pact_Signet, + Reclaim_Essence, + Banishing_Strike, + Mystic_Sweep, + Eremites_Attack, + Reap_Impurities, + Twin_Moon_Sweep, + Victorious_Sweep, + Irresistible_Sweep, + Pious_Assault, + Mystic_Twister, + REMOVE_Wind_Prayers_skill, + Grenths_Fingers, + REMOVE_Boon_of_the_Gods, + Aura_of_Thorns, + Balthazars_Rage, + Dust_Cloak, + Staggering_Force, + Pious_Renewal, + Mirage_Cloak, + REMOVE_Balthazars_Rage, + Arcane_Zeal, + Mystic_Vigor, + Watchful_Intervention, + Vow_of_Piety, + Vital_Boon, + Heart_of_Holy_Flame, + Extend_Enchantments, + Faithful_Intervention, + Sand_Shards, + Intimidating_Aura_beta_version, + Lyssas_Haste, + Guiding_Hands, + Fleeting_Stability, + Armor_of_Sanctity, + Mystic_Regeneration, + Vow_of_Silence, + Avatar_of_Balthazar, + Avatar_of_Dwayna, + Avatar_of_Grenth, + Avatar_of_Lyssa, + Avatar_of_Melandru, + Meditation, + Eremites_Zeal, + Natural_Healing, + Imbue_Health, + Mystic_Healing, + Dwaynas_Touch, + Pious_Restoration, + Signet_of_Pious_Light, + Intimidating_Aura, + Mystic_Sandstorm, + Winds_of_Disenchantment, + Rending_Touch, + Crippling_Sweep, + Wounding_Strike, + Wearying_Strike, + Lyssas_Assault, + Chilling_Victory, + Conviction, + Enchanted_Haste, + Pious_Concentration, + Pious_Haste, + Whirling_Charge, + Test_of_Faith, + Blazing_Spear, + Mighty_Throw, + Cruel_Spear, + Harriers_Toss, + Unblockable_Throw, + Spear_of_Lightning, + Wearying_Spear, + Anthem_of_Fury, + Crippling_Anthem, + Defensive_Anthem, + Godspeed, + Anthem_of_Flame, + Go_for_the_Eyes, + Anthem_of_Envy, + Song_of_Power, + Zealous_Anthem, + Aria_of_Zeal, + Lyric_of_Zeal, + Ballad_of_Restoration, + Chorus_of_Restoration, + Aria_of_Restoration, + Song_of_Concentration, + Anthem_of_Guidance, + Energizing_Chorus, + Song_of_Purification, + Hexbreaker_Aria, + Brace_Yourself, + Awe, + Enduring_Harmony, + Blazing_Finale, + Burning_Refrain, + Finale_of_Restoration, + Mending_Refrain, + Purifying_Finale, + Bladeturn_Refrain, + Glowing_Signet, + REMOVE_Leadership_skill, + Leaders_Zeal, + Leaders_Comfort, + Signet_of_Synergy, + Angelic_Protection, + Angelic_Bond, + Cautery_Signet, + Stand_Your_Ground, + Lead_the_Way, + Make_Haste, + We_Shall_Return, + Never_Give_Up, + Help_Me, + Fall_Back, + Incoming, + Theyre_on_Fire, + Never_Surrender, + Its_Just_a_Flesh_Wound, + Barbed_Spear, + Vicious_Attack, + Stunning_Strike, + Merciless_Spear, + Disrupting_Throw, + Wild_Throw, + Curse_of_the_Staff_of_the_Mists, + Aura_of_the_Staff_of_the_Mists, + Power_of_the_Staff_of_the_Mists, + Scepter_of_Ether, + Summoning_of_the_Scepter, + Rise_From_Your_Grave, + Sugar_Rush_long, + Corsair_disguise, + REMOVE_Queen_Wail, + REMOVE_Queen_Armor, + Queen_Heal, + Queen_Wail, + Queen_Armor, + Queen_Bite, + Queen_Thump, + Queen_Siege, + Junundu_Tunnel_monster_skill, + Skin_of_Stone, + Dervish_of_the_Mystic, + Dervish_of_the_Wind, + Paragon_of_Leadership, + Paragon_of_Motivation, + Dervish_of_the_Blade, + Paragon_of_Command, + Paragon_of_the_Spear, + Dervish_of_the_Earth, + Master_of_DPS, + Malicious_Strike, + Shattering_Assault, + Golden_Skull_Strike, + Black_Spider_Strike, + Golden_Fox_Strike, + Deadly_Haste, + Assassins_Remedy, + Foxs_Promise, + Feigned_Neutrality, + Hidden_Caltrops, + Assault_Enchantments, + Wastrels_Collapse, + Lift_Enchantment, + Augury_of_Death, + Signet_of_Toxic_Shock, + Signet_of_Twilight, + Way_of_the_Assassin, + Shadow_Walk, + Deaths_Retreat, + Shadow_Prison, + Swap, + Shadow_Meld, + Price_of_Pride, + Air_of_Disenchantment, + Signet_of_Clumsiness, + Symbolic_Posture, + Toxic_Chill, + Well_of_Silence, + Glowstone, + Mind_Blast, + Elemental_Flame, + Invoke_Lightning, + Battle_Cry1, + Mending_Shrine_Bonus, + Energy_Shrine_Bonus, + Northern_Health_Shrine_Bonus, + Southern_Health_Shrine_Bonus, + Siege_Attack_Bombardment, + Curse_of_Silence, + To_the_Pain_Hero_Battles, + Edge_of_Reason, + Depths_of_Madness_environment_effect, + Cower_in_Fear, + Dreadful_Pain, + Veiled_Nightmare, + Base_Protection, + Kournan_Siege_Flame, + Drake_Skin, + Skale_Vigor, + Pahnai_Salad_item_effect, + Pensive_Guardian, + Scribes_Insight, + Holy_Haste, + Glimmer_of_Light, + Zealous_Benediction, + Defenders_Zeal, + Signet_of_Mystic_Wrath, + Signet_of_Removal, + Dismiss_Condition, + Divert_Hexes, + Counterattack, + Magehunter_Strike, + Soldiers_Strike, + Decapitate, + Magehunters_Smash, + Soldiers_Stance, + Soldiers_Defense, + Frenzied_Defense, + Steady_Stance, + Steelfang_Slash, + Sunspear_Battle_Call, + Untouchable, + Earth_Shattering_Blow, + Corrupt_Power, + Words_of_Madness_Qwytzylkak, + Gaze_of_MoavuKaal, + Presence_of_the_Skale_Lord, + Madness_Dart, + The_Apocrypha_is_changing_to_another_form, + Reform_Carvings = 1715, + Sunspear_Siege = 1717, + Soul_Torture, + Screaming_Shot, + Keen_Arrow, + Rampage_as_One, + Forked_Arrow, + Disrupting_Accuracy, + Experts_Dexterity, + Roaring_Winds, + Magebane_Shot, + Natural_Stride, + Hekets_Rampage, + Smoke_Trap, + Infuriating_Heat, + Vocal_Was_Sogolon, + Destructive_Was_Glaive, + Wielders_Strike, + Gaze_of_Fury, + Gaze_of_Fury_attack, + Spirits_Strength, + Wielders_Zeal, + Sight_Beyond_Sight, + Renewing_Memories, + Wielders_Remedy, + Ghostmirror_Light, + Signet_of_Ghostly_Might, + Signet_of_Binding, + Caretakers_Charge, + Anguish, + Anguish_attack, + Empowerment, + Recovery, + Weapon_of_Fury, + Xinraes_Weapon, + Warmongers_Weapon, + Weapon_of_Remedy, + Rending_Sweep, + Onslaught, + Mystic_Corruption, + Grenths_Grasp, + Veil_of_Thorns, + Harriers_Grasp, + Vow_of_Strength, + Ebon_Dust_Aura, + Zealous_Vow, + Heart_of_Fury, + Zealous_Renewal, + Attackers_Insight, + Rending_Aura, + Featherfoot_Grace, + Reapers_Sweep, + Harriers_Haste, + Focused_Anger, + Natural_Temper, + Song_of_Restoration, + Lyric_of_Purification, + Soldiers_Fury, + Aggressive_Refrain, + Energizing_Finale, + Signet_of_Aggression, + Remedy_Signet, + Signet_of_Return, + Make_Your_Time, + Cant_Touch_This, + Find_Their_Weakness, + The_Power_Is_Yours, + Slayers_Spear, + Swift_Javelin, + Natures_Speed, + Weapon_of_Mastery, + Accelerated_Growth, + Forge_the_Way, + Anthem_of_Aggression, + Skale_Hunt, + Mandragor_Hunt, + Skree_Battle, + Insect_Hunt, + Corsair_Bounty, + Plant_Hunt, + Undead_Hunt, + Eternal_Suffering, + Eternal_Suffering1, + Eternal_Suffering2, + Eternal_Languor, + Eternal_Languor1, + Eternal_Languor2, + Eternal_Lethargy, + Eternal_Lethargy1, + Eternal_Lethargy2, + Thirst_of_the_Drought = 1808, + Thirst_of_the_Drought1, + Thirst_of_the_Drought2, + Thirst_of_the_Drought3, + Thirst_of_the_Drought4, + Lightbringer, + Lightbringers_Gaze, + Lightbringer_Signet, + Sunspear_Rebirth_Signet, + Wisdom, + Maddened_Strike, + Maddened_Stance, + Spirit_Form_Remains_of_Sahlahja, + Gods_Blessing, + Monster_Hunt, + Monster_Hunt1, + Monster_Hunt2, + Monster_Hunt3, + Elemental_Hunt, + Elemental_Hunt1, + Skree_Battle1, + Insect_Hunt1, + Insect_Hunt2, + Demon_Hunt, + Minotaur_Hunt, + Plant_Hunt1, + Plant_Hunt2, + Skale_Hunt1, + Skale_Hunt2, + Heket_Hunt, + Heket_Hunt1, + Kournan_Bounty, + Mandragor_Hunt1, + Mandragor_Hunt2, + Corsair_Bounty1, + Kournan_Bounty1, + Dhuum_Battle, + Menzies_Battle, + Elemental_Hunt2, + Monolith_Hunt, + Monolith_Hunt1, + Margonite_Battle, + Monster_Hunt4, + Titan_Hunt, + Mandragor_Hunt3, + Giant_Hunt, + Undead_Hunt1, + Kournan_Siege, + Lose_your_Head, + Wandering_Mind, + Altar_Buff = 1859, + Sugar_Rush_short, + Choking_Breath, + Junundu_Bite, + Blinding_Breath, + Burning_Breath, + Junundu_Wail, + Capture_Point, + Approaching_the_Vortex, + Avatar_of_Sweetness = 1871, + Corrupted_Lands = 1873, + Words_of_Madness = 1875, + Unknown_Junundu_Ability, + Torment_Slash_Smothering_Tendrils = 1880, + Bonds_of_Torment, + Shadow_Smash, + Bonds_of_Torment_effect, + Consume_Torment, + Banish_Enchantment, + Summoning_Shadows, + Lightbringers_Insight, + Repressive_Energy = 1889, + Enduring_Torment, + Shroud_of_Darkness, + Demonic_Miasma, + Enraged, + Touch_of_Aaaaarrrrrrggghhh, + Wild_Smash, + Unyielding_Anguish, + Jadoths_Storm_of_Judgment, + Anguish_Hunt, + Avatar_of_Holiday_Cheer, + Side_Step, + Jack_Frost, + Avatar_of_Grenth_snow_fighting_skill, + Avatar_of_Dwayna_snow_fighting_skill, + Steady_Aim, + Rudis_Red_Nose, + Charm_Animal_White_Mantle = 1910, + Volatile_Charr_Crystal, + Hard_mode, + Claim_Resource_Heroes_Ascent, + Hard_mode1, + Hard_Mode_NPC_Buff, + Sugar_Jolt_short, + Rollerbeetle_Racer, + Ram, + Harden_Shell, + Rollerbeetle_Dash, + Super_Rollerbeetle, + Rollerbeetle_Echo, + Distracting_Lunge, + Rollerbeetle_Blast, + Spit_Rocks, + Lunar_Blessing, + Lucky_Aura, + Spiritual_Possession, + Water, + Pig_Form, + Beetle_Metamorphosis, + Sugar_Jolt_long = 1933, + Golden_Egg_skill, + Torturous_Embers, + Test_Buff, + Infernal_Rage, + Putrid_Flames, + Shroud_of_Ash, + Flame_Call, + Torturers_Inferno, + Whirling_Fires, + Charr_Siege_Attack_What_Must_Be_Done, + Charr_Siege_Attack_Against_the_Charr, + Birthday_Cupcake_skill, + Blessing_of_the_Luxons = 1947, + Shadow_Sanctuary_luxon, + Ether_Nightmare_luxon, + Signet_of_Corruption_luxon, + Elemental_Lord_luxon, + Selfless_Spirit_luxon, + Triple_Shot_luxon, + Save_Yourselves_luxon, + Aura_of_Holy_Might_luxon, + Spear_of_Fury_luxon = 1957, + Attribute_Balance, + Monster_Hunt5, + Monster_Hunt6, + Mandragor_Hunt4, + Mandragor_Hunt5, + Giant_Hunt1, + Giant_Hunt2, + Skree_Battle2, + Skree_Battle3, + Insect_Hunt3, + Insect_Hunt4, + Minotaur_Hunt1, + Minotaur_Hunt2, + Corsair_Bounty2, + Corsair_Bounty3, + Plant_Hunt3, + Plant_Hunt4, + Skale_Hunt3, + Skale_Hunt4, + Heket_Hunt2, + Heket_Hunt3, + Kournan_Bounty2, + Kournan_Bounty3, + Undead_Hunt2, + Undead_Hunt3, + Fire_Dart, + Ice_Dart, + Poison_Dart, + Vampiric_Assault, + Lotus_Strike, + Golden_Fang_Strike, + Way_of_the_Mantis, + Falling_Lotus_Strike, + Sadists_Signet, + Signet_of_Distraction, + Signet_of_Recall, + Power_Lock, + Waste_Not_Want_Not, + Sum_of_All_Fears, + Withering_Aura, + Cacophony, + Winters_Embrace, + Earthen_Shackles, + Ward_of_Weakness, + Glyph_of_Swiftness, + Cure_Hex, + Smite_Condition, + Smiters_Boon, + Castigation_Signet, + Purifying_Veil, + Pulverizing_Smash, + Keen_Chop, + Knee_Cutter, + Grapple, + Radiant_Scythe, + Grenths_Aura, + Signet_of_Pious_Restraint, + Farmers_Scythe, + Energetic_Was_Lee_Sa, + Anthem_of_Weariness, + Anthem_of_Disruption, + Burning_Ground, + Freezing_Ground, + Poison_Ground, + Fire_Jet, + Ice_Jet, + Poison_Jet, + Lava_Pool, + Water_Pool, + Fire_Spout, + Ice_Spout, + Poison_Spout, + Dhuum_Battle1, + Dhuum_Battle2, + Elemental_Hunt3, + Elemental_Hunt4, + Monolith_Hunt2, + Monolith_Hunt3, + Margonite_Battle1, + Margonite_Battle2, + Menzies_Battle1, + Menzies_Battle2, + Anguish_Hunt1, + Titan_Hunt1, + Titan_Hunt2, + Monster_Hunt7, + Monster_Hunt8, + Sarcophagus_Spores, + Exploding_Barrel, + Greater_Hard_Mode_NPC_Buff, + Fire_Boulder, + Dire_Snowball, + Boulder, + Summon_Spirits_luxon, + Shadow_Fang, + Calculated_Risk, + Shrinking_Armor, + Aneurysm, + Wandering_Eye, + Foul_Feast, + Putrid_Bile, + Shell_Shock, + Glyph_of_Immolation, + Patient_Spirit, + Healing_Ribbon, + Aura_of_Stability, + Spotless_Mind, + Spotless_Soul, + Disarm, + I_Meant_to_Do_That, + Rapid_Fire, + Sloth_Hunters_Shot, + Aura_Slicer, + Zealous_Sweep, + Pure_Was_Li_Ming, + Weapon_of_Aggression, + Chest_Thumper, + Hasty_Refrain, + Drain_Minion, + Cracked_Armor, + Berserk, + Fleshreavers_Escape, + Chomp, + Twisting_Jaws, + Burning_Immunity, + Mandragors_Charge, + Rock_Slide, + Avalanche_effect, + Snaring_Web, + Ceiling_Collapse, + Trample, + Wurm_Bile, + Ground_Cover, + Shadow_Sanctuary_kurzick, + Ether_Nightmare_kurzick, + Signet_of_Corruption_kurzick, + Elemental_Lord_kurzick, + Selfless_Spirit_kurzick, + Triple_Shot_kurzick, + Save_Yourselves_kurzick, + Aura_of_Holy_Might_kurzick, + Spear_of_Fury_kurzick, + Summon_Spirits_kurzick, + Critical_Agility, + Cry_of_Pain, + Necrosis, + Intensity, + Seed_of_Life, + Call_of_the_Eye, + Whirlwind_Attack, + Never_Rampage_Alone, + Eternal_Aura, + Vampirism, + Vampirism_attack, + Theres_Nothing_to_Fear, + Ursan_Rage_Blood_Washes_Blood, + Ursan_Strike_Blood_Washes_Blood, + Sneak_Attack = 2116, + Firebomb_Explosion, + Firebomb, + Shield_of_Fire, + Respawn, + Marked_For_Death, + Spirit_World_Retreat, + Long_Claws, + Shattered_Spirit, + Spirit_Roar, + Spirit_Senses, + Unseen_Aggression, + Volfen_Pounce_Curse_of_the_Nornbear, + Volfen_Claw_Curse_of_the_Nornbear, + Volfen_Bloodlust_Curse_of_the_Nornbear = 2131, + Volfen_Agility_Curse_of_the_Nornbear, + Volfen_Blessing_Curse_of_the_Nornbear, + Charging_Spirit, + Trampling_Ox, + Smoke_Powder_Defense, + Confusing_Images, + Hexers_Vigor, + Masochism, + Piercing_Trap, + Companionship, + Feral_Aggression, + Disrupting_Shot, + Volley, + Expert_Focus, + Pious_Fury, + Crippling_Victory, + Sundering_Weapon, + Weapon_of_Renewal, + Maiming_Spear, + Temporal_Sheen, + Flux_Overload, + A_pool_of_water, + Phase_Shield_effect, + Phase_Shield_monster_skill, + Vitality_Transfer, + Golem_Strike, + Bloodstone_Slash, + Energy_Blast_golem, + Chaotic_Energy, + Golem_Fire_Shield, + The_Way_of_Duty, + The_Way_of_Kinship, + Diamondshard_Mist_environment_effect, + Diamondshard_Grave, + The_Way_of_Strength, + Diamondshard_Mist, + Raven_Blessing_A_Gate_Too_Far, + Raven_Flight_A_Gate_Too_Far = 2170, + Raven_Shriek_A_Gate_Too_Far, + Raven_Swoop_A_Gate_Too_Far, + Raven_Talons_A_Gate_Too_Far, + Aspect_of_Oak, + Long_Claws1, + Tremor, + Rage_of_the_Jotun, + Thundering_Roar, + Sundering_Soulcrush, + Pyroclastic_Shot, + Explosive_Force, + Rolling_Shift = 2184, + Powder_Keg_Explosion, + Signet_of_Deadly_Corruption, + Way_of_the_Master, + Defile_Defenses, + Angorodons_Gaze, + Magnetic_Surge, + Slippery_Ground, + Glowing_Ice, + Energy_Blast, + Distracting_Strike, + Symbolic_Strike, + Soldiers_Speed, + Body_Blow, + Body_Shot, + Poison_Tip_Signet, + Signet_of_Mystic_Speed, + Shield_of_Force, + Mending_Grip, + Spiritleech_Aura, + Rejuvenation, + Agony, + Ghostly_Weapon, + Inspirational_Speech, + Burning_Shield, + Holy_Spear, + Spear_Swipe, + Alkars_Alchemical_Acid, + Light_of_Deldrimor, + Ear_Bite, + Low_Blow, + Brawling_Headbutt, + Dont_Trip, + By_Urals_Hammer, + Drunken_Master, + Great_Dwarf_Weapon, + Great_Dwarf_Armor, + Breath_of_the_Great_Dwarf, + Snow_Storm, + Black_Powder_Mine, + Summon_Mursaat, + Summon_Ruby_Djinn, + Summon_Ice_Imp, + Summon_Naga_Shaman, + Deft_Strike, + Signet_of_Infection, + Tryptophan_Signet, + Ebon_Battle_Standard_of_Courage, + Ebon_Battle_Standard_of_Wisdom, + Ebon_Battle_Standard_of_Honor, + Ebon_Vanguard_Sniper_Support, + Ebon_Vanguard_Assassin_Support, + Well_of_Ruin, + Atrophy, + Spear_of_Redemption, + Gelatinous_Material_Explosion = 2240, + Gelatinous_Corpse_Consumption, + Gelatinous_Mutation, + Gelatinous_Absorption, + Unstable_Ooze_Explosion, + Golem_Shrapnel, + Unstable_Aura, + Unstable_Pulse, + Polymock_Power_Drain, + Polymock_Block, + Polymock_Glyph_of_Concentration, + Polymock_Ether_Signet, + Polymock_Glyph_of_Power, + Polymock_Overload, + Polymock_Glyph_Destabilization, + Polymock_Mind_Wreck, + Order_of_Unholy_Vigor, + Order_of_the_Lich, + Master_of_Necromancy, + Animate_Undead, + Polymock_Deathly_Chill, + Polymock_Rising_Bile, + Polymock_Rotting_Flesh, + Polymock_Lightning_Strike, + Polymock_Lightning_Orb, + Polymock_Lightning_Djinns_Haste, + Polymock_Flare, + Polymock_Immolate, + Polymock_Meteor, + Polymock_Ice_Spear, + Polymock_Icy_Prison, + Polymock_Mind_Freeze, + Polymock_Ice_Shard_Storm, + Polymock_Frozen_Trident, + Polymock_Smite, + Polymock_Smite_Hex, + Polymock_Bane_Signet, + Polymock_Stone_Daggers, + Polymock_Obsidian_Flame, + Polymock_Earthquake, + Polymock_Frozen_Armor, + Polymock_Glyph_Freeze, + Polymock_Fireball, + Polymock_Rodgorts_Invocation, + Polymock_Calculated_Risk, + Polymock_Recurring_Insecurity, + Polymock_Backfire, + Polymock_Guilt, + Polymock_Lamentation, + Polymock_Spirit_Rift, + Polymock_Painful_Bond, + Polymock_Signet_of_Clumsiness, + Polymock_Migraine, + Polymock_Glowing_Gaze, + Polymock_Searing_Flames, + Polymock_Signet_of_Revenge, + Polymock_Signet_of_Smiting, + Polymock_Stoning, + Polymock_Eruption, + Polymock_Shock_Arrow, + Polymock_Mind_Shock, + Polymock_Piercing_Light_Spear, + Polymock_Mind_Blast, + Polymock_Savannah_Heat, + Polymock_Diversion, + Polymock_Lightning_Blast, + Polymock_Poisoned_Ground, + Polymock_Icy_Bonds, + Polymock_Sandstorm, + Polymock_Banish, + Mergoyle_Form, + Skale_Form, + Gargoyle_Form, + Ice_Imp_Form, + Fire_Imp_Form, + Kappa_Form, + Aloe_Seed_Form, + Earth_Elemental_Form, + Fire_Elemental_Form, + Ice_Elemental_Form, + Mirage_Iboga_Form, + Wind_Rider_Form, + Naga_Shaman_Form, + Mantis_Dreamweaver_Form, + Ruby_Djinn_Form, + Gaki_Form, + Stone_Rain_Form, + Mursaat_Elementalist_Form, + Crystal_Shield, + Crystal_Snare, + Paranoid_Indignation, + Searing_Breath, + Kraks_Charge, + Brawling, + Brawling_Block, + Brawling_Jab, + Brawling_Jab1, + Brawling_Straight_Right, + Brawling_Hook, + Brawling_Hook1, + Brawling_Uppercut, + Brawling_Combo_Punch, + Brawling_Headbutt_Brawling_skill, + STAND_UP, + Call_of_Destruction, + Flame_Jet, + Lava_Ground, + Lava_Wave, + Spirit_Shield = 2349, + Summoning_Lord, + Charm_Animal_Ashlyn_Spiderfriend, + Charr_Siege_Attack_Assault_on_the_Stronghold, + Finish_Him, + Dodge_This, + I_Am_the_Strongest, + I_Am_Unstoppable, + A_Touch_of_Guile, + You_Move_Like_a_Dwarf, + You_Are_All_Weaklings, + Feel_No_Pain, + Club_of_a_Thousand_Bears, + Talon_Strike = 2363, + Lava_Blast, + Thunderfist_Strike, + Alkars_Concoction = 2367, + Murakais_Consumption, + Murakais_Censure, + Murakais_Calamity, + Murakais_Storm_of_Souls, + Edification, + Heart_of_the_Norn, + Ursan_Blessing, + Ursan_Strike, + Ursan_Rage, + Ursan_Roar, + Ursan_Force, + Volfen_Blessing, + Volfen_Claw, + Volfen_Pounce, + Volfen_Bloodlust, + Volfen_Agility, + Raven_Blessing, + Raven_Talons, + Raven_Swoop, + Raven_Shriek, + Raven_Flight, + Totem_of_Man, + Filthy_Explosion, + Murakais_Call, + Spawn_Pods, + Enraged_Blast, + Spawn_Hatchling, + Ursan_Roar_Blood_Washes_Blood, + Ursan_Force_Blood_Washes_Blood, + Ursan_Aura, + Consume_Flames, + Aura_of_the_Great_Destroyer, + Destroy_the_Humans, + Charr_Flame_Keeper_Form, + Titan_Form, + Skeletal_Mage_Form, + Smoke_Wraith_Form, + Bone_Dragon_Form, + Dwarven_Arcanist_Form = 2407, + Dolyak_Rider_Form, + Extract_Inscription, + Charr_Shaman_Form, + Mindbender, + Smooth_Criminal, + Technobabble, + Radiation_Field, + Asuran_Scan, + Air_of_Superiority, + Mental_Block, + Pain_Inverter, + Healing_Salve, + Ebon_Escape, + Weakness_Trap, + Winds, + Dwarven_Stability, + Stout_Hearted, + Inscribed_Ettin_Aura, + Decipher_Inscriptions, + Rebel_Yell, + Asuran_Flame_Staff = 2429, + Aura_of_the_Bloodstone, + Aura_of_the_Bloodstone1, + Aura_of_the_Bloodstone2, + Haunted_Ground, + Asuran_Bodyguard, + Asuran_Bodyguard1, + Asuran_Bodyguard2, + Energy_Channel, + Hunt_Rampage, + Boss_Bounty = 2440, + Hunt_Point_Bonus, + Hunt_Point_Bonus1, + Hunt_Point_Bonus2, + Time_Attack, + Dwarven_Raider, + Dwarven_Raider1, + Dwarven_Raider2, + Dwarven_Raider3, + Great_Dwarfs_Blessing, + Hunt_Rampage1, + Boss_Bounty1 = 2452, + Hunt_Point_Bonus3, + Hunt_Point_Bonus4, + Time_Attack1 = 2456, + Vanguard_Patrol, + Vanguard_Patrol1, + Vanguard_Patrol2, + Vanguard_Patrol3, + Vanguard_Commendation, + Hunt_Rampage2, + Boss_Bounty2 = 2464, + Norn_Hunting_Party = 2469, + Norn_Hunting_Party1, + Norn_Hunting_Party2, + Norn_Hunting_Party3, + Strength_of_the_Norn, + Hunt_Rampage3, + Asuran_Bodyguard3 = 2481, + Desperate_Howl, + Gloat, + Metamorphosis, + Inner_Fire, + Elemental_Shift, + Dryders_Feast, + Fungal_Explosion, + Blood_Rage, + Parasitic_Bite, + False_Death, + Ooze_Combination, + Ooze_Division, + Bear_Form, + Sweeping_Strikes, + Spore_Explosion, + Dormant_Husk, + Monkey_See_Monkey_Do, + Feeding_Frenzy, + Tengus_Mimicry, + Tongue_Lash, + Soulrending_Shriek, + Unreliable, + Siege_Devourer, + Siege_Devourer_Feast, + Devourer_Bite, + Siege_Devourer_Swipe, + Devourer_Siege, + HYAHHHHH, + HYAHHHHH1, + HYAHHHHH2, + HYAHHHHH3, + Dismount_Siege_Devourer, + The_Masters_Mark, + The_Snipers_Spear, + Mount, + Reverse_Polarity_Fire_Shield, + Tengus_Gaze, + Fix_Monster_Attributes, + Armor_of_Salvation_item_effect, + Grail_of_Might_item_effect, + Essence_of_Celerity_item_effect, + Stone_Dwarf_Transformation, + Forgewights_Blessing, + Selvetarms_Blessing, + Thommiss_Blessing, + Duncans_Defense, + Rands_Attack = 2529, + Selvetarms_Attack, + Thommiss_Attack, + Create_Spore, + Invigorating_Mist = 2536, + Courageous_Was_Saidra, + Animate_Undead_Palawa_Joko, + Order_of_Unholy_Vigor_Palawa_Joko, + Order_of_the_Lich_Palawa_Joko, + Golem_Boosters, + Charm_Animal_monster1, + Wurm_Siege_Eye_of_the_North, + Tongue_Whip, + Lit_Torch, + Dishonorable, + Hard_Mode_Dungeon_Boss, + Veteran_Asuran_Bodyguard, + Veteran_Dwarven_Raider, + Veteran_Vanguard_Patrol, + Veteran_Norn_Hunting_Party, + Dwarven_Raider4 = 2565, + Dwarven_Raider5, + Dwarven_Raider6, + Dwarven_Raider7, + Great_Dwarfs_Blessing1 = 2570, + Boss_Bounty3, + Hunt_Point_Bonus5 = 2574, + Hunt_Point_Bonus6, + Hunt_Rampage4, + Time_Attack2, + Vanguard_Patrol4, + Boss_Bounty4 = 2583, + Hunt_Point_Bonus7 = 2585, + Vanguard_Commendation1 = 2589, + Norn_Hunting_Party4 = 2591, + Norn_Hunting_Party5, + Norn_Hunting_Party6, + Norn_Hunting_Party7, + Boss_Bounty5 = 2596, + Strength_of_the_Norn1 = 2598, + Hunt_Point_Bonus8, + Hunt_Point_Bonus9 = 2601, + Hunt_Rampage5, + Time_Attack3, + Candy_Corn_skill, + Candy_Apple_skill, + Anton_Costume_Brawl_disguise, + Erys_Vasburg_Costume_Brawl_disguise, + Olias_Costume_Brawl_disguise, + Argo_Costume_Brawl_disguise, + Mhenlo_Costume_Brawl_disguise, + Lukas_Costume_Brawl_disguise, + Aidan_Costume_Brawl_disguise, + Kahmu_Costume_Brawl_disguise, + Razah_Costume_Brawl_disguise, + Morgahn_Costume_Brawl_disguise, + Nika_Costume_Brawl_disguise, + Seaguard_Hala_Costume_Brawl_disguise, + Livia_Costume_Brawl_disguise, + Cynn_Costume_Brawl_disguise, + Tahlkora_Costume_Brawl_disguise, + Devona_Costume_Brawl_disguise, + Zho_Costume_Brawl_disguise, + Melonni_Costume_Brawl_disguise, + Xandra_Costume_Brawl_disguise, + Hayda_Costume_Brawl_disguise, + UNUSED_Complicate, + UNUSED_Reapers_Mark, + UNUSED_Enfeeble, + UNUSED_Desecrate_Enchantments, + UNUSED_Signet_of_Lost_Souls, + UNUSED_Insidious_Parasite, + UNUSED_Searing_Flames, + UNUSED_Glowing_Gaze, + UNUSED_Steam, + UNUSED_Flame_Djinns_Haste, + UNUSED_Liquid_Flame, + UNUSED_Blessed_Light, + UNUSED_Shield_of_Absorption, + UNUSED_Smite_Condition, + UNUSED_Crippling_Slash, + UNUSED_Sun_and_Moon_Slash, + UNUSED_Enraging_Charge, + UNUSED_Tiger_Stance, + UNUSED_Burning_Arrow, + UNUSED_Natural_Stride, + UNUSED_Falling_Lotus_Strike, + UNUSED_Anthem_of_Weariness, + UNUSED_Pious_Fury, + Pie_Induced_Ecstasy, + Charm_Animal_Charr_Demolisher, + Togo_disguise, + Turai_Ossa_disguise, + Gwen_disguise, + Saul_DAlessio_disguise, + Dragon_Empire_Rage, + Call_to_the_Spirit_Realm, + Call_of_Haste_PvP, + Hide, + Feign_Death, + Flee, + Throw_Rock, + Nightmarish_Aura, + Siege_Strike, + Spike_Trap_spell, + Barbed_Bomb, + Fire_and_Brimstone, + Balm_Bomb, + Explosives, + Rations, + Form_Up_and_Advance, + Advance, + Spectral_Agony_Saul_DAlessio, + Stun_Bomb, + Banner_of_the_Unseen, + Signet_of_the_Unseen, + For_Elona, + Giant_Stomp_Turai_Ossa, + Whirlwind_Attack_Turai_Ossa, + Junundu_Siege1, + Distortion_Gwen, + Shared_Burden_Gwen, + Sum_of_All_Fears_Gwen, + Castigation_Signet_Saul_DAlessio, + Unnatural_Signet_Saul_DAlessio, + Dragon_Slash_Turai_Ossa, + Essence_Strike_Togo, + Spirit_Burn_Togo, + Spirit_Rift_Togo, + Mend_Body_and_Soul_Togo, + Offering_of_Spirit_Togo, + Disenchantment_Togo, + Fire_Dart1, + Corrupted_Haiju_Lagoon_Water = 2698, + Journey_to_the_North, + Rat_Form = 2701, + Ox_Form, + Tiger_Form, + Rabbit_Form, + Dragon_Form, + Snake_Form, + Horse_Form, + Sheep_Form, + Monkey_Form, + Rooster_Form, + Dog_Form, + Party_Time, + Victory_is_Ours, + Dark_Soul_Explosion, + Chaotic_Soul_Explosion, + Fiery_Soul_Explosion, + Rejuvenating_Soul_Explosion, + Plague_Spring, + Unbalancing_Soul_Explosion, + Shadowy_Soul_Explosion, + Ethereal_Soul_Explosion, + Redemption_of_Purity, + Purify_Energy, + Purifying_Flame, + Purifying_Prayer, + Strength_of_Purity, + Spring_of_Purity, + Way_of_the_Pure, + Purify_Soul, + Aura_of_Purity, + Anthem_of_Purity, + Falkens_Fire_Fist, + Falken_Quick, + Mind_Wrack_PvP, + Quickening_Terrain, + Massive_Damage, + Minion_Apocalypse, + Combat_Costume_Assassin = 2739, + Combat_Costume_Mesmer, + Combat_Costume_Necromancer, + Combat_Costume_Elementalist, + Combat_Costume_Monk, + Combat_Costume_Warrior, + Combat_Costume_Ranger, + Combat_Costume_Dervish, + Combat_Costume_Ritualist, + Combat_Costume_Paragon, + Jade_Brotherhood_Bomb = 2755, + Mad_Kings_Fan, + Candy_Corn_Strike = 2758, + Rocket_Propelled_Gobstopper, + Rain_of_Terror_spell, + Cry_of_Madness, + Sugar_Infusion, + Feast_of_Vengeance, + Animate_Candy_Minions, + Taste_of_Undeath, + Scourge_of_Candy, + Motivating_Insults, + Mad_King_Pony_Support, + Its_Good_to_Be_King, + Maddening_Laughter, + Mad_Kings_Influence, + Hidden_Talent = 2792, + Couriers_Haste, + Xinraes_Revenge, + Meek_Shall_Inherit = 2810, + Inverse_Ninja_Law = 2813, + Abyssal_Form = 2839, + Asura_Form, + Awakened_Head_Form, + Spider_Form, + Charr_Form, + Golem_Form, + Hellhound_Form, + Norn_Form, + Ooze_Form, + Rift_Warden_Form, + Yeti_Form = 2850, + Snowman_Form, + Energy_Drain_PvP, + Energy_Tap_PvP, + PvP_effect, + Ward_Against_Melee_PvP, + Lightning_Orb_PvP, + Aegis_PvP, + Watch_Yourself_PvP, + Enfeeble_PvP, + Ether_Renewal_PvP, + Penetrating_Attack_PvP, + Shadow_Form_PvP, + Discord_PvP, + Sundering_Attack_PvP, + Ritual_Lord_PvP, + Flesh_of_My_Flesh_PvP, + Ancestors_Rage_PvP, + Splinter_Weapon_PvP, + Assassins_Remedy_PvP, + Blinding_Surge_PvP, + Light_of_Deliverance_PvP, + Death_Pact_Signet_PvP, + Mystic_Sweep_PvP, + Eremites_Attack_PvP, + Harriers_Toss_PvP, + Defensive_Anthem_PvP, + Ballad_of_Restoration_PvP, + Song_of_Restoration_PvP, + Incoming_PvP, + Never_Surrender_PvP, + Mantra_of_Inscriptions_PvP = 2882, + For_Great_Justice_PvP, + Mystic_Regeneration_PvP, + Enfeebling_Blood_PvP, + Summoning_Sickness, + Signet_of_Judgment_PvP, + Chilling_Victory_PvP, + Unyielding_Aura_PvP = 2891, + Spirit_Bond_PvP, + Weapon_of_Warding_PvP, + Bamph_Lite, + Smiters_Boon_PvP, + Battle_Fervor_Deactivating_ROX, + Cloak_of_Faith_Deactivating_ROX, + Dark_Aura_Deactivating_ROX, + Chaotic_Power_Deactivating_ROX, + Strength_of_the_Oak_Deactivating_ROX, + Sinister_Golem_Form, + Reactor_Blast, + Reactor_Blast_Timer, + Jade_Brotherhood_Disguise, + Internal_Power_Engaged, + Target_Acquisition, + NOX_Beam, + NOX_Field_Dash, + NOXion_Buster, + Countdown, + Bit_Golem_Breaker, + Bit_Golem_Rectifier, + Bit_Golem_Crash, + Bit_Golem_Force, + NOX_Phantom = 2916, + NOX_Thunder, + NOX_Lock_On, + NOX_Driver, + NOX_Fire, + NOX_Knuckle, + NOX_Divider_Drive, + Yo_Ho_Ho_and_a_Bottle_of_Grog, + Oath_of_Protection, + Sloth_Hunters_Shot_PvP, + Bamph_Lifesteal, + Shrine_Backlash, + UNUSED_Amulet_of_Protection, + UNUSED_Eviscerate, + UNUSED_Rush, + UNUSED_Lions_Comfort, + UNUSED_Melandrus_Shot, + UNUSED_Sloth_Hunters_Shot, + UNUSED_Reversal_of_Damage, + UNUSED_Empathic_Removal, + UNUSED_Castigation_Signet, + UNUSED_Wail_of_Doom, + UNUSED_Rip_Enchantment, + UNUSED_Foul_Feast, + UNUSED_Plague_Sending, + UNUSED_Overload, + UNUSED_Wastrels_Worry, + UNUSED_Lyssas_Aura, + UNUSED_Empathy, + UNUSED_Shatterstone, + UNUSED_Glowing_Ice, + UNUSED_Freezing_Gust, + UNUSED_Glyph_of_Immolation, + UNUSED_Glyph_of_Restoration, + UNUSED_Hidden_Caltrops, + UNUSED_Black_Spider_Strike, + UNUSED_Caretakers_Charge, + UNUSED_Signet_of_Mystic_Speed, + UNUSED_Signet_of_Rage, + UNUSED_Signet_of_Judgement, + UNUSED_Vigorous_Spirit, + Western_Health_Shrine_Bonus, + Eastern_Health_Shrine_Bonus, + Experts_Dexterity_PvP, + Delayed_Blast_BAMPH = 2961, + Grentch_Form, + Snowball1 = 2964, + Signet_of_Spirits_PvP, + Signet_of_Ghostly_Might_PvP, + Avatar_of_Grenth_PvP, + Oversized_Tonic_Warning, + Read_the_Wind_PvP, + Mursaat_Form, + Blue_Rock_Candy_Rush, + Green_Rock_Candy_Rush, + Red_Rock_Candy_Rush, + Archer_Form, + Avatar_of_Balthazar_Form, + Champion_of_Balthazar_Form, + Priest_of_Balthazar_Form, + The_Black_Beast_of_Arrgh_Form, + Crystal_Guardian_Form, + Crystal_Spider_Form, + Bone_Dragon_Form1, + Saltspray_Dragon_Form, + Eye_of_Janthir_Form, + Footman_Form, + Ghostly_Hero_Form, + Guild_Lord_Form, + Gwen_Doll_Form, + Black_Moa_Form, + Black_Moa_Chick_Form, + Moa_Bird_Form, + White_Moa_Form, + Rainbow_Phoenix_Form, + Brown_Rabbit_Form, + White_Rabbit_Form, + Seer_Form, + Swarm_of_Bees_Form, + Seed_of_Resurrection1, + Fragility_PvP, + Strength_of_Honor_PvP, + Gunthers_Gaze, + Warriors_Endurance_PvP = 3002, + Armor_of_Unfeeling_PvP, + Signet_of_Creation_PvP, + Union_PvP, + Shadowsong_PvP, + Pain_PvP, + Destruction_PvP, + Soothing_PvP, + Displacement_PvP, + Preservation_PvP, + Life_PvP, + Recuperation_PvP, + Dissonance_PvP, + Earthbind_PvP, + Shelter_PvP, + Disenchantment_PvP, + Restoration_PvP, + Bloodsong_PvP, + Wanderlust_PvP, + Savannah_Heat_PvP, + Gaze_of_Fury_PvP, + Anguish_PvP, + Empowerment_PvP, + Recovery_PvP, + Go_for_the_Eyes_PvP, + Brace_Yourself_PvP, + Blazing_Finale_PvP, + Bladeturn_Refrain_PvP, + Signet_of_Return_PvP, + Cant_Touch_This_PvP, + Stand_Your_Ground_PvP, + We_Shall_Return_PvP, + Find_Their_Weakness_PvP, + Never_Give_Up_PvP, + Help_Me_PvP, + Fall_Back_PvP, + Agony_PvP, + Rejuvenation_PvP, + Anthem_of_Disruption_PvP, + Shadowsong_Master_Riyo, + Pain1, + Wanderlust1, + Spirit_Siphon_Master_Riyo, + Comfort_Animal_PvP, + Melandrus_Assault_PvP = 3047, + Shroud_of_Distress_PvP, + Unseen_Fury_PvP, + Predatory_Bond_PvP, + Enraged_Lunge_PvP, + Conviction_PvP, + Signet_of_Deadly_Corruption_PvP, + Masochism_PvP, + Pain_attack_Togo, + Pain_attack_Togo1, + Pain_attack_Togo2, + Unholy_Feast_PvP, + Signet_of_Agony_PvP, + Escape_PvP, + Death_Blossom_PvP, + Finale_of_Restoration_PvP, + Mantra_of_Resolve_PvP, + Lesser_Hard_Mode_NPC_Buff, + Charm_Animal1, + Charm_Animal2, + Henchman, + Charm_Animal_Codex, + Agent_of_the_Mad_King, + Sugar_Rush_Agent_of_the_Mad_King, + Sticky_Ground, + Sugar_Shock, + The_Mad_Kings_Influence, + Bone_Spike, + Flurry_of_Splinters, + Everlasting_Mobstopper_skill, + Weakened_by_Dhuum, + Curse_of_Dhuum, + Dhuums_Rest_Reaper_skill, + Dhuum_skill, + Summon_Champion, + Summon_Minions, + Touch_of_Dhuum, + Reaping_of_Dhuum, + Judgment_of_Dhuum, + Weight_of_Dhuum_hex, + Dhuums_Rest, + Spiritual_Healing, + Encase_Skeletal, + Reversal_of_Death, + Ghostly_Fury, + Henchman_Form_Pudash, + Henchman_Form_Dahlia, + Henchman_Form_Disenmaedel, + Henchman_Form_Errol_Hyl, + Henchman_Form_Lulu_Xan, + Henchman_Form_Tannaros, + Henchman_Form_Cassie_Santi, + Henchman_Form_Redemptor_Frohs, + Henchman_Form_Julyia, + Henchman_Form_Bellicus, + Henchman_Form_Dirk_Shadowrise, + Henchman_Form_Vincent_Evan, + Henchman_Form_Luzy_Fiera, + Henchman_Form_Motoko_Kai, + Henchman_Form_Hinata, + Henchman_Form_Kah_Xan, + Henchman_Form_Narcissia, + Henchman_Form_Zen_Siert, + Henchman_Form_Blenkeh, + Henchman_Form_Aurora_Allesandra, + Henchman_Form_Teena_the_Raptor, + Henchman_Form_Lora_Lanaya, + Henchman_Form_Adepte, + Henchman_Form_Haldibarn_Earendul, + Henchman_Form_Daky, + Henchman_Form_Syn_Spellstrike, + Henchman_Form_Divinus_Tutela, + Henchman_Form_Blahks, + Henchman_Form_Erick, + Henchman_Form_Ghavin, + Henchman_Form_Hobba_Inaste, + Henchman_Form_Bacchi_Coi, + Henchman_Form_Suzu, + Henchman_Form_Rollo_Lowlo, + Henchman_Form_Fuu_Rin, + Henchman_Form_Nuno, + Henchman_Form_Alsacien, + Henchman_Form_Uto_Wrotki, + Henchman_Form_Khai_Kemnebi, + Henchman_Form_Cole, + Weight_of_Dhuum = 3133, + Spirit_Form_disguise, + Spiritual_Healing_Reaper_skill, + Ghostly_Fury_Reaper_skill, + Reindeer_Form, + Reindeer_Form1, + Reindeer_Form2, + Staggering_Blow_PvP, + Lightning_Reflexes_PvP, + Fierce_Blow_PvP, + Renewing_Smash_PvP, + Heal_as_One_PvP, + Glass_Arrows_PvP, + Protective_Was_Kaolai_PvP, + Keen_Arrow_PvP, + Anthem_of_Envy_PvP, + Mending_Refrain_PvP, + Lesser_Flame_Sentinel_Resistance, + Empathy_PvP, + Crippling_Anguish_PvP, + Pain_attack_Signet_of_Spirits, + Pain_attack_Signet_of_Spirits1, + Pain_attack_Signet_of_Spirits2, + Soldiers_Stance_PvP, + Destructive_Was_Glaive_PvP, + Charm_Drake = 3159, + Theres_not_enough_time = 3162, + Keirans_Sniper_Shot, + Falken_Punch, + Golem_Pilebunker, + Drunken_Stumbling, + Koros_Gaze = 3170, + Ebon_Vanguard_Assassin_Support_NPC, + Ebon_Vanguard_Battle_Standard_of_Power, + Loose_Magic, + Well_Supplied, + Guild_Monument_Protected, + Strong_Natural_Resistance, + Elite_Regeneration, + Elite_Regeneration1, + Mantra_of_Signets_PvP, + Shatter_Delusions_PvP, + Illusionary_Weaponry_PvP, + Panic_PvP, + Migraine_PvP, + Accumulated_Pain_PvP, + Psychic_Instability_PvP, + Shared_Burden_PvP, + Stolen_Speed_PvP, + Unnatural_Signet_PvP, + Spiritual_Pain_PvP, + Frustration_PvP, + Mistrust_PvP, + Enchanters_Conundrum_PvP, + Signet_of_Clumsiness_PvP, + Mirror_of_Disenchantment_PvP, + Wandering_Eye_PvP, + Calculated_Risk_PvP, + Adoration, + Impending_Dhuum, + Sacrifice_Pawn, + Isaiahs_Balance, + Toriimos_Burning_Fury, + Oath_of_Protection1, + Defy_Pain_PvP = 3204, + Entourage, + Spectral_Infusion, + Entourage_Buffer, + Wastrels_Demise_PvP, + Shiro_Tagachi_Costume_Brawl_disguise = 3210, + Dunham_Costume_Brawl_disguise, + Palawa_Joko_Costume_Brawl_disguise, + Lawrence_Crafton_Costume_Brawl_disguise, + Saul_DAlessio_Costume_Brawl_disguise, + Turai_Ossa_Costume_Brawl_disguise, + Lieutenant_Thackeray_Costume_Brawl_disguise, + Gehraz_Costume_Brawl_disguise, + Master_Togo_Costume_Brawl_disguise, + Egil_Fireteller_Costume_Brawl_disguise, + Mysterious_Assassin_Costume_Brawl_disguise, + Gwen_Costume_Brawl_disguise, + Eve_Costume_Brawl_disguise, + Elementalist_Aziure_Costume_Brawl_disguise, + Jamei_Costume_Brawl_disguise, + Jora_Costume_Brawl_disguise, + Margrid_the_Sly_Costume_Brawl_disguise, + Varesh_Ossa_Costume_Brawl_disguise, + Headmaster_Quin_Costume_Brawl_disguise, + Kormir_Costume_Brawl_disguise, + Barbed_Signet_PvP = 3231, + Heal_Party_PvP, + Spoil_Victor_PvP, + Visions_of_Regret_PvP, + Keirans_Sniper_Shot_Hearts_of_the_North, + Gravestone_Marker, + Terminal_Velocity, + Relentless_Assault, + Natures_Blessing, + Find_Their_Weakness_Thackeray, + Theres_Nothing_to_Fear_Thackeray, + Coming_of_Spring, + Promise_of_Death, + Withering_Blade, + Deaths_Embrace, + Venom_Fang, + Survivors_Will, + Keiran_Thackeray_disguise, + Rain_of_Arrows, + Fox_Fangs_PvP = 3251, + Wild_Strike_PvP, + Ultra_Snowball, + Blizzard, + Ultra_Snowball1 = 3259, + Ultra_Snowball2, + Ultra_Snowball3, + Ultra_Snowball4, + Banishing_Strike_PvP, + Twin_Moon_Sweep_PvP, + Irresistible_Sweep_PvP, + Pious_Assault_PvP, + Ebon_Dust_Aura_PvP, + Heart_of_Holy_Flame_PvP, + Guiding_Hands_PvP, + Avatar_of_Dwayna_PvP, + Avatar_of_Melandru_PvP, + Mystic_Healing_PvP, + Signet_of_Pious_Restraint_PvP, + Vanguard_Initiate, + Victorious_Renewal = 3282, + A_Dying_Curse, + Rage_of_the_Djinn = 3288, + Fevered_Dreams_PvP, + Stun_Grenade, + Fragmentation_Grenade, + Tear_Gas, + Land_Mine, + Riot_Shield, + Club_Strike, + Bludgeon, + Tango_Down, + Ill_Be_Back, + Phased_Plasma_Burst, + Plasma_Shot, + Annihilator_Bash, + Sky_Net, + Damage_Assessment, + Going_Commando, + Koss_Form = 3306, + Dunkoro_Form, + Melonni_Form, + Acolyte_Jin_Form, + Acolyte_Sousuke_Form, + Tahlkora_Form, + Zhed_Shadowhoof_Form, + Margrid_the_Sly_Form, + Master_of_Whispers_Form, + Goren_Form, + Norgu_Form, + Morgahn_Form, + Razah_Form, + Olias_Form, + Zenmai_Form, + Ogden_Form, + Vekk_Form, + Gwen_Form, + Xandra_Form, + Kahmu_Form, + Jora_Form, + Pyre_Fierceshot_Form, + Anton_Form, + Hayda_Form, + Livia_Form, + Keiran_Thackeray_Form, + Miku_Form, + MOX_Form, + Shiro_Tagachi_Form, + Prince_Rurik_Form = 3336, + Margonite_Form, + Destroyer_Form, + Queen_Salma_Form, + Slightly_Mad_King_Thorn_Form, + Kuunavang_Form, + Lone_Wolf, + Stand_Together, + Unyielding_Spirit, + Reckless_Advance, + Aura_of_Thorns_PvP, + Dust_Cloak_PvP, + Lyssas_Haste_PvP, + Knight_Form, + Lord_Archer_Form, + Bodyguard_Form, + Guild_Thief_Form, + Ghostly_Priest_Form, + Flame_Sentinel_Form, + Solidarity = 3356, + There_Can_Be_Only_One, + Fight_Against_Despair, + Deaths_Succor, + Battle_of_Attrition, + Fight_or_Flight, + Renewing_Escape, + Battle_Frenzy, + The_Way_of_One, + Onslaught_PvP, + Heart_of_Fury_PvP, + Wounding_Strike_PvP, + Pious_Fury_PvP, + Party_Mode, + Smash_of_the_Titans, + Mirror_Shatter, + Illusion_of_Haste_PvP = 3373, + Illusion_of_Pain_PvP, + Aura_of_Restoration_PvP, + Shapeshift, + GOLEM_disguise, + Phase_Shield, + Reactor_Burst, + Ill_Be_Back1, + Annihilator_Strike, + Annihilator_Beam, + Annihilator_Knuckle, + Annihilator_Toss, + Web_of_Disruption_PvP = 3386, + Chain_Combo, + All_In = 3390, + Jack_of_All_Trades, + Amateur_Hour, + Odrans_Razor, + Like_a_Boss, + The_Boss, + Lightning_Hammer_PvP, + Elemental_Flame_PvP, + Slippery_Ground_PvP, + Disguised_when_using_everlasting_tonics_except_Everlasting_Legionnaire_Tonic, + Disguised_when_using_non_everlasting_tonics, + Disguised_verification_requested, + Tonic_Tipsiness, + Parting_Gift, + Gift_of_Battle, + Rolling_Start, + Disguised_when_using_Everlasting_Legionnaire_Tonic, + Time_Ward = 3422, + Soul_Taker, + Over_the_Limit, + Judgement_Strike, + Seven_Weapon_Stance, + Together_as_one, + Shadow_Theft, + Weapons_of_Three_Forges, + Vow_of_Revolution, + Heroic_Refrain, + Reforged_Mode = 0xD6A, + Dhuums_Covenant_Broken, + Count = 0xD6c, + } + + public enum SkillType : int + { + Bounty = 1, + Scroll = 2, + Stance = 3, + Hex = 4, + Spell = 5, + Enchantment = 6, + Signet = 7, + Condition = 8, + Well = 9, + Skill = 10, + Ward = 11, + Glyph = 12, + Title = 13, + Attack = 14, + Shout = 15, + Skill2 = 16, + Passive = 17, + Environmental = 18, + Preparation = 19, + PetAttack = 20, + Trap = 21, + Ritual = 22, + EnvironmentalTrap = 23, + ItemSpell = 24, + WeaponSpell = 25, + Form = 26, + Chant = 27, + EchoRefrain = 28, + Disguise = 29, + } + + public enum StoragePane : byte + { + Storage_1, + Storage_2, + Storage_3, + Storage_4, + Storage_5, + Storage_6, + Storage_7, + Storage_8, + Storage_9, + Storage_10, + Storage_11, + Storage_12, + Storage_13, + Storage_14, + Material_Storage, + } + + public enum Tick : int + { + NOT_READY, + READY, + } + + public enum TitleID : uint + { + Hero, + TyrianCarto, + CanthanCarto, + Gladiator, + Champion, + Kurzick, + Luxon, + Drunkard, + Deprecated_SkillHunter, + Survivor, + KoaBD, + Deprecated_TreasureHunter, + Deprecated_Wisdom, + ProtectorTyria, + ProtectorCantha, + Lucky, + Unlucky, + Sunspear, + ElonianCarto, + ProtectorElona, + Lightbringer, + LDoA, + Commander, + Gamer, + SkillHunterTyria, + VanquisherTyria, + SkillHunterCantha, + VanquisherCantha, + SkillHunterElona, + VanquisherElona, + LegendaryCarto, + LegendaryGuardian, + LegendarySkillHunter, + LegendaryVanquisher, + Sweets, + GuardianTyria, + GuardianCantha, + GuardianElona, + Asuran, + Deldrimor, + Vanguard, + Norn, + MasterOfTheNorth, + Party, + Zaishen, + TreasureHunter, + Wisdom, + Codex, + None = 0xff, + } + + public enum CharSortOrder : uint + { + None, + Alphabetize, + PvPRP, + } + + public enum TransactionType : uint + { + AccountName, + MerchantBuy, + CollectorBuy, + CrafterBuy, + WeaponsmithCustomize, + Services, + DonateFaction, + Unused, + GuildRegistration, + GuildCape, + SkillTrainer, + MerchantSell, + TraderBuy, + TraderSell, + UnlockHero, + UnlockItem, + UnlockSkill, + } + + public enum Channel : int + { + CHANNEL_ALLIANCE = 0, + CHANNEL_ALLIES = 1, + CHANNEL_GWCA1 = 2, + CHANNEL_ALL = 3, + CHANNEL_GWCA2 = 4, + CHANNEL_MODERATOR = 5, + CHANNEL_EMOTE = 6, + CHANNEL_WARNING = 7, + CHANNEL_GWCA3 = 8, + CHANNEL_GUILD = 9, + CHANNEL_GLOBAL = 10, + CHANNEL_GROUP = 11, + CHANNEL_TRADE = 12, + CHANNEL_ADVISORY = 13, + CHANNEL_WHISPER = 14, + CHANNEL_COUNT, + CHANNEL_COMMAND, + CHANNEL_UNKNOW = -1, + } + + public enum ControlAction : uint + { + ControlAction_None = 0, + ControlAction_Screenshot = 0xAE, + ControlAction_CloseAllPanels = 0x85, + ControlAction_ToggleInventoryWindow = 0x8B, + ControlAction_OpenScoreChart = 0xBD, + ControlAction_OpenTemplateManager = 0xD3, + ControlAction_OpenSaveEquipmentTemplate = 0xD4, + ControlAction_OpenSaveSkillTemplate = 0xD5, + ControlAction_OpenParty = 0xBF, + ControlAction_OpenGuild = 0xBA, + ControlAction_OpenFriends = 0xB9, + ControlAction_ToggleAllBags = 0xB8, + ControlAction_OpenMissionMap = 0xB6, + ControlAction_OpenBag2 = 0xB5, + ControlAction_OpenBag1 = 0xB4, + ControlAction_OpenBelt = 0xB3, + ControlAction_OpenBackpack = 0xB2, + ControlAction_OpenSkillsAndAttributes = 0x8F, + ControlAction_OpenQuestLog = 0x8E, + ControlAction_OpenWorldMap = 0x8C, + ControlAction_OpenOptions = 0x8D, + ControlAction_OpenHero = 0x8A, + ControlAction_CycleEquipment = 0x86, + ControlAction_ActivateWeaponSet1 = 0x81, + ControlAction_ActivateWeaponSet2, + ControlAction_ActivateWeaponSet3, + ControlAction_ActivateWeaponSet4, + ControlAction_DropItem = 0xCD, + ControlAction_ChatReply = 0xBE, + ControlAction_OpenChat = 0xA1, + ControlAction_OpenAlliance = 0x88, + ControlAction_ReverseCamera = 0x90, + ControlAction_StrafeLeft = 0x91, + ControlAction_StrafeRight = 0x92, + ControlAction_TurnLeft = 0xA2, + ControlAction_TurnRight = 0xA3, + ControlAction_MoveBackward = 0xAC, + ControlAction_MoveForward = 0xAD, + ControlAction_CancelAction = 0xAF, + ControlAction_Interact = 0x80, + ControlAction_ReverseDirection = 0xB1, + ControlAction_Autorun = 0xB7, + ControlAction_Follow = 0xCC, + ControlAction_TargetPartyMember1 = 0x96, + ControlAction_TargetPartyMember2, + ControlAction_TargetPartyMember3, + ControlAction_TargetPartyMember4, + ControlAction_TargetPartyMember5, + ControlAction_TargetPartyMember6, + ControlAction_TargetPartyMember7, + ControlAction_TargetPartyMember8, + ControlAction_TargetPartyMember9 = 0xC6, + ControlAction_TargetPartyMember10, + ControlAction_TargetPartyMember11, + ControlAction_TargetPartyMember12, + ControlAction_TargetNearestItem = 0xC3, + ControlAction_TargetNextItem = 0xC4, + ControlAction_TargetPreviousItem = 0xC5, + ControlAction_TargetPartyMemberNext = 0xCA, + ControlAction_TargetPartyMemberPrevious = 0xCB, + ControlAction_TargetAllyNearest = 0xBC, + ControlAction_ClearTarget = 0xE3, + ControlAction_TargetSelf = 0xA0, + ControlAction_TargetPriorityTarget = 0x9F, + ControlAction_TargetNearestEnemy = 0x93, + ControlAction_TargetNextEnemy = 0x95, + ControlAction_TargetPreviousEnemy = 0x9E, + ControlAction_ShowOthers = 0x89, + ControlAction_ShowTargets = 0x94, + ControlAction_CameraZoomIn = 0xCE, + ControlAction_CameraZoomOut = 0xCF, + ControlAction_ClearPartyCommands = 0xDB, + ControlAction_CommandParty = 0xD6, + ControlAction_CommandHero1, + ControlAction_CommandHero2, + ControlAction_CommandHero3, + ControlAction_CommandHero4 = 0x102, + ControlAction_CommandHero5, + ControlAction_CommandHero6, + ControlAction_CommandHero7, + ControlAction_OpenHero1PetCommander = 0xE0, + ControlAction_OpenHero2PetCommander, + ControlAction_OpenHero3PetCommander, + ControlAction_OpenHero4PetCommander = 0xFE, + ControlAction_OpenHero5PetCommander, + ControlAction_OpenHero6PetCommander, + ControlAction_OpenHero7PetCommander, + ControlAction_OpenHeroCommander1 = 0xDC, + ControlAction_OpenHeroCommander2, + ControlAction_OpenHeroCommander3, + ControlAction_OpenPetCommander, + ControlAction_OpenHeroCommander4 = 0x126, + ControlAction_OpenHeroCommander5, + ControlAction_OpenHeroCommander6, + ControlAction_OpenHeroCommander7, + ControlAction_Hero1Skill1 = 0xE5, + ControlAction_Hero1Skill2, + ControlAction_Hero1Skill3, + ControlAction_Hero1Skill4, + ControlAction_Hero1Skill5, + ControlAction_Hero1Skill6, + ControlAction_Hero1Skill7, + ControlAction_Hero1Skill8, + ControlAction_Hero2Skill1, + ControlAction_Hero2Skill2, + ControlAction_Hero2Skill3, + ControlAction_Hero2Skill4, + ControlAction_Hero2Skill5, + ControlAction_Hero2Skill6, + ControlAction_Hero2Skill7, + ControlAction_Hero2Skill8, + ControlAction_Hero3Skill1, + ControlAction_Hero3Skill2, + ControlAction_Hero3Skill3, + ControlAction_Hero3Skill4, + ControlAction_Hero3Skill5, + ControlAction_Hero3Skill6, + ControlAction_Hero3Skill7, + ControlAction_Hero3Skill8, + ControlAction_Hero4Skill1 = 0x106, + ControlAction_Hero4Skill2, + ControlAction_Hero4Skill3, + ControlAction_Hero4Skill4, + ControlAction_Hero4Skill5, + ControlAction_Hero4Skill6, + ControlAction_Hero4Skill7, + ControlAction_Hero4Skill8, + ControlAction_Hero5Skill1, + ControlAction_Hero5Skill2, + ControlAction_Hero5Skill3, + ControlAction_Hero5Skill4, + ControlAction_Hero5Skill5, + ControlAction_Hero5Skill6, + ControlAction_Hero5Skill7, + ControlAction_Hero5Skill8, + ControlAction_Hero6Skill1, + ControlAction_Hero6Skill2, + ControlAction_Hero6Skill3, + ControlAction_Hero6Skill4, + ControlAction_Hero6Skill5, + ControlAction_Hero6Skill6, + ControlAction_Hero6Skill7, + ControlAction_Hero6Skill8, + ControlAction_Hero7Skill1, + ControlAction_Hero7Skill2, + ControlAction_Hero7Skill3, + ControlAction_Hero7Skill4, + ControlAction_Hero7Skill5, + ControlAction_Hero7Skill6, + ControlAction_Hero7Skill7, + ControlAction_Hero7Skill8, + ControlAction_UseSkill1 = 0xA4, + ControlAction_UseSkill2, + ControlAction_UseSkill3, + ControlAction_UseSkill4, + ControlAction_UseSkill5, + ControlAction_UseSkill6, + ControlAction_UseSkill7, + ControlAction_UseSkill8, + ControlAction_ToggleGamepadCursorMode = 0x13d, + } + + public enum EnumPreference : uint + { + CharSortOrder, + AntiAliasing, + Reflections, + ShaderQuality, + ShadowQuality, + TerrainQuality, + InterfaceSize, + FrameLimiter, + Count = 0x8, + } + + public enum FlagPreference : uint + { + FlagPref_0x0, + FlagPref_0x1, + FlagPref_0x2, + FlagPref_0x3, + ChannelAlliance, + FlagPref_0x5, + ChannelEmotes, + ChannelGuild, + ChannelLocal, + ChannelGroup, + ChannelTrade, + FlagPref_0xb, + FlagPref_0xc, + FlagPref_0xd, + FlagPref_0xe, + FlagPref_0xf, + FlagPref_0x10, + ShowTextInSkillFloaters, + ShowKRGBRatingsInGame, + FlagPref_0x13, + AutoHideUIOnLoginScreen, + DoubleClickToInteract, + InvertMouseControlOfCamera, + DisableMouseWalking, + AutoCameraInObserveMode, + AutoHideUIInObserveMode, + FlagPref_0x1a, + FlagPref_0x1b, + FlagPref_0x1c, + FlagPref_0x1d, + FlagPref_0x1e, + FlagPref_0x1f, + FlagPref_0x20, + FlagPref_0x21, + FlagPref_0x22, + FlagPref_0x23, + FlagPref_0x24, + FlagPref_0x25, + FlagPref_0x26, + FlagPref_0x27, + FlagPref_0x28, + FlagPref_0x29, + FlagPref_0x2a, + FlagPref_0x2b, + FlagPref_0x2c, + RememberAccountName, + IsWindowed, + FlagPref_0x2f, + FlagPref_0x30, + ShowSpendAttributesButton, + ConciseSkillDescriptions, + DoNotShowSkillTipsOnEffectMonitor, + DoNotShowSkillTipsOnSkillBars, + FlagPref_0x35, + FlagPref_0x36, + MuteWhenGuildWarsIsInBackground, + FlagPref_0x38, + AutoTargetFoes, + AutoTargetNPCs, + AlwaysShowNearbyNamesPvP, + FadeDistantNameTags, + FlagPref_0x3d, + FlagPref_0x3e, + FlagPref_0x3f, + FlagPref_0x40, + WaitForVSync, + FlagPref_0x42, + FlagPref_0x43, + FlagPref_0x44, + DoNotCloseWindowsOnEscape, + ShowMinimapOnWorldMap, + FlagPref_0x47, + FlagPref_0x48, + FlagPref_0x49, + FlagPref_0x4a, + FlagPref_0x4b, + FlagPref_0x4c, + FlagPref_0x4d, + FlagPref_0x4e, + FlagPref_0x4f, + FlagPref_0x50, + FlagPref_0x51, + HighResolutionPlayerTextures, + FlagPref_0x53, + EnhancedDrawDistance, + WhispersFromFriendsEtcOnly, + ShowChatTimestamps, + ShowCollapsedBags, + ItemRarityBorder, + AlwaysShowAllyNames, + AlwaysShowFoeNames, + FlagPref_0x5b, + LockCompassRotation, + EnableGamepad, + DpiScaling, + FlagPref_0x5f, + FlagPref_0x60, + HdSkillIcons, + HdBloom, + FlagPref_0x63, + Ssao, + FlagPref_0x65, + FlagPref_0x66, + FlagPref_0x67, + FlagPref_0x68, + FlagPref_0x69, + FlagPref_0x6a, + FlagPref_0x6b, + Count, + } + + public enum NumberCommandLineParameter : uint + { + Unk1, + Unk2, + Unk3, + FPS, + Count, + } + + public enum NumberPreference : uint + { + AutoTournPartySort, + ChatState, + ChatTab, + DistrictLastVisitedLanguage, + DistrictLastVisitedLanguage2, + DistrictLastVisitedNonInternationalLanguage, + DistrictLastVisitedNonInternationalLanguage2, + FloaterScale, + FullscreenGamma, + InventoryBag, + Language, + LanguageAudio, + LastDevice, + Refresh, + ScreenSizeX, + ScreenSizeY, + SkillListFilterRarity, + SkillListSortMethod, + SkillListViewMode, + SoundQuality, + StorageBagPage, + TextureLod, + TexFilterMode, + VolBackground, + VolDialog, + VolEffect, + VolMusic, + VolUi, + Vote, + WindowPosX, + WindowPosY, + WindowSizeX, + WindowSizeY, + SealedSeed, + SealedCount, + CameraFov, + CameraRotationSpeed, + ScreenBorderless, + VolMaster, + ClockMode, + MobileUiScale, + GamepadCursorSpeed, + LastLoginMethod, + Count = 0x2b, + } + + public enum StringPreference : uint + { + Unk1, + Unk2, + LastCharacterName, + Count = 0x3, + } + + public enum TooltipType : uint + { + None = 0x0, + EncString1 = 0x4, + EncString2 = 0x6, + Item = 0x8, + WeaponSet = 0xC, + Skill = 0x14, + Attribute = 0x4000, + } + + public enum UIMessage : uint + { + kNone = 0x0, + kFrameMessage_0x1, + kFrameMessage_0x2, + kFrameMessage_0x3, + kFrameMessage_0x4, + kFrameMessage_0x5, + kFrameMessage_0x6, + kFrameMessage_0x7, + kResize, + kInitFrame, + kFrameMessage_0xa, + kDestroyFrame, + kFrameDisabledChange, + kFrameMessage_0xd, + kFrameMessage_0xe, + kFrameMessage_0xf, + kFrameMessage_0x10, + kFrameMessage_0x11, + kFrameMessage_0x12, + kFrameMessage_0x13, + kFrameMessage_0x14, + kFrameMessage_0x15, + kFrameMessage_0x16, + kFrameMessage_0x17, + kFrameMessage_0x18, + kFrameMessage_0x19, + kFrameMessage_0x1a, + kFrameMessage_0x1b, + kFrameMessage_0x1c, + kFrameMessage_0x1d, + kKeyDown = 0x20, + kSetFocus, + kKeyUp, + kFrameMessage_0x21, + kMouseClick, + kFrameMessage_0x23, + kMouseCoordsClick, + kFrameMessage_0x25, + kMouseUp, + kFrameMessage_0x27, + kFrameMessage_0x28, + kFrameMessage_0x29, + kFrameMessage_0x2a, + kFrameMessage_0x2b, + kToggleButtonDown, + kFrameMessage_0x2d, + kMouseClick2 = 0x31, + kMouseAction, + kRenderFrame_0x30, + kRenderFrame_0x31 = 0x35, + kFrameVisibilityChanged, + kSetLayout, + kMeasureContent, + kFrameMessage_0x35, + kFrameMessage_0x36, + kRefreshContent, + kFrameMessage_0x38, + kFrameMessage_0x39, + kFrameMessage_0x3a, + kFrameMessage_0x3b, + kFrameMessage_0x3c = 0x44, + kFrameMessage_0x3d, + kFrameMessage_0x3e, + kFrameMessage_0x3f, + kFrameMessage_0x40, + kFrameMessage_0x41, + kFrameMessage_0x42, + kRenderFrame_0x43, + kFrameMessage_0x44 = 0x52, + kFrameMessage_0x45, + kFrameMessage_0x46 = 0x56, + kFrameMessage_0x47, + kFrameMessage_0x48, + kFrameMessage_0x49, + kFrameMessage_0x4a, + kFrameMessage_0x4b, + kFrameMessage_0x4c, + kFrameMessage_0x4d, + kFrameMessage_0x4e, + kFrameMessage_0x4f, + kFrameMessage_0x50, + kFrameMessage_0x51, + kFrameMessage_0x52, + kFrameMessage_0x53, + kFrameMessage_0x54, + kFrameMessage_0x55, + kFrameMessage_0x56, + kFrameMessage_0x57, + kMessage_0x10000000 = 0x10000000, + kMessage_0x10000001, + kMessage_0x10000002, + kMessage_0x10000003, + kMessage_0x10000004, + kMessage_0x10000005, + kMessage_0x10000006, + kAgentUpdate, + kAgentDestroy, + kUpdateAgentEffects, + kMessage_0x1000000a, + kMessage_0x1000000b, + kDialogueMessage, + kMessage_0x1000000d, + kMessage_0x1000000e, + kMessage_0x1000000f, + kMessage_0x10000010, + kMessage_0x10000011, + kMessage_0x10000012, + kMessage_0x10000013, + kMessage_0x10000014, + kMessage_0x10000015, + kMessage_0x10000016, + kAgentSpeechBubble, + kMessage_0x10000018, + kShowAgentNameTag, + kHideAgentNameTag, + kSetAgentNameTagAttribs, + kMessage_0x1000001c, + kSetAgentProfession, + kMessage_0x1000001e, + kMessage_0x1000001f, + kChangeTarget, + kMessage_0x10000021, + kMessage_0x10000022, + kMessage_0x10000023, + kAgentSkillActivated, + kAgentSkillActivatedInstantly, + kAgentSkillCancelled, + kAgentSkillStartedCast, + kMessage_0x10000028, + kShowMapEntryMessage, + kSetCurrentPlayerData, + kMessage_0x1000002b, + kMessage_0x1000002c, + kMessage_0x1000002d, + kMessage_0x1000002e, + kMessage_0x1000002f, + kMessage_0x10000030, + kMessage_0x10000031, + kMessage_0x10000032, + kMessage_0x10000033, + kPostProcessingEffect, + kMessage_0x10000035, + kMessage_0x10000036, + kMessage_0x10000037, + kHeroAgentAdded, + kHeroDataAdded, + kMessage_0x1000003a, + kMessage_0x1000003b, + kMessage_0x1000003c, + kMessage_0x1000003d, + kMessage_0x1000003e, + kMessage_0x1000003f, + kShowXunlaiChest, + kMessage_0x10000041, + kMessage_0x10000042, + kMessage_0x10000043, + kMessage_0x10000044, + kMessage_0x10000045, + kMinionCountUpdated, + kMoraleChange, + kMessage_0x10000048, + kMessage_0x10000049, + kMessage_0x1000004a, + kMessage_0x1000004b, + kMessage_0x1000004c, + kMessage_0x1000004d, + kMessage_0x1000004e, + kMessage_0x1000004f, + kLoginStateChanged, + kMessage_0x10000051, + kMessage_0x10000052, + kMessage_0x10000053, + kMessage_0x10000054, + kEffectAdd, + kEffectRenew, + kEffectRemove, + kMessage_0x10000058, + kMessage_0x10000059, + kMessage_0x1000005a, + kSkillActivated, + kMessage_0x1000005c, + kMessage_0x1000005d, + kUpdateSkillbar, + kUpdateSkillsAvailable, + kMessage_0x10000060, + kMessage_0x10000061, + kMessage_0x10000062, + kMessage_0x10000063, + kPlayerTitleChanged, + kTitleProgressUpdated, + kExperienceGained, + kMessage_0x10000067, + kMessage_0x10000068, + kMessage_0x10000069, + kMessage_0x1000006a, + kMessage_0x1000006b, + kMessage_0x1000006c, + kMessage_0x1000006d, + kMessage_0x1000006e, + kMessage_0x1000006f, + kMessage_0x10000070, + kMessage_0x10000071, + kMessage_0x10000072, + kMessage_0x10000073, + kMessage_0x10000074, + kMessage_0x10000075, + kMessage_0x10000076, + kMessage_0x10000077, + kMessage_0x10000078, + kMessage_0x10000079, + kMessage_0x1000007a, + kMessage_0x1000007b, + kMessage_0x1000007c, + kMessage_0x1000007d, + kMessage_0x1000007e, + kWriteToChatLog, + kWriteToChatLogWithSender, + kAllyOrGuildMessage, + kPlayerChatMessage, + kMessage_0x10000083, + kFloatingWindowMoved, + kMessage_0x10000085, + kMessage_0x10000086, + kMessage_0x10000087, + kMessage_0x10000088, + kMessage_0x10000089, + kMessage_0x1000008a, + kFriendUpdated, + kMapLoaded, + kMessage_0x1000008d, + kMessage_0x1000008e, + kMessage_0x1000008f, + kMessage_0x10000090, + kMessage_0x10000091, + kOpenWhisper, + kMessage_0x10000093, + kMessage_0x10000094, + kMessage_0x10000095, + kMessage_0x10000096, + kMessage_0x10000097, + kLoadMapContext, + kMessage_0x10000099, + kMessage_0x1000009a, + kMessage_0x1000009b, + kDialogueMessageUpdated, + kLogout, + kCompassDraw, + kMessage_0x1000009f, + kMessage_0x100000a0, + kMessage_0x100000a1, + kOnScreenMessage, + kDialogButton, + kMessage_0x100000a4, + kMessage_0x100000a5, + kDialogBody, + kMessage_0x100000a7, + kMessage_0x100000a8, + kMessage_0x100000a9, + kMessage_0x100000aa, + kMessage_0x100000ab, + kMessage_0x100000ac, + kMessage_0x100000ad, + kMessage_0x100000ae, + kMessage_0x100000af, + kMessage_0x100000b0, + kMessage_0x100000b1, + kMessage_0x100000b2, + kTargetNPCPartyMember, + kTargetPlayerPartyMember, + kVendorWindow, + kMessage_0x100000b6, + kMessage_0x100000b7, + kMessage_0x100000b8, + kVendorItems, + kMessage_0x100000ba, + kVendorTransComplete, + kMessage_0x100000bc, + kVendorQuote, + kMessage_0x100000be, + kMessage_0x100000bf, + kMessage_0x100000c0, + kMessage_0x100000c1, + kStartMapLoad, + kMessage_0x100000c3, + kMessage_0x100000c4, + kMessage_0x100000c5, + kMessage_0x100000c6, + kWorldMapUpdated, + kMessage_0x100000c8, + kMessage_0x100000c9, + kMessage_0x100000ca, + kMessage_0x100000cb, + kMessage_0x100000cc, + kMessage_0x100000cd, + kMessage_0x100000ce, + kMessage_0x100000cf, + kMessage_0x100000d0, + kMessage_0x100000d1, + kMessage_0x100000d2, + kMessage_0x100000d3, + kMessage_0x100000d4, + kMessage_0x100000d5, + kMessage_0x100000d6, + kMessage_0x100000d7, + kMessage_0x100000d8, + kMessage_0x100000d9, + kGuildMemberUpdated, + kMessage_0x100000db, + kMessage_0x100000dc, + kMessage_0x100000dd, + kMessage_0x100000de, + kMessage_0x100000df, + kMessage_0x100000e0, + kShowHint, + kMessage_0x100000e2, + kMessage_0x100000e3, + kMessage_0x100000e4, + kMessage_0x100000e5, + kMessage_0x100000e6, + kMessage_0x100000e7, + kMessage_0x100000e8, + kWeaponSetSwapComplete, + kWeaponSetSwapCancel, + kWeaponSetUpdated, + kUpdateGoldCharacter, + kUpdateGoldStorage, + kInventorySlotUpdated, + kEquipmentSlotUpdated, + kMessage_0x100000f0, + kInventorySlotCleared, + kEquipmentSlotCleared, + kMessage_0x100000f3, + kMessage_0x100000f4, + kMessage_0x100000f5, + kMessage_0x100000f6, + kMessage_0x100000f7, + kMessage_0x100000f8, + kMessage_0x100000f9, + kPvPWindowContent, + kMessage_0x100000fb, + kMessage_0x100000fc, + kMessage_0x100000fd, + kMessage_0x100000fe, + kMessage_0x100000ff, + kMessage_0x10000100, + kMessage_0x10000101, + kPreStartSalvage, + kTomeSkillSelection, + kMessage_0x10000104, + kTradePlayerUpdated, + kItemUpdated, + kMessage_0x10000107, + kMessage_0x10000108, + kMessage_0x10000109, + kMessage_0x1000010a, + kMessage_0x1000010b, + kMessage_0x1000010c, + kMessage_0x1000010d, + kMessage_0x1000010e, + kMessage_0x1000010f, + kMessage_0x10000110, + kMapChange, + kMessage_0x10000112, + kMessage_0x10000113, + kMessage_0x10000114, + kCalledTargetChange, + kMessage_0x10000116, + kMessage_0x10000117, + kMessage_0x10000118, + kErrorMessage, + kPartyHardModeChanged, + kPartyAddHenchman, + kPartyRemoveHenchman, + kMessage_0x1000011d, + kPartyAddHero, + kPartyRemoveHero, + kMessage_0x10000120, + kMessage_0x10000121, + kMessage_0x10000122, + kMessage_0x10000123, + kPartyAddPlayer, + kMessage_0x10000125, + kPartyRemovePlayer, + kMessage_0x10000127, + kMessage_0x10000128, + kMessage_0x10000129, + kDisableEnterMissionBtn, + kMessage_0x1000012b, + kMessage_0x1000012c, + kShowCancelEnterMissionBtn, + kMessage_0x1000012e, + kPartyDefeated, + kMessage_0x10000130, + kMessage_0x10000131, + kMessage_0x10000132, + kPartySearchCreated, + kPartySearchIdChanged, + kPartySearchRemoved, + kPartySearchUpdated, + kPartySearchInviteReceived, + kMessage_0x10000138, + kPartySearchInviteSent, + kPartyShowConfirmDialog, + kMessage_0x1000013b, + kMessage_0x1000013c, + kMessage_0x1000013d, + kMessage_0x1000013e, + kMessage_0x1000013f, + kPreferenceEnumChanged, + kPreferenceFlagChanged, + kPreferenceValueChanged, + kUIPositionChanged, + kPreBuildLoginScene, + kMessage_0x10000145, + kMessage_0x10000146, + kMessage_0x10000147, + kMessage_0x10000148, + kMessage_0x10000149, + kMessage_0x1000014a, + kMessage_0x1000014b, + kMessage_0x1000014c, + kMessage_0x1000014d, + kQuestAdded, + kQuestDetailsChanged, + kQuestRemoved, + kClientActiveQuestChanged, + kMessage_0x10000152, + kServerActiveQuestChanged, + kUnknownQuestRelated, + kMessage_0x10000155, + kDungeonComplete, + kMissionComplete, + kMessage_0x10000158, + kVanquishComplete, + kObjectiveAdd, + kObjectiveComplete, + kObjectiveUpdated, + kMessage_0x1000015d, + kMessage_0x1000015e, + kMessage_0x1000015f, + kMessage_0x10000160, + kMessage_0x10000161, + kMessage_0x10000162, + kMessage_0x10000163, + kMessage_0x10000164, + kTradeSessionStart, + kMessage_0x10000166, + kMessage_0x10000167, + kMessage_0x10000168, + kMessage_0x10000169, + kMessage_0x1000016a, + kTradeSessionUpdated, + kMessage_0x1000016c, + kMessage_0x1000016d, + kMessage_0x1000016e, + kMessage_0x1000016f, + kMessage_0x10000170, + kMessage_0x10000171, + kMessage_0x10000172, + kMessage_0x10000173, + kMessage_0x10000174, + kCheckUIState, + kMessage_0x10000176, + kMessage_0x10000177, + kMessage_0x10000178, + kMessage_0x10000178_1, + kMessage_0x10000178_2, + kMessage_0x10000178_3, + kDestroyUIPositionOverlay, + kEnableUIPositionOverlay, + kMessage_0x1000017b, + kGuildHall, + kMessage_0x1000017d, + kLeaveGuildHall, + kTravel, + kOpenWikiUrl, + kMessage_0x10000181, + kMessage_0x10000182, + kSetPreGameContext_Value0, + kMessage_0x10000184, + kGetPreGameContext_Value0, + kSetPreGameContext_Value1, + kGetPreGameContext_Value1, + kMessage_0x10000186, + kMessage_0x10000187, + kMessage_0x10000188, + kMessage_0x10000189, + kMessage_0x1000018a, + kMessage_0x1000018b, + kMessage_0x1000018c, + kMessage_0x1000018d, + kAppendMessageToChat, + kMessage_0x1000018f, + kMessage_0x10000190, + kMessage_0x10000191, + kMessage_0x10000192, + kMessage_0x10000193, + kMessage_0x10000194, + kMessage_0x10000195, + kMessage_0x10000196, + kMessage_0x10000197, + kMessage_0x10000198, + kMessage_0x10000199, + kMessage_0x1000019a, + kMessage_0x1000019b, + kHideHeroPanel, + kShowHeroPanel, + kMessage_0x1000019e, + kMessage_0x1000019f, + kMessage_0x100001a0, + kGetInventoryAgentId, + kEquipItem, + kMoveItem, + kMessage_0x100001a4, + kMessage_0x100001a5, + kInitiateTrade, + kMessage_0x100001a7, + kMessage_0x100001a8, + kMessage_0x100001a9, + kMessage_0x100001aa, + kMessage_0x100001ab, + kMessage_0x100001ac, + kMessage_0x100001ad, + kMessage_0x100001ae, + kMessage_0x100001af, + kMessage_0x100001b0, + kMessage_0x100001b1, + kMessage_0x100001b2, + kMessage_0x100001b3, + kMessage_0x100001b4, + kMessage_0x100001b5, + kInventoryAgentChanged, + kMessage_0x100001b7, + kMessage_0x100001b8, + kMessage_0x100001b9, + kMessage_0x100001ba, + kMessage_0x100001bb, + kMessage_0x100001bc, + kMessage_0x100001bd, + kPromptSaveTemplate, + kOpenTemplate, + kSendLoadSkillTemplate = 0x30000000 | 0x3, + kSendPingWeaponSet = 0x30000000 | 0x4, + kSendMoveItem = 0x30000000 | 0x5, + kSendMerchantRequestQuote = 0x30000000 | 0x6, + kSendMerchantTransactItem = 0x30000000 | 0x7, + kSendUseItem = 0x30000000 | 0x8, + kSendSetActiveQuest = 0x30000000 | 0x9, + kSendAbandonQuest = 0x30000000 | 0xA, + kSendChangeTarget = 0x30000000 | 0xB, + kSendCallTarget = 0x30000000 | 0x13, + kSendDialog = 0x30000000 | 0x16, + kStartWhisper = 0x30000000 | 0x17, + kGetSenderColor = 0x30000000 | 0x18, + kGetMessageColor = 0x30000000 | 0x19, + kSendChatMessage = 0x30000000 | 0x1B, + kLogChatMessage = 0x30000000 | 0x1D, + kRecvWhisper = 0x30000000 | 0x1E, + kPrintChatMessage = 0x30000000 | 0x1F, + kSendWorldAction = 0x30000000 | 0x20, + kSetRendererValue = 0x30000000 | 0x21, + kIdentifyItem = 0x30000000 | 0x22, + kSalvageItem = 0x30000000 | 0x23, + } + + public enum WindowID : uint + { + WindowID_Dialogue1 = 0x0, + WindowID_Dialogue2 = 0x1, + WindowID_MissionGoals = 0x2, + WindowID_DropBundle = 0x3, + WindowID_Chat = 0x4, + WindowID_InGameClock = 0x6, + WindowID_Compass = 0x7, + WindowID_DamageMonitor = 0x8, + WindowID_PerformanceMonitor = 0xB, + WindowID_EffectsMonitor = 0xC, + WindowID_Hints = 0xD, + WindowID_MissionStatusAndScoreDisplay = 0xF, + WindowID_Notifications = 0x11, + WindowID_Skillbar = 0x14, + WindowID_SkillMonitor = 0x15, + WindowID_UpkeepMonitor = 0x17, + WindowID_SkillWarmup = 0x18, + WindowID_Menu = 0x1A, + WindowID_EnergyBar = 0x1C, + WindowID_ExperienceBar = 0x1D, + WindowID_HealthBar = 0x1E, + WindowID_TargetDisplay = 0x1F, + WindowID_MissionProgress = 0xE, + WindowID_TradeButton = 0x21, + WindowID_WeaponBar = 0x22, + WindowID_Hero1 = 0x33, + WindowID_Hero2 = 0x34, + WindowID_Hero3 = 0x35, + WindowID_Hero = 0x36, + WindowID_SkillsAndAttributes = 0x38, + WindowID_Friends = 0x3A, + WindowID_Guild = 0x3B, + WindowID_Help = 0x3D, + WindowID_Inventory = 0x3E, + WindowID_VaultBox = 0x3F, + WindowID_InventoryBags = 0x40, + WindowID_MissionMap = 0x42, + WindowID_Observe = 0x44, + WindowID_Options = 0x45, + WindowID_PartyWindow = 0x48, + WindowID_PartySearch = 0x49, + WindowID_QuestLog = 0x4F, + WindowID_Merchant = 0x5C, + WindowID_Hero4 = 0x5E, + WindowID_Hero5 = 0x5F, + WindowID_Hero6 = 0x60, + WindowID_Hero7 = 0x61, + WindowID_Count = 0x69, + } + + public enum ActionState : uint + { + MouseDown = 0x6, + MouseUp = 0x7, + MouseClick = 0x8, + MouseDoubleClick = 0x9, + DragRelease = 0xb, + KeyDown = 0xe, + } + + public enum EventID : int + { + kRecvPing = 0x8, + kSendFriendState = 0x26, + kRecvFriendState = 0x2c, + kNone = 0xffff, + } + + public enum Metric : uint + { + Metric0, + Metric1, + Metric2, + Metric3, + FullscreenGamma, + MultiSampling, + PosX, + PosY, + RefreshRate, + ShaderQuality, + SizeX, + SizeY, + TextureFiltering, + Metric13, + Metric14, + Vsync, + ScreenBorderless, + Metric17, + Metric18, + Metric19, + Metric20, + Metric21, + MonitorRefreshRate, + TextureMaxCX, + TextureMaxCY, + Metric25, + Count, + } + + public enum Transform : int + { + TRANSFORM_PROJECTION_MATRIX = 0, + TRANSFORM_MODEL_MATRIX = 1, + TRANSFORM_COUNT = 5, + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x138)] + public unsafe struct AccountContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray AccountUnlockedCounts; // e.g. number of unlocked storage panes + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public fixed byte H0010[164]; + [global::System.Runtime.InteropServices.FieldOffset(0x00B4)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedPvpHeros; // Unused, hero battles is no more :( + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00c4; // If an item is unlocked, the mod struct is stored here. Use unlocked_pvp_items_info to find the index. Idk why, chaos reigns I guess + [global::System.Runtime.InteropServices.FieldOffset(0x00E4)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedPvpItemInfo; // If an item is unlocked, the details are stored here + [global::System.Runtime.InteropServices.FieldOffset(0x00F4)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedPvpItems; // Bitwise array of which pvp items are unlocked + [global::System.Runtime.InteropServices.FieldOffset(0x0104)] + public fixed byte H0104[48]; // Some arrays, some linked lists, meh + [global::System.Runtime.InteropServices.FieldOffset(0x0124)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedAccountSkills; // List of skills unlocked (but not learnt) for this account, i.e. skills that heros can use, tomes can unlock + [global::System.Runtime.InteropServices.FieldOffset(0x0134)] + public uint AccountFlags; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x1C)] + public unsafe struct AccountInfo + { + public nint AccountName; + public uint Wins; + public uint Losses; + public uint Rating; + public uint QualifierPoints; + public uint Rank; + public uint TournamentRewardPoints; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct AccountUnlockedCount + { + public uint Id; + public uint Unk1; + public uint Unk2; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct AccountUnlockedItemInfo + { + public uint NameId; + public uint ModStructIndex; // Used to find mod struct in unlocked_pvp_items_mod_structs... + public uint ModStructSize; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct Agent + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint* Vtable; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public fixed uint H000C[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint Timer; // Agent Instance Timer (in Frames) + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint Timer2; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public global::Daybreak.API.Interop.GuildWars.TLink Link; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public global::Daybreak.API.Interop.GuildWars.TLink Link2; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public float Z; // Z coord in float + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public float Width1; // Width of the model's box + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public float Height1; // Height of the model's box + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public float Width2; // Width of the model's box (same as 1) + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public float Height2; // Height of the model's box (same as 1) + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public float Width3; // Width of the model's box (usually same as 1) + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public float Height3; // Height of the model's box (usually same as 1) + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public float RotationAngle; // Rotation in radians from East (-pi to pi) + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public float RotationCos; // cosine of rotation + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public float RotationSin; // sine of rotation + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public uint NameProperties; // Bitmap basically telling what the agent is + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public uint Ground; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public uint H0060; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct TerrainNormal; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public fixed byte H0070[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public float X; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public float Y; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public uint Plane; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public global::Daybreak.API.Interop.GuildWars.GamePos Pos; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public fixed byte H0080[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public float NameTagX; // Exactly the same as X above + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public float NameTagY; // Exactly the same as Y above + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public float NameTagZ; // Z coord in float + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public ushort VisualEffects; // Number of Visual Effects of Agent (Skills, Weapons); 1 = Always set; + [global::System.Runtime.InteropServices.FieldOffset(0x0092)] + public ushort H0092; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public fixed uint H0094[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public uint Type; // Livings = 0xDB, Gadgets = 0x200, Items = 0x400. + [global::System.Runtime.InteropServices.FieldOffset(0x00A0)] + public float MoveX; // If moving, how much on the X axis per second + [global::System.Runtime.InteropServices.FieldOffset(0x00A4)] + public float MoveY; // If moving, how much on the Y axis per second + [global::System.Runtime.InteropServices.FieldOffset(0x00A0)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Velocity; + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public uint H00A8; // always 0? + [global::System.Runtime.InteropServices.FieldOffset(0x00AC)] + public float RotationCos2; // same as cosine above + [global::System.Runtime.InteropServices.FieldOffset(0x00B0)] + public float RotationSin2; // same as sine above + [global::System.Runtime.InteropServices.FieldOffset(0x00B4)] + public fixed uint H00B4[4]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct AgentContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public fixed uint H0010[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint H0024; // function + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public fixed uint H0028[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint H0030; // function + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public fixed uint H0034[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public uint H003C; // function + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public fixed uint H0040[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public uint H0048; // function + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public fixed uint H004C[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public uint H0054; // function + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public fixed uint H0058[11]; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0084; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public uint H0094; // this field and the next array are link together in a structure. + [global::System.Runtime.InteropServices.FieldOffset(0x0098)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray AgentSummaryInfo; // elements are of size 12. {ptr, func, ptr} + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00A8; + [global::System.Runtime.InteropServices.FieldOffset(0x00B8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00B8; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint Rand1; // Number seems to be randomized quite a bit o.o seems to be accessed by textparser.cpp + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint Rand2; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public fixed byte H00D0[24]; + [global::System.Runtime.InteropServices.FieldOffset(0x00E8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray AgentMovement; + [global::System.Runtime.InteropServices.FieldOffset(0x00F8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00F8; + [global::System.Runtime.InteropServices.FieldOffset(0x0108)] + public fixed uint H0108[17]; + [global::System.Runtime.InteropServices.FieldOffset(0x014C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray AgentArray1; + [global::System.Runtime.InteropServices.FieldOffset(0x015C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray AgentAsyncMovement; + [global::System.Runtime.InteropServices.FieldOffset(0x016C)] + public fixed uint H016C[16]; + [global::System.Runtime.InteropServices.FieldOffset(0x01AC)] + public uint InstanceTimer; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x24)] + public unsafe struct AgentEffects + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public BuffArray Buffs; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public EffectArray Effects; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xE4)] + public unsafe struct AgentGadget + { + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public uint H00C4; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint H00C8; + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint ExtraType; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public uint GadgetId; + [global::System.Runtime.InteropServices.FieldOffset(0x00D4)] + public fixed uint H00D4[4]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x38)] + public unsafe struct AgentInfo + { + public fixed uint H0000[13]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xD4)] + public unsafe struct AgentItem + { + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public uint Owner; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint ItemId; + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint H00CC; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public uint ExtraType; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x1C4)] + public unsafe struct AgentLiving + { + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public uint Owner; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint H00C8; + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint H00CC; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public uint H00D0; + [global::System.Runtime.InteropServices.FieldOffset(0x00D4)] + public fixed uint H00D4[3]; + [global::System.Runtime.InteropServices.FieldOffset(0x00E0)] + public float AnimationType; + [global::System.Runtime.InteropServices.FieldOffset(0x00E4)] + public fixed uint H00E4[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x00EC)] + public float WeaponAttackSpeed; // The base attack speed in float of last attacks weapon. 1.33 = axe, sWORD, daggers etc. + [global::System.Runtime.InteropServices.FieldOffset(0x00F0)] + public float AttackSpeedModifier; // Attack speed modifier of the last attack. 0.67 = 33% increase (1-.33) + [global::System.Runtime.InteropServices.FieldOffset(0x00F4)] + public ushort PlayerNumber; // Selfexplanatory. All non-players have identifiers for their type. Two of the same mob = same number + [global::System.Runtime.InteropServices.FieldOffset(0x00F6)] + public ushort AgentModelType; // Player = 0x3000, NPC = 0x2000 + [global::System.Runtime.InteropServices.FieldOffset(0x00F8)] + public uint TransmogNpcId; // Actually, it's 0x20000000 | npc_id, It's not defined for npc, minipet, etc... + [global::System.Runtime.InteropServices.FieldOffset(0x00FC)] + public nint Equip; + [global::System.Runtime.InteropServices.FieldOffset(0x0100)] + public uint H0100; + [global::System.Runtime.InteropServices.FieldOffset(0x0104)] + public uint H0104; // New variable added here + [global::System.Runtime.InteropServices.FieldOffset(0x0108)] + public global::Daybreak.API.Interop.GuildWars.TagInfo* Tags; // struct { uint16_t guild_id, uint8_t primary, uint8_t secondary, uint16_t level + [global::System.Runtime.InteropServices.FieldOffset(0x010C)] + public ushort H010C; + [global::System.Runtime.InteropServices.FieldOffset(0x010E)] + public byte Primary; // Primary profession 0-10 (None,W,R,Mo,N,Me,E,A,Rt,P,D) + [global::System.Runtime.InteropServices.FieldOffset(0x010F)] + public byte Secondary; // Secondary profession 0-10 (None,W,R,Mo,N,Me,E,A,Rt,P,D) + [global::System.Runtime.InteropServices.FieldOffset(0x0110)] + public byte Level; // Duh! + [global::System.Runtime.InteropServices.FieldOffset(0x0111)] + public byte TeamId; // 0=None, 1=Blue, 2=Red, 3=Yellow + [global::System.Runtime.InteropServices.FieldOffset(0x0112)] + public fixed byte H0112[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0114)] + public uint H0114; + [global::System.Runtime.InteropServices.FieldOffset(0x0118)] + public float EnergyRegen; + [global::System.Runtime.InteropServices.FieldOffset(0x011C)] + public uint H011C; + [global::System.Runtime.InteropServices.FieldOffset(0x0120)] + public float Energy; // Only works for yourself + [global::System.Runtime.InteropServices.FieldOffset(0x0124)] + public uint MaxEnergy; // Only works for yourself + [global::System.Runtime.InteropServices.FieldOffset(0x0128)] + public uint H0128; + [global::System.Runtime.InteropServices.FieldOffset(0x012C)] + public float HpPips; // Regen/degen as float + [global::System.Runtime.InteropServices.FieldOffset(0x0130)] + public uint H0130; + [global::System.Runtime.InteropServices.FieldOffset(0x0134)] + public float Hp; // Health in % where 1=100% and 0=0% + [global::System.Runtime.InteropServices.FieldOffset(0x0138)] + public uint MaxHp; // Only works for yourself + [global::System.Runtime.InteropServices.FieldOffset(0x013C)] + public uint Effects; // Bitmap for effects to display when targetted. DOES include hexes + [global::System.Runtime.InteropServices.FieldOffset(0x0140)] + public uint H0140; + [global::System.Runtime.InteropServices.FieldOffset(0x0144)] + public byte Hex; // Bitmap for the hex effect when targetted (apparently obsolete!) (yes) + [global::System.Runtime.InteropServices.FieldOffset(0x0145)] + public fixed byte H0145[19]; + [global::System.Runtime.InteropServices.FieldOffset(0x0158)] + public uint ModelState; // Different values for different states of the model. + [global::System.Runtime.InteropServices.FieldOffset(0x015C)] + public uint TypeMap; // Odd variable! 0x08 = dead, 0xC00 = boss, 0x40000 = spirit, 0x400000 = player + [global::System.Runtime.InteropServices.FieldOffset(0x0160)] + public fixed uint H0160[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0170)] + public uint InSpiritRange; // Tells if agent is within spirit range of you. Doesn't work anymore? + [global::System.Runtime.InteropServices.FieldOffset(0x0174)] + public VisibleEffectList VisibleEffects; + [global::System.Runtime.InteropServices.FieldOffset(0x0180)] + public uint H0180; + [global::System.Runtime.InteropServices.FieldOffset(0x0184)] + public uint LoginNumber; // Unique number in instance that only works for players + [global::System.Runtime.InteropServices.FieldOffset(0x0188)] + public float AnimationSpeed; // Speed of the current animation + [global::System.Runtime.InteropServices.FieldOffset(0x018C)] + public uint AnimationCode; // related to animations + [global::System.Runtime.InteropServices.FieldOffset(0x0190)] + public uint AnimationId; // Id of the current animation + [global::System.Runtime.InteropServices.FieldOffset(0x0194)] + public fixed byte H0194[32]; + [global::System.Runtime.InteropServices.FieldOffset(0x01B4)] + public byte DaggerStatus; // 0x1 = used lead attack, 0x2 = used offhand attack, 0x3 = used dual attack + [global::System.Runtime.InteropServices.FieldOffset(0x01B5)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Allegiance Allegiance; // 0x1 = ally/non-attackable, 0x2 = neutral, 0x3 = enemy, 0x4 = spirit/pet, 0x5 = minion, 0x6 = npc/minipet + [global::System.Runtime.InteropServices.FieldOffset(0x01B6)] + public ushort WeaponType; // 1=bow, 2=axe, 3=hammer, 4=daggers, 5=scythe, 6=spear, 7=sWORD, 10=wand, 12=staff, 14=staff + [global::System.Runtime.InteropServices.FieldOffset(0x01B8)] + public ushort Skill; // 0 = not using a skill. Anything else is the Id of that skill + [global::System.Runtime.InteropServices.FieldOffset(0x01BA)] + public ushort H01BA; + [global::System.Runtime.InteropServices.FieldOffset(0x01BC)] + public byte WeaponItemType; + [global::System.Runtime.InteropServices.FieldOffset(0x01BD)] + public byte OffhandItemType; + [global::System.Runtime.InteropServices.FieldOffset(0x01BE)] + public ushort WeaponItemId; + [global::System.Runtime.InteropServices.FieldOffset(0x01C0)] + public ushort OffhandItemId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct AgentMovement + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public fixed uint H0000[3]; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public fixed uint H0010[3]; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint AgentDef; // GW_AGENTDEF_CHAR = 1 + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public fixed uint H0020[6]; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public uint Moving1; // tells if you are stuck even if your client doesn't know + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public fixed uint H003C[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint Moving2; // exactly same as Moving1 + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public fixed uint H0048[7]; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct H0064; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public uint H0070; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct H0074; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x7C)] + public unsafe struct AreaInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Campaign Campaign; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GWCA.GW.Continent Continent; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GWCA.GW.Region Region; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GWCA.GW.RegionType Type; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Flags; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint ThumbnailId; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint MinPartySize; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint MaxPartySize; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint MinPlayerSize; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint MaxPlayerSize; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint ControlledOutpostId; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint FractionMission; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint MinLevel; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public uint MaxLevel; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public uint NeededPq; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public uint MissionMapsTo; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public uint X; // icon position on map. + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint Y; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public uint IconStartX; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public uint IconStartY; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public uint IconEndX; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public uint IconEndY; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public uint IconStartXDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public uint IconStartYDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public uint IconEndXDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public uint IconEndYDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0068)] + public uint FileId; + [global::System.Runtime.InteropServices.FieldOffset(0x006C)] + public uint MissionChronology; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public uint HaMapChronology; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public uint NameId; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public uint DescriptionId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct AttributeStruct + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Attribute Id; // ID of attribute + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint LevelBase; // Level of attribute without modifiers (runes,pcons,etc) + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Level; // Level with modifiers + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint DecrementPoints; // Points that you will receive back if you decrement level. + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint IncrementPoints; // Points you will need to increment level. + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x14)] + public unsafe struct AttributeInfo + { + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession ProfessionId; + public global::Daybreak.API.Interop.GWCA.GW.Constants.Attribute AttributeId; + public uint NameId; + public uint DescId; + public uint IsPve; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x28)] + public unsafe struct BagStruct + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.BagType BagType; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint Index; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Unknown0; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint ContainerItem; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint ItemsCount; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* BagArray; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public ItemArray Items; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x10)] + public unsafe struct Buff + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; // skill id of the buff + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint BuffId; // id of buff in the buff array + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint TargetAgentId; // agent id of the target (0 if no target) + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct Camera + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint LookAtAgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public float H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public float H000C; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public float MaxDistance; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public float H0014; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public float Yaw; // left/right camera angle, radians w/ origin @ east + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public float Pitch; // up/down camera angle, range of [-1,1] + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public float Distance; // current distance from players head. + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public fixed uint H0024[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public float YawRightClick; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public float YawRightClick2; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public float PitchRightClick; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public float Distance2; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public float AccelerationConstant; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public float TimeSinceLastKeyboardRotation; // In seconds it seems. + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public float TimeSinceLastMouseRotation; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public float TimeSinceLastMouseMove; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public float TimeSinceLastAgentSelection; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public float TimeInTheMap; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public float TimeInTheDistrict; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public float YawToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public float PitchToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x0068)] + public float DistToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x006C)] + public float MaxDistance2; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public fixed float H0070[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct Position; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct CameraPosToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct CamPosInverted; + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct CamPosInvertedToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct LookAtTarget; + [global::System.Runtime.InteropServices.FieldOffset(0x00B4)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct LookAtToGo; + [global::System.Runtime.InteropServices.FieldOffset(0x00C0)] + public float FieldOfView; + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public float FieldOfView2; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint H00C8; + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint H00CC; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public uint H00D0; + [global::System.Runtime.InteropServices.FieldOffset(0x00D4)] + public uint H00D4; + [global::System.Runtime.InteropServices.FieldOffset(0x00D8)] + public uint H00D8; // Camera controller/mode handler pointer + [global::System.Runtime.InteropServices.FieldOffset(0x00DC)] + public uint H00DC; + [global::System.Runtime.InteropServices.FieldOffset(0x00E0)] + public uint H00E0; + [global::System.Runtime.InteropServices.FieldOffset(0x00E4)] + public uint H00E4; + [global::System.Runtime.InteropServices.FieldOffset(0x00E8)] + public uint H00E8; + [global::System.Runtime.InteropServices.FieldOffset(0x00EC)] + public uint H00EC; + [global::System.Runtime.InteropServices.FieldOffset(0x00F0)] + public uint H00F0; + [global::System.Runtime.InteropServices.FieldOffset(0x00F4)] + public uint H00F4; + [global::System.Runtime.InteropServices.FieldOffset(0x00F8)] + public uint H00F8; + [global::System.Runtime.InteropServices.FieldOffset(0x00FC)] + public uint H00FC; + [global::System.Runtime.InteropServices.FieldOffset(0x0100)] + public uint H0100; + [global::System.Runtime.InteropServices.FieldOffset(0x0104)] + public uint H0104; + [global::System.Runtime.InteropServices.FieldOffset(0x0108)] + public uint H0108; + [global::System.Runtime.InteropServices.FieldOffset(0x010C)] + public uint H010C; + [global::System.Runtime.InteropServices.FieldOffset(0x0110)] + public uint H0110; + [global::System.Runtime.InteropServices.FieldOffset(0x0114)] + public uint H0114; + [global::System.Runtime.InteropServices.FieldOffset(0x0118)] + public uint H0118; + [global::System.Runtime.InteropServices.FieldOffset(0x011C)] + public uint CameraMode; // 0=default, 1=?, 2=follow, 3=unlocked, 4=?, 5=?, 6=?, 7=?, 8=?, 9=? + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x1C)] + public unsafe struct CapeDesign + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint CapeBgColor; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint CapeDetailColor; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint CapeEmblemColor; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint CapeShape; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint CapeDetail; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint CapeEmblem; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint CapeTrim; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct CharAdjustment + { + public byte Hue; + public byte Saturation; + public byte Lightness; + public byte Scale; // percent + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x438)] + public unsafe struct CharContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0014; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public fixed uint H0024[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0034; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0044; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public fixed uint H0054[4]; // load head variables + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public fixed uint PlayerUuid[4]; // uuid + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public fixed char PlayerName[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public fixed uint H009C[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x00EC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00EC; + [global::System.Runtime.InteropServices.FieldOffset(0x00FC)] + public fixed uint H00FC[37]; // 40 + [global::System.Runtime.InteropServices.FieldOffset(0x0190)] + public uint WorldFlags; + [global::System.Runtime.InteropServices.FieldOffset(0x0194)] + public uint Token1; // world id + [global::System.Runtime.InteropServices.FieldOffset(0x0198)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + [global::System.Runtime.InteropServices.FieldOffset(0x019C)] + public uint IsExplorable; + [global::System.Runtime.InteropServices.FieldOffset(0x01A0)] + public fixed byte Host[24]; + [global::System.Runtime.InteropServices.FieldOffset(0x01B8)] + public uint Token2; // player id + [global::System.Runtime.InteropServices.FieldOffset(0x01BC)] + public fixed uint H01BC[25]; + [global::System.Runtime.InteropServices.FieldOffset(0x0220)] + public uint DistrictNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x0224)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Language Language; + [global::System.Runtime.InteropServices.FieldOffset(0x0228)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID ObserveMapId; + [global::System.Runtime.InteropServices.FieldOffset(0x022C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID CurrentMapId; + [global::System.Runtime.InteropServices.FieldOffset(0x0230)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.InstanceType ObserveMapType; + [global::System.Runtime.InteropServices.FieldOffset(0x0234)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.InstanceType CurrentMapType; + [global::System.Runtime.InteropServices.FieldOffset(0x0238)] + public fixed uint H0238[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x024C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray ObserverMatches; + [global::System.Runtime.InteropServices.FieldOffset(0x025C)] + public fixed uint H025C[17]; + [global::System.Runtime.InteropServices.FieldOffset(0x02A0)] + public uint PlayerFlags; // bitwise something + [global::System.Runtime.InteropServices.FieldOffset(0x02A4)] + public uint PlayerNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x02A8)] + public fixed uint H02A8[40]; + [global::System.Runtime.InteropServices.FieldOffset(0x0348)] + public global::Daybreak.API.Interop.GuildWars.ProgressBarContext* ProgressBar; // seems to never be nullptr + [global::System.Runtime.InteropServices.FieldOffset(0x034C)] + public fixed uint H034C[27]; + [global::System.Runtime.InteropServices.FieldOffset(0x03B8)] + public fixed char PlayerEmail[64]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct CharacterInformation + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public fixed uint H0000[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public fixed uint Uuid[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public fixed char Name[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public fixed uint Props[17]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct Cinematic + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; // pointer to data + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x30)] + public unsafe struct CompositeModelInfo + { + public uint ClassFlags; + public fixed uint FileIds[11]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ControlledMinions + { + public uint AgentId; + public uint MinionCount; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct DupeSkill + { + public uint SkillId; + public uint Count; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x3)] + public unsafe struct DyeInfo + { + public byte DyeTint; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct EffectData + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; // skill id of the effect + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AttributeLevel; // attribute level for the skill used + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint EffectId; // unique identifier of effect + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint AgentId; // non-zero means maintained enchantment - caster id + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public float Duration; // non-zero if effect has a duration + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint Timestamp; // GW-timestamp of when effect was applied - only with duration + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct Friend + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.FriendType Type; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GWCA.GW.FriendStatus Status; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public fixed byte Uuid[16]; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public fixed char Alias[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public fixed char Charname[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public uint FriendId; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint ZoneId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct GHKey + { + public fixed uint K[4]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct GadgetContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray GadgetInfo; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct GadgetInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public nint NameEnc; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct GameContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public nint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public nint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.AgentContext* Agent; // Most functions that access are prefixed with Agent. + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public nint Event; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public nint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.MapContext* Map; // Static object/collision data + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public global::Daybreak.API.Interop.GuildWars.TextParser* TextParser; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public nint H001C; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint SomeNumber; // 0x30 for me at the moment. + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public nint H0024; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public global::Daybreak.API.Interop.GuildWars.AccountContext* Account; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public global::Daybreak.API.Interop.GuildWars.WorldContext* World; // Best name to fit it that I can think of. + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public global::Daybreak.API.Interop.GuildWars.Cinematic* Cinematic; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public nint H0034; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public global::Daybreak.API.Interop.GuildWars.GadgetContext* Gadget; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public global::Daybreak.API.Interop.GuildWars.GuildContext* Guild; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public global::Daybreak.API.Interop.GuildWars.ItemContext* Items; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public global::Daybreak.API.Interop.GuildWars.CharContext* Character; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public nint H0048; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public nint Party; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public nint H0050; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public nint H0054; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public global::Daybreak.API.Interop.GuildWars.TradeContext* Trade; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct GamePos + { + public float X; + public float Y; + public uint Zplane; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xAC)] + public unsafe struct Guild + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GHKey Key; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public fixed uint H0010[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint Index; // Same as PlayerGuildIndex + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint Rank; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint Features; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public fixed char Name[32]; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public uint Rating; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public uint Faction; // 0=kurzick, 1=luxon + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public uint FactionPoint; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public uint QualifierPoint; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public fixed char Tag[8]; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public global::Daybreak.API.Interop.GuildWars.CapeDesign Cape; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct GuildContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint H000C; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint H0014; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint H0018; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint H001C; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0020; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint H0030; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public fixed char PlayerName[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public uint H005C; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public uint PlayerGuildIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public global::Daybreak.API.Interop.GuildWars.GHKey PlayerGhKey; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public uint H0074; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public fixed char Announcement[256]; + [global::System.Runtime.InteropServices.FieldOffset(0x0278)] + public fixed char AnnouncementAuthor[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x02A0)] + public uint PlayerGuildRank; + [global::System.Runtime.InteropServices.FieldOffset(0x02A4)] + public uint H02A4; + [global::System.Runtime.InteropServices.FieldOffset(0x02A8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray FactionsOutpostGuilds; + [global::System.Runtime.InteropServices.FieldOffset(0x02B8)] + public uint KurzickTownCount; + [global::System.Runtime.InteropServices.FieldOffset(0x02BC)] + public uint LuxonTownCount; + [global::System.Runtime.InteropServices.FieldOffset(0x02C0)] + public uint H02C0; + [global::System.Runtime.InteropServices.FieldOffset(0x02C4)] + public uint H02C4; + [global::System.Runtime.InteropServices.FieldOffset(0x02C8)] + public uint H02C8; + [global::System.Runtime.InteropServices.FieldOffset(0x02CC)] + public GuildHistory PlayerGuildHistory; + [global::System.Runtime.InteropServices.FieldOffset(0x02DC)] + public fixed uint H02DC[7]; + [global::System.Runtime.InteropServices.FieldOffset(0x02F8)] + public GuildArray Guilds; + [global::System.Runtime.InteropServices.FieldOffset(0x0308)] + public fixed uint H0308[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0318)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0318; + [global::System.Runtime.InteropServices.FieldOffset(0x0328)] + public uint H0328; + [global::System.Runtime.InteropServices.FieldOffset(0x032C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H032C; + [global::System.Runtime.InteropServices.FieldOffset(0x033C)] + public fixed uint H033C[7]; + [global::System.Runtime.InteropServices.FieldOffset(0x0358)] + public GuildRoster PlayerRoster; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x208)] + public unsafe struct GuildHistoryEvent + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Time1; // Guessing one of these is time in ms + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint Time2; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public fixed char Name[256]; // Name of added/kicked person, then the adder/kicker, they seem to be in the same array + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x174)] + public unsafe struct GuildPlayer + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public nint Vtable; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public nint NamePtr; // ptr to invitedname, why? dunno + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public fixed char InvitedName[20]; // name of character that was invited in + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public fixed char CurrentName[20]; // name of character currently being played + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public fixed char InviterName[20]; // name of character that invited player + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public uint InviteTime; // time in ms from game creation ?? + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public fixed char PromoterName[20]; // name of player that last modified rank + [global::System.Runtime.InteropServices.FieldOffset(0x00AC)] + public fixed uint H00AC[12]; + [global::System.Runtime.InteropServices.FieldOffset(0x00DC)] + public uint Offline; + [global::System.Runtime.InteropServices.FieldOffset(0x00E0)] + public uint MemberType; + [global::System.Runtime.InteropServices.FieldOffset(0x00E4)] + public uint Status; + [global::System.Runtime.InteropServices.FieldOffset(0x00E8)] + public fixed uint H00E8[35]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x34)] + public unsafe struct HenchmanPartyMember + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public fixed uint H0004[10]; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Profession; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint Level; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct HeroConstData + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint NameId; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint DescriptionId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x24)] + public unsafe struct HeroFlag + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID HeroId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Level; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GWCA.GW.HeroBehavior HeroBehavior; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Flag; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint H0018; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint H001c; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint LockedTargetId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x9C)] + public unsafe struct HeroInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID HeroId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Level; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint Primary; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Secondary; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint HeroFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint ModelFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint H001C; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint H0020; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint H0024; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint H0028; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint H002C; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint H0030; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public uint H0034; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public uint H0038; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public uint H003C; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public uint H0040; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint H0044; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public uint H0048; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public uint H004C; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public fixed char Name[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public uint H0078; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public uint H007C; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public uint H0080; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public uint H0084; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public uint H0088; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public uint H008C; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public uint H0090; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public uint H0094; + [global::System.Runtime.InteropServices.FieldOffset(0x0098)] + public uint H0098; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct HeroPartyMember + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint OwnerPlayerId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.HeroID HeroId; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint H000C; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint Level; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x98)] + public unsafe struct Inventory + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public BagStructPtrArray23 Bags; + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* UnusedBag; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Backpack; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* BeltPouch; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Bag1; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Bag2; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* EquipmentPack; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* MaterialStorage; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* UnclaimedItems; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage1; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage2; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage3; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage4; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage5; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage6; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage7; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage8; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage9; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage10; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage11; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage12; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage13; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Storage14; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* EquippedItems; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* Bundle; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public uint StoragePanesUnlocked; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public WeaponSetArray4 WeaponSets; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* WeaponSet0; + [global::System.Runtime.InteropServices.FieldOffset(0x0068)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* OffhandSet0; + [global::System.Runtime.InteropServices.FieldOffset(0x006C)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* WeaponSet1; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* OffhandSet1; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* WeaponSet2; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* OffhandSet2; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* WeaponSet3; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* OffhandSet3; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public uint ActiveWeaponSet; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public fixed uint H0088[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public uint GoldCharacter; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public uint GoldStorage; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x54)] + public unsafe struct ItemStruct + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint ItemId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* BagEquipped; // Only valid if Item is a equipped Bag + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.BagStruct* Bag; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.ItemModifier* ModStruct; // Pointer to an array of mods. + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint ModStructSize; // Size of this array. + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public nint Customized; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint ModelFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.ItemType Type; + [global::System.Runtime.InteropServices.FieldOffset(0x0021)] + public global::Daybreak.API.Interop.GuildWars.DyeInfo Dye; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public ushort Value; + [global::System.Runtime.InteropServices.FieldOffset(0x0026)] + public ushort H0026; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint Interaction; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint ModelId; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public nint InfoString; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public nint NameEnc; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public nint CompleteNameEnc; // with color, quantity, etc. + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public nint SingleItemName; // with color, w/o quantity, named as single item + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public fixed uint H0040[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public ushort ItemFormula; + [global::System.Runtime.InteropServices.FieldOffset(0x004A)] + public byte IsMaterialSalvageable; // Only valid for type 11 (Materials) + [global::System.Runtime.InteropServices.FieldOffset(0x004B)] + public byte H004B; // probably used for quantity extension for new material storage + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public ushort Quantity; + [global::System.Runtime.InteropServices.FieldOffset(0x004E)] + public byte Equipped; + [global::System.Runtime.InteropServices.FieldOffset(0x004F)] + public byte Profession; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public byte Slot; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct ItemContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint H0020; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray BagsArray; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public fixed byte H0034[12]; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0040; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0050; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public fixed byte H0060[88]; + [global::System.Runtime.InteropServices.FieldOffset(0x00B8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray ItemArray; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public fixed byte H00C8[48]; + [global::System.Runtime.InteropServices.FieldOffset(0x00F8)] + public global::Daybreak.API.Interop.GuildWars.Inventory* Inventory; + [global::System.Runtime.InteropServices.FieldOffset(0x00FC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H00FC; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x10)] + public unsafe struct ItemData + { + public uint ModelFileId; + public global::Daybreak.API.Interop.GuildWars.DyeInfo Dye; + public uint Value; + public uint Interaction; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x14)] + public unsafe struct ItemFormula + { + public uint H0000; + public uint GoldCost; + public uint SkillPointCost; + public uint MaterialCostCount; + public global::Daybreak.API.Interop.GuildWars.MaterialCost* MaterialCostBuffer; // NB: The game stores a cached array of material amounts that the player has in inventory; we don't care about it though! + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ItemModifier + { + public uint Mod; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct LoginCharacter + { + public uint Unk0; // Some kind of function call + public fixed char CharacterName[20]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct MapAgent + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public float CurEnergy; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public float MaxEnergy; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public float EnergyRegen; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint SkillTimestamp; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public float H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public float MaxEnergy2; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public float H0018; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint H001C; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public float CurHealth; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public float MaxHealth; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public float HealthRegen; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint H002C; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint Effects; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x138)] + public unsafe struct MapContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint MapType; // less than 4 + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct StartPos; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct EndPos; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public fixed uint H0014[6]; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Spawns1; // Seem to be arena spawns. struct is X,Y,unk 4 byte value,unk 4 byte value. + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Spawns2; // Same as above + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Spawns3; // Same as above + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public fixed float H005C[6]; // Some trapezoid i think. + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public nint Path; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public global::Daybreak.API.Interop.GuildWars.PathEngineContext* PathEngine; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public nint Props; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public uint H0080; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public nint Terrain; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public uint H0088; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public uint H0090; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public uint H0094; + [global::System.Runtime.InteropServices.FieldOffset(0x0098)] + public uint H0098; + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public uint H009C; + [global::System.Runtime.InteropServices.FieldOffset(0x00A0)] + public uint H00A0; + [global::System.Runtime.InteropServices.FieldOffset(0x00A4)] + public uint H00A4; + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public uint H00A8; + [global::System.Runtime.InteropServices.FieldOffset(0x00AC)] + public uint H00AC; + [global::System.Runtime.InteropServices.FieldOffset(0x00B0)] + public uint H00B0; + [global::System.Runtime.InteropServices.FieldOffset(0x00B4)] + public uint H00B4; + [global::System.Runtime.InteropServices.FieldOffset(0x00B8)] + public uint H00B8; + [global::System.Runtime.InteropServices.FieldOffset(0x00BC)] + public uint H00BC; + [global::System.Runtime.InteropServices.FieldOffset(0x00C0)] + public uint H00C0; + [global::System.Runtime.InteropServices.FieldOffset(0x00C4)] + public uint H00C4; + [global::System.Runtime.InteropServices.FieldOffset(0x00C8)] + public uint H00C8; + [global::System.Runtime.InteropServices.FieldOffset(0x00CC)] + public uint H00CC; + [global::System.Runtime.InteropServices.FieldOffset(0x00D0)] + public uint H00D0; + [global::System.Runtime.InteropServices.FieldOffset(0x00D4)] + public uint H00D4; + [global::System.Runtime.InteropServices.FieldOffset(0x00D8)] + public uint H00D8; + [global::System.Runtime.InteropServices.FieldOffset(0x00DC)] + public uint H00DC; + [global::System.Runtime.InteropServices.FieldOffset(0x00E0)] + public uint H00E0; + [global::System.Runtime.InteropServices.FieldOffset(0x00E4)] + public uint H00E4; + [global::System.Runtime.InteropServices.FieldOffset(0x00E8)] + public uint H00E8; + [global::System.Runtime.InteropServices.FieldOffset(0x00EC)] + public uint H00EC; + [global::System.Runtime.InteropServices.FieldOffset(0x00F0)] + public uint H00F0; + [global::System.Runtime.InteropServices.FieldOffset(0x00F4)] + public uint H00F4; + [global::System.Runtime.InteropServices.FieldOffset(0x00F8)] + public uint H00F8; + [global::System.Runtime.InteropServices.FieldOffset(0x00FC)] + public uint H00FC; + [global::System.Runtime.InteropServices.FieldOffset(0x0100)] + public uint H0100; + [global::System.Runtime.InteropServices.FieldOffset(0x0104)] + public uint H0104; + [global::System.Runtime.InteropServices.FieldOffset(0x0108)] + public uint H0108; + [global::System.Runtime.InteropServices.FieldOffset(0x010C)] + public uint H010C; + [global::System.Runtime.InteropServices.FieldOffset(0x0110)] + public uint H0110; + [global::System.Runtime.InteropServices.FieldOffset(0x0114)] + public uint H0114; + [global::System.Runtime.InteropServices.FieldOffset(0x0118)] + public uint H0118; + [global::System.Runtime.InteropServices.FieldOffset(0x011C)] + public uint H011C; + [global::System.Runtime.InteropServices.FieldOffset(0x0120)] + public uint H0120; + [global::System.Runtime.InteropServices.FieldOffset(0x0124)] + public uint H0124; + [global::System.Runtime.InteropServices.FieldOffset(0x0128)] + public uint H0128; + [global::System.Runtime.InteropServices.FieldOffset(0x012C)] + public uint H012C; + [global::System.Runtime.InteropServices.FieldOffset(0x0130)] + public nint Zones; + [global::System.Runtime.InteropServices.FieldOffset(0x0134)] + public uint H0134; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x90)] + public unsafe struct MapProp + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public fixed uint H0000[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint UptimeSeconds; // time since spawned + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint H0018; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint PropIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct Position; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint ModelFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public fixed uint H0030[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public float RotationAngle; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public float RotationCos; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public float RotationSin; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public fixed uint H0034[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public global::Daybreak.API.Interop.GuildWars.RecObject* InteractiveModel; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public fixed uint H005C[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x006C)] + public uint AppearanceBitmap; // Modified when animation changes + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public uint AnimationBits; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public fixed uint H0064[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public global::Daybreak.API.Interop.GuildWars.PropByType* PropObjectInfo; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public uint H008C; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct MapTypeInstanceInfo + { + public uint RequestInstanceMapType; // Used for auth server + public byte IsOutpost; + public global::Daybreak.API.Interop.GWCA.GW.RegionType MapRegionType; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct Mat4x3f + { + public float _11; + public float _12; + public float _13; + public float _14; + public float _21; + public float _22; + public float _23; + public float _24; + public float _31; + public float _32; + public float _33; + public float _34; + public uint Flags; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x10)] + public unsafe struct MaterialCost + { + public global::Daybreak.API.Interop.GWCA.GW.Constants.MaterialSlot Material; + public uint Amount; + public uint H0008; + public uint H000c; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x48)] + public unsafe struct MissionMapContext + { + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Size; // Dimensions of the drawable area inside the mission map frame + public uint H0008; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct LastMouseLocation; // Percentage offset (-1.f to 1.f) relative to player_mission_map_pos + public uint FrameId; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct PlayerMissionMapPos; // Position of player on the top down view of mission map (not in gwinches). Mission map centers on this point + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0020; + public uint H0030; + public uint H0034; + public uint H0038; + public global::Daybreak.API.Interop.GuildWars.MissionMapSubContext2* H003c; + public uint H0040; + public uint H0044; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x28)] + public unsafe struct MissionMapIcon + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Index; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public float X; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public float Y; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint H000C; // = 0 + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; // = 0 + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint Option; // Affilitation/color. gray = 0, blue, red, yellow, teal, purple, green, gray + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint H0018; // = 0 + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint ModelId; // Model of the displayed icon in the Minimap + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint H0020; // = 0 + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint H0024; // May concern the name + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct MissionMapSubContext + { + public fixed uint H0000[14]; // Could be 0x38, 0x3C or 0x68 depending on if observing etc. + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x58)] + public unsafe struct MissionMapSubContext2 + { + public uint H0000; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct PlayerMissionMapPos; + public uint H000c; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct MissionMapSize; + public float Unk; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct MissionMapPanOffset; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct MissionMapPanOffset2; + public fixed float Unk2[2]; + public fixed uint Unk3[9]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xC)] + public unsafe struct MissionObjective + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint ObjectiveId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public nint EncStr; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Type; // completed, bullet, etc... + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x30)] + public unsafe struct NPC + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint ModelFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint SkinFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.CharAdjustment VisualAdjustment; // may be overridden + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint Appearance; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint NpcFlags; // uses CHAR_CLASS_FLAG_* constants + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Primary; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Secondary; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public byte DefaultLevel; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public nint NameEnc; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint* ModelFiles; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint FilesCount; // length of ModelFile + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint FilesCapacity; // capacity of ModelFile + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct Node + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Type; // XNode = 0, YNode = 1, SinkNode = 2 + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint Id; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xC)] + public unsafe struct ObjectPool + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public nint FreeList; // This is a singly linked list of free object. The last object freed is always the pointer. + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.ObjectPoolBlock* Blocks; // This is a singly linked list of blocks that were allocated. Every blocks will generally be for many elements. + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Count; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x8)] + public unsafe struct ObjectPoolBlock + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.ObjectPoolBlock* Next; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xA4)] + public unsafe struct ObserverMatch + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint MatchId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint MatchIdDup; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint Age; // Elapsed time since match started [minutes] + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GWCA.GW.ObserverMatchType Type; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint MatchTitle; // eg. 19 - "Monthly Championship Guild Tournament Finals", 18 - "Semifinals", 17 - "Quarterfinals", 16 - "Playoffs", 0 - No title + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint H0018; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint Count; // number of teams + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public ObserverMatchTeamArray2 Team; + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public nint Team1NameDup; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public fixed uint H007C[10]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x2C)] + public unsafe struct ObserverMatchTeam + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Id; // 0 - gray, 1 - blue, 2 - red + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; // indicates something with the tabard + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; // same. + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.CapeDesign Cape; // aka. tabard in gw client + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public nint Name; // encoded name + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0xC)] + public unsafe struct PartyAlly + { + public uint AgentId; + public uint Unk; + public uint CompositeId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x43C)] + public unsafe struct PartyAttribute + { + public uint AgentId; + public AttributeStructArray54 Attribute; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x84)] + public unsafe struct PartyInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint PartyId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Players; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Henchmen; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Heroes; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Others; // agent id of allies, minions, pets. + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public fixed uint H0044[14]; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public global::Daybreak.API.Interop.GuildWars.TLink InviteLink; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct PartyMemberMoraleInfo + { + public uint AgentId; + public uint AgentIdDup; + public fixed uint Unk[4]; + public uint Morale; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0xC)] + public unsafe struct PartyMoraleLink + { + public uint Unk; + public uint Unk2; + public global::Daybreak.API.Interop.GuildWars.PartyMemberMoraleInfo* PartyMemberInfo; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct PartySearch + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint PartySearchId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint PartySearchType; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Hardmode; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint District; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Language; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint PartySize; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint HeroCount; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public fixed char Message[32]; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public fixed char PartyLeader[20]; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Primary; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Secondary; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public uint Level; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public uint Timestamp; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct PartySearchContext + { + public uint H0000; + public uint H0004; + public uint H0008; + public uint H000c; + public uint Flags; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct PathEngineContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public nint Vtable; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public nint UserData; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public nint HDll; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint PfnCreateInterface; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct PathWaypoint + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public float X; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public float Y; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public float Width; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public float Height; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Plane; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* NextTrap; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x30)] + public unsafe struct PathingTrapezoid + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Id; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public PathingTrapezoidPtrArray4 Adjacent; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* TopLeft; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* TopRight; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* BottomLeft; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* BottomRight; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public ushort PortalLeft; + [global::System.Runtime.InteropServices.FieldOffset(0x0016)] + public ushort PortalRight; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public float XTL; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public float XTR; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public float YT; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public float XBL; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public float XBR; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public float YB; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x1C)] + public unsafe struct PetInfo + { + public uint AgentId; + public uint OwnerAgentId; + public nint PetName; + public uint ModelFileId1; + public uint ModelFileId2; + public global::Daybreak.API.Interop.GWCA.GW.HeroBehavior Behavior; + public uint LockedTargetId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x50)] + public unsafe struct Player + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public fixed uint H0004[3]; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint AppearanceBitmap; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint Flags; // Bitwise field + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint Primary; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint Secondary; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint H0020; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public nint NameEnc; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public nint Name; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint PartyLeaderPlayerNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint ActiveTitleTier; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public uint ReforgedOrDhuumsFlags; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public uint PlayerNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public uint PartySize; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0040; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x134)] + public unsafe struct PlayerControlledCharacter + { + public uint Field00x0; + public uint Field10x4; + public uint Field20x8; + public uint Field30xc; + public uint Field40x10; + public uint AgentId; + public uint CompositeId; // 0x30000000 | player_number + public uint Field70x1c; + public uint Field80x20; + public uint Field90x24; + public uint Field100x28; + public uint Field110x2c; + public uint Field120x30; + public uint Field130x34; + public uint Field140x38; + public uint Field150x3c; + public uint Field160x40; + public uint Field170x44; + public uint Field180x48; + public uint Field190x4c; + public uint Field200x50; + public uint Field210x54; + public uint Field220x58; + public uint Field230x5c; + public uint Field240x60; + public uint MoreFlags; + public uint Field260x68; + public uint Field270x6c; + public uint Field280x70; + public uint Field290x74; + public uint Field300x78; + public uint Field310x7c; + public uint Field320x80; + public uint Field330x84; + public uint Field340x88; + public uint Field350x8c; + public uint Field360x90; + public uint Field370x94; + public uint Field380x98; + public uint Field390x9c; + public uint Field400xa0; + public uint Field410xa4; + public uint Field420xa8; + public uint Field430xac; + public uint Field440xb0; + public uint Field450xb4; + public uint Field460xb8; + public uint Field470xbc; + public uint Field480xc0; + public uint Field490xc4; + public uint Field500xc8; + public uint Field510xcc; + public uint Field520xd0; + public uint Field530xd4; + public uint Field540xd8; + public uint Field550xdc; + public uint Field560xe0; + public uint Field570xe4; + public uint Field580xe8; + public uint Field590xec; + public uint Field600xf0; + public uint Field610xf4; + public uint Field620xf8; + public uint Field630xfc; + public uint Field640x100; + public uint Field650x104; + public uint Field660x108; + public uint Flags; + public uint Field680x110; + public uint Field690x114; + public uint Field700x118; + public uint Field710x11c; + public uint Field720x120; + public uint Field730x124; + public uint Field740x128; + public uint Field750x12c; + public uint Field760x130; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x3F8)] + public unsafe struct PlayerEquipment + { + [global::System.Runtime.InteropServices.FieldOffset(0x010C)] + public uint H010C; // From constructor param_3 + [global::System.Runtime.InteropServices.FieldOffset(0x0110)] + public fixed uint H0110[178]; // Padding (178 uint32_t = 0x2C8 bytes) + [global::System.Runtime.InteropServices.FieldOffset(0x03D8)] + public uint EquipmentFlags; // Equipment redraw flags (0xFFFFFFFF = needs draw, 0x00000000 = fully drawn) + [global::System.Runtime.InteropServices.FieldOffset(0x03DC)] + public uint H03DC; // Initialized to 0 + [global::System.Runtime.InteropServices.FieldOffset(0x03E0)] + public uint VisibilityFlags; // Equipment visibility flags (0xFFFFFFFF initial) + [global::System.Runtime.InteropServices.FieldOffset(0x03E4)] + public uint H03E4; // param_1 from constructor + [global::System.Runtime.InteropServices.FieldOffset(0x03E8)] + public fixed uint H03E8[4]; // Padding to reach 0x3F8 (16 bytes) + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xC)] + public unsafe struct PlayerPartyMember + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint LoginNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint CalledTargetId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint State; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x14)] + public unsafe struct Portal + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public ushort PortalPlane; + [global::System.Runtime.InteropServices.FieldOffset(0x0002)] + public ushort NeighborPlane; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint Flags; // 0x4 => "Not used for path finding" + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.Portal* Pair; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint Count; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* Trapezoids; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct PreGameContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint FrameId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public fixed uint H0004[72]; + [global::System.Runtime.InteropServices.FieldOffset(0x0124)] + public uint ChosenCharacterIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x0128)] + public fixed uint H0128[6]; + [global::System.Runtime.InteropServices.FieldOffset(0x0140)] + public uint Index1; + [global::System.Runtime.InteropServices.FieldOffset(0x0144)] + public uint Index2; + [global::System.Runtime.InteropServices.FieldOffset(0x0148)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Chars; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct PrioQ + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint MLinkOffset; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MNodes; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x14)] + public unsafe struct ProfessionState + { + public uint AgentId; + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Primary; + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Secondary; + public uint UnlockedProfessions; // bitwise + public uint Unk; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ProgressBarContext + { + public int Pips; + public fixed byte Color[4]; // RGBA + public fixed byte Background[4]; // RGBA + public fixed int Unk[7]; + public float Progress; // 0 ... 1 + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct PropByType + { + public uint ObjectId; + public uint PropIndex; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct PropModelInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint H000C; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint H0014; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x24)] + public unsafe struct PvPItemInfo + { + public fixed uint Unk[9]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x28)] + public unsafe struct PvPItemUpgradeInfo + { + public uint FileId; + public uint NameId; + public uint UpgradeType; // Axe, Bow, Inscription + public uint CampaignId; + public uint Interaction; + public uint IsDev; // boolean; if 1, then don't use in-game + public uint Profession; // if 0xb then is for all professions + public uint H0018; + public uint ModStructSize; + public uint* ModStruct; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x34)] + public unsafe struct Quest + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID QuestId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint LogState; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public nint Location; // quest category + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public nint Name; // quest name + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public nint Npc; // + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapFrom; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public global::Daybreak.API.Interop.GuildWars.GamePos Marker; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint H0024; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapTo; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public nint Description; // namestring reward + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public nint Objectives; // namestring objective + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x24)] + public unsafe struct RecObject + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public nint Vtable; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint RefCount; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint AccessKey; // This is used by the game to make sure the data from the DAT matches the data in game + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint Standalone; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint FileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint StreamId; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint Flags; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint Opened; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint RefCount2; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x24)] + public unsafe struct SalvageSessionInfo + { + public nint Vtable; + public uint FrameId; + public uint ItemId; + public uint Salvagable1; // Prefix + public uint Salvagable2; // Suffix + public uint Salvagable3; // Inscription + public uint ChosenSalvagable; // 3 for materials + public uint H001c; + public uint KitId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ScannerSectionOffset + { + public nuint Start; + public nuint End; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xC)] + public unsafe struct SinkNode + { + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.PathingTrapezoid* Trapezoid; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xA4)] + public unsafe struct Skill + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0004; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Campaign Campaign; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillType Type; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Special; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint ComboReq; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint Effect1; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint Condition; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint Effect2; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public uint WeaponReq; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.ProfessionByte Profession; + [global::System.Runtime.InteropServices.FieldOffset(0x0029)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.AttributeByte Attribute; + [global::System.Runtime.InteropServices.FieldOffset(0x002A)] + public ushort Title; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillIdPvp; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public byte Combo; + [global::System.Runtime.InteropServices.FieldOffset(0x0031)] + public byte Target; + [global::System.Runtime.InteropServices.FieldOffset(0x0032)] + public byte H0032; + [global::System.Runtime.InteropServices.FieldOffset(0x0033)] + public byte SkillEquipType; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public byte Overcast; // only if special flag has 0x000001 set + [global::System.Runtime.InteropServices.FieldOffset(0x0035)] + public byte EnergyCost; + [global::System.Runtime.InteropServices.FieldOffset(0x0036)] + public byte HealthCost; + [global::System.Runtime.InteropServices.FieldOffset(0x0037)] + public byte H0037; + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public uint Adrenaline; + [global::System.Runtime.InteropServices.FieldOffset(0x003C)] + public float Activation; + [global::System.Runtime.InteropServices.FieldOffset(0x0040)] + public float Aftercast; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint Duration0; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public uint Duration15; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public uint Recharge; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public fixed ushort H0050[4]; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public uint SkillArguments; // 1 - duration set, 2 - scale set, 4 - bonus scale set (3 would mean duration and scale is set/used by the skill) + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public uint Scale0; + [global::System.Runtime.InteropServices.FieldOffset(0x0060)] + public uint Scale15; + [global::System.Runtime.InteropServices.FieldOffset(0x0064)] + public uint BonusScale0; + [global::System.Runtime.InteropServices.FieldOffset(0x0068)] + public uint BonusScale15; + [global::System.Runtime.InteropServices.FieldOffset(0x006C)] + public float AoeRange; + [global::System.Runtime.InteropServices.FieldOffset(0x0070)] + public float ConstEffect; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public uint CasterOverheadAnimationId; // 2077 == max == no animation + [global::System.Runtime.InteropServices.FieldOffset(0x0078)] + public uint CasterBodyAnimationId; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public uint TargetBodyAnimationId; + [global::System.Runtime.InteropServices.FieldOffset(0x0080)] + public uint TargetOverheadAnimationId; + [global::System.Runtime.InteropServices.FieldOffset(0x0084)] + public uint ProjectileAnimation1Id; + [global::System.Runtime.InteropServices.FieldOffset(0x0088)] + public uint ProjectileAnimation2Id; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public uint IconFileId; + [global::System.Runtime.InteropServices.FieldOffset(0x0090)] + public uint IconFileId2; + [global::System.Runtime.InteropServices.FieldOffset(0x0094)] + public uint IconFileIdHiRes; + [global::System.Runtime.InteropServices.FieldOffset(0x0098)] + public uint Name; // String id + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public uint Concise; // String id + [global::System.Runtime.InteropServices.FieldOffset(0x00A0)] + public uint Description; // String id + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0xBC)] + public unsafe struct SkillbarData + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; // id of the agent whose skillbar this is + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public SkillbarSkillDataArray8 Skills; + [global::System.Runtime.InteropServices.FieldOffset(0x00A4)] + public uint Disabled; + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public SkillbarCastArray CastArray; + [global::System.Runtime.InteropServices.FieldOffset(0x00B8)] + public uint H00B8; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct SkillbarCast + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public ushort H0000; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0008; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x14)] + public unsafe struct SkillbarSkillData + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AdrenalineA; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AdrenalineB; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Recharge; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; // see GWConst::SkillIds + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint Event; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct SubStruct1 + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct SubStructUnk + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AsyncDecodeStrCallback; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint AsyncDecodeStrParam; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint BufferUsed; // if it's 1 then uses s1 & if it's 0 uses s2. + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray S1; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray S2; + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint H002C; + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public uint H0030; // tell us how many string will be enqueue before decoding. + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public uint H0034; // @0078B990 + [global::System.Runtime.InteropServices.FieldOffset(0x0038)] + public fixed byte H0038[28]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct TagInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public ushort GuildId; + [global::System.Runtime.InteropServices.FieldOffset(0x0002)] + public byte Primary; + [global::System.Runtime.InteropServices.FieldOffset(0x0003)] + public byte Secondary; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public ushort Level; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct TextCache + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint H0000; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct TextParser + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public fixed uint H0000[8]; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public nint DecStart; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public nint DecEnd; + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public uint Substitute1; // related to h0020 & h0024 + [global::System.Runtime.InteropServices.FieldOffset(0x002C)] + public uint Substitute2; // related to h0020 & h0024 + [global::System.Runtime.InteropServices.FieldOffset(0x0030)] + public global::Daybreak.API.Interop.GuildWars.TextCache* Cache; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public fixed uint H0034[75]; + [global::System.Runtime.InteropServices.FieldOffset(0x0160)] + public uint H0160; // @0078BEF5 + [global::System.Runtime.InteropServices.FieldOffset(0x0164)] + public uint H0164; + [global::System.Runtime.InteropServices.FieldOffset(0x0168)] + public uint H0168; // set to 0 @0078BF34 + [global::System.Runtime.InteropServices.FieldOffset(0x016C)] + public fixed uint H016C[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0180)] + public global::Daybreak.API.Interop.GuildWars.SubStruct1* SubStruct; + [global::System.Runtime.InteropServices.FieldOffset(0x0184)] + public fixed uint H0184[19]; + [global::System.Runtime.InteropServices.FieldOffset(0x01D0)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.Language LanguageId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x2C)] + public unsafe struct Title + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Props; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint CurrentPoints; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint CurrentTitleTierIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public uint PointsNeededCurrentRank; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public uint H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint NextTitleTierIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public uint PointsNeededNextRank; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public uint MaxTitleRank; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public uint MaxTitleTierIndex; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public nint PointsDesc; // Pretty sure these are ptrs to title hash strings + [global::System.Runtime.InteropServices.FieldOffset(0x0028)] + public nint H0028; // Pretty sure these are ptrs to title hash strings + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct TitleClientData + { + public uint TitleFlags; + public global::Daybreak.API.Interop.GWCA.GW.Constants.TitleID TitleId; + public uint NameId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0xC)] + public unsafe struct TitleTier + { + public uint Props; + public uint TierNumber; + public nint TierNameEnc; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x78)] + public unsafe struct TownAlliance + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Rank; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint Allegiance; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint Faction; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public fixed char Name[32]; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public fixed char Tag[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x0056)] + public fixed byte Padding[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public global::Daybreak.API.Interop.GuildWars.CapeDesign Cape; + [global::System.Runtime.InteropServices.FieldOffset(0x0074)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct TradeContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint Flags; // this is actually a flags + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public fixed uint H0004[3]; // Seemingly 3 null dwords + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.TradePlayer Player; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public global::Daybreak.API.Interop.GuildWars.TradePlayer Partner; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct TradeItem + { + public uint ItemId; + public uint Quantity; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct TradePlayer + { + public uint Gold; + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Items; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct Vec2fStruct + { + public float X; + public float Y; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct Vec3fStruct + { + public float X; + public float Y; + public float Z; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct VisibleEffect + { + public uint Unk; // enchantment = 1, weapon spell = 9 + public global::Daybreak.API.Interop.GWCA.GW.Constants.EffectID Id; + public uint HasEnded; // effect no longer active, effect ending animation plays. + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x8)] + public unsafe struct WeaponSet + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* Weapon; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.ItemStruct* Offhand; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x854)] + public unsafe struct WorldContext + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public global::Daybreak.API.Interop.GuildWars.AccountInfo* AccountInfo; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MessageBuff; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray DialogBuff; + [global::System.Runtime.InteropServices.FieldOffset(0x0024)] + public MerchItemArray MerchItems; + [global::System.Runtime.InteropServices.FieldOffset(0x0034)] + public MerchItemArray MerchItems2; + [global::System.Runtime.InteropServices.FieldOffset(0x0044)] + public uint AccumMapInitUnk0; + [global::System.Runtime.InteropServices.FieldOffset(0x0048)] + public uint AccumMapInitUnk1; + [global::System.Runtime.InteropServices.FieldOffset(0x004C)] + public uint AccumMapInitOffset; + [global::System.Runtime.InteropServices.FieldOffset(0x0050)] + public uint AccumMapInitLength; + [global::System.Runtime.InteropServices.FieldOffset(0x0054)] + public uint H0054; + [global::System.Runtime.InteropServices.FieldOffset(0x0058)] + public uint AccumMapInitUnk2; + [global::System.Runtime.InteropServices.FieldOffset(0x005C)] + public fixed uint H005C[8]; + [global::System.Runtime.InteropServices.FieldOffset(0x007C)] + public MapAgentArray MapAgents; + [global::System.Runtime.InteropServices.FieldOffset(0x008C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray PartyAllies; // List of allies added to the current party + [global::System.Runtime.InteropServices.FieldOffset(0x009C)] + public global::Daybreak.API.Interop.GuildWars.Vec3fStruct AllFlag; + [global::System.Runtime.InteropServices.FieldOffset(0x00A8)] + public uint H00A8; + [global::System.Runtime.InteropServices.FieldOffset(0x00AC)] + public PartyAttributeArray Attributes; + [global::System.Runtime.InteropServices.FieldOffset(0x00BC)] + public fixed uint H00BC[255]; + [global::System.Runtime.InteropServices.FieldOffset(0x04B8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H04B8; + [global::System.Runtime.InteropServices.FieldOffset(0x04C8)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H04C8; + [global::System.Runtime.InteropServices.FieldOffset(0x04D8)] + public uint H04D8; + [global::System.Runtime.InteropServices.FieldOffset(0x04DC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H04DC; + [global::System.Runtime.InteropServices.FieldOffset(0x04EC)] + public fixed uint H04EC[7]; + [global::System.Runtime.InteropServices.FieldOffset(0x0508)] + public AgentEffectsArray PartyEffects; + [global::System.Runtime.InteropServices.FieldOffset(0x0518)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0518; + [global::System.Runtime.InteropServices.FieldOffset(0x0528)] + public global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID ActiveQuestId; + [global::System.Runtime.InteropServices.FieldOffset(0x052C)] + public QuestLog QuestLog; + [global::System.Runtime.InteropServices.FieldOffset(0x053C)] + public fixed uint H053C[10]; + [global::System.Runtime.InteropServices.FieldOffset(0x0564)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MissionObjectives; + [global::System.Runtime.InteropServices.FieldOffset(0x0574)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray HenchmenAgentIds; + [global::System.Runtime.InteropServices.FieldOffset(0x0584)] + public HeroFlagArray HeroFlags; + [global::System.Runtime.InteropServices.FieldOffset(0x0594)] + public HeroInfoArray HeroInfo; + [global::System.Runtime.InteropServices.FieldOffset(0x05A4)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray CartographedAreas; // Struct size = 0x20 + [global::System.Runtime.InteropServices.FieldOffset(0x05B4)] + public fixed uint H05B4[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x05BC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray ControlledMinionCount; + [global::System.Runtime.InteropServices.FieldOffset(0x05CC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MissionsCompleted; + [global::System.Runtime.InteropServices.FieldOffset(0x05DC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MissionsBonus; + [global::System.Runtime.InteropServices.FieldOffset(0x05EC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MissionsCompletedHm; + [global::System.Runtime.InteropServices.FieldOffset(0x05FC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray MissionsBonusHm; + [global::System.Runtime.InteropServices.FieldOffset(0x060C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedMap; + [global::System.Runtime.InteropServices.FieldOffset(0x061C)] + public fixed uint H061C[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0624)] + public global::Daybreak.API.Interop.GuildWars.PartyMemberMoraleInfo* PlayerMoraleInfo; + [global::System.Runtime.InteropServices.FieldOffset(0x0628)] + public uint H028C; + [global::System.Runtime.InteropServices.FieldOffset(0x062C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray PartyMoraleRelated; + [global::System.Runtime.InteropServices.FieldOffset(0x063C)] + public fixed uint H063C[16]; + [global::System.Runtime.InteropServices.FieldOffset(0x067C)] + public uint PlayerNumber; + [global::System.Runtime.InteropServices.FieldOffset(0x0680)] + public global::Daybreak.API.Interop.GuildWars.PlayerControlledCharacter* PlayerControlledChar; // Struct size = 0x134 ? + [global::System.Runtime.InteropServices.FieldOffset(0x0684)] + public uint IsHardModeUnlocked; + [global::System.Runtime.InteropServices.FieldOffset(0x0688)] + public fixed uint H0688[2]; + [global::System.Runtime.InteropServices.FieldOffset(0x0690)] + public uint SalvageSessionId; + [global::System.Runtime.InteropServices.FieldOffset(0x0694)] + public fixed uint H0694[5]; + [global::System.Runtime.InteropServices.FieldOffset(0x06A8)] + public uint PlayerTeamToken; + [global::System.Runtime.InteropServices.FieldOffset(0x06AC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Pets; + [global::System.Runtime.InteropServices.FieldOffset(0x06BC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray PartyProfessionStates; // Current state of primary/secondary/unlocked for current player and party heroes, used in skill window. aka attribStates + [global::System.Runtime.InteropServices.FieldOffset(0x06CC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H06CC; + [global::System.Runtime.InteropServices.FieldOffset(0x06DC)] + public uint H06DC; + [global::System.Runtime.InteropServices.FieldOffset(0x06E0)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H06E0; + [global::System.Runtime.InteropServices.FieldOffset(0x06F0)] + public SkillbarArray Skillbar; + [global::System.Runtime.InteropServices.FieldOffset(0x0700)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray LearnableCharacterSkills; // populated at skill trainer and when using signet of capture + [global::System.Runtime.InteropServices.FieldOffset(0x0710)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray UnlockedCharacterSkills; // bit field + [global::System.Runtime.InteropServices.FieldOffset(0x0720)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray DuplicatedCharacterSkills; // When res signet is bought more than once, its mapped into this array. Used in skill window. + [global::System.Runtime.InteropServices.FieldOffset(0x0730)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H0730; + [global::System.Runtime.InteropServices.FieldOffset(0x0740)] + public uint Experience; + [global::System.Runtime.InteropServices.FieldOffset(0x0744)] + public uint ExperienceDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0748)] + public uint CurrentKurzick; + [global::System.Runtime.InteropServices.FieldOffset(0x074C)] + public uint CurrentKurzickDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0750)] + public uint TotalEarnedKurzick; + [global::System.Runtime.InteropServices.FieldOffset(0x0754)] + public uint TotalEarnedKurzickDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0758)] + public uint CurrentLuxon; + [global::System.Runtime.InteropServices.FieldOffset(0x075C)] + public uint CurrentLuxonDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0760)] + public uint TotalEarnedLuxon; + [global::System.Runtime.InteropServices.FieldOffset(0x0764)] + public uint TotalEarnedLuxonDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0768)] + public uint CurrentImperial; + [global::System.Runtime.InteropServices.FieldOffset(0x076C)] + public uint CurrentImperialDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0770)] + public uint TotalEarnedImperial; + [global::System.Runtime.InteropServices.FieldOffset(0x0774)] + public uint TotalEarnedImperialDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0778)] + public uint UnkFaction4; + [global::System.Runtime.InteropServices.FieldOffset(0x077C)] + public uint UnkFaction4Dupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0780)] + public uint UnkFaction5; + [global::System.Runtime.InteropServices.FieldOffset(0x0784)] + public uint UnkFaction5Dupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0788)] + public uint Level; + [global::System.Runtime.InteropServices.FieldOffset(0x078C)] + public uint LevelDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0790)] + public uint Morale; + [global::System.Runtime.InteropServices.FieldOffset(0x0794)] + public uint MoraleDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x0798)] + public uint CurrentBalth; + [global::System.Runtime.InteropServices.FieldOffset(0x079C)] + public uint CurrentBalthDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x07A0)] + public uint TotalEarnedBalth; + [global::System.Runtime.InteropServices.FieldOffset(0x07A4)] + public uint TotalEarnedBalthDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x07A8)] + public uint CurrentSkillPoints; + [global::System.Runtime.InteropServices.FieldOffset(0x07AC)] + public uint CurrentSkillPointsDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x07B0)] + public uint TotalEarnedSkillPoints; + [global::System.Runtime.InteropServices.FieldOffset(0x07B4)] + public uint TotalEarnedSkillPointsDupe; + [global::System.Runtime.InteropServices.FieldOffset(0x07B8)] + public uint MaxKurzick; + [global::System.Runtime.InteropServices.FieldOffset(0x07BC)] + public uint MaxLuxon; + [global::System.Runtime.InteropServices.FieldOffset(0x07C0)] + public uint MaxBalth; + [global::System.Runtime.InteropServices.FieldOffset(0x07C4)] + public uint MaxImperial; + [global::System.Runtime.InteropServices.FieldOffset(0x07C8)] + public uint EquipmentStatus; + [global::System.Runtime.InteropServices.FieldOffset(0x07CC)] + public AgentInfoArray AgentInfos; + [global::System.Runtime.InteropServices.FieldOffset(0x07DC)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray H07DC; + [global::System.Runtime.InteropServices.FieldOffset(0x07EC)] + public MissionMapIconArray MissionMapIcons; + [global::System.Runtime.InteropServices.FieldOffset(0x07FC)] + public NPCArray Npcs; + [global::System.Runtime.InteropServices.FieldOffset(0x080C)] + public PlayerArray Players; + [global::System.Runtime.InteropServices.FieldOffset(0x081C)] + public TitleArray Titles; + [global::System.Runtime.InteropServices.FieldOffset(0x082C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray TitleTiers; + [global::System.Runtime.InteropServices.FieldOffset(0x083C)] + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray VanquishedAreas; + [global::System.Runtime.InteropServices.FieldOffset(0x084C)] + public uint FoesKilled; + [global::System.Runtime.InteropServices.FieldOffset(0x0850)] + public uint FoesToKill; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x224)] + public unsafe struct WorldMapContext + { + public uint FrameId; + public global::Daybreak.API.Interop.GWCA.GW.Continent Continent; + public uint H0008; + public float H000c; + public float H0010; + public uint H0014; + public float H0018; + public float H001c; + public float H0020; + public float H0024; + public float H0028; + public float H002c; + public float H0030; + public float H0034; + public float Zoom; // 1.0f if zoomed in, 0.0f if zoomed out + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct TopLeft; // Viewport position relative to world map, start + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct BottomRight; // Viewport position relative to world map, end + public fixed uint H004c[7]; + public float H0068; + public float H006c; + public fixed uint Params[109]; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x20)] + public unsafe struct XNode + { + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Pos; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Dir; + [global::System.Runtime.InteropServices.FieldOffset(0x0018)] + public global::Daybreak.API.Interop.GuildWars.Node* Left; + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public global::Daybreak.API.Interop.GuildWars.Node* Right; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1, Size = 0x18)] + public unsafe struct YNode + { + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct Pos; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public global::Daybreak.API.Interop.GuildWars.Node* Above; + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public global::Daybreak.API.Interop.GuildWars.Node* Below; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct QuoteInfo + { + public uint Unknown; + public uint ItemCount; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct TransactionInfo + { + public uint ItemCount; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ChatBuffer + { + public uint Next; + public uint Unk1; + public uint Unk2; + public ChatMessagePtrArray1 Messages; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ChatMessage + { + public uint Channel; + public uint Unk1; + public ulong Timestamp; + // Flexible array member: char Message[0] + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct AttributeData + { + public uint Points; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x8C)] + public unsafe struct SkillTemplate + { + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Primary; + public global::Daybreak.API.Interop.GWCA.GW.Constants.Profession Secondary; + public uint AttributesCount; + public AttributeArray12 AttributeIds; + public fixed uint AttributeValues[12]; + public SkillIDArray8 Skills; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit, Pack = 1)] + public unsafe struct AgentNameTagInfo + { + [global::System.Runtime.InteropServices.FieldOffset(0x0000)] + public uint AgentId; + [global::System.Runtime.InteropServices.FieldOffset(0x0004)] + public uint H0002; + [global::System.Runtime.InteropServices.FieldOffset(0x0008)] + public uint H0003; + [global::System.Runtime.InteropServices.FieldOffset(0x000C)] + public nint NameEnc; + [global::System.Runtime.InteropServices.FieldOffset(0x0010)] + public byte H0010; + [global::System.Runtime.InteropServices.FieldOffset(0x0011)] + public byte H0012; + [global::System.Runtime.InteropServices.FieldOffset(0x0012)] + public byte H0013; + [global::System.Runtime.InteropServices.FieldOffset(0x0013)] + public byte BackgroundAlpha; // ARGB, NB: Actual color is ignored, only alpha is used + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint TextColor; // ARGB + [global::System.Runtime.InteropServices.FieldOffset(0x0014)] + public uint LabelAttributes; // bold/size etc + [global::System.Runtime.InteropServices.FieldOffset(0x001C)] + public byte FontStyle; // Text style (bitmask) / bold | 0x1 / strikthrough | 0x80 + [global::System.Runtime.InteropServices.FieldOffset(0x001D)] + public byte Underline; // Text underline (bool) = 0x01 - 0xFF + [global::System.Runtime.InteropServices.FieldOffset(0x001E)] + public byte H001E; + [global::System.Runtime.InteropServices.FieldOffset(0x001F)] + public byte H001F; + [global::System.Runtime.InteropServices.FieldOffset(0x0020)] + public nint ExtraInfoEnc; // Title etc + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct ChatTemplate + { + public uint AgentId; + public uint Type; // 0 = build, 1 = equipment + public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Code; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct CompassPoint + { + public int X; + public int Y; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct CreateUIComponentPacket + { + public uint FrameId; + public uint ComponentFlags; + public uint TabIndex; + public nint EventCallback; + public nint Wparam; + public nint ComponentLabel; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct DialogBodyInfo + { + public uint Type; + public uint AgentId; + public nint MessageEnc; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct DialogButtonInfo + { + public uint ButtonIcon; // byte + public nint Message; + public uint DialogId; + public uint SkillId; // Default 0xFFFFFFF + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x24)] + public unsafe struct FloatingWindow + { + public nint Unk1; // Some kind of function call + public nint Name; + public uint Unk2; + public uint Unk3; + public uint SavePreference; // 1 or 0; if 1, will save to UI layout preferences. + public uint Unk4; + public uint Unk5; + public uint Unk6; + public uint WindowId; // Maps to window array + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct FrameInteractionCallback + { + public nint Callback; + public nint UictlContext; + public uint H0008; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct FramePositionData + { + public uint Flags; + public float Left; + public float Bottom; + public float Right; + public float Top; + public float ContentLeft; + public float ContentBottom; + public float ContentRight; + public float ContentTop; + public float Unk; + public float ScaleFactor; // Depends on UI scale + public float ViewportWidth; // Width in px of available screen height; this may sometimes be scaled down, too! + public float ViewportHeight; // Height in px of available screen height; this may sometimes be scaled down, too! + public float ScreenLeft; + public float ScreenBottom; + public float ScreenRight; + public float ScreenTop; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct InteractionMessage + { + public uint FrameId; + public global::Daybreak.API.Interop.GWCA.GW.UI.UIMessage MessageId; // Same as UIMessage from UIMgr, but includes things like mouse move, click etc + public nint WParam; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct MapEntryMessage + { + public nint Title; + public nint Subtitle; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct TooltipInfo + { + public uint BitField; + public nint* Render; // Function that the game uses to draw the content + public uint* Payload; // uint32_t* for skill or item, wchar_t* for encoded string + public uint PayloadLen; // Length in bytes of the payload + public uint Unk1; + public uint Unk2; + public uint Unk3; + public uint Unk4; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct UIChatMessage + { + public uint Channel; + public nint Message; + public uint Channel2; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct WindowPositionData + { + public uint State; // & 0x1 == visible + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct P1; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct P2; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kAgentSkillPacket + { + public uint AgentId; + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kAgentSkillStartedCast + { + public uint AgentId; + public global::Daybreak.API.Interop.GWCA.GW.Constants.SkillID SkillId; + public float Duration; + public uint H000c; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kAgentSpeechBubble + { + public uint AgentId; + public nint Message; + public uint H0008; + public uint H000c; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kAllyOrGuildMessage + { + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + public nint Message; + public nint Sender; + public nint GuildTag; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kChangeTarget + { + public uint EvaluatedTargetId; + public byte HasEvaluatedTargetChanged; + public uint AutoTargetId; + public byte HasAutoTargetChanged; + public uint ManualTargetId; + public byte HasManualTargetChanged; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kCompassDraw + { + public uint PlayerNumber; + public uint SessionId; + public uint NumberOfPoints; + public global::Daybreak.API.Interop.GuildWars.CompassPoint* Points; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kDialogueMessage + { + public uint AgentId; + public nint Sender; + public nint Message; + public uint Duration; + public uint IsDialogue1Or2; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kEffectAdd + { + public uint AgentId; + public global::Daybreak.API.Interop.GuildWars.EffectData* Effect; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kErrorMessage + { + public uint ErrorId; + public nint Message; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kGetColor + { + public uint* Color; + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kInteractAgent + { + public uint AgentId; + public byte CallTarget; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kInventorySlotUpdated + { + public uint Unk; + public uint ItemId; + public uint BagIndex; + public uint SlotId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kItemUpdated + { + public uint ItemId; + public uint ModelFileId; + public uint Type; + public uint Unk1; + public uint ExtraId; // Dye color + public uint Materials; + public uint Unk2; + public uint Interaction; // Flags + public uint Price; + public uint ModelId; + public uint Quantity; + public nint EncName; + public uint ModStructSize; + public uint* ModStruct; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kKeyAction + { + public uint GwKey; + public uint Modifiers; + public uint StateFlags; // shift held = 0x4, ctrl = 0x2, alt = 0x1 + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x20)] + public unsafe struct kLoadMapContext + { + public nint FileName; + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + public global::Daybreak.API.Interop.GWCA.GW.Constants.InstanceType MapType; + public global::Daybreak.API.Interop.GuildWars.Vec2fStruct SpawnPoint; + public uint H0014; + public uint H0018; + public nint Success; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kLogChatMessage + { + public nint Message; + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1, Size = 0x8)] + public unsafe struct kLogout + { + public uint Unknown; + public uint CharacterSelect; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kMeasureContent + { + public float MaxWidth; // Maximum width constraint + public float MaxHeight; // Maximum height constraint + public float* SizeOutput; // Pointer to output buffer for calculated size + public uint Flags; // Layout flags (similar to the 0x100 flag we saw) + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kMouseAction + { + public uint FrameId; + public uint ChildOffsetId; + public global::Daybreak.API.Interop.GWCA.GW.UI.UIPacket.ActionState CurrentState; + public nint Wparam; + public nint Lparam; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kMouseClick + { + public uint MouseButton; // 0x0 = left, 0x1 = middle, 0x2 = right + public uint IsDoubleclick; + public uint UnknownTypeScreenPos; + public uint H000c; + public uint H0010; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kMouseCoordsClick + { + public float OffsetX; + public float OffsetY; + public uint H0008; + public uint H000c; + public uint* H0010; + public uint H0014; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kMoveItem + { + public uint ItemId; + public uint ToBagIndex; + public uint ToSlot; + public uint Prompt; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kObjectiveAdd + { + public uint ObjectiveId; + public nint Name; + public uint Type; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kObjectiveComplete + { + public uint ObjectiveId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kObjectiveUpdated + { + public uint ObjectiveId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPartySearchInvite + { + public uint SourcePartySearchId; + public uint DestPartySearchId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPartyShowConfirmDialog + { + public uint UiMessageToSendToPartyFrame; + public uint PromptIdentitifier; + public nint PromptEncStr; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPlayerChatMessage + { + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + public nint Message; + public uint PlayerNumber; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPostProcessingEffect + { + public uint Tint; + public float Amount; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPreStartSalvage + { + public uint ItemId; + public uint KitId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPreferenceEnumChanged + { + public global::Daybreak.API.Interop.GWCA.GW.UI.EnumPreference PreferenceId; + public uint EnumIndex; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPreferenceFlagChanged + { + public global::Daybreak.API.Interop.GWCA.GW.UI.FlagPreference PreferenceId; + public uint NewValue; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPreferenceValueChanged + { + public global::Daybreak.API.Interop.GWCA.GW.UI.NumberPreference PreferenceId; + public uint NewValue; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kPrintChatMessage + { + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + public nint Message; + public ulong Timestamp; + public uint IsReprint; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kRecvWhisper + { + public uint TransactionId; + public nint From; + public nint Message; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kResize + { + public uint H0000; + public float ContentWidth; + public float ContentHeight; + public float H000c; + public float H0010; + public float ContentWidth2; + public float ContentHeight2; + public float MarginX; + public float MarginY; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendCallTarget + { + public global::Daybreak.API.Interop.GWCA.GW.CallTargetType CallType; + public uint AgentId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendChangeTarget + { + public uint TargetId; + public uint AutoTargetId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendChatMessage + { + public nint Message; + public uint AgentId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendLoadSkillTemplate + { + public uint AgentId; + public global::Daybreak.API.Interop.GuildWars.SkillTemplate* SkillTemplate; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendMerchantRequestQuote + { + public global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType Type; + public uint ItemId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendMerchantTransactItem + { + public global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType Type; + public uint H0004; + public global::Daybreak.API.Interop.GuildWars.QuoteInfo Give; + public uint GoldRecv; + public global::Daybreak.API.Interop.GuildWars.QuoteInfo Recv; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendMoveItem + { + public uint ItemId; + public uint Quantity; + public uint BagIndex; + public uint Slot; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendPingWeaponSet + { + public uint AgentId; + public uint WeaponItemId; + public uint OffhandItemId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendUseItem + { + public uint ItemId; + public ushort Quantity; // Unused, but would be cool + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSendWorldAction + { + public global::Daybreak.API.Interop.GWCA.GW.WorldActionId ActionId; + public uint AgentId; + public byte SuppressCallTarget; // 1 to block "I'm targetting X", but will also only trigger if the key thing is down + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kServerActiveQuestChanged + { + public global::Daybreak.API.Interop.GWCA.GW.Constants.QuestID QuestId; + public global::Daybreak.API.Interop.GuildWars.GamePos Marker; + public uint H0024; + public global::Daybreak.API.Interop.GWCA.GW.Constants.MapID MapId; + public uint LogState; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSetAgentProfession + { + public uint AgentId; + public uint Primary; + public uint Secondary; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSetLayout + { + public float Field0x0; + public float Field0x4; + public float Field0x8; + public float Field0xc; + public float AvailableWidth; + public float AvailableHeight; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kSetRendererValue + { + public uint RendererMode; // 0 for window, 2 for full screen + public uint MetricId; // TODO: Enum this! + public uint Value; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kShowXunlaiChest + { + public uint H0000; + public byte StoragePaneUnlocked; + public byte AnniversaryPaneUnlocked; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kStartWhisper + { + public nint PlayerName; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kTomeSkillSelection + { + public uint ItemId; + public uint H0004; + public uint H0008; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kUIPositionChanged + { + public uint WindowId; + public global::Daybreak.API.Interop.GuildWars.WindowPositionData* Position; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kUseKitOnItem + { + public uint ItemId; + public uint KitId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kVendorItems + { + public global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType TransactionType; + public uint ItemIdsCount; + public uint* ItemIdsBuffer1; // world->merchant_items.buffer + public uint* ItemIdsBuffer2; // world->merchant_items2.buffer + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kVendorQuote + { + public uint ItemId; + public uint Price; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kVendorWindow + { + public global::Daybreak.API.Interop.GWCA.GW.Merchant.TransactionType TransactionType; + public uint Unk; + public uint MerchantAgentId; + public uint IsPending; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kWeaponSetChanged + { + public uint H0000; + public uint H0004; + public uint H0008; + public uint H000c; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kWeaponSwap + { + public uint WeaponBarFrameId; + public uint WeaponSetId; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kWriteToChatLog + { + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel Channel; + public nint Message; + public global::Daybreak.API.Interop.GWCA.GW.Chat.Channel ChannelDupe; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct kWriteToChatLogWithSender + { + public uint Channel; + public nint Message; + public nint SenderEnc; + } + + [global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] + public unsafe struct PacketBase + { + public uint Header; + } + + public unsafe struct KeyCallback { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct AgentArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct AgentEffectsArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct AgentInfoArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct AgentList { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct AgentMovementArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct BlockedPlaneArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct BuffArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct EffectArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct FriendsListArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct GuildArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct GuildHistory { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct GuildRoster { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct HenchmanPartyMemberArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct HeroFlagArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct HeroInfoArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct HeroPartyMemberArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct ItemArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct MapAgentArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct MerchItemArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct MissionMapIconArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct NPCArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PartyAttributeArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PathNodeArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PathingMapArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PlayerArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PlayerPartyMemberArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct QuestLog { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct SkillbarArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct SkillbarCastArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct TitleArray { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct VisibleEffectList { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } + public unsafe struct PacketCallback { public global::Daybreak.API.Interop.GuildWars.GuildWarsArray Value; } +} diff --git a/Daybreak.API/Interop/GWDelegateCache.cs b/Daybreak.API/Interop/GWDelegateCache.cs deleted file mode 100644 index 219caea5..00000000 --- a/Daybreak.API/Interop/GWDelegateCache.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop; - -public sealed class GWDelegateCache(GWAddressCache cache) - where TDelegate : Delegate -{ - public GWAddressCache Cache { get; } = cache; - - public TDelegate? GetDelegate() - { - if (this.Cache.GetAddress() is not nuint address) - { - return default; - } - - return Marshal.GetDelegateForFunctionPointer((nint)address); - } -} diff --git a/Daybreak.API/Interop/GWFastCall.cs b/Daybreak.API/Interop/GWFastCall.cs deleted file mode 100644 index 8aa37278..00000000 --- a/Daybreak.API/Interop/GWFastCall.cs +++ /dev/null @@ -1,312 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop; - -public abstract class GWFastCall(GWAddressCache target) -{ - public readonly struct Void { } - - public GWAddressCache Cache { get; } = target; - public abstract void Initialize(); - - /// - /// Builds a thunk for __fastcall with 1 parameter (ECX only). - /// - protected unsafe static nint BuildFastCallThunk1(nuint target) - { - if (target is 0) - { - return 0; - } - - var code = stackalloc byte[10] - { - 0x58, // pop eax (ret) - 0x59, // pop ecx (arg1) - 0x50, // push eax (ret) - 0xB8, 0, 0, 0, 0, // mov eax, TARGET - 0xFF, 0xE0 // jmp eax - }; // 10 bytes total - - const int TARGET_OFFSET = 4; - Unsafe.WriteUnaligned(ref code[TARGET_OFFSET], (uint)target); - - var mem = NativeMethods.VirtualAlloc(0, 10, NativeMethods.MEM_COMMIT | NativeMethods.MEM_RESERVE, NativeMethods.PAGE_EXECUTE_READWRITE); - if (mem is 0) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "VirtualAlloc"); - } - - Buffer.MemoryCopy(code, (void*)mem, 10, 10); - return mem; - } - - /// - /// Builds a thunk for __fastcall with 2+ parameters (ECX and EDX). - /// - protected unsafe static nint BuildFastCallThunk2(nuint target) - { - if (target is 0) - { - return 0; - } - - var code = stackalloc byte[11] - { - 0x58, // pop eax (ret) - 0x59, // pop ecx (ctx) - 0x5A, // pop edx (edxVal) - 0x50, // push eax (ret) - 0xB8,0,0,0,0, // mov eax, TARGET - 0xFF,0xE0 // jmp eax - }; // 11 bytes total - - const int TARGET_OFFSET = 5; - Unsafe.WriteUnaligned(ref code[TARGET_OFFSET], (uint)target); - - var mem = NativeMethods.VirtualAlloc(0, 11, NativeMethods.MEM_COMMIT | NativeMethods.MEM_RESERVE, NativeMethods.PAGE_EXECUTE_READWRITE); - if (mem is 0) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "VirtualAlloc"); - } - - Buffer.MemoryCopy(code, (void*)mem, 11, 11); - return mem; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T2? Invoke(T1 t1) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T2) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1); - return default; - } - - return this.func(t1); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk1(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T3? Invoke(T1 t1, T2 t2) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T3) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1, t2); - return default; - } - - return this.func(t1, t2); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk2(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T4? Invoke(T1 t1, T2 t2, T3 t3) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T4) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1, t2, t3); - return default; - } - - return this.func(t1, t2, t3); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk2(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T5? Invoke(T1 t1, T2 t2, T3 t3, T4 t4) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T5) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1, t2, t3, t4); - return default; - } - - return this.func(t1, t2, t3, t4); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk2(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T6? Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T6) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1, t2, t3, t4, t5); - return default; - } - - return this.func(t1, t2, t3, t4, t5); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk2(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} - -public unsafe sealed class GWFastCall(GWAddressCache target) : GWFastCall(target) -{ - private delegate* unmanaged[Stdcall] func = null; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe T7? Invoke(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) - { - if (this.func is null) - { - this.Initialize(); - } - - if (this.func is not null) - { - if (typeof(T7) == typeof(Void)) - { - ((delegate* unmanaged[Stdcall])this.func)(t1, t2, t3, t4, t5, t6); - return default; - } - - return this.func(t1, t2, t3, t4, t5, t6); - } - - return default; - } - - public override void Initialize() - { - if (this.Cache.GetAddress() is not nuint addr || - addr is 0) - { - return; - } - - var call = BuildFastCallThunk2(addr); - this.func = (delegate* unmanaged[Stdcall])call; - } -} diff --git a/Daybreak.API/Interop/GWHook.cs b/Daybreak.API/Interop/GWHook.cs deleted file mode 100644 index 43012db9..00000000 --- a/Daybreak.API/Interop/GWHook.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System.Runtime.InteropServices; -using MinHook; - -namespace Daybreak.API.Interop; - -/// -/// A thin convenience wrapper around MinHook that -/// resolves the target address lazily through -/// unwraps an existing “CALL/JMP rel32” stub so we patch the real code -/// exposes so your detour can chain -/// -public sealed class GWHook( - GWAddressCache funcAddress, - T detour, - bool bypassPreviousHooks = false) : IHook - where T : Delegate -{ - private readonly bool bypassPreviousHooks = bypassPreviousHooks; - private readonly GWAddressCache addressCache = funcAddress ?? throw new ArgumentNullException(nameof(funcAddress)); - private readonly T detour = detour ?? throw new ArgumentNullException(nameof(detour)); - private readonly SemaphoreSlim semaphore = new(1, 1); - - private T? cont; // trampoline returned by MinHook - private HookEngine? engine; - - /// Delegate that calls the next hook / real function. - public T Continue => this.cont ?? - throw new InvalidOperationException("Hook not initialised – call EnsureInitialized() first."); - - public bool Hooked { get; private set; } = false; - public nuint TargetAddress { get; private set; } - public nuint ContinueAddress { get; private set; } - public nuint DetourAddress { get; private set; } - - /// Installs the hook exactly once (thread-safe). - public bool EnsureInitialized() - { - if (this.Hooked) - { - return true; - } - - this.semaphore.Wait(); - try - { - if (this.Hooked) - { - return true; - } - - var addr = this.addressCache.GetAddress(); - if (addr.HasValue is false || - addr.Value is 0) - { - return false; - } - - var target = this.bypassPreviousHooks - ? UnwrapNearBranch(addr.Value) - : addr.Value; - if (target is 0) - { - return false; - } - - this.engine = new HookEngine(); - this.cont = this.engine.CreateHook((nint)target, this.detour); - this.engine.EnableHooks(); - this.TargetAddress = target; - this.ContinueAddress = (nuint)this.cont.Method.MethodHandle.GetFunctionPointer(); - this.DetourAddress = (nuint)this.detour.Method.MethodHandle.GetFunctionPointer(); - this.Hooked = true; - return true; - } - catch (Exception) - { - return false; - } - finally - { - this.semaphore.Release(); - } - } - - public void Dispose() - { - this.semaphore.Wait(); - try - { - if (!this.Hooked || - this.engine is null) - { - return; - } - - this.engine.DisableHooks(); - this.engine.Dispose(); - - this.cont = null; - this.Hooked = false; - } - finally - { - this.semaphore.Release(); - } - } - - /// - /// Follows a CALL rel32 (E8) **or** JMP rel32 (E9) - /// trampoline that may have been planted by a previous hook. - /// - private static unsafe nuint UnwrapNearBranch(nuint addr) - { - byte op = Marshal.ReadByte((IntPtr)addr); - if (op != 0xE8 && op != 0xE9) // not CALL/JMP rel32 - return addr; - - int rel = Marshal.ReadInt32((IntPtr)(addr + 1)); - long dst = (long)addr + 5 + rel; // 5-byte instruction - return (nuint)dst; - } -} diff --git a/Daybreak.API/Interop/GuildWars/AccountGameContext.cs b/Daybreak.API/Interop/GuildWars/AccountGameContext.cs deleted file mode 100644 index 0a633341..00000000 --- a/Daybreak.API/Interop/GuildWars/AccountGameContext.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0xC)] -public readonly struct AccountUnlockedCount -{ - [FieldOffset(0x0000)] - public readonly uint Id; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x138)] -[GWCAEquivalent("AccountContext")] -public readonly struct AccountGameContext -{ - [FieldOffset(0x0000)] - public readonly GuildWarsArray AccountUnlockedCounts; - - [FieldOffset(0x00b4)] - public readonly GuildWarsArray UnlockedPvpHeroes; - - [FieldOffset(0x0124)] - public readonly GuildWarsArray UnlockedAccountSkills; - - [FieldOffset(0x0134)] - public readonly uint AccountFlags; -} diff --git a/Daybreak.API/Interop/GuildWars/AccountInfoContext.cs b/Daybreak.API/Interop/GuildWars/AccountInfoContext.cs deleted file mode 100644 index 88f3d08f..00000000 --- a/Daybreak.API/Interop/GuildWars/AccountInfoContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x1C)] -[GWCAEquivalent("AccountInfo")] -public readonly unsafe struct AccountInfoContext -{ - public readonly char* AccountName; - public readonly uint Wins; - public readonly uint Losses; - public readonly uint Rating; - public readonly uint QualifierPoints; - public readonly uint Rank; - public readonly uint TournamentRewardPoints; -} diff --git a/Daybreak.API/Interop/GuildWars/Agent.cs b/Daybreak.API/Interop/GuildWars/Agent.cs deleted file mode 100644 index 719133ba..00000000 --- a/Daybreak.API/Interop/GuildWars/Agent.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System.Numerics; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[Flags] -public enum AgentType : uint -{ - Living = 0xDB, - Gadget = 0x200, - Item = 0x400 -} - -[Flags] -public enum AgentModelType : ushort -{ - NPC = 0x2000, - Player = 0x3000 -} - -[Flags] -public enum LivingAgentState : uint -{ - None = 0, - InCombatStance = 0x000001, - HasQuest = 0x000002, - Dead = 0x000008, - Female = 0x000200, - HasBossGlow = 0x000400, - HidingCape = 0x001000, - CanBeViewedInPartyWindow = 0x020000, - SpawnedSpirit = 0x040000, - BeingObservedOrPlayer = 0x400000 -} - -public enum LivingAgentAllegiance : byte -{ - Ally_NonAttackable = 0x1, - Neutral = 0x2, - Enemy = 0x3, - Spirit_Pet = 0x4, - Minion = 0x5, - Npc_Minipet = 0x6 -}; - - -[Flags] -public enum LivingAgentEffects : uint -{ - None = 0, - Bleeding = 0x0001, - Conditioned = 0x0002, - Crippled1 = 0x0008, // Part of the Crippled check - Crippled = 0x000A, // Combined flag for crippled (0x0008 | 0x0002) - Dead = 0x0010, - DeepWound = 0x0020, - Poisoned = 0x0040, - Enchanted = 0x0080, - DegenHexed = 0x0400, - Hexed = 0x0800, - WeaponSpelled = 0x8000 -} - -public enum LivingAgentModelState : ushort -{ - // Idle states - Idle1 = 64, - Idle2 = 68, - Idle3 = 100, - - // Casting states - Casting1 = 65, - Casting2 = 581, - - // Moving states - Moving1 = 12, - Moving2 = 76, - Moving3 = 204, - - // Attacking states - Attacking1 = 96, - Attacking2 = 1088, - Attacking3 = 1120, - - // Other states - KnockedDown = 1104 -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("AgentEffects")] -public readonly struct AgentEffects -{ - public readonly uint AgentId; - public readonly GuildWarsArray Buffs; - public readonly GuildWarsArray Effects; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("AgentContext")] -public readonly struct AgentGameContext -{ - [FieldOffset(0x01AC)] - public readonly uint InstanceTimer; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 196)] -[GWCAEquivalent("Agent")] -public readonly struct AgentContext -{ - [FieldOffset(0x0014)] - public readonly uint AgentInstanceTimer; - - [FieldOffset(0x002C)] - public readonly uint AgentId; - - [FieldOffset(0x0074)] - public readonly GamePos Pos; - - [FieldOffset(0x009C)] - public readonly AgentType Type; - - [FieldOffset(0x00A0)] - public readonly Vector2 Velocity; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 212)] -[GWCAEquivalent("AgentItem")] -public readonly struct AgentItemContext -{ - [FieldOffset(0x00C4)] - public readonly uint OwnerId; - - [FieldOffset(0x00C8)] - public readonly uint ItemId; - - [FieldOffset(0x00D0)] - public readonly uint ExtraType; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 228)] -[GWCAEquivalent("AgentGadget")] -public readonly struct AgentGadgetContext -{ - [FieldOffset(0x00CC)] - public readonly uint ExtraType; - - [FieldOffset(0x00D0)] - public readonly uint GadgetId; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x1C0)] -[GWCAEquivalent("AgentLiving")] -public readonly unsafe struct AgentLivingContext -{ - [FieldOffset(0x00C4)] - public readonly uint OwnerId; - - [FieldOffset(0x00F4)] - public readonly ushort AgentType; // All non-player have an identifier. Two of the same mob have the same identifier; - - [FieldOffset(0x00F6)] - public readonly AgentModelType AgentModelType; - - [FieldOffset(0x0108)] - public readonly TagInfo* Tags; - - [FieldOffset(0x010E)] - public readonly byte Primary; - - [FieldOffset(0x010F)] - public readonly byte Secondary; - - [FieldOffset(0x0110)] - public readonly byte Level; - - [FieldOffset(0x0111)] - public readonly byte TeamId; - - [FieldOffset(0x0118)] - public readonly float EnergyRegen; - - [FieldOffset(0x0120)] - public readonly float Energy; - - [FieldOffset(0x0124)] - public readonly uint MaxEnergy; - - [FieldOffset(0x012C)] - public readonly float HealthRegen; - - [FieldOffset(0x0134)] - public readonly float Health; - - [FieldOffset(0x0138)] - public readonly uint MaxHealth; - - [FieldOffset(0x013C)] - public readonly uint Effects; - - [FieldOffset(0x0158)] - public readonly LivingAgentModelState ModelState; - - [FieldOffset(0x015C)] - public readonly LivingAgentState State; - - [FieldOffset(0x0184)] - public readonly uint LoginNumber; - - [FieldOffset(0x01B5)] - public readonly LivingAgentAllegiance Allegiance; - - public readonly bool IsAlive => (!this.State.HasFlag(LivingAgentState.Dead)) && this.Health > 0f; - - public readonly bool IsPlayer => this.LoginNumber is not 0; - - public readonly bool IsNpc => this.LoginNumber is 0; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 52)] -[GWCAEquivalent("MapAgent")] -public readonly struct MapAgentContext -{ - [FieldOffset(0x0000)] - public readonly float CurrentEnergy; - - [FieldOffset(0x0004)] - public readonly float MaxEnergy; - - [FieldOffset(0x0008)] - public readonly float EnergyRegen; - - [FieldOffset(0x000C)] - public readonly uint SkillTimestamp; - - [FieldOffset(0x0020)] - public readonly float CurrentHealth; - - [FieldOffset(0x0024)] - public readonly float MaxHealth; - - [FieldOffset(0x0028)] - public readonly float HealthRegen; - - [FieldOffset(0x0030)] - public readonly LivingAgentEffects Effects; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x38)] -[GWCAEquivalent("AgentInfo")] -public readonly unsafe struct AgentInfo -{ - [FieldOffset(0x0034)] - public readonly char* NameEncoded; -} diff --git a/Daybreak.API/Interop/GuildWars/Attribute.cs b/Daybreak.API/Interop/GuildWars/Attribute.cs deleted file mode 100644 index 1efeb9a7..00000000 --- a/Daybreak.API/Interop/GuildWars/Attribute.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("Attribute")] -public readonly struct AttributeContext -{ - public readonly uint Id; - public readonly uint LevelBase; - public readonly uint Level; - public readonly uint DecrementPoints; - public readonly uint IncrementPoints; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("AttributeInfo")] -public readonly struct AttributeInfo -{ - public readonly uint ProfessionId; - public readonly uint AttributeId; - public readonly uint NameId; - public readonly uint DescriptionId; - public readonly uint IsPve; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("PartyAttribute")] -public readonly struct PartyAttribute -{ - public readonly uint AgentId; - public readonly AttributeContext Attribute0; - public readonly AttributeContext Attribute1; - public readonly AttributeContext Attribute2; - public readonly AttributeContext Attribute3; - public readonly AttributeContext Attribute4; - public readonly AttributeContext Attribute5; - public readonly AttributeContext Attribute6; - public readonly AttributeContext Attribute7; - public readonly AttributeContext Attribute8; - public readonly AttributeContext Attribute9; - public readonly AttributeContext Attribute10; - public readonly AttributeContext Attribute11; - public readonly AttributeContext Attribute12; - public readonly AttributeContext Attribute13; - public readonly AttributeContext Attribute14; - public readonly AttributeContext Attribute15; - public readonly AttributeContext Attribute16; - public readonly AttributeContext Attribute17; - public readonly AttributeContext Attribute18; - public readonly AttributeContext Attribute19; - public readonly AttributeContext Attribute20; - public readonly AttributeContext Attribute21; - public readonly AttributeContext Attribute22; - public readonly AttributeContext Attribute23; - public readonly AttributeContext Attribute24; - public readonly AttributeContext Attribute25; - public readonly AttributeContext Attribute26; - public readonly AttributeContext Attribute27; - public readonly AttributeContext Attribute28; - public readonly AttributeContext Attribute29; - public readonly AttributeContext Attribute30; - public readonly AttributeContext Attribute31; - public readonly AttributeContext Attribute32; - public readonly AttributeContext Attribute33; - public readonly AttributeContext Attribute34; - public readonly AttributeContext Attribute35; - public readonly AttributeContext Attribute36; - public readonly AttributeContext Attribute37; - public readonly AttributeContext Attribute38; - public readonly AttributeContext Attribute39; - public readonly AttributeContext Attribute40; - public readonly AttributeContext Attribute41; - public readonly AttributeContext Attribute42; - public readonly AttributeContext Attribute43; - public readonly AttributeContext Attribute44; - public readonly AttributeContext Attribute45; - public readonly AttributeContext Attribute46; - public readonly AttributeContext Attribute47; - public readonly AttributeContext Attribute48; - public readonly AttributeContext Attribute49; - public readonly AttributeContext Attribute50; - public readonly AttributeContext Attribute51; - public readonly AttributeContext Attribute52; - public readonly AttributeContext Attribute53; - - public readonly AttributeContext[] Attributes => - [ - this.Attribute0, this.Attribute1, this.Attribute2, this.Attribute3, this.Attribute4, this.Attribute5, this.Attribute6, this.Attribute7, this.Attribute8, this.Attribute9, - this.Attribute10, this.Attribute11, this.Attribute12, this.Attribute13, this.Attribute14, this.Attribute15, this.Attribute16, this.Attribute17, this.Attribute18, this.Attribute19, - this.Attribute20, this.Attribute21, this.Attribute22, this.Attribute23, this.Attribute24, this.Attribute25, this.Attribute26, this.Attribute27, this.Attribute28, this.Attribute29, - this.Attribute30, this.Attribute31, this.Attribute32, this.Attribute33, this.Attribute34, this.Attribute35, this.Attribute36, this.Attribute37, this.Attribute38, this.Attribute39, - this.Attribute40, this.Attribute41, this.Attribute42, this.Attribute43, this.Attribute44, this.Attribute45, this.Attribute46, this.Attribute47, this.Attribute48, this.Attribute49, - this.Attribute50, this.Attribute51, this.Attribute52, this.Attribute53 - ]; -} diff --git a/Daybreak.API/Interop/GuildWars/Bag.cs b/Daybreak.API/Interop/GuildWars/Bag.cs deleted file mode 100644 index cae93f7b..00000000 --- a/Daybreak.API/Interop/GuildWars/Bag.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -public enum BagType -{ - None, - Inventory, - Equipped, - NotCollected, - Storage, - MaterialsStorage -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("Bag")] -public readonly unsafe struct Bag -{ - [FieldOffset(0x0000)] - public readonly BagType Type; - [FieldOffset(0x0004)] - public readonly uint Index; - [FieldOffset(0x000C)] - public readonly uint ContainerItem; - [FieldOffset(0x0010)] - public readonly uint ItemsCount; - [FieldOffset(0x0014)] - public readonly Bag* Bags; - [FieldOffset(0x0018)] - public readonly GuildWarsArray> Items; -} diff --git a/Daybreak.API/Interop/GuildWars/Behavior.cs b/Daybreak.API/Interop/GuildWars/Behavior.cs deleted file mode 100644 index 28f29287..00000000 --- a/Daybreak.API/Interop/GuildWars/Behavior.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("HeroBehavior")] -public enum Behavior -{ - Fight, - Guard, - AvoidCombat -} diff --git a/Daybreak.API/Interop/GuildWars/CharContext.cs b/Daybreak.API/Interop/GuildWars/CharContext.cs deleted file mode 100644 index 0902642f..00000000 --- a/Daybreak.API/Interop/GuildWars/CharContext.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("CharContext")] -public readonly struct CharContext -{ - [FieldOffset(0x0064)] - public readonly Uuid PlayerUuid; - - [FieldOffset(0x0074)] - public readonly Array20Char PlayerName; - - [FieldOffset(0x0198)] - public readonly uint MapId; - - [FieldOffset(0x019C)] - public readonly uint IsExporable; - - [FieldOffset(0x01A0)] - public readonly Array24Byte Host; - - [FieldOffset(0x01B8)] - public readonly uint PlayerId; - - [FieldOffset(0x0220)] - public readonly uint DistrictNumber; - - [FieldOffset(0x0224)] - public readonly Language Language; - - [FieldOffset(0x0228)] - public readonly uint ObserveMapId; - - [FieldOffset(0x022C)] - public readonly uint CurrentMapId; - - [FieldOffset(0x0230)] - public readonly uint ObserveMapType; - - [FieldOffset(0x0234)] - public readonly uint CurrentMapType; - - [FieldOffset(0x02A4)] - public readonly uint PlayerNumber; - - [FieldOffset(0x03B8)] - public readonly Array64Char PlayerEmail; -} diff --git a/Daybreak.API/Interop/GuildWars/CharInfoContext.cs b/Daybreak.API/Interop/GuildWars/CharInfoContext.cs deleted file mode 100644 index 7ac0d55f..00000000 --- a/Daybreak.API/Interop/GuildWars/CharInfoContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("CharacterInformation")] -public readonly struct CharInfoContext -{ - [FieldOffset(0x0008)] - public readonly Uuid Uuid; - [FieldOffset(0x0018)] - public readonly Array20Char Name; - [FieldOffset(0x0040)] - public readonly Array17Uint Props; - - public readonly uint MapId => (this.Props[0] >> 16) & 0xFFFF; - public readonly uint Primary => (this.Props[2] >> 20) & 0xF; - public readonly uint Secondary => (this.Props[7] >> 10) & 0xF; - public readonly uint Campaign => this.Props[7] & 0xF; - public readonly uint Level => (this.Props[7] >> 4) & 0x3F; - public readonly bool IsPvp => ((this.Props[7] >> 9) & 0x1) == 0x1; -} diff --git a/Daybreak.API/Interop/GuildWars/ControlAction.cs b/Daybreak.API/Interop/GuildWars/ControlAction.cs deleted file mode 100644 index 40423be9..00000000 --- a/Daybreak.API/Interop/GuildWars/ControlAction.cs +++ /dev/null @@ -1,184 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("ControlAction")] -public enum ControlAction : uint -{ - None = 0, - Screenshot = 0xAE, - - // Panels - CloseAllPanels = 0x85, - ToggleInventoryWindow = 0x8B, - OpenScoreChart = 0xBD, - OpenTemplateManager = 0xD3, - OpenSaveEquipmentTemplate = 0xD4, - OpenSaveSkillTemplate = 0xD5, - OpenParty = 0xBF, - OpenGuild = 0xBA, - OpenFriends = 0xB9, - ToggleAllBags = 0xB8, - OpenMissionMap = 0xB6, - OpenBag2 = 0xB5, - OpenBag1 = 0xB4, - OpenBelt = 0xB3, - OpenBackpack = 0xB2, - OpenSkillsAndAttributes = 0x8F, - OpenQuestLog = 0x8E, - OpenWorldMap = 0x8C, - OpenOptions = 0x8D, - OpenHero = 0x8A, - - // Weapon sets - CycleEquipment = 0x86, - ActivateWeaponSet1 = 0x81, - ActivateWeaponSet2, - ActivateWeaponSet3, - ActivateWeaponSet4, - - DropItem = 0xCD, // drops bundle item >> flags, ashes, etc - - // Chat - CharReply = 0xBE, - OpenChat = 0xA1, - OpenAlliance = 0x88, - - ReverseCamera = 0x90, - StrafeLeft = 0x91, - StrafeRight = 0x92, - TurnLeft = 0xA2, - TurnRight = 0xA3, - MoveBackward = 0xAC, - MoveForward = 0xAD, - CancelAction = 0xAF, - Interact = 0x80, - ReverseDirection = 0xB1, - Autorun = 0xB7, - Follow = 0xCC, - - // Targeting - TargetPartyMember1 = 0x96, - TargetPartyMember2, - TargetPartyMember3, - TargetPartyMember4, - TargetPartyMember5, - TargetPartyMember6, - TargetPartyMember7, - TargetPartyMember8, - TargetPartyMember9 = 0xC6, - TargetPartyMember10, - TargetPartyMember11, - TargetPartyMember12, - - TargetNearestItem = 0xC3, - TargetNextItem = 0xC4, - TargetPreviousItem = 0xC5, - TargetPartyMemberNext = 0xCA, - TargetPartyMemberPrevious = 0xCB, - TargetAllyNearest = 0xBC, - ClearTarget = 0xE3, - TargetSelf = 0xA0, // also 0x96 - TargetPriorityTarget = 0x9F, - TargetNearestEnemy = 0x93, - TargetNextEnemy = 0x95, - TargetPreviousEnemy = 0x9E, - - ShowOthers = 0x89, - ShowTargets = 0x94, - - CameraZoomIn = 0xCE, - CameraZoomOut = 0xCF, - - // Party/Hero commands - ClearPartyCommands = 0xDB, - CommandParty = 0xD6, - CommandHero1, - CommandHero2, - CommandHero3, - CommandHero4 = 0x102, - CommandHero5, - CommandHero6, - CommandHero7, - - OpenHero1PetCommander = 0xE0, - OpenHero2PetCommander, - OpenHero3PetCommander, - OpenHero4PetCommander = 0xFE, - OpenHero5PetCommander, - OpenHero6PetCommander, - OpenHero7PetCommander, - OpenHeroCommander1 = 0xDC, - OpenHeroCommander2, - OpenHeroCommander3, - OpenPetCommander, - OpenHeroCommander4 = 0x126, - OpenHeroCommander5, - OpenHeroCommander6, - OpenHeroCommander7, - - Hero1Skill1 = 0xE5, - Hero1Skill2, - Hero1Skill3, - Hero1Skill4, - Hero1Skill5, - Hero1Skill6, - Hero1Skill7, - Hero1Skill8, - Hero2Skill1, - Hero2Skill2, - Hero2Skill3, - Hero2Skill4, - Hero2Skill5, - Hero2Skill6, - Hero2Skill7, - Hero2Skill8, - Hero3Skill1, - Hero3Skill2, - Hero3Skill3, - Hero3Skill4, - Hero3Skill5, - Hero3Skill6, - Hero3Skill7, - Hero3Skill8, - Hero4Skill1 = 0x106, - Hero4Skill2, - Hero4Skill3, - Hero4Skill4, - Hero4Skill5, - Hero4Skill6, - Hero4Skill7, - Hero4Skill8, - Hero5Skill1, - Hero5Skill2, - Hero5Skill3, - Hero5Skill4, - Hero5Skill5, - Hero5Skill6, - Hero5Skill7, - Hero5Skill8, - Hero6Skill1, - Hero6Skill2, - Hero6Skill3, - Hero6Skill4, - Hero6Skill5, - Hero6Skill6, - Hero6Skill7, - Hero6Skill8, - Hero7Skill1, - Hero7Skill2, - Hero7Skill3, - Hero7Skill4, - Hero7Skill5, - Hero7Skill6, - Hero7Skill7, - Hero7Skill8, - - // Skills - UseSkill1 = 0xA4, - UseSkill2, - UseSkill3, - UseSkill4, - UseSkill5, - UseSkill6, - UseSkill7, - UseSkill8 -}; diff --git a/Daybreak.API/Interop/GuildWars/District.cs b/Daybreak.API/Interop/GuildWars/District.cs deleted file mode 100644 index 218949e9..00000000 --- a/Daybreak.API/Interop/GuildWars/District.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("District")] -public enum District -{ - Current, - International, - American, - EuropeEnglish, - EuropeFrench, - EuropeGerman, - EuropeItalian, - EuropeSpanish, - EuropePolish, - EuropeRussian, - AsiaKorean, - AsiaChinese, - AsiaJapanese, - Unknown = 0xff -} diff --git a/Daybreak.API/Interop/GuildWars/Frame.cs b/Daybreak.API/Interop/GuildWars/Frame.cs deleted file mode 100644 index 7a095a0f..00000000 --- a/Daybreak.API/Interop/GuildWars/Frame.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Daybreak.API.Models; -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -// Very incomplete. GWCA contains a much better definition -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x1AC)] -[GWCAEquivalent("Frame")] -public readonly struct Frame -{ - [FieldOffset(0x0008)] - public readonly uint FrameLayout; - - [FieldOffset(0x0018)] - public readonly uint VisibilityFlags; - - [FieldOffset(0x0020)] - public readonly uint Type; - - [FieldOffset(0x0024)] - public readonly uint TemplateType; - - [FieldOffset(0x00A8)] - public readonly GuildWarsArray FrameCallbacks; - - [FieldOffset(0x00b8)] - public readonly uint ChildOffsetId; - - [FieldOffset(0x00bc)] - public readonly uint FrameId; - - [FieldOffset(0x0128)] - public readonly FrameRelation Relation; - - [FieldOffset(0x018C)] - public readonly uint FrameState; - - public bool IsCreated => (this.FrameState & 0x4) != 0; - public bool IsHidden => (this.FrameState & 0x200) != 0; - public bool IsVisible => !this.IsHidden; - public bool IsDIsabled => (this.FrameState & 0x10) != 0; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x1C)] -public readonly unsafe struct FrameRelation -{ - [FieldOffset(0x0000)] - public readonly FrameRelation* Parent; - - [FieldOffset(0x000C)] - public readonly uint FrameHashId; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -public readonly unsafe struct InteractionMessage -{ - public readonly uint FrameId; - public readonly UIMessage MessageId; - public readonly void** WParam; -} - -public unsafe delegate void UIInteractionCallback(InteractionMessage* message, void* wParam, void* lParam); - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0xC)] -public unsafe readonly struct FrameInteractionCallback -{ - public readonly void* Callback; // UIInteractionCallback - public readonly void* UiCtl_Context; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly unsafe struct CharSelectorContext -{ - [FieldOffset(0x0000)] - public readonly uint Vtable; - - [FieldOffset(0x0004)] - public readonly uint FrameId; - - [FieldOffset(0x0008)] - public readonly GuildWarsArray> Chars; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly struct CharSelectorChar -{ - [FieldOffset(0x0020)] - public readonly Array20Char Name; -} diff --git a/Daybreak.API/Interop/GuildWars/GameContext.cs b/Daybreak.API/Interop/GuildWars/GameContext.cs deleted file mode 100644 index 44bd65e0..00000000 --- a/Daybreak.API/Interop/GuildWars/GameContext.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("GameContext")] -public readonly unsafe struct GameContext -{ - [FieldOffset(0x0008)] - public readonly AgentGameContext* AgentGameContext; - - [FieldOffset(0x0014)] - public readonly MapContext* MapContext; - - [FieldOffset(0x0018)] - public readonly TextParserContext* TextParserContext; - - [FieldOffset(0x0028)] - public readonly AccountGameContext* AccountContext; - - [FieldOffset(0x002C)] - public readonly WorldContext* WorldContext; - - [FieldOffset(0x003C)] - public readonly GuildContext* GuildContext; - - [FieldOffset(0x0040)] - public readonly ItemContext* ItemContext; - - [FieldOffset(0x0044)] - public readonly CharContext* CharContext; - - [FieldOffset(0x004C)] - public readonly PartyContext* PartyContext; -} diff --git a/Daybreak.API/Interop/GuildWars/GamePos.cs b/Daybreak.API/Interop/GuildWars/GamePos.cs deleted file mode 100644 index 906d15ab..00000000 --- a/Daybreak.API/Interop/GuildWars/GamePos.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("GamePos")] -public readonly struct GamePos -{ - public readonly float X; - public readonly float Y; - public readonly uint Plane; -} diff --git a/Daybreak.API/Interop/GuildWars/GameplayContext.cs b/Daybreak.API/Interop/GuildWars/GameplayContext.cs deleted file mode 100644 index ff1dce23..00000000 --- a/Daybreak.API/Interop/GuildWars/GameplayContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x78)] -[GWCAEquivalent("GameplayContext")] -public readonly struct GameplayContext -{ - [FieldOffset(0x4C)] - public readonly float MissionMapZoom; -} \ No newline at end of file diff --git a/Daybreak.API/Interop/GuildWars/Guild.cs b/Daybreak.API/Interop/GuildWars/Guild.cs deleted file mode 100644 index 596747a1..00000000 --- a/Daybreak.API/Interop/GuildWars/Guild.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("GuildContext")] -public readonly struct GuildContext -{ - [FieldOffset(0x0034)] - public readonly Array20Char PlayerName; - - [FieldOffset(0x0060)] - public readonly uint PlayerBuildIndex; - - [FieldOffset(0x0078)] - public readonly Array256Char Announcement; - - [FieldOffset(0x0287)] - public readonly Array20Char AnnouncementAuthor; - - [FieldOffset(0x02A0)] - public readonly uint PlayerGuildRank; - - [FieldOffset(0x02A8)] - public readonly GuildWarsArray FactionOutpostGuilds; - - [FieldOffset(0x02B8)] - public readonly uint KurzickTownCount; - - [FieldOffset(0x02BC)] - public readonly uint LuxonTownCount; - - [FieldOffset(0x02F8)] - public readonly GuildWarsArray> Guilds; - - [FieldOffset(0x0358)] - public readonly GuildWarsArray> PlayerRoster; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -public readonly struct TownAlliance -{ - public readonly uint Rank; - public readonly uint Allegiance; - public readonly uint Faction; - public readonly Array32Char Name; - public readonly Array5Char Tag; - public readonly CapeDesign Cape; - public readonly uint MapId; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -public readonly struct CapeDesign -{ - public readonly uint CapeBgColor; - public readonly uint CapeDetailColor; - public readonly uint CapeEmblemColor; - public readonly uint CapeShape; - public readonly uint CapeDetail; - public readonly uint CapeEmblem; - public readonly uint CapeTrim; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x174)] -public readonly unsafe struct GuildPlayer -{ - [FieldOffset(0x0004)] - public readonly char* NamePtr; - [FieldOffset(0x0008)] - public readonly Array20Char InvitedName; - [FieldOffset(0x0030)] - public readonly Array20Char CurrentName; - [FieldOffset(0x0050)] - public readonly Array20Char InviterName; - [FieldOffset(0x0080)] - public readonly uint InviteTime; - [FieldOffset(0x0084)] - public readonly Array20Char PromoterName; - [FieldOffset(0x00DC)] - public readonly uint Offline; - [FieldOffset(0x00E0)] - public readonly uint MemberType; - [FieldOffset(0x00E4)] - public readonly uint Status; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0xAC)] -public readonly struct Guild -{ - [FieldOffset(0x0024)] - public readonly uint Index; - [FieldOffset(0x0028)] - public readonly uint Rank; - [FieldOffset(0x002C)] - public readonly uint Features; - [FieldOffset(0x0030)] - public readonly Array32Char Name; - [FieldOffset(0x0070)] - public readonly uint Rating; - [FieldOffset(0x0074)] - public readonly uint Faction; - [FieldOffset(0x0078)] - public readonly uint FactionPoints; - [FieldOffset(0x007C)] - public readonly uint QualifierPoints; - [FieldOffset(0x0080)] - public readonly Array8Char Tag; - [FieldOffset(0x0090)] - public readonly CapeDesign Cape; -} diff --git a/Daybreak.API/Interop/GuildWars/Hero.cs b/Daybreak.API/Interop/GuildWars/Hero.cs deleted file mode 100644 index db563ab6..00000000 --- a/Daybreak.API/Interop/GuildWars/Hero.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Extensions; -using System.Numerics; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x24)] -public readonly struct HeroFlag -{ - [FieldOffset(0x0000)] - public readonly uint HeroId; - [FieldOffset(0x0004)] - public readonly uint AgentId; - [FieldOffset(0x0008)] - public readonly uint Level; - [FieldOffset(0x000C)] - public readonly Behavior Behavior; - [FieldOffset(0x0010)] - public readonly Vector2 Flag; - [FieldOffset(0x0020)] - public readonly uint LockedTargetId; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x78)] -[GWCAEquivalent("HeroInfo")] -public readonly struct HeroInfo -{ - [FieldOffset(0x0000)] - public readonly uint HeroId; - [FieldOffset(0x0004)] - public readonly uint AgentId; - [FieldOffset(0x0008)] - public readonly uint Level; - [FieldOffset(0x000C)] - public readonly Profession Primary; - [FieldOffset(0x0010)] - public readonly Profession Secondary; - [FieldOffset(0x0014)] - public readonly uint HeroFileId; - [FieldOffset(0x0018)] - public readonly uint ModelFileId; - [FieldOffset(0x0050)] - public readonly Array20Char Name; -} diff --git a/Daybreak.API/Interop/GuildWars/InstanceInfo.cs b/Daybreak.API/Interop/GuildWars/InstanceInfo.cs deleted file mode 100644 index 2cce42d6..00000000 --- a/Daybreak.API/Interop/GuildWars/InstanceInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("InstanceType")] -public enum InstanceType -{ - Outpost, - Explorable, - Loading -}; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly unsafe struct InstanceInfoContext -{ - [FieldOffset(0x0004)] - public readonly InstanceType InstanceType; - [FieldOffset(0x0008)] - public readonly AreaInfo* CurrentMapInfo; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("AreaInfo")] -public readonly struct AreaInfo -{ - public readonly uint Campaign; - public readonly uint Continent; - public readonly uint Region; - public readonly uint RegionType; - public readonly uint Flags; -} diff --git a/Daybreak.API/Interop/GuildWars/Inventory.cs b/Daybreak.API/Interop/GuildWars/Inventory.cs deleted file mode 100644 index 3ebc46bc..00000000 --- a/Daybreak.API/Interop/GuildWars/Inventory.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("Inventory")] -public readonly unsafe struct Inventory -{ - public readonly Bag* UnusedBag; - public readonly Bag* Backpack; - public readonly Bag* BeltPouch; - public readonly Bag* Bag1; - public readonly Bag* Bag2; - public readonly Bag* EquipmentPack; - public readonly Bag* MaterialStorage; - public readonly Bag* UnclaimedItems; - public readonly Bag* Storage1; - public readonly Bag* Storage2; - public readonly Bag* Storage3; - public readonly Bag* Storage4; - public readonly Bag* Storage5; - public readonly Bag* Storage6; - public readonly Bag* Storage7; - public readonly Bag* Storage8; - public readonly Bag* Storage9; - public readonly Bag* Storage10; - public readonly Bag* Storage11; - public readonly Bag* Storage12; - public readonly Bag* Storage13; - public readonly Bag* Storage14; - public readonly Bag* EquippedItems; - public readonly Item* Bundle; - public readonly uint StoragePanesUnlocked; - - public readonly Bag*[] Bags => [ - this.Backpack, - this.BeltPouch, - this.Bag1, - this.Bag2, - this.EquipmentPack, - this.MaterialStorage, - this.UnclaimedItems, - this.Storage1, - this.Storage2, - this.Storage3, - this.Storage4, - this.Storage5, - this.Storage6, - this.Storage7, - this.Storage8, - this.Storage9, - this.Storage10, - this.Storage11, - this.Storage12, - this.Storage13, - this.Storage14, - this.EquippedItems - ]; -} diff --git a/Daybreak.API/Interop/GuildWars/Item.cs b/Daybreak.API/Interop/GuildWars/Item.cs deleted file mode 100644 index 61ec8b5f..00000000 --- a/Daybreak.API/Interop/GuildWars/Item.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -public enum ItemType : byte -{ - Salvage, - Axe = 2, - Bag, - Boots, - Bow, - Bundle, - Chestpiece, - Rune_Mod, - Usable, - Dye, - Materials_Zcoins, - Offhand, - Gloves, - Hammer = 15, - Headpiece, - CC_Shards, - Key, - Leggings, - Gold_Coin, - Quest_Item, - Wand, - Shield = 24, - Staff = 26, - Sword, - Kit = 29, - Trophy, - Scroll, - Daggers, - Present, - Minipet, - Scythe, - Spear, - Storybook = 43, - Costume, - Costume_Headpiece, - Unknown = 0xff -}; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("ItemModifier")] -public readonly struct ItemModifier(uint mod) -{ - public static readonly ItemModifier Zero = new(); - - public readonly uint Mod = mod; - - public uint Identifier => this.Mod >> 16; - public uint Arg1 => (this.Mod & 0x0000FF00) >> 8; - public uint Arg2 => this.Mod & 0x000000FF; - public uint Arg => this.Mod & 0x0000FFFF; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("Item")] -public readonly unsafe struct Item -{ - [FieldOffset(0x0000)] - public readonly uint ItemId; - - [FieldOffset(0x0004)] - public readonly uint AgentId; - - [FieldOffset(0x0008)] - public readonly Bag* BagEquipped; - - [FieldOffset(0x000C)] - public readonly Bag* Bag; - - [FieldOffset(0x0010)] - public readonly ItemModifier* Modifiers; - - [FieldOffset(0x0014)] - public readonly uint ModifiersCount; - - [FieldOffset(0x001C)] - public readonly uint ModelFileId; - - [FieldOffset(0x0020)] - public readonly ItemType Type; - - [FieldOffset(0x0024)] - public readonly ushort Value; - - [FieldOffset(0x0028)] - public readonly uint Interaction; - - [FieldOffset(0x002C)] - public readonly uint ModelId; - - [FieldOffset(0x0030)] - public readonly char* InfoString; - - [FieldOffset(0x0034)] - public readonly char* NameEncoded; - - [FieldOffset(0x0038)] - public readonly char* CompleteNameEncoded; - - [FieldOffset(0x003C)] - public readonly char* SingleItemName; - - [FieldOffset(0x0048)] - public readonly ushort ItemFormula; - - [FieldOffset(0x004A)] - public readonly byte IsMaterialSalvageable; - - [FieldOffset(0x004C)] - public readonly ushort Quantity; - - [FieldOffset(0x004E)] - public readonly byte Equipped; - - [FieldOffset(0x004F)] - public readonly byte Profession; - - [FieldOffset(0x0050)] - public readonly uint Slot; - - public readonly bool Stackable => (this.Interaction & 0x80000) != 0; - - public readonly bool Inscribable => (this.Interaction & 0x08000000) != 0; -} diff --git a/Daybreak.API/Interop/GuildWars/ItemContext.cs b/Daybreak.API/Interop/GuildWars/ItemContext.cs deleted file mode 100644 index 21be67dd..00000000 --- a/Daybreak.API/Interop/GuildWars/ItemContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("ItemContext")] -public readonly struct ItemContext -{ - [FieldOffset(0x0024)] - public readonly GuildWarsArray> Bags; - - [FieldOffset(0x00B8)] - public readonly GuildWarsArray> Items; - - [FieldOffset(0x00F8)] - public readonly WrappedPointer Inventory; -} diff --git a/Daybreak.API/Interop/GuildWars/Language.cs b/Daybreak.API/Interop/GuildWars/Language.cs deleted file mode 100644 index 049205ec..00000000 --- a/Daybreak.API/Interop/GuildWars/Language.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("Language")] -public enum Language -{ - English, - Korean, - French, - German, - Italian, - Spanish, - TraditionalChinese, - Japanese = 8, - Polish, - Russian, - BorkBorkBork = 17, - Unknown = 0xff -} diff --git a/Daybreak.API/Interop/GuildWars/MapContext.cs b/Daybreak.API/Interop/GuildWars/MapContext.cs deleted file mode 100644 index 8e06c5bf..00000000 --- a/Daybreak.API/Interop/GuildWars/MapContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("MapContext")] -public readonly struct MapContext -{ -} diff --git a/Daybreak.API/Interop/GuildWars/Npc.cs b/Daybreak.API/Interop/GuildWars/Npc.cs deleted file mode 100644 index 1881f586..00000000 --- a/Daybreak.API/Interop/GuildWars/Npc.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit)] -[GWCAEquivalent("NPC")] -public readonly unsafe struct NpcContext -{ - [FieldOffset(0x0000)] - public readonly uint ModelId; - - [FieldOffset(0x000C)] - public readonly uint Sex; - - [FieldOffset(0x0010)] - public readonly NpcFlags Flags; - - [FieldOffset(0x0014)] - public readonly uint Primary; - - [FieldOffset(0x001C)] - public readonly byte DefaultLevel; - - [FieldOffset(0x0020)] - public readonly char* EncName; - - [FieldOffset(0x0028)] - public readonly int FilesCount; - - [FieldOffset(0x002C)] - public readonly int FilesCapacity; - - [Flags] - public enum NpcFlags : uint - { - None = 0x0000, - Henchman = 0x0010, - Hero = 0x0020, - Spirit = 0x4000, - Minion = 0x0100, - Pet = 0x000D - } -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("PetInfo")] -public readonly unsafe struct PetContext -{ - public readonly uint AgentId; - public readonly uint OwnerAgentId; - public readonly char* PetName; - public readonly uint ModelFileId1; - public readonly uint ModelFileId2; - public readonly Behavior Behavior; - public readonly uint LockedTargetId; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -public readonly struct ControlledMinion -{ - public readonly uint AgentId; - public readonly uint MinionCount; -} diff --git a/Daybreak.API/Interop/GuildWars/Party.cs b/Daybreak.API/Interop/GuildWars/Party.cs deleted file mode 100644 index 6a470d74..00000000 --- a/Daybreak.API/Interop/GuildWars/Party.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[Flags] -public enum PlayerPartyMemberState : uint -{ - None = 0, - Connected = 1, - Ticked = 2 -} - -public enum PartySearchType -{ - PartySearchType_Hunting = 0, - PartySearchType_Mission = 1, - PartySearchType_Quest = 2, - PartySearchType_Trade = 3, - PartySearchType_Guild = 4, -}; - -[Flags] -public enum PartyFlags : uint -{ - None = 0, - HardMode = 0x10, // Bit 4 - Defeated = 0x20, // Bit 5 - PartyLeader = 0x80 // Bit 7 (0x7th position) -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0xC)] -public readonly unsafe struct PartyMoraleContext -{ - [FieldOffset(0x000C)] - public readonly PartyMemberMoraleInfo* MoraleInfo; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly struct PartyMemberMoraleInfo -{ - [FieldOffset(0x0000)] - public readonly uint AgentId; - [FieldOffset(0x0014)] - public readonly uint Morale; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x58)] -[GWCAEquivalent("PartyContext")] -public readonly unsafe struct PartyContext -{ - [FieldOffset(0x0014)] - public readonly PartyFlags Flags; - [FieldOffset(0x0040)] - public readonly GuildWarsArray> Parties; - [FieldOffset(0x0054)] - public readonly PartyInfo* PlayerParty; - [FieldOffset(0x00C0)] - public readonly GuildWarsArray> PartySearches; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0xC)] -public readonly struct PlayerPartyMember -{ - public readonly uint LogingNumber; - public readonly uint CalledTargetId; - public readonly PlayerPartyMemberState State; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x18)] -public readonly struct HeroPartyMember -{ - [FieldOffset(0x0000)] - public readonly uint AgentId; - [FieldOffset(0x0004)] - public readonly uint OwnerPlayerId; - [FieldOffset(0x0008)] - public readonly uint HeroId; - [FieldOffset(0x0014)] - public readonly uint Level; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x34)] -public readonly struct HenchmanPartyMember -{ - [FieldOffset(0x0000)] - public readonly uint AgentId; - [FieldOffset(0x002C)] - public readonly Profession Profession; - [FieldOffset(0x0030)] - public readonly uint Level; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x84)] -[GWCAEquivalent("PartyInfo")] -public readonly struct PartyInfo -{ - [FieldOffset(0x0000)] - public readonly uint PartyId; - [FieldOffset(0x0004)] - public readonly GuildWarsArray Players; - [FieldOffset(0x0014)] - public readonly GuildWarsArray Henchmen; - [FieldOffset(0x0024)] - public readonly GuildWarsArray Heroes; - [FieldOffset(0x0034)] - public readonly GuildWarsArray Others; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("PartySearch")] -public readonly struct PartySearch -{ - public readonly uint PartySearchId; - public readonly PartySearchType PartySearchType; - public readonly uint HardMode; - public readonly uint District; - public readonly uint Language; - public readonly uint PartySize; - public readonly uint HeroCount; - public readonly Array32Char Message; - public readonly Array20Char PartyLeader; - public readonly Profession Primary; - public readonly Profession Secondary; - public readonly uint Level; - public readonly uint Timestamp; -} diff --git a/Daybreak.API/Interop/GuildWars/PartySearchWindowContext.cs b/Daybreak.API/Interop/GuildWars/PartySearchWindowContext.cs deleted file mode 100644 index 7288e6cd..00000000 --- a/Daybreak.API/Interop/GuildWars/PartySearchWindowContext.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x34)] -public unsafe struct PartySearchWindowContext -{ - [FieldOffset(0x0000)] - public uint* Vtable; - [FieldOffset(0x0004)] - public uint FrameId; - [FieldOffset(0x0020)] - public uint SelectedPartySearchId; - [FieldOffset(0x0024)] - public uint SelectedHeroId; - [FieldOffset(0x0028)] - public uint SelectedHenchmanId; - [FieldOffset(0x002C)] - public uint CurrentTab; -} diff --git a/Daybreak.API/Interop/GuildWars/PlayerContext.cs b/Daybreak.API/Interop/GuildWars/PlayerContext.cs deleted file mode 100644 index 990be740..00000000 --- a/Daybreak.API/Interop/GuildWars/PlayerContext.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[Flags] -public enum PlayerContextFlags : uint -{ - None = 0, - PvP = 0x800 -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x50)] -[GWCAEquivalent("PlayerContext")] -public readonly unsafe struct PlayerContext -{ - [FieldOffset(0x0000)] - public readonly int AgentId; - - [FieldOffset(0x0014)] - public readonly PlayerContextFlags Flags; - - [FieldOffset(0x0018)] - public readonly uint PrimaryProfession; - - [FieldOffset(0x001C)] - public readonly uint SecondaryProfession; - - [FieldOffset(0x0024)] - public readonly char* NameEncoded; - - [FieldOffset(0x0028)] - public readonly char* Name; - - [FieldOffset(0x002C)] - public readonly uint PartyLeaderPlayerNumber; - - [FieldOffset(0x0030)] - public readonly uint ActiveTitleTier; - - [FieldOffset(0x0034)] - public readonly uint ReforgedOrDhuumsFlags; - - [FieldOffset(0x0038)] - public readonly uint PlayerNumber; - - [FieldOffset(0x003C)] - public readonly uint PartySize; -} diff --git a/Daybreak.API/Interop/GuildWars/PlayerControlledCharContext.cs b/Daybreak.API/Interop/GuildWars/PlayerControlledCharContext.cs deleted file mode 100644 index 343d4c9b..00000000 --- a/Daybreak.API/Interop/GuildWars/PlayerControlledCharContext.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly struct PlayerControlledCharContext -{ - [FieldOffset(0x0014)] - public readonly uint AgentId; -} diff --git a/Daybreak.API/Interop/GuildWars/PreGameContext.cs b/Daybreak.API/Interop/GuildWars/PreGameContext.cs deleted file mode 100644 index b5b4a32d..00000000 --- a/Daybreak.API/Interop/GuildWars/PreGameContext.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Extensions; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("PreGameContext")] -public readonly struct PreGameContext -{ - [FieldOffset(0x0000)] - public readonly uint FrameId; - - [FieldOffset(0x0124)] - public readonly uint ChosenCharacterIndex; - - [FieldOffset(0x0148)] - public readonly GuildWarsArray LoginCharacters; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -public readonly struct LoginCharacterContext -{ - [FieldOffset(0x0004)] - public readonly Array20Char CharacterName; -} diff --git a/Daybreak.API/Interop/GuildWars/Preferences.cs b/Daybreak.API/Interop/GuildWars/Preferences.cs deleted file mode 100644 index 3fdf8cd1..00000000 --- a/Daybreak.API/Interop/GuildWars/Preferences.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("EnumPreference")] -public enum EnumPreference : uint -{ - CharSortOrder = 0, - AntiAliasing = 1, - Reflections = 2, - ShaderQuality = 3, - ShadowQuality = 4, - TerrainQuality = 5, - InterfaceSize = 6, - FrameLimiter = 7, - Count = 8 -} - -[GWCAEquivalent("CharSortOrder")] -public enum CharSortOrder : uint -{ - None = 0, - Alphabetize = 1, - PvPRP = 2 -} - -[GWCAEquivalent("NumberPreference")] -public enum NumberPreference : uint -{ - AutoTournPartySort = 0, - ChatState = 1, - Count = 0x2b -} - -[GWCAEquivalent("FlagPreference")] -public enum FlagPreference : uint -{ -} - -[GWCAEquivalent("StringPreference")] -public enum StringPreference : uint -{ - Unk1 = 0, - Unk2 = 1, - LastCharacterName = 2, - Count = 3 -} diff --git a/Daybreak.API/Interop/GuildWars/Profession.cs b/Daybreak.API/Interop/GuildWars/Profession.cs deleted file mode 100644 index a99db1ca..00000000 --- a/Daybreak.API/Interop/GuildWars/Profession.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("Profession")] -public enum Profession : uint -{ - None, - Warrior, - Ranger, - Monk, - Necromancer, - Mesmer, - Elementalist, - Assassin, - Ritualist, - Paragon, - Dervish -} - -public enum ProfessionByte : byte -{ - None, - Warrior, - Ranger, - Monk, - Necromancer, - Mesmer, - Elementalist, - Assassin, - Ritualist, - Paragon, - Dervish -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x0014)] -public readonly struct ProfessionsContext -{ - public readonly uint AgentId; - public readonly Profession CurrentPrimary; - public readonly Profession CurrentSecondary; - public readonly uint UnlockedProfessionsFlags; - - public bool ProfessionUnlocked(int professionId) - { - return (this.UnlockedProfessionsFlags & (1U << professionId)) != 0; - } -} diff --git a/Daybreak.API/Interop/GuildWars/Quest.cs b/Daybreak.API/Interop/GuildWars/Quest.cs deleted file mode 100644 index 6fb2e96f..00000000 --- a/Daybreak.API/Interop/GuildWars/Quest.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Numerics; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x0034)] -[GWCAEquivalent("Quest")] -public readonly struct QuestContext -{ - [FieldOffset(0x0000)] - public readonly uint QuestId; - - [FieldOffset(0x0014)] - public readonly uint MapFrom; - - [FieldOffset(0x0018)] - public readonly Vector3 Marker; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0xC)] -public readonly unsafe struct MissionObjectiveContext -{ - public readonly uint ObjectiveId; - public readonly char* EncodedString; - public readonly uint Type; -} diff --git a/Daybreak.API/Interop/GuildWars/ServerRegion.cs b/Daybreak.API/Interop/GuildWars/ServerRegion.cs deleted file mode 100644 index d84d619f..00000000 --- a/Daybreak.API/Interop/GuildWars/ServerRegion.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("ServerRegion")] -public enum ServerRegion -{ - International = -2, - America = 0, - Korea, - Europe, - China, - Japan, - Unknown = 0xff -} diff --git a/Daybreak.API/Interop/GuildWars/Skill.cs b/Daybreak.API/Interop/GuildWars/Skill.cs deleted file mode 100644 index 2aa8a22d..00000000 --- a/Daybreak.API/Interop/GuildWars/Skill.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("SkillbarSkill")] -public readonly struct SkillContext -{ - public readonly uint Adrenaline1; - public readonly uint Adrenaline2; - public readonly uint Recharge; - public readonly uint Id; - public readonly uint Event; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0xBC)] -[GWCAEquivalent("Skillbar")] -public readonly struct SkillbarContext -{ - public readonly uint AgentId; - public readonly SkillContext Skill0; - public readonly SkillContext Skill1; - public readonly SkillContext Skill2; - public readonly SkillContext Skill3; - public readonly SkillContext Skill4; - public readonly SkillContext Skill5; - public readonly SkillContext Skill6; - public readonly SkillContext Skill7; - public readonly uint Disabled; - public readonly uint Casting; -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x10)] -[GWCAEquivalent("Buff")] -public readonly struct Buff -{ - [FieldOffset(0x0000)] - public readonly uint SkillId; - [FieldOffset(0x0008)] - public readonly uint BuffId; - [FieldOffset(0x000C)] - public readonly uint TargetAgentId; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x18)] -[GWCAEquivalent("Effect")] -public readonly struct Effect -{ - public readonly uint SkillId; - public readonly uint AttributeLevel; - public readonly uint EffectId; - public readonly uint AgentId; - public readonly float Duration; - public readonly uint Timestamp; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -public readonly struct DupeSkill -{ - public readonly uint SkillId; - public readonly uint Count; -} diff --git a/Daybreak.API/Interop/GuildWars/SkillTemplate.cs b/Daybreak.API/Interop/GuildWars/SkillTemplate.cs deleted file mode 100644 index df235f5a..00000000 --- a/Daybreak.API/Interop/GuildWars/SkillTemplate.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Extensions; - -namespace Daybreak.API.Interop.GuildWars; - -[GWCAEquivalent("SkillTemplate")] -public readonly struct SkillTemplate(uint primary, uint secondary, uint attributeCount, Array12Uint attributeIds, Array12Uint attributeValues, Array8Uint skills) -{ - public readonly uint Primary = primary; - public readonly uint Secondary = secondary; - public readonly uint AttributesCount = attributeCount; - public readonly Array12Uint AttributeIds = attributeIds; - public readonly Array12Uint AttributeValues = attributeValues; - public readonly Array8Uint Skills = skills; -} diff --git a/Daybreak.API/Interop/GuildWars/TagInfo.cs b/Daybreak.API/Interop/GuildWars/TagInfo.cs deleted file mode 100644 index da4b4476..00000000 --- a/Daybreak.API/Interop/GuildWars/TagInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("TagInfo")] -public readonly struct TagInfo -{ - public readonly ushort GuildId; - public readonly byte Primary; - public readonly byte Secondary; - public readonly ushort Level; -} diff --git a/Daybreak.API/Interop/GuildWars/TextParserContext.cs b/Daybreak.API/Interop/GuildWars/TextParserContext.cs deleted file mode 100644 index 5f725326..00000000 --- a/Daybreak.API/Interop/GuildWars/TextParserContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("TextParser")] -public struct TextParserContext -{ - [FieldOffset(0x01D0)] - public Language Language; -} diff --git a/Daybreak.API/Interop/GuildWars/Title.cs b/Daybreak.API/Interop/GuildWars/Title.cs deleted file mode 100644 index f9024c59..00000000 --- a/Daybreak.API/Interop/GuildWars/Title.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[Flags] -public enum TitleProps : uint -{ - None = 0, - PercentageBased = 1, - HasTiers = 2 - // Note: The HasTiers check uses (props & 3) == 2, which means bit 1 is set but bit 0 is not -} - -[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x2C)] -[GWCAEquivalent("Title")] -public readonly struct TitleContext -{ - [FieldOffset(0x0000)] - public readonly TitleProps Props; - [FieldOffset(0x0004)] - public readonly uint CurrentPoints; - [FieldOffset(0x0008)] - public readonly uint CurrentTitleTierIndex; - [FieldOffset(0x000C)] - public readonly uint PointsNeededForCurrentRank; - [FieldOffset(0x0014)] - public readonly uint NextTitleTierIndex; - [FieldOffset(0x0018)] - public readonly uint PointsNeededForNextRank; - [FieldOffset(0x001C)] - public readonly uint MaxTitleRank; - [FieldOffset(0x0020)] - public readonly uint MaxTitleTierIndex; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0xC)] -[GWCAEquivalent("TitleTier")] -public readonly unsafe struct TitleTier -{ - public readonly TitleProps Props; - public readonly uint TierNumber; - public readonly char* TierNameEncoded; -} - -[StructLayout(LayoutKind.Sequential, Pack = 1)] -[GWCAEquivalent("TitleClientData")] -public readonly struct TitleClientData -{ - public readonly uint TitleId; - public readonly uint NameId; -} diff --git a/Daybreak.API/Interop/GuildWars/WorldContext.cs b/Daybreak.API/Interop/GuildWars/WorldContext.cs deleted file mode 100644 index 9eee8bcb..00000000 --- a/Daybreak.API/Interop/GuildWars/WorldContext.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System.Numerics; -using System.Runtime.InteropServices; - -namespace Daybreak.API.Interop.GuildWars; - -[StructLayout(LayoutKind.Explicit, Pack = 1)] -[GWCAEquivalent("WorldContext")] -public readonly unsafe struct WorldContext -{ - [FieldOffset(0x0000)] - public readonly AccountInfoContext* AccountInfo; - - [FieldOffset(0x0024)] - public readonly GuildWarsArray MerchItems; - - [FieldOffset(0x0034)] - public readonly GuildWarsArray MerchItems2; - - [FieldOffset(0x007C)] - public readonly GuildWarsArray MapAgents; - - [FieldOffset(0x009C)] - public readonly Vector3 AllFlag; - - [FieldOffset(0x00AC)] - public readonly GuildWarsArray Attributes; - - [FieldOffset(0x0508)] - public readonly GuildWarsArray PartyEffects; - - [FieldOffset(0x0528)] - public readonly uint ActiveQuestId; - - [FieldOffset(0x052C)] - public readonly GuildWarsArray QuestLog; - - [FieldOffset(0x0564)] - public readonly GuildWarsArray MissionObjectives; - - [FieldOffset(0x0574)] - public readonly GuildWarsArray HenchmenAgentIds; - - [FieldOffset(0x0584)] - public readonly GuildWarsArray HeroFlags; - - [FieldOffset(0x0594)] - public readonly GuildWarsArray HeroInfos; - - [FieldOffset(0x05A4)] - public readonly GuildWarsArray CartographedAreas; - - [FieldOffset(0x05BC)] - public readonly GuildWarsArray ControlledMinions; - - [FieldOffset(0x05CC)] - public readonly GuildWarsArray MissionsCompleted; - - [FieldOffset(0x05DC)] - public readonly GuildWarsArray MissionsBonus; - - [FieldOffset(0x05EC)] - public readonly GuildWarsArray MissionsCompletedHardMode; - - [FieldOffset(0x05FC)] - public readonly GuildWarsArray MissionsBonusHardMode; - - [FieldOffset(0x060C)] - public readonly GuildWarsArray UnlockedMap; - - [FieldOffset(0x062C)] - public readonly GuildWarsArray PartyMorale; - - [FieldOffset(0x067C)] - public readonly uint PlayerNumber; - - [FieldOffset(0x0680)] - public readonly PlayerControlledCharContext* PlayerControlledChar; - - [FieldOffset(0x0684)] - public readonly uint HardModeUnlocked; - - [FieldOffset(0x06AC)] - public readonly GuildWarsArray Pets; - - [FieldOffset(0x06BC)] - public readonly GuildWarsArray Professions; - - [FieldOffset(0x06F0)] - public readonly GuildWarsArray Skillbars; - - [FieldOffset(0x0700)] - public readonly GuildWarsArray LearnableCharacterSkills; - - [FieldOffset(0x0710)] - public readonly GuildWarsArray UnlockedCharacterSkills; - - [FieldOffset(0x0720)] - public readonly GuildWarsArray DupeSkills; - - [FieldOffset(0x0740)] - public readonly uint Experience; - - [FieldOffset(0x0748)] - public readonly uint CurrentKurzick; - - [FieldOffset(0x0750)] - public readonly uint TotalKurzick; - - [FieldOffset(0x0758)] - public readonly uint CurrentLuxon; - - [FieldOffset(0x0760)] - public readonly uint TotalLuxon; - - [FieldOffset(0x0768)] - public readonly uint CurrentImperial; - - [FieldOffset(0x0770)] - public readonly uint TotalImperial; - - [FieldOffset(0x0788)] - public readonly uint Level; - - [FieldOffset(0x0790)] - public readonly uint Morale; - - [FieldOffset(0x0798)] - public readonly uint CurrentBalthazar; - - [FieldOffset(0x07A0)] - public readonly uint TotalBalthazar; - - [FieldOffset(0x07A8)] - public readonly uint CurrentSkillPoints; - - [FieldOffset(0x07B0)] - public readonly uint TotalSkillPoints; - - [FieldOffset(0x07B8)] - public readonly uint MaxKurzick; - - [FieldOffset(0x07BC)] - public readonly uint MaxLuxon; - - [FieldOffset(0x07C0)] - public readonly uint MaxBalthazar; - - [FieldOffset(0x07C4)] - public readonly uint MaxImperial; - - [FieldOffset(0x07CC)] - public readonly GuildWarsArray AgentInfos; - - [FieldOffset(0x07FC)] - public readonly GuildWarsArray Npcs; - - [FieldOffset(0x080C)] - public readonly GuildWarsArray Players; - - [FieldOffset(0x081C)] - public readonly GuildWarsArray Titles; - - [FieldOffset(0x082C)] - public readonly GuildWarsArray TitleTiers; - - [FieldOffset(0x083C)] - public readonly GuildWarsArray VanquishedAreas; - - [FieldOffset(0x084C)] - public readonly uint FoesKilled; - - [FieldOffset(0x0850)] - public readonly uint FoesToKill; -} diff --git a/Daybreak.API/Interop/IHook.cs b/Daybreak.API/Interop/IHook.cs deleted file mode 100644 index acc053ad..00000000 --- a/Daybreak.API/Interop/IHook.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Daybreak.API.Interop; - -public interface IHook - : IDisposable where T : Delegate -{ - public T Continue { get; } - - public nuint ContinueAddress { get; } -} diff --git a/Daybreak.API/Interop/PointerValue.cs b/Daybreak.API/Interop/PointerValue.cs deleted file mode 100644 index 84153744..00000000 --- a/Daybreak.API/Interop/PointerValue.cs +++ /dev/null @@ -1,78 +0,0 @@ -using Daybreak.API.Converters; -using System.Text.Json.Serialization; - -namespace Daybreak.API.Interop; - -[JsonConverter(typeof(PointerValueConverter))] -public readonly struct PointerValue(nuint address) : IEquatable, IEquatable, IEquatable -{ - public readonly nuint Address = address; - - public bool Equals(PointerValue other) - { - return this.Address.Equals(other.Address); - } - - public bool Equals(nuint other) - { - return this.Address.Equals(other); - } - - public bool Equals(nint other) - { - return this.Address.Equals((nuint)other); - } - - public override string ToString() - { - return $"0x{this.Address:X8}"; - } - - public override bool Equals(object? obj) => obj is PointerValue value && this.Equals(value); - - public override int GetHashCode() - { - return HashCode.Combine(this.Address); - } - - public static bool operator ==(PointerValue left, PointerValue right) - { - return left.Equals(right); - } - - public static bool operator !=(PointerValue left, PointerValue right) - { - return !(left == right); - } - - public static implicit operator PointerValue(nuint address) - { - return new PointerValue(address); - } - - public static implicit operator PointerValue(nint address) - { - return new PointerValue((nuint)address); - } - - public static implicit operator PointerValue(int address) - { - return new PointerValue((nuint)address); - } - - public static implicit operator PointerValue(uint address) - { - return new PointerValue(address); - } - - public static PointerValue Parse(string s) - { - if (s.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase) - && nuint.TryParse(s.AsSpan(2), System.Globalization.NumberStyles.HexNumber, null, out var v)) - { - return new PointerValue(v); - } - - throw new FormatException($"Invalid pointer format: {s}"); - } -} diff --git a/Daybreak.API/Models/AddressState.cs b/Daybreak.API/Models/AddressState.cs deleted file mode 100644 index 779ceab1..00000000 --- a/Daybreak.API/Models/AddressState.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Daybreak.API.Interop; - -namespace Daybreak.API.Models; - -public sealed class AddressState -{ - public required string Name { get; init; } - public required PointerValue Address { get; init; } -} diff --git a/Daybreak.API/Models/AsyncRefreshCache.cs b/Daybreak.API/Models/AsyncRefreshCache.cs deleted file mode 100644 index 1d4cf364..00000000 --- a/Daybreak.API/Models/AsyncRefreshCache.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Core.Extensions; -using System.Extensions; - -namespace Daybreak.API.Models; - -public sealed class AsyncRefreshCache(TimeSpan refreshRate, Func> refreshFunc) -{ - private readonly Func> refreshFunc = refreshFunc.ThrowIfNull(); - - private readonly SemaphoreSlim semaphoreSlim = new(1); - - private T? cache; - private DateTime lastUpdateDateTime = DateTime.MinValue; - private TimeSpan refreshRate = refreshRate; - - public async ValueTask GetAsync(CancellationToken cancellationToken) - { - if (this.cache is not null && DateTime.UtcNow - this.lastUpdateDateTime < this.refreshRate) - { - return this.cache; - } - - using var ctx = await this.semaphoreSlim.Acquire(cancellationToken); - if (DateTime.UtcNow - this.lastUpdateDateTime > this.refreshRate || - this.cache is null) - { - this.lastUpdateDateTime = DateTime.UtcNow; - this.cache = await this.refreshFunc(cancellationToken); - } - - return this.cache; - } - - public void UpdateRefreshRate(TimeSpan newRefreshRate) - { - this.refreshRate = newRefreshRate; - } -} diff --git a/Daybreak.API/Models/Channel.cs b/Daybreak.API/Models/Channel.cs deleted file mode 100644 index 052ebf35..00000000 --- a/Daybreak.API/Models/Channel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Daybreak.API.Interop; - -namespace Daybreak.API.Models; - -[GWCAEquivalent("Channel")] -public enum Channel : uint -{ - Alliance = 0, - Allies = 1, // coop with two groups for instance. - GWCA1 = 2, - All = 3, - GWCA2 = 4, - Moderator = 5, - Emote = 6, - Warning = 7, // shows in the middle of the screen and does not parse tags - GWCA3 = 8, - Guild = 9, - Global = 10, - Group = 11, - Trade = 12, - Advisory = 13, - Whisper = 14, - Count, - - // non-standard channel, but useful. - Command -}; diff --git a/Daybreak.API/Models/HookState.cs b/Daybreak.API/Models/HookState.cs deleted file mode 100644 index b286807c..00000000 --- a/Daybreak.API/Models/HookState.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Daybreak.API.Interop; - -namespace Daybreak.API.Models; - -public sealed class HookState -{ - public required bool Hooked { get; init; } - public required string Name { get; init; } - public required PointerValue TargetAddress { get; init; } - public required PointerValue ContinueAddress { get; init; } - public required PointerValue DetourAddress { get; init; } -} diff --git a/Daybreak.API/Models/UIMessage.cs b/Daybreak.API/Models/UIMessage.cs deleted file mode 100644 index c4ec2cd5..00000000 --- a/Daybreak.API/Models/UIMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Daybreak.API.Interop; - -namespace Daybreak.API.Models; - -[GWCAEquivalent("UIMessage")] -public enum UIMessage : uint -{ - None = 0x0, - InitFrame = 0x9, - DestroyFrame = 0xb, - KeyDown = 0x20, // wparam = UIPacket::kKeyAction* - KeyUp = 0x22, // wparam = UIPacket::kKeyAction* - MouseClick = 0x24, // wparam = UIPacket::kMouseClick* - MouseClick2 = 0x31, // wparam = UIPacket::kMouseAction* - MouseAction = 0x32, // wparam = UIPacket::kMouseAction* - FrameMessage_QuerySelectedIndex = 0x59, // Used to query selected index in character selector - WriteToChatLog = 0x10000000 | 0x7F, // wparam = UIPacket::kWriteToChatLog*. Triggered by the game when it wants to add a new message to chat. - WriteToChatLogWithSender = 0x10000000 | 0x80, // wparam = UIPacket::kWriteToChatLogWithSender*. Triggered by the game when it wants to add a new message to chat. - CheckUIState = 0x10000000 | 0x118, // lparam = uint32_t* out state (2 = char select ready) - Logout = 0x10000000 | 0x9D, // wparam = { bool unknown, bool character_select } -} diff --git a/Daybreak.API/Models/UIPackets.cs b/Daybreak.API/Models/UIPackets.cs deleted file mode 100644 index 24c12c6e..00000000 --- a/Daybreak.API/Models/UIPackets.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.API.Models; - -public static class UIPackets -{ - public enum MouseButtons - { - Left = 0x0, - Middle = 0x1, - Right = 0x2 - } - - public enum ActionState - { - MouseDown = 0x6, - MouseUp = 0x7, - MouseClick = 0x8, - MouseDoubleClick = 0x9, - DragRelease = 0xb, - KeyDown = 0xe - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public readonly struct LogChatMessage(string message, Channel channel) - { - [MarshalAs(UnmanagedType.LPWStr)] - public readonly string Message = message; - public readonly Channel Channel = channel; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public readonly struct UIChatMessage(Channel channel, string message, Channel channel2) - { - public readonly Channel Channel = channel; - [MarshalAs(UnmanagedType.LPWStr)] - public readonly string Message = message; - public readonly Channel Channel2 = channel2; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public readonly struct KeyAction(uint key, uint wParam = 0x4000, uint lParam = 0x0006) - { - public readonly uint Key = key; - public readonly uint WParam = wParam; - public readonly uint LParam = lParam; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public readonly struct MouseClick(MouseButtons mouseButton, uint isDoubleClick, uint unknownTypeScreenPos) - { - public readonly MouseButtons MouseButton = mouseButton; - public readonly uint IsDoubleClick = isDoubleClick; - public readonly uint UnknownTypeScreenPos = unknownTypeScreenPos; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public readonly struct MouseAction(uint frameId, uint childOffsetId, ActionState currentState, nuint wparam = 0, nuint lparam = 0) - { - public readonly uint FrameId = frameId; - public readonly uint ChildOffsetId = childOffsetId; - public readonly ActionState CurrentState = currentState; - public readonly nuint WParam = wparam; - public readonly nuint LParam = lparam; - } -} diff --git a/Daybreak.API/Serialization/ApiJsonSerializerContext.cs b/Daybreak.API/Serialization/ApiJsonSerializerContext.cs index 68c211cb..ea1488d0 100644 --- a/Daybreak.API/Serialization/ApiJsonSerializerContext.cs +++ b/Daybreak.API/Serialization/ApiJsonSerializerContext.cs @@ -17,10 +17,6 @@ namespace Daybreak.API.Serialization; [JsonSerializable(typeof(JsonElement))] [JsonSerializable(typeof(HealthCheckResponse))] [JsonSerializable(typeof(HealthCheckEntryResponse))] -[JsonSerializable(typeof(HookState))] -[JsonSerializable(typeof(ArraySegment))] -[JsonSerializable(typeof(AddressState))] -[JsonSerializable(typeof(ArraySegment))] [JsonSerializable(typeof(MainPlayerState))] [JsonSerializable(typeof(QuestLogInformation))] [JsonSerializable(typeof(QuestInformation))] diff --git a/Daybreak.API/Services/CharacterSelectService.cs b/Daybreak.API/Services/CharacterSelectService.cs index 0f93d317..560c6954 100644 --- a/Daybreak.API/Services/CharacterSelectService.cs +++ b/Daybreak.API/Services/CharacterSelectService.cs @@ -1,8 +1,11 @@ -using Daybreak.API.Interop.GuildWars; +using Daybreak.API.Extensions; +using Daybreak.API.Interop; +using Daybreak.API.Interop.GuildWars; using Daybreak.API.Models; using Daybreak.API.Services.Interop; using Daybreak.Shared.Models.Api; using System.Core.Extensions; +using System.Extensions; using System.Extensions.Core; using System.Runtime.InteropServices; using ZLinq; @@ -18,13 +21,6 @@ public sealed class CharacterSelectService( PreferencesService preferencesService, ILogger logger) { - [StructLayout(LayoutKind.Sequential, Pack = 1)] - private readonly struct LogOutMessage(uint unknown, uint characterSelect) - { - public readonly uint Unknown = unknown; - public readonly uint CharacterSelect = characterSelect; - } - private readonly InstanceContextService instanceContextService = instanceContextService.ThrowIfNull(); private readonly PlatformContextService platformContextService = platformContextService.ThrowIfNull(); private readonly UIContextService uiContextService = uiContextService.ThrowIfNull(); @@ -42,7 +38,7 @@ private readonly struct LogOutMessage(uint unknown, uint characterSelect) { var gameContext = this.gameContextService.GetGameContext(); if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null) + gameContext.Pointer->World is null) { scopedLogger.LogError("Game context is not initialized"); return default; @@ -55,21 +51,20 @@ private readonly struct LogOutMessage(uint unknown, uint characterSelect) return default; } - var currentUuid = gameContext.Pointer->CharContext->PlayerUuid.ToString(); + var currentUuid = (*(Uuid*)gameContext.Pointer->Character->PlayerUuid).ToString(); var availableChars = new List((int)availableCharsContext.Pointer->Size); foreach (var charContext in *availableCharsContext.Pointer) { - var nameSpan = charContext.Name.AsSpan(); - var name = new string(nameSpan[..nameSpan.IndexOf('\0')]); + var name = new string(charContext.Name); availableChars.Add(new CharacterSelectEntry( - charContext.Uuid.ToString(), + (*(Uuid*)charContext.Uuid).ToString(), name, - charContext.Primary, - charContext.Secondary, - charContext.Campaign, - charContext.MapId, - charContext.Level, - charContext.IsPvp)); + (uint)charContext.GetPrimaryProfession(), + (uint)charContext.GetSecondaryProfession(), + (uint)charContext.GetCampaign(), + (uint)charContext.GetMapId(), + (uint)charContext.GetLevel(), + charContext.IsPvP())); } // TODO: Reforged sometimes returns Zero UUID even when in-game, need to investigate why @@ -143,6 +138,26 @@ private unsafe struct CharSelectButtonParam public uint Play; } + [StructLayout(LayoutKind.Explicit, Pack = 1)] + private readonly unsafe struct CharSelectorContext + { + [FieldOffset(0x0000)] + public readonly uint Vtable; + + [FieldOffset(0x0004)] + public readonly uint FrameId; + + [FieldOffset(0x0008)] + public readonly GuildWarsArray> Chars; + } + + [StructLayout(LayoutKind.Explicit, Pack = 1)] + private readonly struct CharSelectorChar + { + [FieldOffset(0x0020)] + public readonly Array20Char Name; + } + private async Task SelectCharacterToPlay(string characterName, bool play, CancellationToken cancellationToken) { var scopedLogger = this.logger.CreateScopedLogger(); @@ -173,7 +188,7 @@ private async Task SelectCharacterToPlay(string characterName, bool play, // Get current selected index uint selectedIdx = 0; - this.uiContextService.SendFrameUIMessage(panesFrame, UIMessage.FrameMessage_QuerySelectedIndex, null, &selectedIdx); + this.uiContextService.SendFrameUIMessage(panesFrame, UIMessage.kFrameMessage_0x4a, null, &selectedIdx); // Find target character index uint targetIdx = 0xFFFF; @@ -234,19 +249,21 @@ bool SelectChar(uint idx) Play = 0 }; - var action = new UIPackets.MouseAction( - selectorFrame->FrameId, - selectorFrame->ChildOffsetId, - UIPackets.ActionState.MouseClick, - (nuint)(&buttonParam)); + var action = new kMouseAction + { + FrameId = selectorFrame->FrameId, + ChildOffsetId = selectorFrame->ChildOffsetId, + CurrentState = GWCA.GW.UI.UIPacket.ActionState.MouseClick, + Wparam = (nint)(&buttonParam) + }; - if (!this.uiContextService.SendFrameUIMessage(parentFrame, UIMessage.MouseClick2, &action)) + if (!this.uiContextService.SendFrameUIMessage(parentFrame, UIMessage.kMouseClick2, &action)) { return false; } uint newSelectedIdx = 0; - this.uiContextService.SendFrameUIMessage(panesFrame, UIMessage.FrameMessage_QuerySelectedIndex, null, &newSelectedIdx); + this.uiContextService.SendFrameUIMessage(panesFrame, UIMessage.kFrameMessage_0x4a, null, &newSelectedIdx); return newSelectedIdx == idx; } } @@ -380,13 +397,12 @@ private async Task WaitForCharSelectAndSelectCharacter(string characterNam foreach (var charContext in *availableCharsContext.Pointer) { - if (charContext.Uuid.ToString() != uuid) + if ((*(Uuid*)charContext.Uuid).ToString() != uuid) { continue; } - var nameSpan = charContext.Name.AsSpan(); - var name = new string(nameSpan[..nameSpan.IndexOf('\0')]); + var name = new string(charContext.Name); return name; } @@ -399,10 +415,10 @@ private async Task TriggerLogOut(CancellationToken cancellationToken) { await this.gameThreadService.QueueOnGameThread(() => { - var logoutMessage = new LogOutMessage(0, 1); // Changed to 1 for character select + var logoutMessage = new kLogout { Unknown = 0, CharacterSelect = 1 }; unsafe { - this.uiContextService.SendMessage(UIMessage.Logout, (uint)&logoutMessage, 0); + this.uiContextService.SendMessage(UIMessage.kLogout, (uint)&logoutMessage, 0); } }, cancellationToken); } diff --git a/Daybreak.API/Services/ChatService.cs b/Daybreak.API/Services/ChatService.cs index 9e246d6d..dc5603df 100644 --- a/Daybreak.API/Services/ChatService.cs +++ b/Daybreak.API/Services/ChatService.cs @@ -1,6 +1,5 @@ using Daybreak.API.Interop; using Daybreak.API.Interop.GuildWars; -using Daybreak.API.Models; using Daybreak.API.Services.Interop; using System.Core.Extensions; using System.Extensions; @@ -70,8 +69,15 @@ await this.gameThreadService.QueueOnGameThread(() => span[^2] = '\u0001'; }); - using var packet = new UnmanagedStruct(new UIPackets.UIChatMessage(channel, encoded, channel)); - this.uiContextService.SendMessage(UIMessage.WriteToChatLog, (nuint)packet.Address, 0x0); + unsafe + { + fixed (char* encodedPtr = encoded) + { + using var packet = new UnmanagedStruct(new kPrintChatMessage { Channel = (GWCA.GW.Chat.Channel)channel, Message = (nint)encodedPtr }); + this.uiContextService.SendMessage(UIMessage.kWriteToChatLog, (nuint)packet.Address, 0x0); + } + } + }, cancellationToken); } } diff --git a/Daybreak.API/Services/Interop/AgentContextService.cs b/Daybreak.API/Services/Interop/AgentContextService.cs index df36da96..4dd4148e 100644 --- a/Daybreak.API/Services/Interop/AgentContextService.cs +++ b/Daybreak.API/Services/Interop/AgentContextService.cs @@ -5,15 +5,7 @@ namespace Daybreak.API.Services.Interop; public unsafe sealed class AgentContextService { - public WrappedPointer>> GetAgentArray() - { - // GuildWarsArray and GuildWarsArray> have the same memory layout - // since both nint and WrappedPointer are pointer-sized - return (GuildWarsArray>*)GWCA.GW.Agents.GetAgentArray(); - } + public uint GetPlayerAgentId() => GWCA.GW.PlayerMgr.GetPlayerAgentId(0); - public uint GetPlayerAgentId() - { - return GWCA.GW.PlayerMgr.GetPlayerAgentId(0); - } + public Agent* GetAgentById(uint agentId) => GWCA.GW.Agents.GetAgentByID(agentId); } diff --git a/Daybreak.API/Services/Interop/GameContextService.cs b/Daybreak.API/Services/Interop/GameContextService.cs index 16d4eb42..fe0395b2 100644 --- a/Daybreak.API/Services/Interop/GameContextService.cs +++ b/Daybreak.API/Services/Interop/GameContextService.cs @@ -10,7 +10,7 @@ public unsafe sealed class GameContextService public WrappedPointer GetPreGameContext() => GWCA.GW.GetPreGameContext(); - public WrappedPointer> GetAvailableChars() => GWCA.GW.GetAvailableChars(); + public WrappedPointer> GetAvailableChars() => GWCA.GW.GetAvailableChars(); public bool IsMapLoaded() => GWCA.GW.Map.GetIsMapLoaded(); } diff --git a/Daybreak.API/Services/Interop/InstanceContextService.cs b/Daybreak.API/Services/Interop/InstanceContextService.cs index e3d13e26..921ae165 100644 --- a/Daybreak.API/Services/Interop/InstanceContextService.cs +++ b/Daybreak.API/Services/Interop/InstanceContextService.cs @@ -7,7 +7,7 @@ public sealed unsafe class InstanceContextService { public WrappedPointer GetAreaInfo() => GWCA.GW.Map.GetMapInfo(0); - public ServerRegion GetServerRegion() => GWCA.GW.Map.GetRegion(); + public ServerRegion GetServerRegion() => (Daybreak.API.Interop.GuildWars.ServerRegion)GWCA.GW.Map.GetRegion(); - public InstanceType GetInstanceType() => GWCA.GW.Map.GetInstanceType(); + public InstanceType GetInstanceType() => (Daybreak.API.Interop.GuildWars.InstanceType)GWCA.GW.Map.GetInstanceType(); } diff --git a/Daybreak.API/Services/Interop/PartyContextService.cs b/Daybreak.API/Services/Interop/PartyContextService.cs index 123bd2b1..1db1ff67 100644 --- a/Daybreak.API/Services/Interop/PartyContextService.cs +++ b/Daybreak.API/Services/Interop/PartyContextService.cs @@ -1,12 +1,13 @@ using Daybreak.API.Interop; +using static Daybreak.API.Interop.GWCA.GW.Constants; namespace Daybreak.API.Services.Interop; public sealed class PartyContextService { - public bool AddHero(uint heroId) => GWCA.GW.PartyMgr.AddHero((int)heroId); + public bool AddHero(uint heroId) => GWCA.GW.PartyMgr.AddHero((HeroID)heroId); - public bool KickHero(uint heroId) => GWCA.GW.PartyMgr.KickHero((int)heroId); + public bool KickHero(uint heroId) => GWCA.GW.PartyMgr.KickHero((HeroID)heroId); public bool KickAllHeroes() => GWCA.GW.PartyMgr.KickAllHeroes(); diff --git a/Daybreak.API/Services/Interop/PreferencesService.cs b/Daybreak.API/Services/Interop/PreferencesService.cs index 360e2577..944755da 100644 --- a/Daybreak.API/Services/Interop/PreferencesService.cs +++ b/Daybreak.API/Services/Interop/PreferencesService.cs @@ -5,7 +5,7 @@ namespace Daybreak.API.Services.Interop; public sealed class PreferencesService() { - public uint? GetEnumPreference(EnumPreference pref) => GWCA.GW.UI.GetPreference(pref); + public uint? GetEnumPreference(EnumPreference pref) => GWCA.GW.UI.GetPreference((GWCA.GW.UI.EnumPreference)pref); - public bool SetEnumPreference(EnumPreference pref, uint value) => GWCA.GW.UI.SetPreference(pref, value); + public bool SetEnumPreference(EnumPreference pref, uint value) => GWCA.GW.UI.SetPreference((GWCA.GW.UI.EnumPreference)pref, value); } diff --git a/Daybreak.API/Services/Interop/UIContextService.cs b/Daybreak.API/Services/Interop/UIContextService.cs index 1a98e61d..6e533916 100644 --- a/Daybreak.API/Services/Interop/UIContextService.cs +++ b/Daybreak.API/Services/Interop/UIContextService.cs @@ -1,6 +1,5 @@ using Daybreak.API.Interop; using Daybreak.API.Interop.GuildWars; -using Daybreak.API.Models; using System.Collections.Concurrent; using System.Core.Extensions; using System.Extensions.Core; @@ -23,21 +22,7 @@ public sealed class UIContextService(ILogger logger) public unsafe WrappedPointer GetFrameContext(WrappedPointer frame) where T : unmanaged { - if (frame.IsNull || frame.Pointer->FrameCallbacks.Size == 0) - { - return null; - } - - for (uint i = 0; i < frame.Pointer->FrameCallbacks.Size; i++) - { - var callback = frame.Pointer->FrameCallbacks.Buffer[i]; - if (callback.UiCtl_Context != null) - { - return new WrappedPointer((T*)callback.UiCtl_Context); - } - } - - return null; + return (T*)GWCA.GW.UI.GetFrameContext(frame.Pointer); } public unsafe WrappedPointer GetChildFrame(WrappedPointer parent, uint childOffset) @@ -66,16 +51,16 @@ public unsafe bool SendFrameUIMessage(WrappedPointer frame, UIMessage mes return false; } - return GWCA.GW.UI.SendFrameUIMessage(frame, messageId, arg1, (nint)arg2); + return GWCA.GW.UI.SendFrameUIMessage(frame, (GWCA.GW.UI.UIMessage)messageId, arg1, (nint)arg2); } public unsafe bool SetFrameDisabled(WrappedPointer frame, bool disabled) => GWCA.GW.UI.SetFrameDisabled(frame, disabled); public unsafe bool SetFrameVisible(WrappedPointer frame, bool visible) => GWCA.GW.UI.SetFrameVisible(frame, visible); - public unsafe bool KeyDown(ControlAction action, WrappedPointer frame) => GWCA.GW.UI.Keydown(action, frame); + public unsafe bool KeyDown(GWCA.GW.UI.ControlAction action, WrappedPointer frame) => GWCA.GW.UI.Keydown(action, frame); - public unsafe bool KeyUp(ControlAction action, WrappedPointer frame) => GWCA.GW.UI.Keyup(action, frame); + public unsafe bool KeyUp(GWCA.GW.UI.ControlAction action, WrappedPointer frame) => GWCA.GW.UI.Keyup(action, frame); public unsafe WrappedPointer GetFrameByLabel(string label) { @@ -107,9 +92,9 @@ public unsafe bool ButtonClick(WrappedPointer frame) return GWCA.GW.UI.ButtonClick(frame); } - public unsafe void SendMessage(UIMessage message, nuint wParam, nuint lParam) => GWCA.GW.UI.SendUIMessage(message, (void*)wParam, (nint)lParam); + public unsafe void SendMessage(UIMessage message, nuint wParam, nuint lParam) => GWCA.GW.UI.SendUIMessage((GWCA.GW.UI.UIMessage)message, (void*)wParam, (nint)lParam); - public unsafe Task AsyncDecodeStringAsync(ushort* encodedString, Language language = Language.Unknown, CancellationToken cancellationToken = default) + public unsafe Task AsyncDecodeStringAsync(ushort* encodedString, GWCA.GW.Constants.Language language = GWCA.GW.Constants.Language.Unknown, CancellationToken cancellationToken = default) { var taskCompletionSource = new TaskCompletionSource(); cancellationToken.Register(() => taskCompletionSource.TrySetCanceled(cancellationToken)); @@ -150,7 +135,7 @@ void callback(void* param, ushort* decodedString) return taskCompletionSource.Task; } - public unsafe Task AsyncDecodeStringAsync(string encodedString, Language language = Language.Unknown, CancellationToken cancellationToken = default) + public unsafe Task AsyncDecodeStringAsync(string encodedString, GWCA.GW.Constants.Language language = GWCA.GW.Constants.Language.Unknown, CancellationToken cancellationToken = default) { // Pin the string and convert to ushort* fixed (char* encodedPtr = encodedString) diff --git a/Daybreak.API/Services/InventoryService.cs b/Daybreak.API/Services/InventoryService.cs index f283a2ce..bfb609d7 100644 --- a/Daybreak.API/Services/InventoryService.cs +++ b/Daybreak.API/Services/InventoryService.cs @@ -1,8 +1,10 @@ -using Daybreak.API.Interop.GuildWars; +using Daybreak.API.Interop; +using Daybreak.API.Interop.GuildWars; using Daybreak.API.Services.Interop; using Daybreak.Shared.Models.Api; using Daybreak.Shared.Models.Guildwars; using System.Extensions.Core; +using System.Runtime.CompilerServices; using System.Text; namespace Daybreak.API.Services; @@ -32,45 +34,48 @@ public sealed class InventoryService( return default; } - var inventory = gameContext.Pointer->ItemContext->Inventory; - if (inventory.IsNull) + var inventory = gameContext.Pointer->Items->Inventory; + if (inventory is null) { scopedLogger.LogError("Inventory is null"); return default; } - var itemTuples = new List<(BagType Type,List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)>)>(); - foreach (var bag in inventory.Pointer->Bags) + var itemTuples = new List<(GWCA.GW.Constants.BagType Type, List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType, uint Interaction, uint ModelFileId)>)>(); + var bags = (BagStruct**)Unsafe.AsPointer(ref inventory->Bags); + for (var i = 0; i < 23; i++) { + var bag = bags[i]; if (bag is null) { continue; } - var retBag = new List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)>(); - itemTuples.Add((bag->Type, retBag)); + var retBag = new List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType, uint Interaction, uint ModelFileId)>(); + itemTuples.Add((bag->BagType, retBag)); if (bag->ItemsCount is 0) { continue; } - foreach(var item in bag->Items) + foreach (var itemPtr in bag->Items.Value) { - if (item.IsNull) + if (itemPtr is 0) { continue; } - var singleItemName = new string(item.Pointer->SingleItemName); - var nameEncoded = new string(item.Pointer->NameEncoded); - var completeNameEncoded = new string(item.Pointer->CompleteNameEncoded); - var modifiers = new uint[item.Pointer->ModifiersCount]; - for(var j = 0; j < item.Pointer->ModifiersCount; j++) + var item = (ItemStruct*)itemPtr; + var singleItemName = new string((char*)item->SingleItemName); + var nameEncoded = new string((char*)item->NameEnc); + var completeNameEncoded = new string((char*)item->CompleteNameEnc); + var modifiers = new uint[item->ModStructSize]; + for (var j = 0; j < item->ModStructSize; j++) { - modifiers[j] = item.Pointer->Modifiers[j].Mod; + modifiers[j] = item->ModStruct[j].Mod; } - retBag.Add((item.Pointer->ModelId, completeNameEncoded, singleItemName, nameEncoded, item.Pointer->Inscribable, item.Pointer->Quantity, modifiers, item.Pointer->Type)); + retBag.Add((item->ModelId, completeNameEncoded, singleItemName, nameEncoded, (item->Interaction & 0x08000000) != 0, item->Quantity, modifiers, (ItemType)item->Type, item->Interaction, item->ModelFileId)); } } @@ -85,17 +90,18 @@ public sealed class InventoryService( // Decode strings sequentially to avoid race conditions with the game's TextParser language field. // Parallel decoding causes crashes because multiple operations race to set/restore the language. - var decodedItemTuples = new List<(BagType Type, List<(uint ModelId, string EncodedName, string? DecodedName, string EncodedSingleName, string? DecodedSingleName, string EncodedCompleteName, string? DecodedCompleteName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)> Items)>(); + var decodedItemTuples = new List<(GWCA.GW.Constants.BagType Type, List<(uint ModelId, string EncodedName, string? DecodedName, string EncodedSingleName, string? DecodedSingleName, string EncodedCompleteName, string? DecodedCompleteName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType, uint Interaction, uint ModelFileId)> Items)>(); foreach (var tuple in itemTuples) { - var decodedItems = new List<(uint ModelId, string EncodedName, string? DecodedName, string EncodedSingleName, string? DecodedSingleName, string EncodedCompleteName, string? DecodedCompleteName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)>(); + var decodedItems = new List<(uint ModelId, string EncodedName, string? DecodedName, string EncodedSingleName, string? DecodedSingleName, string EncodedCompleteName, string? DecodedCompleteName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType, uint Interaction, uint ModelFileId)>(); foreach (var item in tuple.Item2) { - var decodedName = await this.uIService.DecodeString(item.EncodedName, Language.English, cancellationToken); - var decodedCompleteName = await this.uIService.DecodeString(item.EncodedCompleteName, Language.English, cancellationToken); - var decodedSingleName = await this.uIService.DecodeString(item.EncodedSingleName, Language.English, cancellationToken); - decodedItems.Add((item.ModelId, item.EncodedName, decodedName, item.EncodedSingleName, decodedSingleName, item.EncodedCompleteName, decodedCompleteName, item.Inscribable, item.Quantity, item.Modifiers, item.ItemType)); + var decodedName = await this.uIService.DecodeString(item.EncodedName, (GWCA.GW.Constants.Language)Language.English, cancellationToken); + var decodedCompleteName = await this.uIService.DecodeString(item.EncodedCompleteName, (GWCA.GW.Constants.Language)Language.English, cancellationToken); + var decodedSingleName = await this.uIService.DecodeString(item.EncodedSingleName, (GWCA.GW.Constants.Language)Language.English, cancellationToken); + decodedItems.Add((item.ModelId, item.EncodedName, decodedName, item.EncodedSingleName, decodedSingleName, item.EncodedCompleteName, decodedCompleteName, item.Inscribable, item.Quantity, item.Modifiers, item.ItemType, item.Interaction, item.ModelFileId)); } + decodedItemTuples.Add((tuple.Type, decodedItems)); } @@ -116,7 +122,9 @@ public sealed class InventoryService( Quantity: item.Quantity, Modifiers: item.Modifiers, Properties: [.. ItemProperty.ParseItemModifiers([.. item.Modifiers.Select(m => (Shared.Models.Guildwars.ItemModifier)m)])], - ItemType: item.ItemType.ToString()))]))]); + ItemType: item.ItemType.ToString(), + Interaction: item.Interaction, + ModelFileId: item.ModelFileId))]))]); } private static string ToBase64(string encoded) diff --git a/Daybreak.API/Services/LoginService.cs b/Daybreak.API/Services/LoginService.cs index 5947b8c0..b7b856e6 100644 --- a/Daybreak.API/Services/LoginService.cs +++ b/Daybreak.API/Services/LoginService.cs @@ -22,16 +22,14 @@ public sealed class LoginService( unsafe { var gameContext = this.gameContextService.GetGameContext(); - if (gameContext.IsNull || gameContext.Pointer->CharContext is null) + if (gameContext.IsNull || gameContext.Pointer->Character is null) { scopedLogger.LogError("Game context is not initialized"); return default; } - var playerNameSpan = gameContext.Pointer->CharContext->PlayerName.AsSpan(); - var playerName = new string(playerNameSpan[..playerNameSpan.IndexOf('\0')]); - var emailSpan = gameContext.Pointer->CharContext->PlayerEmail.AsSpan(); - var email = new string(emailSpan[..emailSpan.IndexOf('\0')]); + var playerName = new string(gameContext.Pointer->Character->PlayerName); + var email = new string(gameContext.Pointer->Character->PlayerEmail); return new LoginInfo(email, playerName); } }, cancellationToken); diff --git a/Daybreak.API/Services/MainPlayerService.cs b/Daybreak.API/Services/MainPlayerService.cs index cc60f704..f0f759c3 100644 --- a/Daybreak.API/Services/MainPlayerService.cs +++ b/Daybreak.API/Services/MainPlayerService.cs @@ -1,4 +1,5 @@ using Daybreak.API.Extensions; +using Daybreak.API.Interop; using Daybreak.API.Interop.GuildWars; using Daybreak.API.Models; using Daybreak.API.Services.Interop; @@ -72,7 +73,7 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc var gameContext = this.gameContextService.GetGameContext(); if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null) + gameContext.Pointer->World is null) { scopedLogger.LogError("Failed to get game context"); return false; @@ -85,23 +86,23 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc return false; } - var playerAgent = this.GetAgentContext(playerAgentId); + var playerAgent = this.agentContextService.GetAgentById(playerAgentId); if (playerAgent is null || - playerAgent->Type is not AgentType.Living || + playerAgent->Type is not (uint)AgentType.Living || playerAgent->AgentId != playerAgentId) { scopedLogger.LogError("Player agent {playerAgentId} not found in agent array", playerAgentId); return false; } - var livingAgent = (AgentLivingContext*)playerAgent; - if (livingAgent->Level != gameContext.Pointer->WorldContext->Level) + var livingAgent = (AgentLiving*)playerAgent; + if (livingAgent->Level != gameContext.Pointer->World->Level) { - scopedLogger.LogError("Player agent not found. Player level mismatch: {level} != {gameLevel}", livingAgent->Level, gameContext.Pointer->WorldContext->Level); + scopedLogger.LogError("Player agent not found. Player level mismatch: {level} != {gameLevel}", livingAgent->Level, gameContext.Pointer->World->Level); return false; } - var agentProfession = gameContext.Pointer->WorldContext->Professions.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); + var agentProfession = gameContext.Pointer->World->PartyProfessionStates.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); if (agentProfession.AgentId != playerAgentId) { scopedLogger.LogError("Failed to find agent profession for player agent id {agentId}", playerAgentId); @@ -112,9 +113,9 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc (uint)singleBuild.Primary.Id, (uint)singleBuild.Secondary.Id, singleBuild.Skills.AsValueEnumerable().Select(s => (uint)s.Id).ToArray(), - livingAgent->Primary, - agentProfession.UnlockedProfessionsFlags, - [.. gameContext.Pointer->WorldContext->UnlockedCharacterSkills]); + livingAgent->Tags->Primary, + agentProfession.UnlockedProfessions, + [.. gameContext.Pointer->World->UnlockedCharacterSkills]); if (!this.buildTemplateManager.CanTemplateApply(validationRequest)) { @@ -122,9 +123,9 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc return false; } - var attributeIds = new Array12Uint(); + var attributeIds = new AttributeArray12(); var attributeValues = new Array12Uint(); - var skills = new Array8Uint(); + var skills = new SkillIDArray8(); for (var i = 0; i < singleBuild.Attributes.Count && i < 12; i++) { if (singleBuild.Attributes[i].Attribute is null) @@ -132,23 +133,24 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc continue; } - attributeIds[i] = (uint)singleBuild.Attributes[i].Attribute!.Id; + attributeIds[i] = (GWCA.GW.Constants.Attribute)singleBuild.Attributes[i].Attribute!.Id; attributeValues[i] = (uint)singleBuild.Attributes[i].Points; } for (var i = 0; i < singleBuild.Skills.Count && i < 8; i++) { - skills[i] = (uint)singleBuild.Skills[i].Id; + skills[i] = (GWCA.GW.Constants.SkillID)singleBuild.Skills[i].Id; } - var skillTemplate = new SkillTemplate( - (uint)singleBuild.Primary.Id, - (uint)singleBuild.Secondary.Id, - (uint)Math.Min(singleBuild.Attributes.Count, 12), - attributeIds, - attributeValues, - skills); - + var skillTemplate = new SkillTemplate + { + Primary = (GWCA.GW.Constants.Profession)singleBuild.Primary.Id, + Secondary = (GWCA.GW.Constants.Profession)singleBuild.Secondary.Id, + AttributesCount = (uint)Math.Min(singleBuild.Attributes.Count, 12), + AttributeIds = attributeIds, + Skills = skills, + }; + Unsafe.CopyBlock(skillTemplate.AttributeValues, Unsafe.AsPointer(ref attributeValues), (uint)(12 * sizeof(uint))); this.skillbarContextService.LoadBuild(playerAgentId, &skillTemplate); return true; } @@ -156,11 +158,11 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc if (result) { - await this.chatService.AddMessageAsync("Build applied successfully.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Build applied successfully.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); } else { - await this.chatService.AddMessageAsync("Failed to apply build.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Failed to apply build.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); } return result; @@ -193,21 +195,21 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc return default; } - var skillbarContext = gameContext.Pointer->WorldContext->Skillbars.AsValueEnumerable().FirstOrDefault(s => s.AgentId == playerAgentId); + var skillbarContext = gameContext.Pointer->World->Skillbar.Value.AsValueEnumerable().FirstOrDefault(s => s.AgentId == playerAgentId); if (skillbarContext.AgentId != playerAgentId) { scopedLogger.LogError("Failed to find skillbar context for player agent id {agentId}", playerAgentId); return default; } - var agentAttributes = gameContext.Pointer->WorldContext->Attributes.AsValueEnumerable().FirstOrDefault(a => a.AgentId == playerAgentId); + var agentAttributes = gameContext.Pointer->World->Attributes.Value.AsValueEnumerable().FirstOrDefault(a => a.AgentId == playerAgentId); if (agentAttributes.AgentId != playerAgentId) { scopedLogger.LogError("Failed to find agent attributes for player agent id {agentId}", playerAgentId); return default; } - var professionContext = gameContext.Pointer->WorldContext->Professions.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); + var professionContext = gameContext.Pointer->World->PartyProfessionStates.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); if (professionContext.AgentId != playerAgentId) { scopedLogger.LogError("Failed to find agent profession for player agent id {agentId}", playerAgentId); @@ -215,11 +217,11 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc } return new BuildEntry( - (int)professionContext.CurrentPrimary, - (int)professionContext.CurrentSecondary, - agentAttributes.Attributes.GetAttributeEntryList(), - [skillbarContext.Skill0.Id, skillbarContext.Skill1.Id, skillbarContext.Skill2.Id, skillbarContext.Skill3.Id, - skillbarContext.Skill4.Id, skillbarContext.Skill5.Id, skillbarContext.Skill6.Id, skillbarContext.Skill7.Id]); + (int)professionContext.Primary, + (int)professionContext.Secondary, + [.. agentAttributes.Attribute.GetAttributeEntryList()], + [(uint)skillbarContext.Skills[0].SkillId, (uint)skillbarContext.Skills[1].SkillId, (uint)skillbarContext.Skills[2].SkillId, (uint)skillbarContext.Skills[3].SkillId, + (uint)skillbarContext.Skills[4].SkillId, (uint)skillbarContext.Skills[5].SkillId, (uint)skillbarContext.Skills[6].SkillId, (uint)skillbarContext.Skills[7].SkillId]); } }, cancellationToken); } @@ -238,15 +240,15 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc } var gameContext = this.gameContextService.GetGameContext(); - if (gameContext.IsNull || gameContext.Pointer->WorldContext is null) + if (gameContext.IsNull || gameContext.Pointer->World is null) { scopedLogger.LogError("Game context is not initialized"); return default; } return new QuestLogInformation( - gameContext.Pointer->WorldContext->ActiveQuestId, - gameContext.Pointer->WorldContext->QuestLog.AsValueEnumerable().Select(q => new QuestInformation(q.QuestId, q.MapFrom)).ToList()); + (uint)gameContext.Pointer->World->ActiveQuestId, + gameContext.Pointer->World->QuestLog.Value.AsValueEnumerable().Select(q => new QuestInformation((uint)q.QuestId, (uint)q.MapFrom)).ToList()); } }, cancellationToken); } @@ -265,29 +267,27 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc } var gameContext = this.gameContextService.GetGameContext(); - if (gameContext.IsNull || gameContext.Pointer->CharContext is null || - gameContext.Pointer->WorldContext is null) + if (gameContext.IsNull || gameContext.Pointer->Character is null || + gameContext.Pointer->World is null) { scopedLogger.LogError("Game context is not initialized"); return default; } - var playerNameSpan = gameContext.Pointer->CharContext->PlayerName.AsSpan(); - var playerName = new string(playerNameSpan[..playerNameSpan.IndexOf('\0')]); - var emailSpan = gameContext.Pointer->CharContext->PlayerEmail.AsSpan(); - var email = new string(emailSpan[..emailSpan.IndexOf('\0')]); - var accountName = new string(gameContext.Pointer->WorldContext->AccountInfo->AccountName); + var playerName = new string (gameContext.Pointer->Character->PlayerName); + var email = new string(gameContext.Pointer->Character->PlayerEmail); + var accountName = new string((char*)gameContext.Pointer->World->AccountInfo->AccountName); return new MainPlayerInformation( - gameContext.Pointer->CharContext->PlayerUuid.ToString(), + (*(Uuid*)gameContext.Pointer->Character->PlayerUuid).ToString(), email, playerName, accountName, - gameContext.Pointer->WorldContext->AccountInfo->Wins, - gameContext.Pointer->WorldContext->AccountInfo->Losses, - gameContext.Pointer->WorldContext->AccountInfo->Rating, - gameContext.Pointer->WorldContext->AccountInfo->QualifierPoints, - gameContext.Pointer->WorldContext->AccountInfo->Rank, - gameContext.Pointer->WorldContext->AccountInfo->TournamentRewardPoints); + gameContext.Pointer->World->AccountInfo->Wins, + gameContext.Pointer->World->AccountInfo->Losses, + gameContext.Pointer->World->AccountInfo->Rating, + gameContext.Pointer->World->AccountInfo->QualifierPoints, + gameContext.Pointer->World->AccountInfo->Rank, + gameContext.Pointer->World->AccountInfo->TournamentRewardPoints); } }, cancellationToken); } @@ -306,61 +306,57 @@ public async Task SetCurrentBuild(string buildCode, CancellationToken canc } var gameContext = this.gameContextService.GetGameContext(); - var agentArray = this.agentContextService.GetAgentArray(); var playerAgentId = this.agentContextService.GetPlayerAgentId(); if (gameContext.IsNull || - gameContext.Pointer->WorldContext is null || - gameContext.Pointer->CharContext is null || - gameContext.Pointer->WorldContext->MapAgents.Buffer is null || - agentArray.IsNull || - agentArray.Pointer->Buffer is null || + gameContext.Pointer->World is null || + gameContext.Pointer->Character is null || playerAgentId is 0x0) { scopedLogger.LogDebug("Game data is not yet initialized"); return default; } - var playerAgent = this.GetAgentContext(playerAgentId); + var playerAgent = this.agentContextService.GetAgentById(playerAgentId); if (playerAgent is null || - playerAgent->Type is not AgentType.Living || + playerAgent->Type is not (uint)AgentType.Living || playerAgent->AgentId != playerAgentId) { scopedLogger.LogError("Player agent {playerAgentId} not found in agent array", playerAgentId); return default; } - var livingAgent = (AgentLivingContext*)playerAgent; - if (livingAgent->Level != gameContext.Pointer->WorldContext->Level) + var livingAgent = (AgentLiving*)playerAgent; + if (livingAgent->Level != gameContext.Pointer->World->Level) { - scopedLogger.LogError("Player agent not found. Player level mismatch: {level} != {gameLevel}", livingAgent->Level, gameContext.Pointer->WorldContext->Level); + scopedLogger.LogError("Player agent not found. Player level mismatch: {level} != {gameLevel}", livingAgent->Level, gameContext.Pointer->World->Level); return default; } return new MainPlayerState( - gameContext.Pointer->WorldContext->Experience, - gameContext.Pointer->WorldContext->Level, - - gameContext.Pointer->WorldContext->CurrentLuxon, - gameContext.Pointer->WorldContext->CurrentKurzick, - gameContext.Pointer->WorldContext->CurrentImperial, - gameContext.Pointer->WorldContext->CurrentBalthazar, - gameContext.Pointer->WorldContext->MaxLuxon, - gameContext.Pointer->WorldContext->MaxKurzick, - gameContext.Pointer->WorldContext->MaxImperial, - gameContext.Pointer->WorldContext->MaxBalthazar, - gameContext.Pointer->WorldContext->TotalLuxon, - gameContext.Pointer->WorldContext->TotalKurzick, - gameContext.Pointer->WorldContext->TotalImperial, - gameContext.Pointer->WorldContext->TotalBalthazar, + gameContext.Pointer->World->Experience, + gameContext.Pointer->World->Level, + + gameContext.Pointer->World->CurrentLuxon, + gameContext.Pointer->World->CurrentKurzick, + gameContext.Pointer->World->CurrentImperial, + gameContext.Pointer->World->CurrentBalth, + gameContext.Pointer->World->MaxLuxon, + gameContext.Pointer->World->MaxKurzick, + gameContext.Pointer->World->MaxImperial, + gameContext.Pointer->World->MaxBalth, + gameContext.Pointer->World->TotalEarnedLuxon, + gameContext.Pointer->World->TotalEarnedKurzick, + gameContext.Pointer->World->TotalEarnedImperial, + gameContext.Pointer->World->TotalEarnedBalth, // Energy and health are percentages of Max - livingAgent->Health * livingAgent->MaxHealth, - livingAgent->MaxHealth, + livingAgent->Hp * livingAgent->MaxHp, + livingAgent->MaxHp, livingAgent->Energy * livingAgent->MaxEnergy, livingAgent->MaxEnergy, - livingAgent->Primary, - livingAgent->Secondary, + livingAgent->Tags->Primary, + livingAgent->Tags->Secondary, playerAgent->Pos.X, playerAgent->Pos.Y @@ -386,18 +382,17 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo var currentMapInfo = this.instanceContextService.GetAreaInfo(); var serverRegion = this.instanceContextService.GetServerRegion(); if (gameContext.IsNull || - gameContext.Pointer->CharContext is null || - gameContext.Pointer->WorldContext is null || - gameContext.Pointer->PartyContext is null || + gameContext.Pointer->Character is null || + gameContext.Pointer->World is null || + gameContext.Pointer->Party is 0 || currentMapInfo.IsNull) { scopedLogger.LogError("Game context is not initialized"); return new InstanceInfo(0, 0, 0, 0, Shared.Models.Api.InstanceType.Loading, DistrictRegionInfo.Unknown, LanguageInfo.Unknown, CampaignInfo.Unknown, ContinentInfo.Unknown, RegionInfo.Unknown, DifficultyInfo.Unknown); } - var charContext = *gameContext.Pointer->CharContext; - var worldContext = *gameContext.Pointer->WorldContext; - var partyContext = *gameContext.Pointer->PartyContext; + var charContext = *gameContext.Pointer->Character; + var worldContext = *gameContext.Pointer->World; var mapInfo = *currentMapInfo.Pointer; var mapId = charContext.MapId; var language = charContext.Language; @@ -406,7 +401,7 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo var foesToKill = worldContext.FoesToKill; return new InstanceInfo( - MapId: charContext.MapId, + MapId: (uint)charContext.MapId, DistrictNumber: charContext.DistrictNumber, FoesKilled: worldContext.FoesKilled, FoesToKill: worldContext.FoesToKill, @@ -416,7 +411,7 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo Campaign: (CampaignInfo)mapInfo.Campaign, Continent: (ContinentInfo)mapInfo.Continent, Region: (RegionInfo)mapInfo.Region, - Difficulty: partyContext.Flags.HasFlag(PartyFlags.HardMode) ? DifficultyInfo.Hard : DifficultyInfo.Normal); + Difficulty: GWCA.GW.PartyMgr.GetIsPartyInHardMode() ? DifficultyInfo.Hard : DifficultyInfo.Normal); } }, cancellationToken); } @@ -435,27 +430,26 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo } var gameContext = this.gameContextService.GetGameContext(); - if (gameContext.IsNull || gameContext.Pointer->WorldContext is null) + if (gameContext.IsNull || gameContext.Pointer->World is null) { scopedLogger.LogError("Game context is not initialized"); return default; } - var playerIndex = gameContext.Pointer->CharContext->PlayerNumber; - var players = gameContext.Pointer->WorldContext->Players; - if (playerIndex < 0 || playerIndex >= players.Size) + var playerIndex = gameContext.Pointer->Character->PlayerNumber; + var player = GWCA.GW.PlayerMgr.GetPlayerByID(playerIndex); + if (player is null) { - scopedLogger.LogError("Failed to get player id. Got {playerNumber}", playerIndex); + scopedLogger.LogError("Failed to get player"); return default; } - var player = gameContext.Pointer->WorldContext->Players[(int)playerIndex]; - var currentTier = player.ActiveTitleTier; - TitleContext? currentTitle = default; + var currentTier = player->ActiveTitleTier; + Title? currentTitle = default; int? id = -1; - for (var i = 0; i < gameContext.Pointer->WorldContext->Titles.Size; i++) + for (var i = 0; i < gameContext.Pointer->World->Titles.Value.Size; i++) { - var title = gameContext.Pointer->WorldContext->Titles.Skip(i).FirstOrDefault(); + var title = gameContext.Pointer->World->Titles.Value.Skip(i).FirstOrDefault(); if (title.CurrentTitleTierIndex == currentTier) { currentTitle = title; @@ -470,15 +464,15 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo return default; } - var titleTier = gameContext.Pointer->WorldContext->TitleTiers.Skip((int)currentTitle.Value.CurrentTitleTierIndex).FirstOrDefault(); + var titleTier = gameContext.Pointer->World->TitleTiers.Skip((int)currentTitle.Value.CurrentTitleTierIndex).FirstOrDefault(); return new TitleInfo ( Id: (uint)id, - IsPercentage: currentTitle.Value.Props.HasFlag(TitleProps.PercentageBased), - PointsForCurrentRank: currentTitle.Value.PointsNeededForCurrentRank, + IsPercentage: currentTitle.Value.IsPercentageBased(), + PointsForCurrentRank: currentTitle.Value.PointsNeededCurrentRank, PointsForNextRank: titleTier.TierNumber == currentTitle.Value.MaxTitleRank ? currentTitle.Value.CurrentPoints : - currentTitle.Value.PointsNeededForNextRank, + currentTitle.Value.PointsNeededNextRank, CurrentPoints: currentTitle.Value.CurrentPoints, TierNumber: titleTier.TierNumber, MaxTierNumber: currentTitle.Value.MaxTitleTierIndex @@ -502,8 +496,8 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo var gameContext = this.gameContextService.GetGameContext(); if (gameContext.IsNull || - gameContext.Pointer->AccountContext is null || - gameContext.Pointer->WorldContext is null) + gameContext.Pointer->Account is null || + gameContext.Pointer->World is null) { this.logger.LogError("Game context is not initialized"); return default; @@ -516,7 +510,7 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo return default; } - var agentProfession = gameContext.Pointer->WorldContext->Professions.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); + var agentProfession = gameContext.Pointer->World->PartyProfessionStates.AsValueEnumerable().FirstOrDefault(p => p.AgentId == playerAgentId); if (agentProfession.AgentId != playerAgentId) { scopedLogger.LogError("Failed to find agent profession for player agent id {agentId}", playerAgentId); @@ -524,25 +518,11 @@ public Task GetMainPlayerInstance(CancellationToken cancellationTo } return new MainPlayerBuildContext( - PrimaryProfessionId: (uint)agentProfession.CurrentPrimary, - UnlockedProfessions: agentProfession.UnlockedProfessionsFlags, - UnlockedAccountSkills: gameContext.Pointer->AccountContext->UnlockedAccountSkills.AsValueEnumerable().ToArray(), - UnlockedCharacterSkills: gameContext.Pointer->WorldContext->UnlockedCharacterSkills.AsValueEnumerable().ToArray()); + PrimaryProfessionId: (uint)agentProfession.Primary, + UnlockedProfessions: agentProfession.UnlockedProfessions, + UnlockedCharacterSkills: gameContext.Pointer->World->UnlockedCharacterSkills.AsValueEnumerable().ToArray()); } }, cancellationToken); } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private unsafe AgentContext* GetAgentContext(uint agentId) - { - var agentArray = this.agentContextService.GetAgentArray(); - if (agentArray.IsNull || agentArray.Pointer->Buffer is null || - agentArray.Pointer->Size <= agentId) - { - return null; - } - - return agentArray.Pointer->Buffer[agentId].Pointer; - } } diff --git a/Daybreak.API/Services/PartyService.cs b/Daybreak.API/Services/PartyService.cs index 206ad668..158668da 100644 --- a/Daybreak.API/Services/PartyService.cs +++ b/Daybreak.API/Services/PartyService.cs @@ -1,4 +1,5 @@ using Daybreak.API.Extensions; +using Daybreak.API.Interop; using Daybreak.API.Interop.GuildWars; using Daybreak.API.Models; using Daybreak.API.Services.Interop; @@ -9,6 +10,7 @@ using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; +using System.Runtime.CompilerServices; using ZLinq; using InstanceType = Daybreak.API.Interop.GuildWars.InstanceType; @@ -46,21 +48,21 @@ public async Task SetPartyLoadout(PartyLoadout partyLoadout, CancellationT if (!await this.IsInValidOutpost(cancellationToken)) { scopedLogger.LogError("Could not set party loadout. Not in a valid outpost"); - await this.chatService.AddMessageAsync("Cannot set party loadout. Not in a valid outpost.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Cannot set party loadout. Not in a valid outpost.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); return false; } if (!await this.KickAllHeroes(cancellationToken)) { scopedLogger.LogError("Could not set party loadout. Could not leave party"); - await this.chatService.AddMessageAsync("Cannot set party loadout. Could not leave party.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Cannot set party loadout. Could not leave party.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); return false; } if (!await this.gameThreadService.QueueOnGameThread(() => this.SpawnHeroes(partyLoadout), cancellationToken)) { scopedLogger.LogError("Could not set party loadout. Could not spawn heroes"); - await this.chatService.AddMessageAsync("Cannot set party loadout. Could not spawn heroes.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Cannot set party loadout. Could not spawn heroes.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); return false; } @@ -69,21 +71,21 @@ public async Task SetPartyLoadout(PartyLoadout partyLoadout, CancellationT if (!await this.gameThreadService.QueueOnGameThread(() => this.ApplyBuilds(partyLoadout), cancellationToken)) { scopedLogger.LogError("Could not set party loadout. Could not apply builds"); - await this.chatService.AddMessageAsync("Cannot set party loadout. Could not apply builds.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Cannot set party loadout. Could not apply builds.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); return false; } var heroBehaviorSetup = await this.gameThreadService.QueueOnGameThread(() => this.GetHeroBehaviorSetup(partyLoadout), cancellationToken); - foreach (var heroBehaviorEntry in heroBehaviorSetup ?? []) + foreach (var (AgentId, Behavior) in heroBehaviorSetup ?? []) { - if (!await this.SetHeroBehavior(heroBehaviorEntry.AgentId, heroBehaviorEntry.Behavior, cancellationToken)) + if (!await this.SetHeroBehavior(AgentId, Behavior, cancellationToken)) { - scopedLogger.LogWarning("Could not set hero behavior for agent {agentId} to {behavior}", heroBehaviorEntry.AgentId, heroBehaviorEntry.Behavior); - await this.chatService.AddMessageAsync($"Cannot set party loadout. Could not set behavior {heroBehaviorEntry.Behavior} for agent {heroBehaviorEntry.AgentId}.", "Daybreak.API", Channel.Moderator, cancellationToken); + scopedLogger.LogWarning("Could not set hero behavior for agent {agentId} to {behavior}", AgentId, Behavior); + await this.chatService.AddMessageAsync($"Cannot set party loadout. Could not set behavior {Behavior} for agent {AgentId}.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); } } - await this.chatService.AddMessageAsync("Party loadout set.", "Daybreak.API", Channel.Moderator, cancellationToken); + await this.chatService.AddMessageAsync("Party loadout set.", "Daybreak.API", Channel.CHANNEL_MODERATOR, cancellationToken); return true; } @@ -126,9 +128,9 @@ public async Task SetPartyLoadout(PartyLoadout partyLoadout, CancellationT var buildTuples = professions.Value.AsValueEnumerable() .Select(p => (p.AgentId, p, attributes.Value.FirstOrDefault(a => a.AgentId == p.AgentId), skillbars.Value.FirstOrDefault(s => s.AgentId == p.AgentId), heroFlags.Value.FirstOrDefault(f => f.AgentId == p.AgentId))) - .Select(t => (t.AgentId, GetBuildEntryById(t.p, t.Item4, t.Item3), t.Item5.Behavior)) + .Select(t => (t.AgentId, GetBuildEntryById(t.p, t.Item4, t.Item3), t.Item5.HeroBehavior)) .Where(t => t.Item2 is not null) - .OfType<(uint AgentId, BuildEntry BuildEntry, Behavior Behavior)>() + .OfType<(uint AgentId, BuildEntry BuildEntry, API.Interop.GWCA.GW.HeroBehavior Behavior)>() .ToList(); return new PartyLoadout( @@ -136,16 +138,17 @@ [.. buildTuples.Select(t => { if (t.AgentId == playerId) { - return new PartyLoadoutEntry(0, HeroBehavior.Undefined, t.BuildEntry); + return new PartyLoadoutEntry(0, Shared.Models.Api.HeroBehavior.Undefined, t.BuildEntry); } else if (heroes.Value.FirstOrDefault(h => h.AgentId == t.AgentId) is HeroPartyMember hero && hero.AgentId == t.AgentId) { - return new PartyLoadoutEntry((int)hero.HeroId, (HeroBehavior)t.Behavior, t.BuildEntry); + return new PartyLoadoutEntry((int)hero.HeroId, (Shared.Models.Api.HeroBehavior)t.Behavior, t.BuildEntry); } return default; }) + .Where(t => t is not null) .OfType()]); } }, cancellationToken); @@ -179,7 +182,7 @@ public async Task GetPartySize(CancellationToken cancellationToken) }, cancellationToken); } - public async Task SetHeroBehavior(uint heroAgentId, HeroBehavior behavior, CancellationToken cancellationToken) + public async Task SetHeroBehavior(uint heroAgentId, Shared.Models.Api.HeroBehavior behavior, CancellationToken cancellationToken) { var scopedLogger = this.logger.CreateScopedLogger(); @@ -209,14 +212,14 @@ public async Task SetHeroBehavior(uint heroAgentId, HeroBehavior behavior, unsafe { var btn = this.uIContextService.GetChildFrame(frame.Frame, (uint)behavior); - var packet = new UIPackets.MouseClick(UIPackets.MouseButtons.Left, 0, 0); + var packet = new kMouseClick { MouseButton = 0, IsDoubleclick = 0 }; if (btn.IsNull) { scopedLogger.LogError("Could not set hero behavior. Could not find button for behavior {behavior} in frame {frameLabel}", behavior, heroCommanderFrameLabel); return false; } - return this.uIContextService.SendFrameUIMessage(btn, UIMessage.MouseClick, &packet); + return this.uIContextService.SendFrameUIMessage(btn, UIMessage.kMouseClick, &packet); } }, cancellationToken); @@ -305,7 +308,7 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) } else { - var hero = heroes.Value.AsValueEnumerable().FirstOrDefault(h => h.HeroId == entry.HeroId); + var hero = heroes.Value.AsValueEnumerable().FirstOrDefault(h => (int)h.HeroId == entry.HeroId); return (entry, hero.AgentId); } }) @@ -317,7 +320,7 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) : accountContext.Pointer->UnlockedAccountSkills; var unlockedProfessionsFlags = t.playerId == playerId - ? playerProfessionContext.UnlockedProfessionsFlags + ? playerProfessionContext.UnlockedProfessions : uint.MaxValue; if (!this.buildTemplateManager.CanTemplateApply( @@ -325,7 +328,7 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) (uint)t.entry.Build.Primary, (uint)t.entry.Build.Secondary, [.. t.entry.Build.Skills], - (uint)t.Item3.CurrentPrimary, + (uint)t.Item3.Primary, unlockedProfessionsFlags, [.. validSkills]))) { @@ -358,28 +361,29 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) continue; } - var attributeIds = new Array12Uint(); + var attributeIds = new AttributeArray12(); var attributeValues = new Array12Uint(); for (var i = 0; i < entry.Build.Attributes.Count && i < 12; i++) { - attributeIds[i] = (uint)entry.Build.Attributes[i].Id; + attributeIds[i] = (GWCA.GW.Constants.Attribute)entry.Build.Attributes[i].Id; attributeValues[i] = (uint)entry.Build.Attributes[i].BasePoints; } - var skills = new Array8Uint(); + var skills = new SkillIDArray8(); for (var i = 0; i < entry.Build.Skills.Count && i < 8; i++) { - skills[i] = entry.Build.Skills[i]; + skills[i] = (GWCA.GW.Constants.SkillID)entry.Build.Skills[i]; } - var skillTemplate = new SkillTemplate( - (uint)entry.Build.Primary, - (uint)entry.Build.Secondary, - (uint)entry.Build.Attributes.Count, - attributeIds, - attributeValues, - skills); - + var skillTemplate = new SkillTemplate + { + Primary = (GWCA.GW.Constants.Profession)entry.Build.Primary, + Secondary = (GWCA.GW.Constants.Profession)entry.Build.Secondary, + AttributesCount = (uint)entry.Build.Attributes.Count, + AttributeIds = attributeIds, + Skills = skills + }; + Unsafe.CopyBlock(skillTemplate.AttributeValues, Unsafe.AsPointer(ref attributeValues), (uint)(12 * sizeof(uint))); scopedLogger.LogInformation("Applying build for agent {agentId} with primary {primary} and secondary {secondary}", agentId, entry.Build.Primary, entry.Build.Secondary); this.skillbarContextService.LoadBuild(agentId, &skillTemplate); } @@ -387,7 +391,7 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) return true; } - private unsafe List<(uint AgentId, HeroBehavior Behavior)>? GetHeroBehaviorSetup(PartyLoadout partyLoadout) + private unsafe List<(uint AgentId, Shared.Models.Api.HeroBehavior Behavior)>? GetHeroBehaviorSetup(PartyLoadout partyLoadout) { var scopedLogger = this.logger.CreateScopedLogger(); scopedLogger.LogDebug("Getting hero behavior setup"); @@ -402,12 +406,12 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) return heroes.Value.AsValueEnumerable() .Select(h => { - if (h.HeroId is 0) + if (h.HeroId is API.Interop.GWCA.GW.Constants.HeroID.NoHero) { return default; } - var entry = partyLoadout.Entries.AsValueEnumerable().FirstOrDefault(e => (uint)e.HeroId == h.HeroId); + var entry = partyLoadout.Entries.AsValueEnumerable().FirstOrDefault(e => e.HeroId == (int)h.HeroId); if (entry is null) { scopedLogger.LogWarning("No entry found for hero {heroId}", h.HeroId); @@ -455,21 +459,14 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) return -1; } - var partyContext = gameContext.Pointer->PartyContext; - if (partyContext is null) - { - scopedLogger.LogError("Party context is null"); - return -1; - } - - var charContext = gameContext.Pointer->CharContext; + var charContext = gameContext.Pointer->Character; if (charContext is null) { scopedLogger.LogError("Char context is null"); return -1; } - var playerParty = partyContext->PlayerParty; + var playerParty = GWCA.GW.PartyMgr.GetPartyInfo(0); var playerId = charContext->PlayerNumber; var offset = 0; foreach(var hero in playerParty->Heroes) @@ -492,22 +489,22 @@ private unsafe bool ApplyBuilds(PartyLoadout partyLoadout) return heroNumber is -1 ? default : (uint)heroNumber; } - private static BuildEntry? GetBuildEntryById(ProfessionsContext professionContext, SkillbarContext skillbar, PartyAttribute attributes) + private static BuildEntry? GetBuildEntryById(ProfessionState professionContext, SkillbarData skillbar, PartyAttribute attributes) { return new BuildEntry( - Primary: (int)professionContext.CurrentPrimary, - Secondary: (int)professionContext.CurrentSecondary, - Attributes: attributes.Attributes.GetAttributeEntryList(), + Primary: (int)professionContext.Primary, + Secondary: (int)professionContext.Secondary, + Attributes: attributes.Attribute.GetAttributeEntryList().ToList(), Skills: [ - skillbar.Skill0.Id, - skillbar.Skill1.Id, - skillbar.Skill2.Id, - skillbar.Skill3.Id, - skillbar.Skill4.Id, - skillbar.Skill5.Id, - skillbar.Skill6.Id, - skillbar.Skill7.Id + (uint)skillbar.Skills[0].SkillId, + (uint)skillbar.Skills[1].SkillId, + (uint)skillbar.Skills[2].SkillId, + (uint)skillbar.Skills[3].SkillId, + (uint)skillbar.Skills[4].SkillId, + (uint)skillbar.Skills[5].SkillId, + (uint)skillbar.Skills[6].SkillId, + (uint)skillbar.Skills[7].SkillId ]); } } diff --git a/Daybreak.API/Services/UIService.cs b/Daybreak.API/Services/UIService.cs index b5d5f815..44344c72 100644 --- a/Daybreak.API/Services/UIService.cs +++ b/Daybreak.API/Services/UIService.cs @@ -1,6 +1,5 @@ using Daybreak.API.Interop; using Daybreak.API.Interop.GuildWars; -using Daybreak.API.Models; using Daybreak.API.Services.Interop; using System.Extensions.Core; @@ -20,7 +19,7 @@ public async Task Keypress(ControlAction action, WrappedPointer fra var scopedLogger = this.logger.CreateScopedLogger(); var keyDownResult = await this.gameThreadService.QueueOnGameThread(() => { - if (!this.uIContextService.KeyDown(action, frame)) + if (!this.uIContextService.KeyDown((GWCA.GW.UI.ControlAction)action, frame)) { scopedLogger.LogError("Failed to send keydown action {action}", action); return false; @@ -36,7 +35,7 @@ public async Task Keypress(ControlAction action, WrappedPointer fra var keyUpResult = await this.gameThreadService.QueueOnGameThread(() => { - if (!this.uIContextService.KeyUp(action, frame)) + if (!this.uIContextService.KeyUp((GWCA.GW.UI.ControlAction)action, frame)) { scopedLogger.LogError("Failed to send keyup action {action}", action); return false; @@ -86,7 +85,7 @@ await this.gameThreadService.QueueOnGameThread(async () => }); } - public async Task DecodeString(string encoded, Language language, CancellationToken cancellationToken) + public async Task DecodeString(string encoded, GWCA.GW.Constants.Language language, CancellationToken cancellationToken) { // GWCA's AsyncDecodeStr handles language switching internally (sets language, decodes, restores) return await this.uIContextService.AsyncDecodeStringAsync(encoded, language, cancellationToken); @@ -96,14 +95,14 @@ private static ControlAction GetUIActionFromFrameLabel(string frameLabel) { return frameLabel switch { - "AgentCommander0" => ControlAction.OpenHeroCommander1, - "AgentCommander1" => ControlAction.OpenHeroCommander2, - "AgentCommander2" => ControlAction.OpenHeroCommander3, - "AgentCommander3" => ControlAction.OpenHeroCommander4, - "AgentCommander4" => ControlAction.OpenHeroCommander5, - "AgentCommander5" => ControlAction.OpenHeroCommander6, - "AgentCommander6" => ControlAction.OpenHeroCommander7, - _ => ControlAction.None + "AgentCommander0" => ControlAction.ControlAction_OpenHeroCommander1, + "AgentCommander1" => ControlAction.ControlAction_OpenHeroCommander2, + "AgentCommander2" => ControlAction.ControlAction_OpenHeroCommander3, + "AgentCommander3" => ControlAction.ControlAction_OpenHeroCommander4, + "AgentCommander4" => ControlAction.ControlAction_OpenHeroCommander5, + "AgentCommander5" => ControlAction.ControlAction_OpenHeroCommander6, + "AgentCommander6" => ControlAction.ControlAction_OpenHeroCommander7, + _ => ControlAction.ControlAction_None }; } } diff --git a/Daybreak.API/Services/WebApplicationBuilderExtensions.cs b/Daybreak.API/Services/WebApplicationBuilderExtensions.cs index ea8dcf98..dbfeddb6 100644 --- a/Daybreak.API/Services/WebApplicationBuilderExtensions.cs +++ b/Daybreak.API/Services/WebApplicationBuilderExtensions.cs @@ -1,6 +1,6 @@ using Daybreak.API.Services.Interop; using Daybreak.Shared.Services.BuildTemplates; -using System.Diagnostics.CodeAnalysis; +using Daybreak.Shared.Services.BuildTemplates.Parsers; namespace Daybreak.API.Services; @@ -8,6 +8,9 @@ public static class WebApplicationBuilderExtensions { public static WebApplicationBuilder WithDaybreakServices(this WebApplicationBuilder builder) { + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/Daybreak.Core/Configuration/ProjectConfiguration.cs b/Daybreak.Core/Configuration/ProjectConfiguration.cs index b4451867..2fd1dcc7 100644 --- a/Daybreak.Core/Configuration/ProjectConfiguration.cs +++ b/Daybreak.Core/Configuration/ProjectConfiguration.cs @@ -54,6 +54,7 @@ using Daybreak.Shared.Services.ApplicationArguments; using Daybreak.Shared.Services.ApplicationLauncher; using Daybreak.Shared.Services.BuildTemplates; +using Daybreak.Shared.Services.BuildTemplates.Parsers; using Daybreak.Shared.Services.Credentials; using Daybreak.Shared.Services.DirectSong; using Daybreak.Shared.Services.Downloads; @@ -140,8 +141,11 @@ public override void RegisterServices(IServiceCollection services) }); services.AddSingleton(); - services.AddSingleton(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(sp => sp.GetRequiredService().Cast() diff --git a/Daybreak.Core/Services/ApplicationLauncher/ApplicationLauncher.cs b/Daybreak.Core/Services/ApplicationLauncher/ApplicationLauncher.cs index 59cdccc4..de1bbdbb 100644 --- a/Daybreak.Core/Services/ApplicationLauncher/ApplicationLauncher.cs +++ b/Daybreak.Core/Services/ApplicationLauncher/ApplicationLauncher.cs @@ -167,9 +167,8 @@ is null args.AddRange(PopulateCommandLineArgs("-email", email) ?? []); args.AddRange(PopulateCommandLineArgs("-password", password) ?? []); - args.AddRange(PopulateCommandLineArgs("-character", "Daybreak") ?? []); - foreach (var arg in launchConfigurationWithCredentials.Arguments?.Split(" ") ?? []) + foreach (var arg in SplitArguments(launchConfigurationWithCredentials.Arguments)) { args.Add(arg); } @@ -215,6 +214,11 @@ is null args.AddRange(mod.GetCustomArguments()); } + if (!args.Any(a => a.StartsWith("-character"))) + { + args.AddRange(PopulateCommandLineArgs("-character", "Daybreak") ?? []); + } + var process = new Process() { StartInfo = new ProcessStartInfo @@ -695,6 +699,44 @@ CancellationToken cancellationToken return true; } + private static IEnumerable SplitArguments(string? arguments) + { + if (string.IsNullOrWhiteSpace(arguments)) + { + yield break; + } + + var current = new System.Text.StringBuilder(); + var inQuotes = false; + + for (var i = 0; i < arguments.Length; i++) + { + var c = arguments[i]; + if (c == '"') + { + inQuotes = !inQuotes; + current.Append(c); + } + else if (c == ' ' && !inQuotes) + { + if (current.Length > 0) + { + yield return current.ToString(); + current.Clear(); + } + } + else + { + current.Append(c); + } + } + + if (current.Length > 0) + { + yield return current.ToString(); + } + } + private static string[]? PopulateCommandLineArgs(string argName, string? argValue) { if (argValue is null || argValue.IsNullOrWhiteSpace()) diff --git a/Daybreak.Core/Services/BuildTemplates/AttributePointCalculator.cs b/Daybreak.Core/Services/BuildTemplates/AttributePointCalculator.cs index 4770fc97..0a0b13c7 100644 --- a/Daybreak.Core/Services/BuildTemplates/AttributePointCalculator.cs +++ b/Daybreak.Core/Services/BuildTemplates/AttributePointCalculator.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Builds; -using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.BuildTemplates; namespace Daybreak.Services.BuildTemplates; @@ -31,30 +30,11 @@ public int GetPointsRequiredToIncreaseRank(int currentRank) return PointsRequiredToIncreaseRankMapping[currentRank]; } - public int GetRemainingFreePoints(Build build) - { - return this.MaximumAttributePoints - this.GetUsedPoints(build); - } - public int GetRemainingFreePoints(SingleBuildEntry build) { return this.MaximumAttributePoints - this.GetUsedPoints(build); } - public int GetUsedPoints(Build build) - { - var totalPoints = 0; - foreach(var attribute in build.Attributes) - { - for(var i = 0; i < attribute.Points; i++) - { - totalPoints += this.GetPointsRequiredToIncreaseRank(i); - } - } - - return totalPoints; - } - public int GetUsedPoints(SingleBuildEntry build) { var totalPoints = 0; diff --git a/Daybreak.Core/Services/Graph/GraphClient.cs b/Daybreak.Core/Services/Graph/GraphClient.cs index d3d57142..4077ebb3 100644 --- a/Daybreak.Core/Services/Graph/GraphClient.cs +++ b/Daybreak.Core/Services/Graph/GraphClient.cs @@ -202,7 +202,6 @@ is false build.SourceUrl = buildFile.SourceUrl; build.Name = buildFile.FileName; build.PreviousName = buildFile.FileName; - build.Metadata = buildFile.Metadata; return build; }) .Where(entry => entry is not null) @@ -240,7 +239,6 @@ is false build.SourceUrl = buildFile.SourceUrl; build.Name = buildFile.FileName; build.PreviousName = buildFile.FileName; - build.Metadata = buildFile.Metadata; return build; }) .Where(entry => entry is not null) @@ -399,7 +397,6 @@ private async Task PutBuild(IBuildEntry buildEntry) FileName = buildEntry.Name, TemplateCode = this.buildTemplateManager.EncodeTemplate(buildEntry), SourceUrl = buildEntry.SourceUrl, - Metadata = buildEntry.Metadata, }; var buildList = this.buildsCache ?? []; @@ -444,7 +441,6 @@ private async Task PutBuilds(List buildEntries) FileName = buildEntry.Name, TemplateCode = this.buildTemplateManager.EncodeTemplate(buildEntry), SourceUrl = buildEntry.SourceUrl, - Metadata = buildEntry.Metadata, }); var buildList = new List(); diff --git a/Daybreak.Core/Services/Graph/Models/BuildFile.cs b/Daybreak.Core/Services/Graph/Models/BuildFile.cs index 579a4285..bb4d3301 100644 --- a/Daybreak.Core/Services/Graph/Models/BuildFile.cs +++ b/Daybreak.Core/Services/Graph/Models/BuildFile.cs @@ -5,5 +5,4 @@ public sealed class BuildFile public string? TemplateCode { get; set; } public string? FileName { get; set; } public string? SourceUrl { get; set; } - public Dictionary? Metadata { get; set; } } diff --git a/Daybreak.Core/Services/Screenshots/ScreenshotService.cs b/Daybreak.Core/Services/Screenshots/ScreenshotService.cs index 7a495b54..02f914b8 100644 --- a/Daybreak.Core/Services/Screenshots/ScreenshotService.cs +++ b/Daybreak.Core/Services/Screenshots/ScreenshotService.cs @@ -66,7 +66,7 @@ public sealed class ScreenshotService( { using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); using var image = Image.Load(fileStream); - + var (dominantColor, isDark) = GetDominantColor(image); var closestAccent = GetClosestAccentColor(dominantColor); var entry = new ScreenshotEntry(path, closestAccent, isDark ? LightDarkMode.Dark : LightDarkMode.Light); @@ -108,13 +108,15 @@ private static (Color Color, bool IsDark) GetDominantColor(Image image) var sumB = Vector.Zero; int simdPixelCount = 0; + // Gather sampled pixels into arrays for vectorization + Span rValues = stackalloc int[Vector.Count]; + Span gValues = stackalloc int[Vector.Count]; + Span bValues = stackalloc int[Vector.Count]; + // Collect sampled pixels for SIMD processing while (x + (Vector.Count * SampleQuality) <= rowSpan.Length) { - // Gather sampled pixels into arrays for vectorization - Span rValues = stackalloc int[Vector.Count]; - Span gValues = stackalloc int[Vector.Count]; - Span bValues = stackalloc int[Vector.Count]; + for (int i = 0; i < Vector.Count && x < rowSpan.Length; i++, x += SampleQuality) { @@ -146,6 +148,7 @@ private static (Color Color, bool IsDark) GetDominantColor(Image image) totalG += sumG[i]; totalB += sumB[i]; } + pixelCount += simdPixelCount; } @@ -171,7 +174,7 @@ private static (Color Color, bool IsDark) GetDominantColor(Image image) var avgB = (byte)(totalB / pixelCount); var color = Color.FromArgb(255, avgR, avgG, avgB); - + // Calculate perceived brightness using standard formula // Values > 128 are generally considered "light" var brightness = (0.299 * avgR) + (0.587 * avgG) + (0.114 * avgB); diff --git a/Daybreak.Core/Views/BuildTemplateViewModelBase.cs b/Daybreak.Core/Views/BuildTemplateViewModelBase.cs index aa6057cb..9b3e919f 100644 --- a/Daybreak.Core/Views/BuildTemplateViewModelBase.cs +++ b/Daybreak.Core/Views/BuildTemplateViewModelBase.cs @@ -17,7 +17,7 @@ public abstract class BuildTemplateViewModelBase( where TViewModel : BuildTemplateViewModelBase where TView : BuildTemplateViewBase { - private readonly IBuildTemplateManager buildTemplateManager = buildTemplateManager; + protected readonly IBuildTemplateManager buildTemplateManager = buildTemplateManager; private readonly IAttributePointCalculator attributePointCalculator = attributePointCalculator; private readonly IViewManager viewManager = viewManager; @@ -220,7 +220,7 @@ public void CloseSkillSnippet(Skill skill, MouseEventArgs _) this.RefreshView(); } - protected void UpdateBuildCode() + protected virtual void UpdateBuildCode() { if (this.BuildEntry is null) { diff --git a/Daybreak.Core/Views/BuildsSynchronizationView.razor.cs b/Daybreak.Core/Views/BuildsSynchronizationView.razor.cs index 1fdff134..dff4eac6 100644 --- a/Daybreak.Core/Views/BuildsSynchronizationView.razor.cs +++ b/Daybreak.Core/Views/BuildsSynchronizationView.razor.cs @@ -207,7 +207,6 @@ private async Task ReloadBuildsAndCalculateDiff() { build.Name = buildFile.FileName; build.SourceUrl = buildFile.SourceUrl; - build.Metadata = buildFile.Metadata; this.remoteBuildEntries[buildFile.FileName] = build; } } diff --git a/Daybreak.Core/Views/FocusView.razor.cs b/Daybreak.Core/Views/FocusView.razor.cs index 8f0e5666..fa00c76a 100644 --- a/Daybreak.Core/Views/FocusView.razor.cs +++ b/Daybreak.Core/Views/FocusView.razor.cs @@ -488,7 +488,6 @@ characterSelectInformation.CharacterNames is null || } if (this.BuildComponentContext?.CharacterUnlockedSkills.SequenceEqual(mainPlayerBuildContext.UnlockedCharacterSkills) is true && - this.BuildComponentContext?.AccountUnlockedSkills.SequenceEqual(mainPlayerBuildContext.UnlockedAccountSkills) is true && this.BuildComponentContext?.UnlockedProfessions == mainPlayerBuildContext.UnlockedProfessions && this.BuildComponentContext?.PrimaryProfessionId == mainPlayerBuildContext.PrimaryProfessionId && DateTime.Now < this.lastBuildCheck + BuildsCheckFrequency) @@ -518,7 +517,6 @@ characterSelectInformation.CharacterNames is null || { IsInOutpost = instanceInfo.Type is Shared.Models.Api.InstanceType.Outpost, PrimaryProfessionId = mainPlayerBuildContext.PrimaryProfessionId, - AccountUnlockedSkills = mainPlayerBuildContext.UnlockedAccountSkills, CharacterUnlockedSkills = mainPlayerBuildContext.UnlockedCharacterSkills, UnlockedProfessions = mainPlayerBuildContext.UnlockedProfessions, AvailableBuilds = matchingBuilds diff --git a/Daybreak.Core/Views/TeamBuildTemplateView.razor b/Daybreak.Core/Views/TeamBuildTemplateView.razor index f7f8930d..a279ce09 100644 --- a/Daybreak.Core/Views/TeamBuildTemplateView.razor +++ b/Daybreak.Core/Views/TeamBuildTemplateView.razor @@ -21,14 +21,26 @@ { } + else if (composition?.Type is Shared.Models.Guildwars.PartyCompositionMemberType.Player) + { + + } else if (composition?.Type is Shared.Models.Guildwars.PartyCompositionMemberType.Hero) { _ = Shared.Models.Guildwars.Hero.TryParse(composition?.HeroId ?? -1, out var hero); } + else if (composition?.Type is Shared.Models.Guildwars.PartyCompositionMemberType.Henchman) + { + + } } +
+ + +
} @@ -63,7 +75,9 @@ var name = composition?.Type switch { Shared.Models.Guildwars.PartyCompositionMemberType.MainPlayer => "Main Player", + Shared.Models.Guildwars.PartyCompositionMemberType.Player => "Player", Shared.Models.Guildwars.PartyCompositionMemberType.Hero => Shared.Models.Guildwars.Hero.TryParse(composition?.HeroId ?? -1, out var hero) ? hero.Name : "Unknown Hero", + Shared.Models.Guildwars.PartyCompositionMemberType.Henchman => "Henchman", _ => "Unknown Member" }; var attributesString = string.Join(", ", build.Attributes.Where(a => a.Points > 0).Select(a => $"{a.Attribute?.AlternativeName ?? string.Empty}: {a.Points}")); diff --git a/Daybreak.Core/Views/TeamBuildTemplateView.razor.cs b/Daybreak.Core/Views/TeamBuildTemplateView.razor.cs index b2a62ecb..5c129f5a 100644 --- a/Daybreak.Core/Views/TeamBuildTemplateView.razor.cs +++ b/Daybreak.Core/Views/TeamBuildTemplateView.razor.cs @@ -20,9 +20,20 @@ public TeamBuildEntry? TeamEntry { field = value; this.NotifyPropertyChanged(nameof(this.TeamEntry)); + this.UpdateTeamCode(); } } + public string TeamCode + { + get; + set + { + field = value; + this.NotifyPropertyChanged(nameof(this.TeamCode)); + } + } = string.Empty; + public int BuildEntryIndex { get; @@ -120,4 +131,45 @@ public void HideSummary() this.SummaryVisible = false; this.RefreshView(); } + + protected override void UpdateBuildCode() + { + base.UpdateBuildCode(); + this.UpdateTeamCode(); + } + + private void UpdateTeamCode() + { + if (this.TeamEntry is null) + { + this.TeamCode = string.Empty; + return; + } + + this.TeamCode = this.buildTemplateManager.EncodeTemplate(this.TeamEntry); + } + + public void TeamCodeChanged(string teamCode) + { + if (string.IsNullOrWhiteSpace(teamCode)) + { + return; + } + + if (!this.buildTemplateManager.TryDecodeTemplate(teamCode, out var buildEntry)) + { + return; + } + + if (buildEntry is not TeamBuildEntry teamBuildEntry) + { + return; + } + + this.TeamEntry = teamBuildEntry; + this.BuildEntry = teamBuildEntry.Builds.FirstOrDefault(); + this.BuildEntryIndex = 0; + this.FilterSkillsByProfessionsAndString(); + this.RefreshView(); + } } diff --git a/Daybreak.Core/Views/TeamBuildTemplateView.razor.css b/Daybreak.Core/Views/TeamBuildTemplateView.razor.css index 1ba421a3..5fb83444 100644 --- a/Daybreak.Core/Views/TeamBuildTemplateView.razor.css +++ b/Daybreak.Core/Views/TeamBuildTemplateView.razor.css @@ -31,6 +31,7 @@ .build-selection { display: flex; + align-items: stretch; margin-top: 10px; padding: 20px 20px 0 20px; } @@ -49,12 +50,37 @@ } .build-select { + flex: 1; +} + +.team-code { + flex: 2; + display: flex; + flex-direction: column; + gap: 5px; + margin-left: 20px; +} + + .team-code label { + font-weight: bold; + font-size: var(--font-size-medium); + color: var(--neutral-input-rest); + } + +.team-code-input { + flex: 1; padding: 8px 12px; border-radius: 4px; font-size: var(--font-size-medium); background-color: var(--neutral-fill-rest); color: var(--neutral-input-rest); border: 1px solid var(--neutral-foreground-rest); + font-family: monospace; + overflow-x: hidden; + overflow-y: auto; + word-wrap: break-word; + white-space: pre-wrap; + resize: none; } .summary-popup { diff --git a/Daybreak.Core/wwwroot/css/site.css b/Daybreak.Core/wwwroot/css/site.css index 91be9d9a..10416e2e 100644 --- a/Daybreak.Core/wwwroot/css/site.css +++ b/Daybreak.Core/wwwroot/css/site.css @@ -216,4 +216,28 @@ html, body { width: 100%; height: 100%; object-fit: contain; -} \ No newline at end of file +} + +/* Global select styling - Override native GTK styling on Linux */ +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 8px 12px; + padding-right: 32px; + border-radius: 4px; + font-size: var(--font-size-medium); + background-color: var(--neutral-fill-rest); + color: var(--neutral-input-rest); + border: 1px solid var(--neutral-foreground-rest); + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 12px center; + cursor: pointer; +} + + select option { + font-size: var(--font-size-medium); + background-color: var(--neutral-fill-rest); + color: var(--neutral-input-rest); + } \ No newline at end of file diff --git a/Daybreak.Generators/CppHeaderParser.cs b/Daybreak.Generators/CppHeaderParser.cs new file mode 100644 index 00000000..016d2ac0 --- /dev/null +++ b/Daybreak.Generators/CppHeaderParser.cs @@ -0,0 +1,863 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using static Daybreak.Generators.GenerateGWCABindings; + +namespace Daybreak.Generators; + +internal static class CppHeaderParser +{ + // ════════════════════════════════════════════════════════════════ + // Regex patterns for enum parsing + // ════════════════════════════════════════════════════════════════ + + // Matches: enum class Name : Type { + // Matches: enum class Name { + // Matches: enum Name : Type { + // Matches: enum { + private static readonly Regex EnumStartRegex = new( + @"^\s*enum\s+(?:class\s+)?(?:(\w+)\s*)?(?::\s*(\w+)\s*)?\{", + RegexOptions.Compiled); + + // Matches: enum class Name : Type (brace on next line) + // Matches: enum class Name (brace on next line) + // Does NOT match forward declarations ending with ; + private static readonly Regex EnumNobraceRegex = new( + @"^\s*enum\s+(?:class\s+)?(?:(\w+)\s*)?(?::\s*(\w+)\s*)?$", + RegexOptions.Compiled); + + // ════════════════════════════════════════════════════════════════ + // Regex patterns for struct parsing + // ════════════════════════════════════════════════════════════════ + + // Matches: struct Name { or struct Name : public Base { or struct Name : Base { + // Captures: Name, optional BaseType + private static readonly Regex StructStartRegex = new( + @"^\s*struct\s+(\w+)\s*(?::\s*(?:public\s+)?(\w+(?:::\w+)*)\s*)?\{", + RegexOptions.Compiled); + + // Matches: struct Name : public Base (brace on next line) + private static readonly Regex StructNobraceRegex = new( + @"^\s*struct\s+(\w+)\s*(?::\s*(?:public\s+)?(\w+(?:::\w+)*)\s*)?$", + RegexOptions.Compiled); + + // Matches field with offset comment: /* +h0024 */ Type field; + private static readonly Regex FieldWithOffsetRegex = new( + @"^\s*/\*\s*\+h([0-9A-Fa-f]{4})\s*\*/\s*(.+?)\s*;\s*(?://\s*(.*))?$", + RegexOptions.Compiled); + + // Matches field without offset comment: Type field; + // Also handles inline initializers like = value or {} or {value} + private static readonly Regex FieldNoOffsetRegex = new( + @"^\s*(?!(?:inline|static|virtual|GWCA_API|typedef|using|enum|struct|union|return|if|for|while|switch|\[\[|\}))([A-Za-z_][\w:*&<>\s,]+?)\s+(\w+)(?:\s*\[\s*([^\]]+)\s*\])?(?:\s*\{[^}]*\})?(?:\s*=\s*[^;]+)?\s*;\s*(?://\s*(.*))?$", + RegexOptions.Compiled); + + // Matches static_assert(sizeof(Name) == 0xHEX or decimal) + private static readonly Regex SizeofAssertRegex = new( + @"static_assert\s*\(\s*sizeof\s*\(\s*(\w+)\s*\)\s*==\s*(0x[0-9A-Fa-f]+|\d+)", + RegexOptions.Compiled); + + // ════════════════════════════════════════════════════════════════ + // Other patterns + // ════════════════════════════════════════════════════════════════ + + // Matches: constexpr Type Name = Value; // comment + private static readonly Regex ConstexprRegex = new( + @"^\s*constexpr\s+(\w+)\s+(\w+)\s*=\s*(.+?)\s*;\s*(?://\s*(.*))?$", + RegexOptions.Compiled); + + // Matches: namespace Name { + // Also matches: namespace Name1::Name2 { (but we split on ::) + private static readonly Regex NamespaceRegex = new( + @"^\s*namespace\s+([\w:]+)\s*\{", + RegexOptions.Compiled); + + // Matches closing brace with optional semicolon + private static readonly Regex CloseBraceRegex = new( + @"^\s*\}\s*;?\s*$", + RegexOptions.Compiled); + + // Matches: typedef ... (to skip) + private static readonly Regex TypedefRegex = new( + @"^\s*typedef\s+", + RegexOptions.Compiled); + + // Matches lines to skip inside structs + private static readonly Regex SkipLineRegex = new( + @"^\s*(inline|static\s+const|GWCA_API|virtual|explicit|friend|\[\[nodiscard\]\]|constexpr|template\s*<|//|#|public:|private:|protected:|$)", + RegexOptions.Compiled); + + // Matches: union { (to skip union blocks) + private static readonly Regex UnionStartRegex = new( + @"^\s*union\s*\{", + RegexOptions.Compiled); + + // Matches: template<...> struct/class (to skip) + private static readonly Regex TemplateStructRegex = new( + @"^\s*template\s*<", + RegexOptions.Compiled); + + // Matches inline function definitions (static, inline, GWCA_API, etc.) that have a body + private static readonly Regex FunctionWithBodyRegex = new( + @"^\s*(?:static|inline|GWCA_API|virtual|explicit|constexpr).*\([^)]*\)\s*(?:const)?\s*\{", + RegexOptions.Compiled); + + // Matches function declarations with body on next line (no opening brace) + private static readonly Regex FunctionNoBraceRegex = new( + @"^\s*(?:static|inline|GWCA_API|virtual|explicit|constexpr).*\([^)]*\)\s*(?:const)?\s*$", + RegexOptions.Compiled); + + // Matches out-of-line method definitions: Type* Class::Method() { or Type Class::Method() const { + private static readonly Regex OutOfLineMethodRegex = new( + @"^\s*(?:const\s+)?[\w:*&<>]+(?:\s+[\w:*&<>]+)*\s+\w+::\w+\s*\([^)]*\)\s*(?:const)?\s*\{", + RegexOptions.Compiled); + + // Matches standalone opening brace + private static readonly Regex OpenBraceOnlyRegex = new( + @"^\s*\{\s*$", + RegexOptions.Compiled); + + public static List DebugLines { get; } = []; + + public static void Parse(string headerText, ConstantsNode root) + { + var lines = headerText.Split('\n'); + var namespaceStack = new Stack(); + namespaceStack.Push(root); + + // Parsing state + bool inEnum = false; + CppEnumDef? currentEnum = null; + bool inStruct = false; + CppStructDef? currentStruct = null; + int structBraceDepth = 0; + bool inSkipBlock = false; + int skipBlockBraceCount = 0; + bool inMultiLineConstexpr = false; + int multiLineBraceCount = 0; + int freeBraceDepth = 0; // Track braces from functions with body on separate line + + // Track struct sizes from static_assert + var structSizes = new Dictionary(StringComparer.Ordinal); + + // First pass: collect sizeof assertions + foreach (var line in lines) + { + var sizeMatch = SizeofAssertRegex.Match(line); + if (sizeMatch.Success) + { + var name = sizeMatch.Groups[1].Value; + var sizeStr = sizeMatch.Groups[2].Value; + int size = sizeStr.StartsWith("0x", StringComparison.OrdinalIgnoreCase) + ? Convert.ToInt32(sizeStr, 16) + : int.Parse(sizeStr); + structSizes[name] = size; + } + } + + for (int i = 0; i < lines.Length; i++) + { + var line = lines[i].TrimEnd('\r'); + + // Skip preprocessor directives + if (line.TrimStart().StartsWith("#")) + continue; + + var trimmed = line.TrimStart(); + if (trimmed.Length == 0) + continue; + if (trimmed.StartsWith("//") && !inEnum && !inStruct) + continue; + + // Handle multi-line constexpr (like constexpr std::array) + if (inMultiLineConstexpr) + { + multiLineBraceCount += CountChar(line, '{') - CountChar(line, '}'); + if (multiLineBraceCount <= 0 || line.TrimEnd().EndsWith(";")) + { + inMultiLineConstexpr = false; + } + continue; + } + + // Handle skip blocks (unions, template structs, etc.) + if (inSkipBlock) + { + skipBlockBraceCount += CountChar(line, '{') - CountChar(line, '}'); + if (skipBlockBraceCount <= 0) + { + inSkipBlock = false; + } + continue; + } + + // ── Inside an enum body (multi-line) ─────────────────── + if (inEnum && currentEnum is not null) + { + if (trimmed.StartsWith("//")) + continue; + + // Strip comments before checking for closing brace - comments can contain braces like "{ wchar_t* title }" + var trimmedWithoutComment = trimmed; + var commentIdx = trimmed.IndexOf("//"); + if (commentIdx >= 0) + trimmedWithoutComment = trimmed.Substring(0, commentIdx).TrimEnd(); + + var closeBraceIdx = trimmedWithoutComment.IndexOf('}'); + if (closeBraceIdx >= 0) + { + if (closeBraceIdx > 0) + { + ParseEnumMembersFromLine(trimmed.Substring(0, closeBraceIdx), currentEnum); + } + inEnum = false; + var node = namespaceStack.Peek(); + node.Enums.Add(currentEnum); + currentEnum = null; + continue; + } + + ParseEnumMembersFromLine(trimmed, currentEnum); + continue; + } + + // ── Inside a struct body ─────────────────────────────── + if (inStruct && currentStruct is not null) + { + // Strip comments before counting braces - comments can contain braces + var lineWithoutComments = StripComments(line); + int openBraces = CountChar(lineWithoutComments, '{'); + int closeBraces = CountChar(lineWithoutComments, '}'); + int prevDepth = structBraceDepth; + structBraceDepth += openBraces - closeBraces; + + // Debug: Track brace changes for AgentLiving + if (currentStruct.Name == "AgentLiving" && (openBraces > 0 || closeBraces > 0)) + { + DebugLines.Add($"[BRACE] line {i+1}: {currentStruct.Name} depth {prevDepth}->{structBraceDepth} (open={openBraces}, close={closeBraces})"); + } + + // If we hit the closing brace of the struct + if (structBraceDepth <= 0) + { + // Apply known size if available + if (structSizes.TryGetValue(currentStruct.Name, out var size)) + currentStruct.Size = size; + + var node = namespaceStack.Peek(); + // Debug: capture namespace path + var pathParts = new List(); + foreach (var n in namespaceStack) + pathParts.Add(n.Name); + pathParts.Reverse(); + currentStruct.DebugNamespacePath = string.Join(".", pathParts); + + DebugLines.Add($"[STRUCT-END] line {i+1}: {currentStruct.Name} with {currentStruct.Fields.Count} fields"); + node.Structs.Add(currentStruct); + currentStruct = null; + inStruct = false; + continue; + } + + // Skip nested named structs (e.g., "struct Foo {") but NOT anonymous unions/structs + // We want to parse fields inside unions because they map to overlapping [FieldOffset] in C# + // Only skip if we're inside a named nested struct (not an anonymous union/struct block) + if (structBraceDepth > 1) + { + // Still try to parse fields with explicit offsets inside unions + // These are perfectly valid - they become overlapping fields in C# explicit layout + var fieldOffsetMatchNested = FieldWithOffsetRegex.Match(trimmed); + if (fieldOffsetMatchNested.Success) + { + var offset = Convert.ToInt32(fieldOffsetMatchNested.Groups[1].Value, 16); + var typeAndName = fieldOffsetMatchNested.Groups[2].Value; + var comment = fieldOffsetMatchNested.Groups[3].Success ? fieldOffsetMatchNested.Groups[3].Value.Trim() : null; + + var field = ParseFieldTypeAndName(typeAndName, offset, comment); + if (field is not null) + currentStruct.Fields.Add(field); + } + continue; + } + + // Skip comment-only lines + if (trimmed.StartsWith("//")) + continue; + + // Skip method/static/inline lines + if (SkipLineRegex.IsMatch(trimmed)) + continue; + + // Skip lines with function bodies or method declarations + // Strip trailing // comment before checking - comments can contain parentheses like "(runes,pcons,etc)" + var trimmedWithoutTrailingComment = trimmed; + var trailingCommentIdx = trimmed.IndexOf("//"); + if (trailingCommentIdx > 0) + trimmedWithoutTrailingComment = trimmed.Substring(0, trailingCommentIdx).TrimEnd(); + + if (trimmedWithoutTrailingComment.Contains("(") && (trimmedWithoutTrailingComment.Contains(")") || trimmedWithoutTrailingComment.Contains("{"))) + continue; + + // Skip bitfield declarations (e.g., DyeColor dye1 : 4;) + if (trimmed.Contains(" : ") && Regex.IsMatch(trimmed, @":\s*\d+\s*;")) + continue; + + // Skip union starts + if (UnionStartRegex.IsMatch(trimmed)) + continue; + + // Try to parse field with offset + var fieldOffsetMatch = FieldWithOffsetRegex.Match(trimmed); + if (fieldOffsetMatch.Success) + { + var offset = Convert.ToInt32(fieldOffsetMatch.Groups[1].Value, 16); + var typeAndName = fieldOffsetMatch.Groups[2].Value; + var comment = fieldOffsetMatch.Groups[3].Success ? fieldOffsetMatch.Groups[3].Value.Trim() : null; + + var field = ParseFieldTypeAndName(typeAndName, offset, comment); + if (field is not null) + currentStruct.Fields.Add(field); + continue; + } + + // Try to parse field without offset + var fieldNoOffsetMatch = FieldNoOffsetRegex.Match(trimmed); + if (fieldNoOffsetMatch.Success) + { + var cppType = fieldNoOffsetMatch.Groups[1].Value.Trim(); + var name = fieldNoOffsetMatch.Groups[2].Value; + var arraySize = fieldNoOffsetMatch.Groups[3].Success ? fieldNoOffsetMatch.Groups[3].Value.Trim() : null; + var comment = fieldNoOffsetMatch.Groups[4].Success ? fieldNoOffsetMatch.Groups[4].Value.Trim() : null; + + var field = new CppStructField + { + Name = name, + CppType = cppType, + ArraySize = arraySize, + Comment = comment, + }; + currentStruct.Fields.Add(field); + } + continue; + } + + // ── Try to match namespace ───────────────────────────── + var nsMatch = NamespaceRegex.Match(trimmed); + if (nsMatch.Success) + { + var nsName = nsMatch.Groups[1].Value; + var parts = nsName.Split(new[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + foreach (var part in parts) + { + var current = namespaceStack.Peek(); + var child = current.GetOrCreateChild(part); + namespaceStack.Push(child); + } + continue; + } + + // ── Closing brace (function body end or namespace end) ─ + if (CloseBraceRegex.IsMatch(trimmed)) + { + // If we have unclosed function bodies, close those first + if (freeBraceDepth > 0) + { + freeBraceDepth--; + continue; + } + + if (namespaceStack.Count > 1) + { + // Debug: Track where namespace was popped + var poppedNode = namespaceStack.Pop(); + poppedNode.DebugPopLine = i + 1; + } + continue; + } + + // ── Skip static_assert ───────────────────────────────── + if (trimmed.StartsWith("static_assert")) + { + if (!trimmed.Contains(";")) + { + for (int j = i + 1; j < lines.Length; j++) + { + if (lines[j].Contains(";")) + { + i = j; + break; + } + } + } + continue; + } + + // ── Handle typedef struct Name { (parse as regular struct) ─ + var typedefStructMatch = Regex.Match(trimmed, @"^\s*typedef\s+struct\s+(\w+)\s*\{"); + if (typedefStructMatch.Success) + { + var structName = typedefStructMatch.Groups[1].Value; + currentStruct = new CppStructDef + { + Name = structName, + }; + inStruct = true; + structBraceDepth = 1; + continue; + } + + // ── Handle typedef Array AliasName; ─────────────────────── + var typedefArrayMatch = Regex.Match(trimmed, @"^\s*typedef\s+(\w+)\s*<\s*([\w:\s*]+)\s*>\s+(\w+)\s*;"); + if (typedefArrayMatch.Success) + { + var sourceType = typedefArrayMatch.Groups[1].Value; + var templateArg = typedefArrayMatch.Groups[2].Value.Trim(); + var aliasName = typedefArrayMatch.Groups[3].Value; + namespaceStack.Peek().TypeAliases.Add(new CppTypeAlias + { + AliasName = aliasName, + SourceType = sourceType, + TemplateArg = templateArg + }); + continue; + } + + // ── Skip other typedef ───────────────────────────────── + if (TypedefRegex.IsMatch(trimmed)) + continue; + + // ── Skip template struct/class ───────────────────────── + if (TemplateStructRegex.IsMatch(trimmed)) + { + int braces = CountChar(trimmed, '{') - CountChar(trimmed, '}'); + if (braces > 0) + { + inSkipBlock = true; + skipBlockBraceCount = braces; + } + continue; + } + + // ── Skip inline function bodies ──────────────────────── + if (FunctionWithBodyRegex.IsMatch(trimmed)) + { + int braces = CountChar(trimmed, '{') - CountChar(trimmed, '}'); + if (braces > 0) + { + inSkipBlock = true; + skipBlockBraceCount = braces; + } + continue; + } + + // ── Skip out-of-line method definitions (Type* Class::Method() {) ─ + if (OutOfLineMethodRegex.IsMatch(trimmed)) + { + int braces = CountChar(trimmed, '{') - CountChar(trimmed, '}'); + DebugLines.Add($"[OUT-OF-LINE] line {i+1}: {trimmed.Substring(0, Math.Min(50, trimmed.Length))}... braces={braces}"); + if (braces > 0) + { + inSkipBlock = true; + skipBlockBraceCount = braces; + } + continue; + } + else if (trimmed.Contains("::") && trimmed.Contains("(") && trimmed.Contains("{")) + { + DebugLines.Add($"[UNMATCHED-METHOD] line {i+1}: {trimmed.Substring(0, Math.Min(60, trimmed.Length))}"); + } + + // ── Track function declarations with body on separate line ─ + if (FunctionNoBraceRegex.IsMatch(trimmed)) + { + // The next meaningful line should be { which starts the body + // We'll handle this by looking for standalone { and tracking brace depth + continue; + } + + // ── Track standalone opening braces (function bodies with { on separate line) + if (OpenBraceOnlyRegex.IsMatch(trimmed)) + { + freeBraceDepth++; + continue; + } + + // ── Skip constexpr std::array etc. ───────────────────── + if (trimmed.StartsWith("constexpr std::")) + { + int braces = CountChar(trimmed, '{') - CountChar(trimmed, '}'); + if (braces > 0) + { + inMultiLineConstexpr = true; + multiLineBraceCount = braces; + } + continue; + } + + // ── Try to match struct start ────────────────────────── + var structMatch = StructStartRegex.Match(trimmed); + if (structMatch.Success) + { + var structName = structMatch.Groups[1].Value; + var baseType = structMatch.Groups[2].Success ? structMatch.Groups[2].Value : null; + DebugLines.Add($"[STRUCT-START] line {i+1}: {structName} (inSkip={inSkipBlock}, freeBrace={freeBraceDepth})"); + + // Skip some special cases + if (structName.StartsWith("__") || structName == "Packet") + { + int braces = CountChar(trimmed, '{') - CountChar(trimmed, '}'); + if (braces > 0) + { + inSkipBlock = true; + skipBlockBraceCount = braces; + } + continue; + } + + currentStruct = new CppStructDef + { + Name = structName, + BaseType = baseType, + }; + inStruct = true; + structBraceDepth = 1; + continue; + } + + // ── Struct without opening brace on same line ────────── + var structNobraceMatch = StructNobraceRegex.Match(trimmed); + if (structNobraceMatch.Success) + { + var structName = structNobraceMatch.Groups[1].Value; + + // Skip forward declarations (just struct Name;) + if (trimmed.EndsWith(";")) + continue; + + // Skip special cases + if (structName.StartsWith("__") || structName == "Packet") + continue; + + // Look ahead for opening brace + for (int j = i + 1; j < lines.Length; j++) + { + var nextTrimmed = lines[j].TrimStart().TrimEnd('\r'); + if (nextTrimmed.Length == 0 || nextTrimmed.StartsWith("//")) + continue; + + if (nextTrimmed.Contains("{")) + { + var baseType = structNobraceMatch.Groups[2].Success ? structNobraceMatch.Groups[2].Value : null; + currentStruct = new CppStructDef + { + Name = structName, + BaseType = baseType, + }; + inStruct = true; + structBraceDepth = 1; + i = j; + break; + } + break; // unexpected content + } + continue; + } + + // ── Try to match enum start (with opening brace on same line) ── + var enumMatch = EnumStartRegex.Match(trimmed); + if (enumMatch.Success) + { + var enumDef = new CppEnumDef + { + Name = enumMatch.Groups[1].Success && enumMatch.Groups[1].Value.Length > 0 + ? enumMatch.Groups[1].Value : null, + UnderlyingType = enumMatch.Groups[2].Success && enumMatch.Groups[2].Value.Length > 0 + ? enumMatch.Groups[2].Value : null, + }; + + var afterBrace = trimmed.Substring(enumMatch.Length); + var closeBraceIdx = afterBrace.IndexOf('}'); + + if (closeBraceIdx >= 0) + { + var body = afterBrace.Substring(0, closeBraceIdx); + ParseEnumMembersFromLine(body, enumDef); + var node = namespaceStack.Peek(); + node.Enums.Add(enumDef); + } + else + { + var rest = afterBrace.Trim(); + if (rest.Length > 0) + { + ParseEnumMembersFromLine(rest, enumDef); + } + currentEnum = enumDef; + inEnum = true; + } + continue; + } + + // ── Enum without opening brace on same line ──────────── + var enumNobraceMatch = EnumNobraceRegex.Match(trimmed); + if (enumNobraceMatch.Success) + { + for (int j = i + 1; j < lines.Length; j++) + { + var nextTrimmed = lines[j].TrimStart().TrimEnd('\r'); + if (nextTrimmed.Length == 0 || nextTrimmed.StartsWith("//")) + continue; + + if (nextTrimmed.Contains("{")) + { + var enumDef = new CppEnumDef + { + Name = enumNobraceMatch.Groups[1].Success && enumNobraceMatch.Groups[1].Value.Length > 0 + ? enumNobraceMatch.Groups[1].Value : null, + UnderlyingType = enumNobraceMatch.Groups[2].Success && enumNobraceMatch.Groups[2].Value.Length > 0 + ? enumNobraceMatch.Groups[2].Value : null, + }; + + var braceIdx = nextTrimmed.IndexOf('{'); + var afterBrace = nextTrimmed.Substring(braceIdx + 1); + var closeBraceIdx = afterBrace.IndexOf('}'); + + if (closeBraceIdx >= 0) + { + var body = afterBrace.Substring(0, closeBraceIdx); + ParseEnumMembersFromLine(body, enumDef); + var node = namespaceStack.Peek(); + node.Enums.Add(enumDef); + } + else + { + var rest = afterBrace.Trim(); + if (rest.Length > 0) + { + ParseEnumMembersFromLine(rest, enumDef); + } + currentEnum = enumDef; + inEnum = true; + } + i = j; + break; + } + break; // unexpected content + } + continue; + } + + // ── Try to match constexpr field ─────────────────────── + var constMatch = ConstexprRegex.Match(trimmed); + if (constMatch.Success) + { + var cppType = constMatch.Groups[1].Value; + var name = constMatch.Groups[2].Value; + var value = constMatch.Groups[3].Value.Trim(); + var comment = constMatch.Groups[4].Success ? constMatch.Groups[4].Value.Trim() : null; + + // Skip complex expressions with :: references or casts + if (value.Contains("::") || value.Contains("(") || value.Contains("static_cast")) + continue; + + var field = new CppConstField + { + Name = name, + CppType = cppType, + Value = NormalizeCppValue(value), + Comment = comment, + }; + var node = namespaceStack.Peek(); + node.Constants.Add(field); + continue; + } + } + } + + /// + /// Parses a combined "Type Name" or "Type Name[Size]" string into a field. + /// + private static CppStructField? ParseFieldTypeAndName(string typeAndName, int offset, string? comment) + { + typeAndName = typeAndName.Trim(); + + // Handle array notation: uint32_t name[7] + string? arraySize = null; + var bracketIdx = typeAndName.IndexOf('['); + if (bracketIdx >= 0) + { + var closeBracket = typeAndName.IndexOf(']', bracketIdx); + if (closeBracket > bracketIdx) + { + arraySize = typeAndName.Substring(bracketIdx + 1, closeBracket - bracketIdx - 1).Trim(); + typeAndName = typeAndName.Substring(0, bracketIdx).Trim(); + } + } + + // Split type and name - name is the last token + var tokens = typeAndName.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + if (tokens.Length < 2) + return null; + + var name = tokens[tokens.Length - 1].TrimStart('*'); + var cppType = string.Join(" ", tokens.Take(tokens.Length - 1)); + + // Handle pointer attached to name: Item *weapon -> Item*, weapon + if (tokens[tokens.Length - 1].StartsWith("*")) + { + cppType += "*"; + } + // Handle pointer attached to type: Item* weapon + else if (cppType.EndsWith("*")) + { + // Already correct + } + // Handle pointer in middle: Item * weapon + else if (tokens.Any(t => t == "*")) + { + cppType = cppType.Replace(" *", "*").Replace("* ", "*"); + if (!cppType.EndsWith("*")) + cppType += "*"; + } + + return new CppStructField + { + Name = name, + CppType = cppType.Trim(), + Offset = offset, + ArraySize = arraySize, + Comment = comment, + }; + } + + /// + /// Parses comma-separated enum members from a single line of text. + /// + private static void ParseEnumMembersFromLine(string line, CppEnumDef enumDef) + { + string? lineComment = null; + var commentIdx = line.IndexOf("//"); + if (commentIdx >= 0) + { + lineComment = line.Substring(commentIdx + 2).Trim(); + line = line.Substring(0, commentIdx); + } + + var parts = line.Split(','); + CppEnumMember? lastMember = null; + + foreach (var part in parts) + { + var trimPart = part.Trim(); + if (trimPart.Length == 0) + continue; + + var eqIdx = trimPart.IndexOf('='); + string name; + string? value = null; + + if (eqIdx >= 0) + { + name = trimPart.Substring(0, eqIdx).Trim(); + value = trimPart.Substring(eqIdx + 1).Trim(); + } + else + { + name = trimPart; + } + + if (name.Length > 0 && (char.IsLetter(name[0]) || name[0] == '_')) + { + var member = new CppEnumMember + { + Name = name, + Value = value, + }; + enumDef.Members.Add(member); + lastMember = member; + } + } + + if (lastMember is not null && lineComment is not null) + { + lastMember.Comment = lineComment; + } + } + + /// + /// Strips C++ comments from a line (both // and /* */ style). + /// + private static string StripComments(string line) + { + // Remove // style comments + int slashSlash = line.IndexOf("//"); + if (slashSlash >= 0) + line = line.Substring(0, slashSlash); + + // Remove /* */ style comments (simple - doesn't handle nested) + int blockStart = line.IndexOf("/*"); + while (blockStart >= 0) + { + int blockEnd = line.IndexOf("*/", blockStart + 2); + if (blockEnd >= 0) + line = line.Substring(0, blockStart) + line.Substring(blockEnd + 2); + else + line = line.Substring(0, blockStart); + blockStart = line.IndexOf("/*"); + } + + return line; + } + + private static int CountChar(string s, char c) + { + int count = 0; + foreach (var ch in s) + if (ch == c) count++; + return count; + } + + /// + /// Normalizes a C++ value literal to a C# compatible one. + /// + private static string NormalizeCppValue(string value) + { + value = value.Trim().TrimEnd(','); + + // Remove 'u' or 'U' suffix from integer literals + if (value.EndsWith("u", StringComparison.OrdinalIgnoreCase) && + !value.EndsWith("0xu", StringComparison.OrdinalIgnoreCase)) + { + var candidate = value.Substring(0, value.Length - 1); + if (IsIntegerLiteral(candidate)) + return candidate; + } + + // Normalize C++ float suffix to valid C# float literal + if (value.EndsWith("f", StringComparison.OrdinalIgnoreCase)) + { + value = value.Substring(0, value.Length - 1); + if (value.EndsWith(".")) + value += "0"; + return value + "f"; + } + + // If it's a float-looking literal without suffix, add f + if (value.Contains(".") && !value.Contains("\"")) + return value + "f"; + + return value; + } + + private static bool IsIntegerLiteral(string s) + { + s = s.Trim(); + if (s.Length == 0) return false; + if (s.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + return s.Length > 2 && s.Substring(2).All(c => "0123456789abcdefABCDEF".Contains(c)); + var start = s[0] == '-' ? 1 : 0; + if (start >= s.Length) return false; + return s.Substring(start).All(char.IsDigit); + } +} diff --git a/Daybreak.Generators/GenerateGWCABindings.cs b/Daybreak.Generators/GenerateGWCABindings.cs index 2e5c1b31..8e58f38e 100644 --- a/Daybreak.Generators/GenerateGWCABindings.cs +++ b/Daybreak.Generators/GenerateGWCABindings.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using Microsoft.CodeAnalysis; using Sybil; using static Daybreak.Generators.MsvcDemangler; @@ -15,10 +16,10 @@ namespace Daybreak.Generators; /// Incremental source generator that reads PE exports from gwca.dll, /// demangles MSVC-decorated C++ names to recover type and namespace /// information, and emits a GWCA class with nested static classes -/// mirroring the C++ namespace hierarchy. +/// mirroring the C++ namespace hierarchy (e.g. GW::Agents → GWCA.GW.Agents). /// -/// For example, GW::Agents::ChangeTarget(uint) becomes -/// GWCA.GW.Agents.ChangeTarget(uint). +/// Additionally scans C++ header files under Constants/ for enum and constexpr +/// declarations, emitting matching C# enums and const fields. /// /// Types annotated with [GWCAEquivalent("CppName")] are resolved /// automatically so the generated signatures use the correct C# types. @@ -41,6 +42,10 @@ public sealed class GenerateGWCABindings : IIncrementalGenerator { ["Vec2f"] = "global::System.Numerics.Vector2", ["Vec3f"] = "global::System.Numerics.Vector3", + // UIInteractionCallback is a typedef for a function pointer - map to nint + ["UIInteractionCallback"] = "nint", + ["UI::UIInteractionCallback"] = "nint", + ["GW::UI::UIInteractionCallback"] = "nint", }; // ════════════════════════════════════════════════════════════════ @@ -107,7 +112,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) // Combine each matching DLL with all type mappings and generate var combined = exportsProvider.Combine(typeMappingsProvider); context.RegisterSourceOutput(combined, static (ctx, source) => - EmitSource(ctx, source.Left.Path, source.Left.Exports, source.Right)); + EmitSource(source.Left.Path, source.Left.Exports, source.Right)); } // ════════════════════════════════════════════════════════════════ @@ -115,7 +120,6 @@ public void Initialize(IncrementalGeneratorInitializationContext context) // ════════════════════════════════════════════════════════════════ private static void EmitSource( - SourceProductionContext context, string dllPath, ImmutableArray exports, ImmutableArray mappings) @@ -176,9 +180,74 @@ private static void EmitSource( node.Functions.Add(new ExportEntry(mangledName, info)); } + // ── Parse C++ headers for enums, constexpr, and structs ─── + var headerRoot = new ConstantsNode("GWCA"); + var dllDir = Path.GetDirectoryName(dllPath)!; + var gwcaIncludeDir = Path.Combine(dllDir, "Include", "GWCA"); +#pragma warning disable RS1035 + if (Directory.Exists(gwcaIncludeDir)) + { + // Scan all subdirectories: Constants, GameEntities, GameContainers, Context, Managers, Packets + foreach (var subDir in Directory.GetDirectories(gwcaIncludeDir)) + { + foreach (var headerFile in Directory.GetFiles(subDir, "*.h")) + { + try + { + var headerText = File.ReadAllText(headerFile); + CppHeaderParser.Parse(headerText, headerRoot); + } + catch + { + // Skip headers that fail to parse + } + } + } + // Also scan root GWCA headers + foreach (var headerFile in Directory.GetFiles(gwcaIncludeDir, "*.h")) + { + try + { + var headerText = File.ReadAllText(headerFile); + CppHeaderParser.Parse(headerText, headerRoot); + } + catch + { + // Skip headers that fail to parse + } + } + } +#pragma warning restore RS1035 + + // Collect names of all namespace classes from the export tree + // These will be skipped when emitting structs to avoid name collisions + var namespaceClassNames = new HashSet(StringComparer.Ordinal); + CollectNamespaceClassNames(root, namespaceClassNames); + + // Register generated enums in the typeMap so demangled signatures + // resolve to the generated C# enum types instead of falling back + // to int/uint. GWCAEquivalent entries take priority (already in map). + // IMPORTANT: Collect enums FIRST, then structs, so struct collision detection works. + CollectEnumMappings(headerRoot, "GWCA", typeMap); + CollectStructMappings(headerRoot, "GWCA", typeMap, namespaceClassNames, new HashSet(StringComparer.Ordinal)); + + // Collect diagnostic info about parsed structs + var structDiagnostics = new List(); + CollectStructDiagnostics(headerRoot, "", structDiagnostics); + // Emit var sb = new StringBuilder(65536); EmitHeader(sb, totalExports, skippedExports); + + // Add diagnostic comment about parsed structs + sb.AppendLine(" // ═══════════════════════════════════════════════════"); + sb.AppendLine(" // Parsed structs diagnostic:"); + foreach (var diag in structDiagnostics.OrderBy(d => d)) + { + sb.AppendLine($" // {diag}"); + } + sb.AppendLine(" // ═══════════════════════════════════════════════════"); + sb.AppendLine(); // Emit the tree recursively (starting from GWCA's children) foreach (var child in root.Children.Values.OrderBy(c => c.Name, StringComparer.Ordinal)) @@ -186,6 +255,51 @@ private static void EmitSource( EmitNamespaceNode(sb, child, typeMap, cExports, 4); } + // Emit constants from headers (merge into the same GWCA class) + // The headerRoot is "GWCA" → children are "GW", etc. + // Each node emits as a partial class, which C# merges with the + // identically-named class already emitted by the export tree. + // Skip any child named "GWCA" - its content should go at root level, not nested. + foreach (var child in headerRoot.Children.Values.OrderBy(c => c.Name, StringComparer.Ordinal)) + { + if (child.Name == "GWCA") + { + // Emit GWCA namespace content directly at root level (not as nested class) + // But first emit its children normally + foreach (var grandchild in child.Children.Values.OrderBy(c => c.Name, StringComparer.Ordinal)) + { + EmitConstantsNode(sb, grandchild, typeMap, namespaceClassNames, 4); + } + continue; + } + EmitConstantsNode(sb, child, typeMap, namespaceClassNames, 4); + } + + sb.AppendLine("}"); // Close GWCA class + sb.AppendLine("}"); // Close Daybreak.API.Interop namespace + + // Emit structs and enums into GuildWars namespace for consumer code compatibility + // Consumer code uses `using Daybreak.API.Interop.GuildWars;` to access types + sb.AppendLine(); + sb.AppendLine("namespace Daybreak.API.Interop.GuildWars"); + sb.AppendLine("{"); + var emittedNames = new HashSet(StringComparer.Ordinal); + + // Collect inline array types needed by struct fields (for non-blittable array fields) + var inlineArrayTypes = new HashSet<(string csType, int size)>(); + CollectInlineArrayTypes(headerRoot, typeMap, inlineArrayTypes); + + // Emit manually-defined helper structs first (TLink, etc.) + EmitManualHelperStructs(sb, 4, emittedNames); + + // Emit inline array types for non-blittable arrays (e.g., enum arrays) + EmitInlineArrayTypes(sb, 4, inlineArrayTypes, emittedNames); + + // Emit enums first - they're often referenced by structs (e.g. Attribute enum vs Attribute struct) + EmitEnumsToGuildWarsNamespace(sb, headerRoot, 4, emittedNames); + EmitStructsToGuildWarsNamespace(sb, headerRoot, typeMap, 4, emittedNames, inlineArrayTypes); + sb.AppendLine(); + EmitTypeAliasesToGuildWarsNamespace(sb, headerRoot, typeMap, 4, emittedNames); sb.AppendLine("}"); // Write to Daybreak.API/Interop/GWCA.cs so LibraryImport generator can process it @@ -212,14 +326,15 @@ private static void EmitHeader(StringBuilder sb, int exportCount, int skippedCou sb.AppendLine("using System.Runtime.InteropServices;"); sb.AppendLine("using System.Runtime.InteropServices.Marshalling;"); sb.AppendLine(); - sb.AppendLine("namespace Daybreak.API.Interop;"); + sb.AppendLine("namespace Daybreak.API.Interop"); + sb.AppendLine("{"); sb.AppendLine(); sb.AppendLine("/// "); sb.AppendLine($"/// P/Invoke bindings for {exportCount} C++ exports from gwca.dll ({skippedCount} skipped)."); sb.AppendLine("/// Nested classes mirror the C++ namespace hierarchy (e.g. GW::Agents → GWCA.GW.Agents)."); sb.AppendLine("/// Types annotated with [GWCAEquivalent] are used in signatures where available."); sb.AppendLine("/// "); - sb.AppendLine("internal static unsafe partial class GWCA"); + sb.AppendLine("public static unsafe partial class GWCA"); sb.AppendLine("{"); sb.AppendLine(" private const string DllName = \"gwca.dll\";"); } @@ -236,7 +351,7 @@ private static void EmitNamespaceNode( var pad = new string(' ', indent); sb.AppendLine(); - sb.AppendLine($"{pad}internal static partial class {SanitizeIdentifier(node.Name)}"); + sb.AppendLine($"{pad}public static partial class {SanitizeIdentifier(node.Name)}"); sb.AppendLine($"{pad}{{"); // Emit functions in this namespace, disambiguating overloads that @@ -368,7 +483,907 @@ private static void EmitFunction( sb.AppendLine($"{pad}{prefix}{conventionAttr}"); if (retAttr.Length > 0) sb.AppendLine($"{pad}{prefix}{retAttr}"); - sb.AppendLine($"{pad}{prefix}internal static partial {csRet} {methodName}({paramStr});"); + sb.AppendLine($"{pad}{prefix}public static partial {csRet} {methodName}({paramStr});"); + } + + // ════════════════════════════════════════════════════════════════ + // Constants / Enum emission from parsed headers + // ════════════════════════════════════════════════════════════════ + + /// + /// Emits a tree as nested static classes + /// containing enums and const fields. If a namespace node already + /// exists in the export tree, the constants are merged into it. + /// + private static void EmitConstantsNode( + StringBuilder sb, + ConstantsNode node, + Dictionary typeMap, + HashSet namespaceClassNames, + int indent) + { + var pad = new string(' ', indent); + + // If the node has nothing to emit (no enums, no consts, no children with content), skip + if (!HasAnyContent(node)) + return; + + // Always emit a partial class wrapper — C# allows multiple partial + // declarations for the same nested class, so this merges cleanly + // with any class already emitted by the export tree. + sb.AppendLine(); + sb.AppendLine($"{pad}public static partial class {SanitizeIdentifier(node.Name)}"); + sb.AppendLine($"{pad}{{"); + + var innerIndent = indent + 4; + var innerPad = new string(' ', innerIndent); + + // Emit enums + foreach (var enumDef in node.Enums.OrderBy(e => e.Name, StringComparer.Ordinal)) + { + sb.AppendLine(); + if (enumDef.Name is not null) + { + var baseType = MapCppTypeToCs(enumDef.UnderlyingType); + sb.AppendLine($"{innerPad}public enum {SanitizeIdentifier(enumDef.Name)} : {baseType}"); + sb.AppendLine($"{innerPad}{{"); + foreach (var member in enumDef.Members) + { + var comment = member.Comment is not null ? $" // {member.Comment}" : ""; + if (member.Value is not null) + sb.AppendLine($"{innerPad} {SanitizeIdentifier(member.Name)} = {member.Value},{comment}"); + else + sb.AppendLine($"{innerPad} {SanitizeIdentifier(member.Name)},{comment}"); + } + sb.AppendLine($"{innerPad}}}"); + } + else + { + // Anonymous enum → emit as const fields + foreach (var member in enumDef.Members) + { + var csType = MapCppTypeToCs(enumDef.UnderlyingType); + var comment = member.Comment is not null ? $" // {member.Comment}" : ""; + sb.AppendLine($"{innerPad}internal const {csType} {SanitizeIdentifier(member.Name)} = {member.Value};{comment}"); + } + } + } + + // Emit constexpr fields + foreach (var field in node.Constants.OrderBy(f => f.Name, StringComparer.Ordinal)) + { + var csType = MapCppTypeToCs(field.CppType); + var value = field.Value; + var comment = field.Comment is not null ? $" // {field.Comment}" : ""; + sb.AppendLine($"{innerPad}internal const {csType} {SanitizeIdentifier(field.Name)} = {value};{comment}"); + } + + // Type aliases are now emitted to GuildWars namespace, not nested GWCA classes + // Skip type alias emission here - see EmitTypeAliasesToGuildWarsNamespace + + // Structs are now emitted to GuildWars namespace, not nested classes + // Skip struct emission here - see EmitStructsToGuildWarsNamespace + + // Emit children + foreach (var child in node.Children.Values.OrderBy(c => c.Name, StringComparer.Ordinal)) + { + EmitConstantsNode(sb, child, typeMap, namespaceClassNames, innerIndent); + } + + sb.AppendLine($"{pad}}}"); + } + + private static bool HasAnyContent(ConstantsNode node) + { + // Note: TypeAliases and Structs are emitted to GuildWars namespace, not counted here + if (node.Enums.Count > 0 || node.Constants.Count > 0) + return true; + return node.Children.Values.Any(HasAnyContent); + } + + /// + /// Walks the constants tree and adds each named enum to the type map. + /// Enums take priority over structs - this must be called first. + /// Existing entries (from [GWCAEquivalent]) are never overwritten. + /// + private static void CollectEnumMappings( + ConstantsNode node, + string csPath, + Dictionary typeMap) + { + foreach (var enumDef in node.Enums) + { + if (enumDef.Name is null) + continue; // skip anonymous enums + + if (!typeMap.ContainsKey(enumDef.Name)) + typeMap[enumDef.Name] = "global::Daybreak.API.Interop." + csPath + "." + SanitizeIdentifier(enumDef.Name); + } + + foreach (var child in node.Children.Values) + { + CollectEnumMappings(child, csPath + "." + SanitizeIdentifier(child.Name), typeMap); + } + } + + /// + /// Walks the constants tree and adds each struct to the type map. + /// Must be called AFTER CollectEnumMappings so struct collision detection works. + /// + private static void CollectStructMappings( + ConstantsNode node, + string csPath, + Dictionary typeMap, + HashSet namespaceClassNames, + HashSet usedGuildWarsNames) + { + // First, collect all struct names in this node to avoid collisions + var structNamesInNode = new HashSet(node.Structs.Select(s => s.Name), StringComparer.Ordinal); + + foreach (var structDef in node.Structs) + { + // Only add structs that can actually be emitted + if (!CanEmitStruct(structDef)) + continue; + + // Determine the C# name, handling collisions with namespace classes or enums + var csName = SanitizeIdentifier(structDef.Name); + + // Check if name collides with a namespace class, enum, or ANOTHER struct already using this name + if (namespaceClassNames.Contains(structDef.Name)) + { + // Try "Data" suffix first, then "Struct" if that also collides + if (!structNamesInNode.Contains(structDef.Name + "Data") && !usedGuildWarsNames.Contains(csName + "Data")) + csName += "Data"; + else if (!structNamesInNode.Contains(structDef.Name + "Struct") && !usedGuildWarsNames.Contains(csName + "Struct")) + csName += "Struct"; + else + csName += "_"; // Last resort + } + // Check if name collides with an enum already in typeMap (different namespace, e.g. Constants::Attribute vs GW::Attribute) + // OR another struct already using this name in GuildWars namespace + else if (typeMap.ContainsKey(structDef.Name) || usedGuildWarsNames.Contains(csName)) + { + // An enum or other type with this name exists - suffix the struct + if (!structNamesInNode.Contains(structDef.Name + "Struct") && !usedGuildWarsNames.Contains(csName + "Struct")) + csName += "Struct"; + else if (!structNamesInNode.Contains(structDef.Name + "Data") && !usedGuildWarsNames.Contains(csName + "Data")) + csName += "Data"; + else + csName += "_"; + } + + usedGuildWarsNames.Add(csName); + + // Use a qualified key that includes the C++ path to distinguish structs with the same name + // from different namespaces (e.g., GW::Attribute vs GW::SkillbarMgr::Attribute) + var mapKey = structDef.Name; + var fqCsType = "global::Daybreak.API.Interop.GuildWars." + csName; + var simpleStructKey = "struct " + structDef.Name; + + if (typeMap.ContainsKey(mapKey)) + { + // Use qualified key to distinguish this struct from enum or another struct + // Include the csPath to make it unique (e.g., "struct GW.Attribute" vs "struct GW.SkillbarMgr.Attribute") + mapKey = "struct " + csPath.Replace("GWCA.", "") + "." + structDef.Name; + + // Also add simple "struct X" key if not already taken (for field type resolution) + // This allows MapCppFieldTypeToCs to find the struct without knowing the full path + if (!typeMap.ContainsKey(simpleStructKey)) + { + typeMap[simpleStructKey] = fqCsType; + } + } + + // Structs go into GuildWars namespace (flat), not nested GWCA classes + typeMap[mapKey] = fqCsType; + } + + foreach (var child in node.Children.Values) + { + CollectStructMappings(child, csPath + "." + SanitizeIdentifier(child.Name), typeMap, namespaceClassNames, usedGuildWarsNames); + } + } + + /// + /// Collects all namespace class names from the export tree recursively. + /// Used to avoid name collisions when emitting structs. + /// + private static void CollectNamespaceClassNames(NamespaceNode node, HashSet names) + { + names.Add(node.Name); + foreach (var child in node.Children.Values) + { + CollectNamespaceClassNames(child, names); + } + } + + /// + /// Collects diagnostic information about parsed structs. + /// + private static void CollectStructDiagnostics(ConstantsNode node, string path, List diagnostics) + { + var currentPath = string.IsNullOrEmpty(path) ? node.Name : path + "." + node.Name; + + // Show namespace pop line info + if (node.DebugPopLine > 0) + { + diagnostics.Add($"[NAMESPACE] {currentPath} popped at line {node.DebugPopLine}"); + } + + foreach (var structDef in node.Structs) + { + var (canEmit, reason) = CanEmitStructWithReason(structDef); + var status = canEmit ? "OK" : $"SKIP: {reason}"; + diagnostics.Add($"{currentPath}.{structDef.Name}: {structDef.Fields.Count} fields [{status}]"); + } + foreach (var child in node.Children.Values) + { + CollectStructDiagnostics(child, currentPath, diagnostics); + } + } + + /// + /// Checks if a struct can be emitted (has no complex template fields or unresolved types). + /// + private static (bool canEmit, string? reason) CanEmitStructWithReason(CppStructDef structDef) + { + // Skip structs with no fields (usually forward declarations that got parsed) + if (structDef.Fields.Count == 0) + return (false, "no fields"); + + // Check for mixed offset/no-offset fields (can't use Explicit layout if not all have offsets) + bool hasAnyOffset = structDef.Fields.Any(f => f.Offset.HasValue); + bool allHaveOffsets = structDef.Fields.All(f => f.Offset.HasValue); + if (hasAnyOffset && !allHaveOffsets) + return (false, "mixed offset fields"); + + // Check for unresolvable fields (template types, missing types) + foreach (var field in structDef.Fields) + { + var cppType = field.CppType; + // Skip structs with template type parameters (T, etc.) + if (Regex.IsMatch(cppType, @"\bT\b") && !cppType.Contains("Array")) + return (false, $"template param T in field {field.Name}"); + // Skip structs with complex template containers we can't represent + // Note: TLink is handled separately in MapCppFieldTypeToCs (8-byte linked list node) + if (cppType.Contains("TList<") || + cppType.Contains("PrioQ<") || cppType.Contains("PrioQLink<") || + cppType.Contains("BaseArray<")) + return (false, $"complex template in field {field.Name}: {cppType}"); + // Skip if field type contains unresolved typedef names + // Note: UIInteractionCallback is now mapped to nint in BuiltInTypeMappings + // Note: FrameRelation* (pointer) maps to nint automatically, but embedded FrameRelation + // is a problem because the struct itself is skipped (contains TList) + if (cppType.Contains("FriendsListArray") || + cppType.Contains("PathNodeArray") || cppType.Contains("PathingMapArray") || + cppType.Contains("BlockedPlaneArray") || cppType.Contains("AgentSummaryInfoSub") || + cppType.Contains("EffectData") || + cppType.Contains("SkillbarSkillData") || cppType.Contains("SkillbarData") || + cppType == "FrameRelation") // Embedded FrameRelation - struct is skipped due to TList<> + return (false, $"unresolved typedef in field {field.Name}: {cppType}"); + // Skip structs with function pointer fields (complex vtable types) + if (cppType.Contains("__fastcall") || cppType.Contains("__stdcall") || + cppType.Contains("(__cdecl") || Regex.IsMatch(cppType, @"\(\s*\*\s*\w+\s*\)")) + return (false, $"function pointer in field {field.Name}: {cppType}"); + // Skip structs with inline initializers in field declarations (e.g., "uint32_t k[4]{}") + if (cppType.Contains("{}")) + return (false, $"inline initializer in field {field.Name}: {cppType}"); + // Skip fields referencing complex struct types we can't emit + // These are structs that have vtables, function pointers, or complex layouts + if (cppType.Contains("EquipmentVTable") || cppType.Contains("VTable")) + return (false, $"vtable in field {field.Name}: {cppType}"); + } + return (true, null); + } + + private static bool CanEmitStruct(CppStructDef structDef) => CanEmitStructWithReason(structDef).canEmit; + + /// + /// Emits a C# struct from a parsed C++ struct definition. + /// + private static void EmitStruct(StringBuilder sb, CppStructDef structDef, Dictionary typeMap, int indent, HashSet<(string csType, int size)>? inlineArrayTypes = null, string? csStructName = null) + { + var pad = new string(' ', indent); + + // Skip structs that can't be emitted + if (!CanEmitStruct(structDef)) + return; + + // Use provided name or default to sanitized original name + var structName = csStructName ?? SanitizeIdentifier(structDef.Name); + + sb.AppendLine(); + + // Determine layout strategy based on whether we have offsets + bool hasOffsets = structDef.Fields.Any(f => f.Offset.HasValue); + var layoutKind = hasOffsets ? "Explicit" : "Sequential"; + + // Build the struct attributes + if (structDef.Size.HasValue) + sb.AppendLine($"{pad}[global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.{layoutKind}, Pack = 1, Size = 0x{structDef.Size.Value:X})]"); + else + sb.AppendLine($"{pad}[global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.{layoutKind}, Pack = 1)]"); + + sb.AppendLine($"{pad}public unsafe struct {structName}"); + sb.AppendLine($"{pad}{{"); + + var innerPad = new string(' ', indent + 4); + + foreach (var field in structDef.Fields) + { + var csType = MapCppFieldTypeToCs(field.CppType, typeMap); + var fieldName = SanitizeIdentifier(ToPascalCase(field.Name)); + var comment = field.Comment is not null ? $" // {field.Comment}" : ""; + + // Emit FieldOffset if we have explicit layout + if (hasOffsets && field.Offset.HasValue) + sb.AppendLine($"{innerPad}[global::System.Runtime.InteropServices.FieldOffset(0x{field.Offset.Value:X4})]"); + + // Handle fixed-size arrays + if (field.ArraySize is not null) + { + var size = ParseArraySize(field.ArraySize); + // Skip zero-length arrays (flexible array members in C++) - just add a comment + if (size <= 0) + { + sb.AppendLine($"{innerPad}// Flexible array member: {csType} {fieldName}[0]"); + continue; + } + // For fixed arrays, we need a fixed buffer or explicit FieldOffset per element + // Use fixed buffer for blittable types + if (IsBlittableForFixed(csType)) + { + sb.AppendLine($"{innerPad}public fixed {csType} {fieldName}[{size}];{comment}"); + } + else if (inlineArrayTypes is not null && inlineArrayTypes.Contains((csType, size))) + { + // Use the inline array type we generated + var inlineArrayTypeName = GetInlineArrayTypeName(csType, size); + sb.AppendLine($"{innerPad}public {inlineArrayTypeName} {fieldName};{comment}"); + } + else + { + // Fallback: use single element with comment (shouldn't happen if inlineArrayTypes is properly populated) + sb.AppendLine($"{innerPad}public {csType} {fieldName}; // [{field.ArraySize}]{comment}"); + } + } + else + { + sb.AppendLine($"{innerPad}public {csType} {fieldName};{comment}"); + } + } + + sb.AppendLine($"{pad}}}"); + } + + /// + /// Emits all emittable structs from the constants tree into the GuildWars namespace. + /// This provides compatibility for consumer code that uses `using Daybreak.API.Interop.GuildWars;` + /// + private static void EmitStructsToGuildWarsNamespace(StringBuilder sb, ConstantsNode node, Dictionary typeMap, int indent, HashSet emittedNames, HashSet<(string csType, int size)> inlineArrayTypes) + { + // Start with the node's own name as the path base (GWCA for headerRoot) + EmitStructsRecursive(sb, node, node.Name, typeMap, indent, emittedNames, inlineArrayTypes); + } + + private static void EmitStructsRecursive(StringBuilder sb, ConstantsNode node, string currentPath, Dictionary typeMap, int indent, HashSet emittedNames, HashSet<(string csType, int size)> inlineArrayTypes) + { + foreach (var structDef in node.Structs.OrderBy(s => s.Name, StringComparer.Ordinal)) + { + // Skip structs that can't be emitted + if (!CanEmitStruct(structDef)) + continue; + + // Get the C# name from typeMap (which includes collision-resolution suffixes like "Struct") + // Try direct name first, then qualified struct key (for collision cases) + string? fqCsName; + var directLookup = typeMap.TryGetValue(structDef.Name, out fqCsName); + var containsGuildWars = fqCsName?.Contains("GuildWars.") ?? false; + + if (!directLookup || !containsGuildWars) + { + // If direct lookup failed or returned an enum (not in GuildWars namespace), + // try qualified struct key: "struct GW.StructName" + var qualifiedKey = "struct " + currentPath.Replace("GWCA.", "") + "." + structDef.Name; + typeMap.TryGetValue(qualifiedKey, out fqCsName); + } + + if (fqCsName is null) + continue; + + // Extract just the struct name from the fully-qualified name + // e.g. "global::Daybreak.API.Interop.GuildWars.ItemStruct" -> "ItemStruct" + var csName = fqCsName.Substring(fqCsName.LastIndexOf('.') + 1); + + // Skip duplicates (including if an enum with the same name was emitted) + if (emittedNames.Contains(csName)) + continue; + + emittedNames.Add(csName); + EmitStruct(sb, structDef, typeMap, indent, inlineArrayTypes, csName); + } + + // Recurse into children, appending the child's name to the current path + foreach (var child in node.Children.Values) + { + EmitStructsRecursive(sb, child, currentPath + "." + child.Name, typeMap, indent, emittedNames, inlineArrayTypes); + } + } + + /// + /// Emits manually-defined helper structs that can't be parsed from headers. + /// These are typically C++ template containers with known fixed layouts. + /// + private static void EmitManualHelperStructs(StringBuilder sb, int indent, HashSet emittedNames) + { + var pad = new string(' ', indent); + + // TLink - doubly-linked list node used in Agent and other structs + // C++ definition: struct TLink { TLink* prev_link; T* next_node; } + // Size: 8 bytes (2 pointers on x86) + if (emittedNames.Add("TLink")) + { + sb.AppendLine($"{pad}/// "); + sb.AppendLine($"{pad}/// TLink<T> - doubly-linked list node (8 bytes: 2 pointers)."); + sb.AppendLine($"{pad}/// Used in Agent structs for linked list chaining."); + sb.AppendLine($"{pad}/// "); + sb.AppendLine($"{pad}[global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)]"); + sb.AppendLine($"{pad}public struct TLink"); + sb.AppendLine($"{pad}{{"); + sb.AppendLine($"{pad} public nint PrevLink;"); + sb.AppendLine($"{pad} public nint NextNode;"); + sb.AppendLine($"{pad}}}"); + sb.AppendLine(); + } + } + + /// + /// Collects all inline array types needed for non-blittable array fields in emittable structs. + /// + private static void CollectInlineArrayTypes(ConstantsNode node, Dictionary typeMap, HashSet<(string csType, int size)> inlineArrayTypes) + { + foreach (var structDef in node.Structs) + { + if (!CanEmitStruct(structDef)) + continue; + + foreach (var field in structDef.Fields) + { + if (field.ArraySize is null) + continue; + + var size = ParseArraySize(field.ArraySize); + if (size <= 0) + continue; + + var csType = MapCppFieldTypeToCs(field.CppType, typeMap); + if (!IsBlittableForFixed(csType)) + { + inlineArrayTypes.Add((csType, size)); + } + } + } + + foreach (var child in node.Children.Values) + { + CollectInlineArrayTypes(child, typeMap, inlineArrayTypes); + } + } + + /// + /// Emits InlineArray types for non-blittable array fields. + /// Uses [InlineArray(N)] attribute introduced in .NET 8. + /// + private static void EmitInlineArrayTypes(StringBuilder sb, int indent, HashSet<(string csType, int size)> inlineArrayTypes, HashSet emittedNames) + { + var pad = new string(' ', indent); + + foreach (var (csType, size) in inlineArrayTypes.OrderBy(x => x.csType).ThenBy(x => x.size)) + { + // Generate a name like "AttributeArray12" or "SkillIDArray8" + var simpleName = GetSimpleTypeName(csType); + var arrayTypeName = $"{simpleName}Array{size}"; + + if (!emittedNames.Add(arrayTypeName)) + continue; + + sb.AppendLine($"{pad}/// "); + sb.AppendLine($"{pad}/// Inline array of {size} {simpleName} elements."); + sb.AppendLine($"{pad}/// "); + sb.AppendLine($"{pad}[global::System.Runtime.CompilerServices.InlineArray({size})]"); + sb.AppendLine($"{pad}public unsafe struct {arrayTypeName}"); + sb.AppendLine($"{pad}{{"); + sb.AppendLine($"{pad} private {csType} _element0;"); + sb.AppendLine($"{pad}}}"); + sb.AppendLine(); + } + } + + /// + /// Extracts the simple type name from a fully-qualified type name. + /// e.g., "global::Daybreak.API.Interop.GuildWars.Attribute" -> "Attribute" + /// Handles pointer types: "ChatMessage*" -> "ChatMessagePtr" + /// + private static string GetSimpleTypeName(string csType) + { + // Handle pointer types + var isPointer = csType.EndsWith("*"); + if (isPointer) + csType = csType.TrimEnd('*'); + + var lastDot = csType.LastIndexOf('.'); + var name = lastDot >= 0 ? csType.Substring(lastDot + 1) : csType; + + // Append Ptr for pointer types to make valid identifier + return isPointer ? name + "Ptr" : name; + } + + /// + /// Gets the inline array type name for a given element type and size. + /// + private static string GetInlineArrayTypeName(string csType, int size) + { + var simpleName = GetSimpleTypeName(csType); + return $"{simpleName}Array{size}"; + } + + /// + /// Emits all enums from the constants tree into the GuildWars namespace. + /// This provides compatibility for consumer code that uses `using Daybreak.API.Interop.GuildWars;` + /// + private static void EmitEnumsToGuildWarsNamespace(StringBuilder sb, ConstantsNode node, int indent, HashSet emittedNames) + { + EmitEnumsRecursive(sb, node, indent, emittedNames); + } + + private static void EmitEnumsRecursive(StringBuilder sb, ConstantsNode node, int indent, HashSet emittedNames) + { + var pad = new string(' ', indent); + + foreach (var enumDef in node.Enums.OrderBy(e => e.Name, StringComparer.Ordinal)) + { + // Skip anonymous enums + if (enumDef.Name is null) + continue; + + // Skip duplicates (including if a struct with the same name was emitted) + if (emittedNames.Contains(enumDef.Name)) + continue; + + emittedNames.Add(enumDef.Name); + + // Determine base type and map C++ types to C# + var baseType = MapCppEnumBaseType(enumDef.UnderlyingType ?? "int"); + + sb.AppendLine(); + sb.AppendLine($"{pad}public enum {SanitizeIdentifier(enumDef.Name)} : {baseType}"); + sb.AppendLine($"{pad}{{"); + + var innerPad = new string(' ', indent + 4); + foreach (var member in enumDef.Members) + { + if (member.Value is not null) + sb.AppendLine($"{innerPad}{SanitizeIdentifier(member.Name)} = {member.Value},"); + else + sb.AppendLine($"{innerPad}{SanitizeIdentifier(member.Name)},"); + } + sb.AppendLine($"{pad}}}"); + } + + // Recurse into children + foreach (var child in node.Children.Values) + { + EmitEnumsRecursive(sb, child, indent, emittedNames); + } + } + + /// + /// Emits all type aliases (typedef Array) from the constants tree into the GuildWars namespace. + /// + private static void EmitTypeAliasesToGuildWarsNamespace(StringBuilder sb, ConstantsNode node, Dictionary typeMap, int indent, HashSet emittedNames) + { + EmitTypeAliasesRecursive(sb, node, typeMap, indent, emittedNames); + } + + private static void EmitTypeAliasesRecursive(StringBuilder sb, ConstantsNode node, Dictionary typeMap, int indent, HashSet emittedNames) + { + var pad = new string(' ', indent); + + foreach (var alias in node.TypeAliases.OrderBy(a => a.AliasName, StringComparer.Ordinal)) + { + // Skip duplicates + if (emittedNames.Contains(alias.AliasName)) + continue; + + emittedNames.Add(alias.AliasName); + + var innerType = alias.TemplateArg.Replace("::", ".").Trim(); + // Handle pointer types (e.g., "Item *" -> "nint") + if (innerType.EndsWith("*")) + innerType = "nint"; + else if (typeMap.TryGetValue(innerType, out var mapped)) + innerType = mapped; + else + { + // Try primitive type mapping + var primitiveMapping = MapPrimitiveType(innerType); + if (primitiveMapping != innerType) + innerType = primitiveMapping; + else + // Unmapped struct type - use nint as fallback + innerType = "nint"; + } + + sb.AppendLine($"{pad}public unsafe struct {alias.AliasName} {{ public global::Daybreak.API.Interop.GuildWars.GuildWarsArray<{innerType}> Value; }}"); + } + + // Recurse into children + foreach (var child in node.Children.Values) + { + EmitTypeAliasesRecursive(sb, child, typeMap, indent, emittedNames); + } + } + + /// + /// Maps a C++ enum underlying type to C# type. + /// + private static string MapCppEnumBaseType(string cppType) + { + return cppType switch + { + "uint8_t" or "unsigned char" => "byte", + "int8_t" or "char" or "signed char" => "sbyte", + "uint16_t" or "unsigned short" => "ushort", + "int16_t" or "short" => "short", + "uint32_t" or "unsigned int" or "unsigned long" => "uint", + "int32_t" or "int" or "long" => "int", + "uint64_t" or "unsigned long long" => "ulong", + "int64_t" or "long long" => "long", + _ => "int" + }; + } + + /// + /// Maps a C++ field type to a C# type for struct fields. + /// Handles pointers, qualified types, etc. + /// + private static string MapCppFieldTypeToCs(string cppType, Dictionary typeMap) + { + cppType = cppType.Trim(); + + // Strip leading 'const' keyword + if (cppType.StartsWith("const ")) + cppType = cppType.Substring(6).Trim(); + + // Strip leading 'struct' keyword (C++ forward decl style) + if (cppType.StartsWith("struct ")) + cppType = cppType.Substring(7).Trim(); + + // Handle 'struct' inside template arguments (e.g., Array) + cppType = Regex.Replace(cppType, @"<\s*struct\s+", "<"); + + // Strip namespace prefix before template detection (GW::Array<> -> Array<>) + // But preserve the inner type for recursive processing + if (cppType.StartsWith("GW::")) + cppType = cppType.Substring(4); + + // Handle Array - GWCA's Array template which is a {T* data, uint size, uint capacity} (12 bytes) + if (cppType.StartsWith("Array<")) + { + // Extract the inner type from Array + var innerStart = cppType.IndexOf('<') + 1; + var innerEnd = cppType.LastIndexOf('>'); + if (innerEnd > innerStart) + { + var innerCpp = cppType.Substring(innerStart, innerEnd - innerStart).Trim(); + // Handle pointer inner types (e.g., Array) + // C# does NOT allow pointer types as generic type arguments (CS0306), so use nint + if (innerCpp.EndsWith("*")) + { + return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray"; + } + // Handle non-pointer inner types + // Strip "struct " prefix + if (innerCpp.StartsWith("struct ")) + innerCpp = innerCpp.Substring(7).Trim(); + // Strip namespace + if (innerCpp.Contains("::")) + { + var parts = innerCpp.Split(new[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + innerCpp = parts[parts.Length - 1]; + } + // Map primitives + var csInner = MapPrimitiveType(innerCpp); + if (csInner != innerCpp) + return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray<" + csInner + ">"; + // Check typeMap for structs/enums + if (typeMap.TryGetValue(innerCpp, out var mappedInner)) + return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray<" + mappedInner + ">"; + // Fallback for unmapped types + return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray"; + } + return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray"; + } + + // Handle TLink - linked list node, always 8 bytes (2 pointers) + if (cppType.StartsWith("TLink<")) + { + return "global::Daybreak.API.Interop.GuildWars.TLink"; + } + + // Handle pointers + bool isPointer = cppType.EndsWith("*"); + if (isPointer) + { + var inner = cppType.TrimEnd('*').Trim(); + // Strip namespace qualifiers before lookup + var innerStripped = inner; + if (inner.Contains("::")) + { + var parts = inner.Split(new[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + innerStripped = parts[parts.Length - 1]; + } + + var csInner = MapCppFieldTypeToCs(inner, typeMap); + // Special case: void* and char* and wchar_t* map to nint + if (csInner is "void" or "char" or "byte") + return "nint"; + // If the inner type is unmapped (csInner equals the stripped name), use nint for the pointer + // A mapped type will have a fully-qualified name or be a known primitive + if (!IsKnownCsType(csInner) && csInner == innerStripped) + return "nint"; + return csInner + "*"; + } + + // Check if original type is from Constants namespace (typically enums) + // In this case, prefer enum mapping over struct mapping + var isFromConstantsNamespace = cppType.Contains("Constants::"); + + // Strip namespace qualifiers (GW::, GW::Constants::, etc.) + if (cppType.Contains("::")) + { + var parts = cppType.Split(new[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + cppType = parts[parts.Length - 1]; + } + + // Check if this type is in our generated enums/structs map + if (typeMap.TryGetValue(cppType, out var mapped)) + { + // If original was from Constants:: namespace, it's an enum - use enum mapping + if (isFromConstantsNamespace) + return mapped; + // Otherwise, if it's a GuildWars type (struct), use it + if (mapped.Contains("GuildWars.")) + return mapped; + } + // Try struct-prefixed key only if NOT from Constants namespace + // (for collision cases like Attribute struct vs enum) + if (!isFromConstantsNamespace && typeMap.TryGetValue("struct " + cppType, out var structAlt)) + return structAlt; + // Fall back to original mapping (could be an enum) + if (mapped is not null) + return mapped; + + // Handle common C++ types + return cppType switch + { + "uint32_t" => "uint", + "int32_t" => "int", + "uint16_t" => "ushort", + "int16_t" => "short", + "uint8_t" => "byte", + "int8_t" => "sbyte", + "uint64_t" => "ulong", + "int64_t" => "long", + "size_t" => "nuint", + "int" => "int", + "unsigned" => "uint", + "unsigned int" => "uint", + "short" => "short", + "unsigned short" => "ushort", + "long" => "int", + "unsigned long" => "uint", + "float" => "float", + "double" => "double", + "bool" => "byte", // C++ bool is 1 byte + "wchar_t" => "char", + "char" => "byte", + "void" => "void", + "DWORD" => "uint", + "FILETIME" => "ulong", // FILETIME is two DWORDs + "HMODULE" => "nint", + "HANDLE" => "nint", + "HWND" => "nint", + "uintptr_t" => "nuint", + "intptr_t" => "nint", + "Vec2f" => "global::System.Numerics.Vector2", + "Vec3f" => "global::System.Numerics.Vector3", + "Color" => "uint", // GWCA Color is usually uint32 + // Known GWCA types that are typedefs to uint32_t (not enums) + "AgentID" => "uint", + "PlayerNumber" => "uint", + "ItemID" => "uint", + "PlayerID" => "uint", + // Everything else: assume it's a struct/enum name we'll reference directly + _ => cppType, + }; + } + + /// + /// Checks if a type name is a known C# primitive or built-in type. + /// + private static bool IsKnownCsType(string csType) + { + return csType is "byte" or "sbyte" or "short" or "ushort" or "int" or "uint" + or "long" or "ulong" or "float" or "double" or "char" or "nint" or "nuint" + or "void" or "bool" or "string" or "object" + or "global::System.Numerics.Vector2" or "global::System.Numerics.Vector3"; + } + + private static bool IsBlittableForFixed(string csType) + { + // Note: nint and nuint are NOT valid for fixed buffers in C# + return csType is "byte" or "sbyte" or "short" or "ushort" or "int" or "uint" + or "long" or "ulong" or "float" or "double" or "char"; + } + + private static int ParseArraySize(string sizeExpr) + { + sizeExpr = sizeExpr.Trim(); + if (sizeExpr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + return Convert.ToInt32(sizeExpr, 16); + if (int.TryParse(sizeExpr, out var size)) + return size; + // If it's a named constant or expression, default to 1 + return 1; + } + + private static string ToPascalCase(string name) + { + if (string.IsNullOrEmpty(name)) + return name; + + // Handle snake_case: split by underscores and capitalize each part + if (name.Contains("_")) + { + var parts = name.Split('_'); + var result = new StringBuilder(); + foreach (var part in parts) + { + if (part.Length > 0) + { + result.Append(char.ToUpperInvariant(part[0])); + if (part.Length > 1) + result.Append(part.Substring(1)); + } + } + return result.ToString(); + } + + // Just capitalize first letter + return char.ToUpperInvariant(name[0]) + name.Substring(1); + } + + private static string MapCppTypeToCs(string? cppType) + { + if (cppType is null) + return "int"; + return cppType switch + { + "uint32_t" => "uint", + "int32_t" => "int", + "uint16_t" => "ushort", + "int16_t" => "short", + "uint8_t" => "byte", + "int8_t" => "sbyte", + "int" => "int", + "unsigned int" => "uint", + "size_t" => "uint", + "float" => "float", + "double" => "double", + _ => "int", + }; } // ════════════════════════════════════════════════════════════════ @@ -392,8 +1407,13 @@ private static void EmitFunction( private static string SanitizeIdentifier(string name) { + if (string.IsNullOrEmpty(name)) + return "_"; if (CsKeywords.Contains(name)) return "@" + name; + // If identifier starts with a digit, prefix with underscore + if (char.IsDigit(name[0])) + return "_" + name; return name; } @@ -519,7 +1539,7 @@ private static string ResolveCsType(DemangledType dt, Dictionary "float" => "float", "double" => "double", "bool" => "byte", // bool* not blittable - _ => typeMap.TryGetValue(dt.Name, out var mapped) ? mapped : dt.Name, + _ => ResolveStructOrEnumPointerInner(dt.Name, typeMap), }; return inner + "*"; } @@ -536,7 +1556,18 @@ private static string ResolveCsType(DemangledType dt, Dictionary return "global::Daybreak.API.Interop.GuildWars.GuildWarsArray<" + innerType + ">"; } + // First try direct lookup, but ensure we get a struct (GuildWars namespace), not an enum if (typeMap.TryGetValue(dt.Name, out var structCs)) + { + // If it's a GuildWars type, use it (it's the struct) + if (structCs.Contains("GuildWars.")) + return structCs; + } + // If direct lookup returned an enum, try struct-prefixed key + if (typeMap.TryGetValue("struct " + dt.Name, out var structCsAlt)) + return structCsAlt; + // Fall back to direct lookup result or name + if (structCs is not null) return structCs; return dt.Name; @@ -549,13 +1580,106 @@ private static string ResolveTemplateArgType(DemangledType arg, Dictionary arg.Name, + TypeKind.Primitive => MapPrimitiveType(arg.Name), TypeKind.Enum => typeMap.TryGetValue(arg.Name, out var e) ? e : arg.Name, - TypeKind.Struct => typeMap.TryGetValue(arg.Name, out var s) ? s : arg.Name, - TypeKind.Pointer => "nint", // pointer types cannot be generic type arguments + TypeKind.Struct => ResolveStructType(arg.Name, typeMap), + TypeKind.Pointer => "nint", // C# does NOT allow pointer types as generic type arguments (CS0306) _ => "nint", }; } + + /// + /// Resolves a struct name to its C# type, handling name collisions with enums. + /// + private static string ResolveStructType(string name, Dictionary typeMap) + { + // Try direct lookup - if it's in GuildWars namespace, it's the struct + if (typeMap.TryGetValue(name, out var direct) && direct.Contains("GuildWars.")) + return direct; + // Try struct-prefixed key (for collision cases like Attribute struct vs enum) + if (typeMap.TryGetValue("struct " + name, out var structAlt)) + return structAlt; + // Unmapped struct -> nint + return "nint"; + } + + /// + /// Resolves a pointer inner type (the pointee) for struct or enum types, + /// handling name collisions between structs and enums. + /// + private static string ResolveStructOrEnumPointerInner(string name, Dictionary typeMap) + { + // Try direct lookup - if it's in GuildWars namespace, it's a struct + if (typeMap.TryGetValue(name, out var direct) && direct.Contains("GuildWars.")) + return direct; + // Try struct-prefixed key (for collision cases like Attribute struct vs enum) + if (typeMap.TryGetValue("struct " + name, out var structAlt)) + return structAlt; + // Fall back to direct lookup result (could be an enum) or just the name + return direct ?? name; + } + + /// + /// Resolves a pointer type used as a template argument (e.g., Agent* in Array<Agent*>). + /// In unsafe C#, pointer types can be used as generic type arguments for unmanaged structs. + /// + private static string ResolvePointerTemplateArg(DemangledType arg, Dictionary typeMap) + { + // arg.Name is the inner type (e.g., "Agent" for Agent*) + var innerName = arg.Name; + + // Check if the inner type is mapped (prefer struct mapping for GuildWars types) + var resolved = ResolveStructOrEnumPointerInner(innerName, typeMap); + if (resolved != innerName) + return resolved + "*"; + + // Check for primitives + var primitive = MapPrimitiveType(innerName); + if (primitive != innerName) + return primitive + "*"; + + // Special cases + return innerName switch + { + "void" => "nint", // void* -> nint + _ => "nint", // unmapped pointer -> nint + }; + } + + /// + /// Maps C/C++ primitive type names to C# primitive types. + /// + private static string MapPrimitiveType(string cppType) + { + return cppType switch + { + "uint32_t" => "uint", + "int32_t" => "int", + "uint16_t" => "ushort", + "int16_t" => "short", + "uint8_t" => "byte", + "int8_t" => "sbyte", + "uint64_t" => "ulong", + "int64_t" => "long", + "size_t" => "nuint", + "uintptr_t" => "nuint", + "intptr_t" => "nint", + "unsigned int" or "unsigned" => "uint", + "unsigned short" => "ushort", + "unsigned long" => "uint", + "unsigned char" => "byte", + "char" => "byte", + "wchar_t" => "char", + "bool" => "byte", + // GWCA-specific typedefs + "AgentID" => "uint", + "PlayerNumber" => "uint", + "ItemID" => "uint", + "PlayerID" => "uint", + "Color" => "uint", + _ => cppType, // pass through already-correct types like int, uint, etc + }; + } /// /// Returns a comment annotation for unmapped struct/enum types, or null. @@ -669,7 +1793,7 @@ public override int GetHashCode() /// A node in the namespace tree, representing a C++ namespace /// as a nested static class. - private sealed class NamespaceNode(string name) + internal sealed class NamespaceNode(string name) { public string Name { get; } = name; public Dictionary Children { get; } = new(StringComparer.Ordinal); @@ -677,10 +1801,84 @@ private sealed class NamespaceNode(string name) } /// A single mangled export with its demangled info. - private sealed class ExportEntry(string mangledName, DemangledFunction info) + internal sealed class ExportEntry(string mangledName, DemangledFunction info) { public string MangledName { get; } = mangledName; public DemangledFunction Info { get; } = info; } -} + // ════════════════════════════════════════════════════════════════ + // Constants tree types (parsed from C++ headers) + // ════════════════════════════════════════════════════════════════ + + internal sealed class ConstantsNode(string name) + { + public string Name { get; } = name; + public Dictionary Children { get; } = new(StringComparer.Ordinal); + public List Enums { get; } = []; + public List Constants { get; } = []; + public List Structs { get; } = []; + public List TypeAliases { get; } = []; + public int DebugPopLine { get; set; } // Debug: line number where this namespace was popped + + public ConstantsNode GetOrCreateChild(string childName) + { + if (!this.Children.TryGetValue(childName, out var child)) + { + child = new ConstantsNode(childName); + this.Children[childName] = child; + } + return child; + } + } + + internal sealed class CppEnumDef + { + public string? Name { get; set; } // null for anonymous enums + public string? UnderlyingType { get; set; } // e.g. "uint32_t", null → int + public List Members { get; } = []; + } + + internal sealed class CppEnumMember + { + public string Name { get; set; } = ""; + public string? Value { get; set; } + public string? Comment { get; set; } + } + + internal sealed class CppConstField + { + public string Name { get; set; } = ""; + public string CppType { get; set; } = "int"; + public string Value { get; set; } = "0"; + public string? Comment { get; set; } + } + + internal sealed class CppStructDef + { + public string Name { get; set; } = ""; + public string? BaseType { get; set; } + public int? Size { get; set; } // from static_assert(sizeof(...)) + public List Fields { get; } = []; + public string DebugNamespacePath { get; set; } = ""; // Debug: namespace path when parsed + } + + internal sealed class CppStructField + { + public string Name { get; set; } = ""; + public string CppType { get; set; } = "int"; + public int? Offset { get; set; } + public string? ArraySize { get; set; } // e.g., "7", "0x10", "20" + public string? Comment { get; set; } + } + + /// + /// Represents a C++ typedef alias like: typedef Array<T> AliasName; + /// + internal sealed class CppTypeAlias + { + public string AliasName { get; set; } = ""; + public string SourceType { get; set; } = ""; // e.g., "Array" + public string? TemplateArg { get; set; } // e.g., "Buff" + } +} \ No newline at end of file diff --git a/Daybreak.Shared/Models/Api/ItemEntry.cs b/Daybreak.Shared/Models/Api/ItemEntry.cs index 98858ebb..f6e6c83d 100644 --- a/Daybreak.Shared/Models/Api/ItemEntry.cs +++ b/Daybreak.Shared/Models/Api/ItemEntry.cs @@ -1,4 +1,4 @@ -using Daybreak.Shared.Converters; +using Daybreak.Shared.Converters; using Daybreak.Shared.Models.Guildwars; using System.Text.Json.Serialization; @@ -16,6 +16,8 @@ public sealed record ItemEntry( bool Inscribable, int Quantity, [property: JsonConverter(typeof(HexUIntArrayJsonConverter))] uint[] Modifiers, - ItemProperty[] Properties) + ItemProperty[] Properties, + uint Interaction, + uint ModelFileId) { } diff --git a/Daybreak.Shared/Models/Api/MainPlayerBuildContext.cs b/Daybreak.Shared/Models/Api/MainPlayerBuildContext.cs index 1c56b157..5ba82eeb 100644 --- a/Daybreak.Shared/Models/Api/MainPlayerBuildContext.cs +++ b/Daybreak.Shared/Models/Api/MainPlayerBuildContext.cs @@ -1,4 +1,4 @@ namespace Daybreak.Shared.Models.Api; -public sealed record MainPlayerBuildContext(uint PrimaryProfessionId, uint UnlockedProfessions, uint[] UnlockedCharacterSkills, uint[] UnlockedAccountSkills) +public sealed record MainPlayerBuildContext(uint PrimaryProfessionId, uint UnlockedProfessions, uint[] UnlockedCharacterSkills) { } diff --git a/Daybreak.Shared/Models/Builds/IBuildEntry.cs b/Daybreak.Shared/Models/Builds/IBuildEntry.cs index 45c9c1d5..f7c4334f 100644 --- a/Daybreak.Shared/Models/Builds/IBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/IBuildEntry.cs @@ -2,9 +2,10 @@ public interface IBuildEntry { - public DateTime CreationTime { get; set; } - public Dictionary? Metadata { get; set; } - public string? SourceUrl { get; set; } - public string? PreviousName { get; set; } - public string? Name { get; set; } + DateTime CreationTime { get; set; } + string? SourceUrl { get; set; } + string? PreviousName { get; set; } + string? Name { get; set; } + int? ToolboxBuildId { get; set; } + bool IsToolboxBuild { get; set; } } diff --git a/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs b/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs index de9fc39f..e6419a77 100644 --- a/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs @@ -3,8 +3,63 @@ using Attribute = Daybreak.Shared.Models.Guildwars.Attribute; namespace Daybreak.Shared.Models.Builds; -public sealed class SingleBuildEntry : BuildEntryBase, IBuildEntry, INotifyPropertyChanged, IEquatable + +public sealed class SingleBuildEntry : IBuildEntry, INotifyPropertyChanged, IEquatable { + public event PropertyChangedEventHandler? PropertyChanged; + + public string? Name + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.Name)); + } + } + + public string? PreviousName { get; set; } + + public string? SourceUrl + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.SourceUrl)); + } + } + + public DateTime CreationTime + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.CreationTime)); + } + } + + public int? ToolboxBuildId + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.ToolboxBuildId)); + } + } + + public bool IsToolboxBuild + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.IsToolboxBuild)); + } + } + public Profession Primary { get; @@ -276,4 +331,9 @@ public override int GetHashCode() { return HashCode.Combine(this.Name, this.PreviousName, this.SourceUrl, this.Primary.Name, this.Secondary.Name, string.Join(';', this.Skills.Select(s => s.Id))); } + + private void OnPropertyChanged(string propertyName) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } diff --git a/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs b/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs index 6aa50ff3..c58fdf8b 100644 --- a/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs @@ -1,8 +1,74 @@ using Daybreak.Shared.Models.Guildwars; +using System.ComponentModel; namespace Daybreak.Shared.Models.Builds; -public sealed class TeamBuildEntry : BuildEntryBase, IEquatable + +public sealed class TeamBuildEntry : IBuildEntry, INotifyPropertyChanged, IEquatable { + public event PropertyChangedEventHandler? PropertyChanged; + + public string? Name + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.Name)); + } + } + + public string? PreviousName { get; set; } + + public string? SourceUrl + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.SourceUrl)); + } + } + + public DateTime CreationTime + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.CreationTime)); + } + } + + public int? ToolboxBuildId + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.ToolboxBuildId)); + } + } + + public bool IsToolboxBuild + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.IsToolboxBuild)); + } + } + + public List? PartyComposition + { + get; + set + { + field = value; + this.OnPropertyChanged(nameof(this.PartyComposition)); + } + } + public List Builds { get; @@ -36,4 +102,9 @@ public override int GetHashCode() { return HashCode.Combine(this.Name, this.PreviousName, this.SourceUrl, this.Builds.Select(c => c.GetHashCode())); } + + private void OnPropertyChanged(string propertyName) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } diff --git a/Daybreak.Shared/Models/Builds/TemplateHeader.cs b/Daybreak.Shared/Models/Builds/TemplateHeader.cs new file mode 100644 index 00000000..27cc18ef --- /dev/null +++ b/Daybreak.Shared/Models/Builds/TemplateHeader.cs @@ -0,0 +1,21 @@ +namespace Daybreak.Shared.Models.Builds; + +public enum TemplateHeader : byte +{ + LegacySkill0, + Equipment, + LegacySkill2, + LegacySkill3, + LegacySkill4, + LegacySkill5, + LegacySkill6, + LegacySkill7, + LegacySkill8, + LegacySkill9, + LegacySkill10, + LegacySkill11, + LegacySkill12, + LegacySkill13, + Skill, + Extension +} diff --git a/Daybreak.Shared/Models/FocusView/BuildComponentContext.cs b/Daybreak.Shared/Models/FocusView/BuildComponentContext.cs index dde4eb2c..383a07a2 100644 --- a/Daybreak.Shared/Models/FocusView/BuildComponentContext.cs +++ b/Daybreak.Shared/Models/FocusView/BuildComponentContext.cs @@ -7,6 +7,5 @@ public sealed class BuildComponentContext public required uint PrimaryProfessionId { get; init; } public required uint UnlockedProfessions { get; init; } public required uint[] CharacterUnlockedSkills { get; init; } - public required uint[] AccountUnlockedSkills { get; init; } public required List AvailableBuilds { get; init; } } diff --git a/Daybreak.Shared/Models/Guildwars/Build.cs b/Daybreak.Shared/Models/Guildwars/Build.cs deleted file mode 100644 index 2653a8b2..00000000 --- a/Daybreak.Shared/Models/Guildwars/Build.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Daybreak.Shared.Models.Builds; - -namespace Daybreak.Shared.Models.Guildwars; - -public sealed class Build -{ - public BuildMetadata? BuildMetadata { get; set; } - public Profession Primary { get; set; } = Profession.None; - public Profession Secondary { get; set; } = Profession.None; - public List Attributes { get; set; } = []; - public List Skills { get; set; } = [Skill.None, Skill.None, Skill.None, Skill.None, Skill.None, Skill.None, Skill.None, Skill.None]; -} diff --git a/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs b/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs deleted file mode 100644 index 0df1753c..00000000 --- a/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs +++ /dev/null @@ -1,124 +0,0 @@ -using Daybreak.Shared.Models.Builds; -using Daybreak.Shared.Utils; -using System.ComponentModel; -using System.Text.Json; - -namespace Daybreak.Shared.Models.Guildwars; - -public abstract class BuildEntryBase : INotifyPropertyChanged, IBuildEntry -{ - public event PropertyChangedEventHandler? PropertyChanged; - - public Dictionary? Metadata { get; set; } - public string? PreviousName { get; set; } - public int? ToolboxBuildId - { - get - { - if (this.Metadata?.TryGetValue(nameof(this.ToolboxBuildId), out var toolBoxBuildString) is true && - int.TryParse(toolBoxBuildString, out var toolboxBuild)) - { - return toolboxBuild; - } - - return default; - } - set - { - this.Metadata ??= []; - this.Metadata[nameof(this.ToolboxBuildId)] = value.HasValue ? value.Value.ToString() : string.Empty; - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.ToolboxBuildId))); - } - } - public bool IsToolboxBuild - { - get - { - if (this.Metadata?.TryGetValue(nameof(this.IsToolboxBuild), out var toolBoxBuildString) is true && - bool.TryParse(toolBoxBuildString, out var toolboxBuild)) - { - return toolboxBuild; - } - - return false; - } - set - { - this.Metadata ??= []; - this.Metadata[nameof(this.IsToolboxBuild)] = value.ToString(); - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.IsToolboxBuild))); - } - } - public DateTime CreationTime - { - get - { - if (this.Metadata?.TryGetValue(nameof(this.CreationTime), out var creationTimeString) is true && - int.TryParse(creationTimeString, out var creationTimeUnix)) - { - return DateTimeOffset.FromUnixTimeSeconds(creationTimeUnix).DateTime; - } - - return DateTime.MinValue; - } - set - { - this.Metadata ??= []; - this.Metadata[nameof(this.CreationTime)] = value.ToUniversalTime().ToSafeDateTimeOffset().ToUnixTimeSeconds().ToString(); - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CreationTime))); - } - } - public string? Name - { - get; - set - { - field = value; - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Name))); - } - } - public string? SourceUrl - { - get - { - if (this.Metadata?.TryGetValue(nameof(this.SourceUrl), out var sourceUrl) is true) - { - return sourceUrl; - } - - return default; - } - set - { - this.Metadata ??= []; - this.Metadata[nameof(this.SourceUrl)] = value ?? string.Empty; - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.SourceUrl))); - } - } - public List? PartyComposition - { - get - { - if (this.Metadata?.TryGetValue(nameof(this.PartyComposition), out var serializedPartyComposition) is true && - !string.IsNullOrWhiteSpace(serializedPartyComposition)) - { - return JsonSerializer.Deserialize>(serializedPartyComposition); - } - - return default; - } - set - { - this.Metadata ??= []; - this.Metadata[nameof(this.PartyComposition)] = value is null - ? string.Empty - : JsonSerializer.Serialize(value); - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.PartyComposition))); - } - } - - protected virtual void OnPropertyChanged(string propertyName) - { - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } -} diff --git a/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs b/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs deleted file mode 100644 index 0a18eeee..00000000 --- a/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Daybreak.Shared.Models.Guildwars; - -public sealed class BuildMetadata -{ - public List? Base64Decoded { get; set; } - public List? BinaryDecoded { get; set; } - public int Header { get; set; } - public int VersionNumber { get; set; } - public int ProfessionIdLength { get; set; } - public int PrimaryProfessionId { get; set; } - public int SecondaryProfessionId { get; set; } - public int AttributeCount { get; set; } - public int AttributesLength { get; set; } - public int SkillsLength { get; set; } - public bool TailPresent { get; set; } - public bool NewTemplate { get; set; } - public List SkillIds { get; set; } = []; - public List AttributesIds { get; set; } = []; - public List AttributePoints { get; set; } = []; -} diff --git a/Daybreak.Shared/Models/Guildwars/PartyLoadoutTemplateMetadata.cs b/Daybreak.Shared/Models/Guildwars/PartyLoadoutTemplateMetadata.cs new file mode 100644 index 00000000..1f2602c3 --- /dev/null +++ b/Daybreak.Shared/Models/Guildwars/PartyLoadoutTemplateMetadata.cs @@ -0,0 +1,37 @@ +namespace Daybreak.Shared.Models.Guildwars; + +/// +/// Parsed metadata from a party loadout template (extended template, type 1). +/// +public readonly struct PartyLoadoutTemplateMetadata( + int version, + int partySize, + List members) +{ + public readonly int Version = version; + public readonly int PartySize = partySize; + public readonly List Members = members; +} + +/// +/// Metadata for a single party member in a party loadout template. +/// +public readonly struct PartyLoadoutMemberMetadata( + PartyCompositionMemberType memberType, + int heroId, + int behavior, + int primaryProfessionId, + int secondaryProfessionId, + List attributeIds, + List attributePoints, + List skillIds) +{ + public readonly PartyCompositionMemberType MemberType = memberType; + public readonly int HeroId = heroId; + public readonly int Behavior = behavior; + public readonly int PrimaryProfessionId = primaryProfessionId; + public readonly int SecondaryProfessionId = secondaryProfessionId; + public readonly List AttributeIds = attributeIds; + public readonly List AttributePoints = attributePoints; + public readonly List SkillIds = skillIds; +} diff --git a/Daybreak.Shared/Models/Guildwars/SkillTemplateMetadata.cs b/Daybreak.Shared/Models/Guildwars/SkillTemplateMetadata.cs new file mode 100644 index 00000000..5afd21d9 --- /dev/null +++ b/Daybreak.Shared/Models/Guildwars/SkillTemplateMetadata.cs @@ -0,0 +1,38 @@ +using Daybreak.Shared.Models.Builds; + +namespace Daybreak.Shared.Models.Guildwars; + +public readonly struct SkillTemplateMetadata( + List? base64Decoded, + List? binaryDecoded, + TemplateHeader header, + int version, + int professionIdLength, + int primaryProfessionId, + int secondaryProfessionId, + int attributeCount, + int attributesLength, + int skillLength, + bool tailPresent, + bool newTemplate, + List skillIds, + List attributeIds, + List attributePoints + ) +{ + public readonly List? Base64Decoded = base64Decoded; + public readonly List? BinaryDecoded = binaryDecoded; + public readonly TemplateHeader Header = header; + public readonly int VersionNumber = version; + public readonly int ProfessionIdLength = professionIdLength; + public readonly int PrimaryProfessionId = primaryProfessionId; + public readonly int SecondaryProfessionId = secondaryProfessionId; + public readonly int AttributeCount = attributeCount; + public readonly int AttributesLength = attributesLength; + public readonly int SkillsLength = skillLength; + public readonly bool TailPresent = tailPresent; + public readonly bool NewTemplate = newTemplate; + public readonly List SkillIds = skillIds; + public readonly List AttributesIds = attributeIds; + public readonly List AttributePoints = attributePoints; +} diff --git a/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs b/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs index c99e8839..3f2555a7 100644 --- a/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs +++ b/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs @@ -3,18 +3,19 @@ using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.BuildTemplates.Models; +using Daybreak.Shared.Services.BuildTemplates.Parsers; using Microsoft.Extensions.Logging; using System.Diagnostics.CodeAnalysis; using System.Extensions; using System.Extensions.Core; using System.Text; using System.Text.Json; -using AttributeEntry = Daybreak.Shared.Models.Builds.AttributeEntry; using Convert = System.Convert; namespace Daybreak.Shared.Services.BuildTemplates; public sealed class BuildTemplateManager( + IEnumerable templateParsers, ILogger logger) : IBuildTemplateManager { private const string DecodingLookupTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; @@ -22,6 +23,7 @@ public sealed class BuildTemplateManager( private List BuildMemoryCache { get; } = []; + private readonly IEnumerable templateParsers = templateParsers.ThrowIfNull(nameof(templateParsers)); private readonly ILogger logger = logger.ThrowIfNull(nameof(logger)); public bool IsTemplate(string template) @@ -31,7 +33,7 @@ public bool IsTemplate(string template) return false; } - if (template.Where(c => DecodingLookupTable.Contains(c) is false).Any()) + if (template.Any(c => DecodingLookupTable.Contains(c) is false)) { return false; } @@ -41,14 +43,11 @@ public bool IsTemplate(string template) public SingleBuildEntry CreateSingleBuild() { - var emptyBuild = new Build(); var name = Guid.NewGuid().ToString(); var entry = new SingleBuildEntry { Name = name, PreviousName = string.Empty, - Attributes = emptyBuild.Attributes, - Skills = emptyBuild.Skills, CreationTime = DateTime.UtcNow }; @@ -58,13 +57,10 @@ public SingleBuildEntry CreateSingleBuild() public SingleBuildEntry CreateSingleBuild(string name) { - var emptyBuild = new Build(); var entry = new SingleBuildEntry { Name = name, PreviousName = string.Empty, - Attributes = emptyBuild.Attributes, - Skills = emptyBuild.Skills, CreationTime = DateTime.UtcNow }; @@ -137,7 +133,9 @@ public SingleBuildEntry ConvertToSingleBuildEntry(TeamBuildEntry teamBuildEntry) singleBuildEntry.Name = teamBuildEntry.Name; singleBuildEntry.PreviousName = teamBuildEntry.PreviousName; singleBuildEntry.SourceUrl = teamBuildEntry.SourceUrl; - singleBuildEntry.Metadata = teamBuildEntry.Metadata; + singleBuildEntry.ToolboxBuildId = teamBuildEntry.ToolboxBuildId; + singleBuildEntry.IsToolboxBuild = teamBuildEntry.IsToolboxBuild; + singleBuildEntry.CreationTime = teamBuildEntry.CreationTime; return singleBuildEntry; } @@ -150,7 +148,9 @@ public TeamBuildEntry ConvertToTeamBuildEntry(SingleBuildEntry singleBuildEntry) PreviousName = singleBuildEntry.PreviousName, SourceUrl = singleBuildEntry.SourceUrl, Builds = [ singleBuildEntry ], - Metadata = singleBuildEntry.Metadata + ToolboxBuildId = singleBuildEntry.ToolboxBuildId, + IsToolboxBuild = singleBuildEntry.IsToolboxBuild, + CreationTime = singleBuildEntry.CreationTime }; return teamBuildEntry; @@ -256,34 +256,7 @@ public bool CanTemplateApply(BuildTemplateValidationRequest request) public void SaveBuild(IBuildEntry buildEntry) { - var encodedBuild = new StringBuilder(); - if (buildEntry is SingleBuildEntry singleBuild) - { - var build = new Build - { - Attributes = singleBuild.Attributes, - Primary = singleBuild.Primary, - Secondary = singleBuild.Secondary, - Skills = singleBuild.Skills - }; - - encodedBuild.Append(this.EncodeTemplateInner(build)); - } - else if (buildEntry is TeamBuildEntry teamBuild) - { - foreach(var singleBuildEntry in teamBuild.Builds) - { - var build = new Build - { - Attributes = singleBuildEntry.Attributes, - Primary = singleBuildEntry.Primary, - Secondary = singleBuildEntry.Secondary, - Skills = singleBuildEntry.Skills - }; - - encodedBuild.Append(this.EncodeTemplateInner(build)).Append(' '); - } - } + var encodedBuild = this.EncodeTemplate(buildEntry); var newPath = Path.Combine(BuildsPath, $"{buildEntry.Name}.txt"); if (string.IsNullOrWhiteSpace(buildEntry.PreviousName) is false) @@ -296,12 +269,7 @@ public void SaveBuild(IBuildEntry buildEntry) } Directory.CreateDirectory(Path.GetDirectoryName(newPath)!); - var metadata = buildEntry.Metadata is not null - ? Convert.ToBase64String( - Encoding.UTF8.GetBytes( - JsonSerializer.Serialize(buildEntry.Metadata))) - : string.Empty; - File.WriteAllText(newPath, $"{encodedBuild.ToString().Trim()}\n{metadata}"); + File.WriteAllText(newPath, encodedBuild); // Remove the build from the memory cache once it's created on disk this.BuildMemoryCache.Remove(buildEntry); @@ -371,32 +339,48 @@ public IBuildEntry DecodeTemplate(string template) { var randomName = Guid.NewGuid().ToString(); var builds = this.DecodeTemplatesInner(template); - return builds is null - ? throw new InvalidOperationException("Failed to decode build template") - : builds.Length == 1 ? - new SingleBuildEntry - { - Name = randomName, - PreviousName = randomName, - Primary = builds[0].Primary, - Secondary = builds[0].Secondary, - Attributes = builds[0].Attributes, - Skills = builds[0].Skills - } : - new TeamBuildEntry - { - Name = randomName, - PreviousName = randomName, - Builds = [.. builds.Select(b => new SingleBuildEntry - { - Name = randomName, - PreviousName = randomName, - Primary = b.Primary, - Secondary = b.Secondary, - Attributes = b.Attributes, - Skills = b.Skills - })] - }; + if (builds is null) + { + throw new InvalidOperationException("Failed to decode build template"); + } + + // If we got a single TeamBuildEntry (e.g., from party loadout), return it directly + if (builds.Length == 1 && builds[0] is TeamBuildEntry teamBuild) + { + teamBuild.Name = randomName; + teamBuild.PreviousName = randomName; + return teamBuild; + } + + // Otherwise, handle as before: single or multiple skill templates + if (builds.Length == 1 && builds[0] is SingleBuildEntry single) + { + return new SingleBuildEntry + { + Name = randomName, + PreviousName = randomName, + Primary = single.Primary, + Secondary = single.Secondary, + Attributes = single.Attributes, + Skills = single.Skills + }; + } + + // Multiple templates -> TeamBuildEntry + return new TeamBuildEntry + { + Name = randomName, + PreviousName = randomName, + Builds = [.. builds.OfType().Select(b => new SingleBuildEntry + { + Name = randomName, + PreviousName = randomName, + Primary = b.Primary, + Secondary = b.Secondary, + Attributes = b.Attributes, + Skills = b.Skills + })] + }; } public bool TryDecodeTemplate(string template, [NotNullWhen(true)] out IBuildEntry? build) @@ -407,30 +391,46 @@ public bool TryDecodeTemplate(string template, [NotNullWhen(true)] out IBuildEnt if (maybeBuilds is not null) { var randomName = Guid.NewGuid().ToString(); - build = maybeBuilds.Length == 1 ? - new SingleBuildEntry + + // If we got a single TeamBuildEntry (e.g., from party loadout), return it directly + if (maybeBuilds.Length == 1 && maybeBuilds[0] is TeamBuildEntry teamBuild) + { + teamBuild.Name = randomName; + teamBuild.PreviousName = randomName; + build = teamBuild; + return true; + } + + // Otherwise, handle as before: single or multiple skill templates + if (maybeBuilds.Length == 1 && maybeBuilds[0] is SingleBuildEntry single) + { + build = new SingleBuildEntry { Name = randomName, PreviousName = randomName, - Primary = maybeBuilds[0].Primary, - Secondary = maybeBuilds[0].Secondary, - Attributes = maybeBuilds[0].Attributes, - Skills = maybeBuilds[0].Skills - } : - new TeamBuildEntry + Primary = single.Primary, + Secondary = single.Secondary, + Attributes = single.Attributes, + Skills = single.Skills + }; + return true; + } + + // Multiple templates -> TeamBuildEntry + build = new TeamBuildEntry + { + Name = randomName, + PreviousName = randomName, + Builds = maybeBuilds.OfType().Select(b => new SingleBuildEntry { Name = randomName, PreviousName = randomName, - Builds = maybeBuilds.Select(b => new SingleBuildEntry - { - Name = randomName, - PreviousName = randomName, - Primary = b.Primary, - Secondary = b.Secondary, - Attributes = b.Attributes, - Skills = b.Skills - }).ToList() - }; + Primary = b.Primary, + Secondary = b.Secondary, + Attributes = b.Attributes, + Skills = b.Skills + }).ToList() + }; return true; } @@ -449,30 +449,21 @@ public string EncodeTemplate(IBuildEntry build) { if (build is SingleBuildEntry singleBuildEntry) { - var preparedBuild = new Build - { - Primary = singleBuildEntry.Primary, - Secondary = singleBuildEntry.Secondary, - Attributes = singleBuildEntry.Attributes, - Skills = singleBuildEntry.Skills - }; - - return this.EncodeTemplateInner(preparedBuild); + return this.EncodeTemplateInner(singleBuildEntry); } else if (build is TeamBuildEntry teamBuildEntry) { + // If the team build has party composition, encode as party loadout + if (teamBuildEntry.PartyComposition is { Count: > 0 }) + { + return this.EncodeTemplateInner(teamBuildEntry); + } + + // Otherwise, encode as space-separated skill templates var encodedString = new StringBuilder(); foreach(var teamBuild in teamBuildEntry.Builds) { - var preparedBuild = new Build - { - Primary = teamBuild.Primary, - Secondary = teamBuild.Secondary, - Attributes = teamBuild.Attributes, - Skills = teamBuild.Skills - }; - - encodedString.Append(this.EncodeTemplateInner(preparedBuild)).Append(' '); + encodedString.Append(this.EncodeTemplateInner(teamBuild)).Append(' '); } return encodedString.ToString().Trim(); @@ -584,7 +575,7 @@ private SingleBuildEntry PopulateSingleBuild(SingleBuildEntry singleBuildEntry, build.Name = buildName; build.PreviousName = buildName; - if (content.Length > 1) + if (content.Length > 1 && !string.IsNullOrWhiteSpace(content[1])) { // This check has to stay in place for backwards compatibility. If the second line in a build is url, it is the source Url of the build. Otherwise, it is a base64 encoded metadata of the build if (Uri.TryCreate(content[1], UriKind.Absolute, out var sourceUrl)) @@ -595,10 +586,44 @@ private SingleBuildEntry PopulateSingleBuild(SingleBuildEntry singleBuildEntry, { try { - build.Metadata = - JsonSerializer.Deserialize>( + var legacyMetadata = JsonSerializer.Deserialize>( Encoding.UTF8.GetString( Convert.FromBase64String(content[1]))); + + // Extract legacy metadata into proper properties + if (legacyMetadata is not null) + { + if (legacyMetadata.TryGetValue("SourceUrl", out var sourceUrlValue)) + { + build.SourceUrl = sourceUrlValue; + } + + if (legacyMetadata.TryGetValue("CreationTime", out var creationTimeString) && + int.TryParse(creationTimeString, out var creationTimeUnix)) + { + build.CreationTime = DateTimeOffset.FromUnixTimeSeconds(creationTimeUnix).DateTime; + } + + if (legacyMetadata.TryGetValue("ToolboxBuildId", out var toolboxIdString) && + int.TryParse(toolboxIdString, out var toolboxId)) + { + build.ToolboxBuildId = toolboxId; + } + + if (legacyMetadata.TryGetValue("IsToolboxBuild", out var isToolboxBuildString) && + bool.TryParse(isToolboxBuildString, out var isToolboxBuild)) + { + build.IsToolboxBuild = isToolboxBuild; + } + + // Extract party composition for team builds + if (build is TeamBuildEntry teamBuild && + legacyMetadata.TryGetValue("PartyComposition", out var partyCompositionJson) && + !string.IsNullOrWhiteSpace(partyCompositionJson)) + { + teamBuild.PartyComposition = JsonSerializer.Deserialize>(partyCompositionJson); + } + } } catch(Exception ex) { @@ -616,7 +641,7 @@ private SingleBuildEntry PopulateSingleBuild(SingleBuildEntry singleBuildEntry, return build; } - private Build[]? DecodeTemplatesInner(string template) + private IBuildEntry[]? DecodeTemplatesInner(string template) { var buildTemplates = template.Split(' ').Where(s => !s.IsNullOrWhiteSpace()).ToArray(); if (buildTemplates.Length == 0) @@ -624,8 +649,8 @@ private SingleBuildEntry PopulateSingleBuild(SingleBuildEntry singleBuildEntry, return []; } - var builds = new Build[buildTemplates.Length]; - for(var i = 0; i < builds.Length; i++) + var builds = new List(); + for(var i = 0; i < buildTemplates.Length; i++) { var result = this.DecodeTemplateInner(buildTemplates[i]); if (result is null) @@ -633,107 +658,81 @@ private SingleBuildEntry PopulateSingleBuild(SingleBuildEntry singleBuildEntry, return default; } - builds[i] = result; + builds.Add(result); } - return builds; + return [.. builds]; } - private Build? DecodeTemplateInner(string template) + private IBuildEntry? DecodeTemplateInner(string template) { var scopedLogger = this.logger.CreateScopedLogger(); scopedLogger.LogDebug("Attempting to decode template"); - var buildMetadata = ParseEncodedTemplate(template); - scopedLogger.LogDebug("Decoded template. Beginning parsing"); - if (buildMetadata.VersionNumber != 0) - { - scopedLogger.LogError("Expected version number to be 0 but found {buildMetadata.VersionNumber}", buildMetadata.VersionNumber); - return default; - } - - var build = new Build() - { - BuildMetadata = buildMetadata, - Skills = [] - }; - - if (Profession.TryParse(buildMetadata.PrimaryProfessionId, out var primaryProfession) is false) - { - scopedLogger.LogError("Failed to parse profession with id {buildMetadata.PrimaryProfessionId}", buildMetadata.PrimaryProfessionId); - return default; - } - - build.Primary = primaryProfession; - if (Profession.TryParse(buildMetadata.SecondaryProfessionId, out var secondaryProfession) is false) - { - scopedLogger.LogError("Failed to parse profession with id {buildMetadata.SecondaryProfessionId}", buildMetadata.SecondaryProfessionId); - return default; - } - - build.Secondary = secondaryProfession; - /* - * Prepopulate the attributes first and then populate the attribute points based on ids. - */ - - if (primaryProfession != Profession.None) - { - build.Attributes.Add(new AttributeEntry { Attribute = primaryProfession.PrimaryAttribute }); - build.Attributes.AddRange(primaryProfession.Attributes?.Select(a => new AttributeEntry { Attribute = a }) ?? []); - } - if (secondaryProfession != Profession.None) + // Decode base64 to binary + var base64Decoded = template.Select(c => DecodingLookupTable.IndexOf(c)).ToList(); + var binaryDecoded = base64Decoded.Select(ToBitString).ToList(); + var bitString = string.Join("", binaryDecoded); + var stream = new DecodeCharStream([.. binaryDecoded]); + + // Read header to determine template type + var headerValue = stream.Read(4); + var header = (TemplateHeader)headerValue; + + // Create decode context + var context = new DecodeContext(template, bitString, stream); + + // Try skill template parsers first + var skillParser = this.templateParsers.OfType>().FirstOrDefault(p => p.CanDecode(header)); + if (skillParser is not null) { - build.Attributes.AddRange(secondaryProfession.Attributes?.Select(a => new AttributeEntry { Attribute = a }) ?? []); + var buildMetadata = skillParser.Decode(context); + scopedLogger.LogDebug("Decoded skill template. Creating build entry"); + return skillParser.CreateBuildEntry(buildMetadata); } - for(int i = 0; i < buildMetadata.AttributeCount; i++) + // Try party loadout parser + var partyLoadoutParser = this.templateParsers.OfType>().FirstOrDefault(p => p.CanDecode(header)); + if (partyLoadoutParser is not null) { - var attributeId = buildMetadata.AttributesIds[i]; - var maybeAttribute = build.Attributes.FirstOrDefault(a => a.Attribute?.Id == attributeId); - if (maybeAttribute is null) - { - scopedLogger.LogError("Failed to parse attribute with id {attributeId} for professions {primaryProfession.Name}/{secondaryProfession.Name}", attributeId, primaryProfession.Name ?? string.Empty, secondaryProfession.Name ?? string.Empty); - return default; - } - - maybeAttribute.Points = buildMetadata.AttributePoints[i]; + var partyMetadata = partyLoadoutParser.Decode(context); + scopedLogger.LogDebug("Decoded party loadout template. Creating build entry"); + return partyLoadoutParser.CreateBuildEntry(partyMetadata); } - for(int i = 0; i < 8; i++) - { - if (Skill.TryParse(buildMetadata.SkillIds[i], out var skill) is false) - { - scopedLogger.LogError("Failed to parse skill with id {skillId}", buildMetadata.SkillIds[i]); - return default; - } + scopedLogger.LogError("No parser found for template header {header}", header); + return default; + } - build.Skills.Add(skill); - } + private string EncodeTemplateInner(SingleBuildEntry buildEntry) + { + return this.EncodeTemplateInner((IBuildEntry)buildEntry); + } - scopedLogger.LogDebug("Successfully parsed build template"); - return build; + private string EncodeTemplateInner(TeamBuildEntry buildEntry) + { + return this.EncodeTemplateInner((IBuildEntry)buildEntry); } - private string EncodeTemplateInner(Build build) + private string EncodeTemplateInner(IBuildEntry buildEntry) { var scopedLogger = this.logger.CreateScopedLogger(); - scopedLogger.LogDebug("Building build metadata"); - var buildMetadata = new BuildMetadata - { - VersionNumber = 0, - NewTemplate = true, - Header = 14, - PrimaryProfessionId = build.Primary.Id, - SecondaryProfessionId = build.Secondary.Id, - AttributeCount = build.Attributes.Count(attrEntry => attrEntry.Points > 0), - AttributesIds = [.. build.Attributes.Where(attrEntry => attrEntry.Points > 0).OrderBy(attrEntry => attrEntry.Attribute?.Id).Select(attrEntry => attrEntry.Attribute?.Id ?? -1)], - AttributePoints = [.. build.Attributes.Where(attrEntry => attrEntry.Points > 0).OrderBy(attrEntry => attrEntry.Attribute?.Id).Select(attrEntry => attrEntry.Points)], - SkillIds = [.. build.Skills.Select(skill => skill.Id)], - TailPresent = true - }; - - scopedLogger.LogDebug("Encoding metadata into binary"); - var encodedBinary = BuildEncodedString(buildMetadata); + scopedLogger.LogDebug("Encoding build to template"); + + // Find the appropriate parser for encoding + var parser = this.templateParsers.FirstOrDefault(p => p.CanEncode(buildEntry)); + if (parser is null) + { + scopedLogger.LogError("No parser found that can encode this build"); + throw new InvalidOperationException("No parser found that can encode this build"); + } + + // Create encode context and encode + var stream = new EncodeCharStream(); + var context = new EncodeContext(buildEntry, stream); + var encodedBinary = parser.Encode(context); + + // Convert binary string to base64 int index = 0; var encodedBase64 = new List(); while (index < encodedBinary.Length) @@ -764,112 +763,6 @@ private static string ToBitString(int value) return sb.ToString(); } - private static BuildMetadata ParseEncodedTemplate(string template) - { - var curedTemplate = template.Trim(); - - var buildMetadata = new BuildMetadata - { - Base64Decoded = [.. template.Select(c => DecodingLookupTable.IndexOf(c))], - }; - buildMetadata.BinaryDecoded = [.. buildMetadata.Base64Decoded.Select(ToBitString)]; - - var stream = new DecodeCharStream([.. buildMetadata.BinaryDecoded]); - buildMetadata.Header = stream.Read(4); - if (buildMetadata.Header == 14) - { - buildMetadata.VersionNumber = stream.Read(4); - buildMetadata.NewTemplate = true; - } - else - { - buildMetadata.VersionNumber = buildMetadata.Header; - buildMetadata.NewTemplate = false; - } - - buildMetadata.ProfessionIdLength = (stream.Read(2) * 2) + 4; - buildMetadata.PrimaryProfessionId = stream.Read(buildMetadata.ProfessionIdLength); - buildMetadata.SecondaryProfessionId = stream.Read(buildMetadata.ProfessionIdLength); - buildMetadata.AttributeCount = stream.Read(4); - buildMetadata.AttributesLength = stream.Read(4) + 4; - for (int i = 0; i < buildMetadata.AttributeCount; i++) - { - buildMetadata.AttributesIds.Add(stream.Read(buildMetadata.AttributesLength)); - buildMetadata.AttributePoints.Add(stream.Read(4)); - } - - buildMetadata.SkillsLength = stream.Read(4) + 8; - for (int i = 0; i < 8; i++) - { - buildMetadata.SkillIds.Add(stream.Read(buildMetadata.SkillsLength)); - } - - if (stream.Position < stream.Length - 1) - { - buildMetadata.TailPresent = true; - } - - return buildMetadata; - } - - private static string BuildEncodedString(BuildMetadata buildMetadata) - { - var stream = new EncodeCharStream(); - if(buildMetadata.NewTemplate || buildMetadata.Header == 14) - { - stream.Write(14, 4); - } - - stream.Write(0, 4); - - var desiredProfessionIdLength = GetBitLength(new List { buildMetadata.PrimaryProfessionId, buildMetadata.SecondaryProfessionId }.Max()); - var professionIdLength = Math.Max((desiredProfessionIdLength - 4) / 2, 0); - var finalProfessionIdLength = (professionIdLength * 2) + 4; - stream.Write(professionIdLength, 2); - stream.Write(buildMetadata.PrimaryProfessionId, finalProfessionIdLength); - stream.Write(buildMetadata.SecondaryProfessionId, finalProfessionIdLength); - - stream.Write(buildMetadata.AttributeCount, 4); - var desiredAttributesLength = GetBitLength(buildMetadata.AttributesIds.Count != 0 ? buildMetadata.AttributesIds.Max() : 0); - var attributesLength = Math.Max(desiredAttributesLength - 4, 0); - var finalAttributesLength = attributesLength + 4; - stream.Write(attributesLength, 4); - for(int i = 0; i < buildMetadata.AttributeCount; i++) - { - stream.Write(buildMetadata.AttributesIds[i], finalAttributesLength); - stream.Write(buildMetadata.AttributePoints[i], 4); - } - - var desiredSkillsLength = GetBitLength(buildMetadata.SkillIds.Max()); - var skillsLength = Math.Max(desiredSkillsLength - 8, 0); - var finalSkillsLength = skillsLength + 8; - stream.Write(skillsLength, 4); - for(int i = 0; i < 8; i++) - { - stream.Write(buildMetadata.SkillIds[i], finalSkillsLength); - } - - if (buildMetadata.TailPresent) - { - stream.Write(0, 1); - } - - return stream.GetEncodedString(); - } - - private static int GetBitLength(int value) - { - int decimals = 1; - value /= 2; - while (value > 0) - { - decimals++; - value /= 2; - } - - return decimals; - } - private static int FromBitString(string bitString) { var sb = new StringBuilder(bitString); diff --git a/Daybreak.Shared/Services/BuildTemplates/IAttributePointCalculator.cs b/Daybreak.Shared/Services/BuildTemplates/IAttributePointCalculator.cs index e898ef4d..49a41e9e 100644 --- a/Daybreak.Shared/Services/BuildTemplates/IAttributePointCalculator.cs +++ b/Daybreak.Shared/Services/BuildTemplates/IAttributePointCalculator.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Builds; -using Daybreak.Shared.Models.Guildwars; namespace Daybreak.Shared.Services.BuildTemplates; @@ -8,12 +7,8 @@ public interface IAttributePointCalculator int MaximumAttributePoints { get; } int GetPointsRequiredToIncreaseRank(int currentRank); - - int GetRemainingFreePoints(Build build); int GetRemainingFreePoints(SingleBuildEntry build); - int GetUsedPoints(Build build); - int GetUsedPoints(SingleBuildEntry build); } diff --git a/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs b/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs index 9370204f..400ea28f 100644 --- a/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs +++ b/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs @@ -1,6 +1,6 @@ namespace Daybreak.Shared.Services.BuildTemplates.Models; -internal sealed class DecodeCharStream(string[] encodedValues) +public sealed class DecodeCharStream(string[] encodedValues) { private readonly string innerCharArray = string.Join("", encodedValues); diff --git a/Daybreak.Shared/Services/BuildTemplates/Models/EncodeCharStream.cs b/Daybreak.Shared/Services/BuildTemplates/Models/EncodeCharStream.cs index 6304b33c..08783f5f 100644 --- a/Daybreak.Shared/Services/BuildTemplates/Models/EncodeCharStream.cs +++ b/Daybreak.Shared/Services/BuildTemplates/Models/EncodeCharStream.cs @@ -2,7 +2,7 @@ namespace Daybreak.Shared.Services.BuildTemplates.Models; -internal sealed class EncodeCharStream +public sealed class EncodeCharStream { private readonly StringBuilder innerStringBuilder = new(); @@ -18,7 +18,7 @@ public string GetEncodedString() private void EncodeToBinary(int value, int count) { - while(value > 0 && count > 0) + while (value > 0 && count > 0) { this.innerStringBuilder.Append(value % 2 == 1 ? '1' : '0'); value /= 2; diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/DecodeContext.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/DecodeContext.cs new file mode 100644 index 00000000..87615edc --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/DecodeContext.cs @@ -0,0 +1,13 @@ +using Daybreak.Shared.Services.BuildTemplates.Models; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +public readonly struct DecodeContext( + string encodedString, + string bitString, + DecodeCharStream decodeCharStream) +{ + public readonly string EncodedString = encodedString; + public readonly string BitString = bitString; + public readonly DecodeCharStream DecodeCharStream = decodeCharStream; +} \ No newline at end of file diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/EncodeContext.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/EncodeContext.cs new file mode 100644 index 00000000..656885c5 --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/EncodeContext.cs @@ -0,0 +1,12 @@ +using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Services.BuildTemplates.Models; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +public readonly struct EncodeContext( + IBuildEntry buildEntry, + EncodeCharStream encodeCharStream) +{ + public readonly IBuildEntry BuildEntry = buildEntry; + public readonly EncodeCharStream EncodeCharStream = encodeCharStream; +} \ No newline at end of file diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/ITemplateParser.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/ITemplateParser.cs new file mode 100644 index 00000000..06b0f720 --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/ITemplateParser.cs @@ -0,0 +1,18 @@ +using Daybreak.Shared.Models.Builds; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +public interface ITemplateParser + : ITemplateParser + where TTemplateContext : struct +{ + TTemplateContext Decode(DecodeContext context); + IBuildEntry CreateBuildEntry(TTemplateContext templateContext); +} + +public interface ITemplateParser +{ + bool CanDecode(TemplateHeader header); + bool CanEncode(IBuildEntry buildEntry); + string Encode(EncodeContext context); +} \ No newline at end of file diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/LegacySkillTemplateParser.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/LegacySkillTemplateParser.cs new file mode 100644 index 00000000..46b55def --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/LegacySkillTemplateParser.cs @@ -0,0 +1,96 @@ +using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Models.Guildwars; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +/// +/// Parser for legacy skill templates (header values 0, 2-13). +/// See for details on the skill template format. +/// +public sealed class LegacySkillTemplateParser : SkillTemplateParserBase, ITemplateParser +{ + public bool CanDecode(TemplateHeader header) + { + return header switch + { + TemplateHeader.LegacySkill0 => true, + TemplateHeader.LegacySkill2 => true, + TemplateHeader.LegacySkill3 => true, + TemplateHeader.LegacySkill4 => true, + TemplateHeader.LegacySkill5 => true, + TemplateHeader.LegacySkill6 => true, + TemplateHeader.LegacySkill7 => true, + TemplateHeader.LegacySkill8 => true, + TemplateHeader.LegacySkill9 => true, + TemplateHeader.LegacySkill10 => true, + TemplateHeader.LegacySkill11 => true, + TemplateHeader.LegacySkill12 => true, + TemplateHeader.LegacySkill13 => true, + _ => false + }; + } + + public SkillTemplateMetadata Decode(DecodeContext context) + { + // For legacy templates, header was already read and IS the version + // The stream position is already past the header (4 bits) + // Decode embedded build (professions, attributes, skills) + var (primaryProfessionId, secondaryProfessionId, attributeIds, attributePoints, skillIds) = DecodeEmbeddedBuild(context); + + // Calculate lengths for metadata (reverse the formulas) + var professionIdLength = GetBitLength(Math.Max(primaryProfessionId, secondaryProfessionId)); + professionIdLength = Math.Max(4, ((professionIdLength - 4) / 2 * 2) + 4); // Normalize to valid length + var attributesLength = GetBitLength(attributeIds.Count > 0 ? attributeIds.Max() : 0); + attributesLength = Math.Max(4, attributesLength); + var skillsLength = GetBitLength(skillIds.Count > 0 ? skillIds.Max() : 0); + skillsLength = Math.Max(8, skillsLength); + + // Check for tail + var tailPresent = context.DecodeCharStream.Position < context.DecodeCharStream.Length - 1; + return new SkillTemplateMetadata( + base64Decoded: [], + binaryDecoded: [], + header: TemplateHeader.LegacySkill0, // Will be set by caller based on actual header + version: 0, // Legacy templates use header as version, but we normalize to 0 for processing + professionIdLength: professionIdLength, + primaryProfessionId: primaryProfessionId, + secondaryProfessionId: secondaryProfessionId, + attributeCount: attributeIds.Count, + attributesLength: attributesLength, + skillLength: skillsLength, + tailPresent: tailPresent, + newTemplate: false, + skillIds: skillIds, + attributeIds: attributeIds, + attributePoints: attributePoints + ); + } + + public IBuildEntry CreateBuildEntry(SkillTemplateMetadata templateContext) + { + var singleBuildEntry = new SingleBuildEntry(); + Profession.TryParse(templateContext.PrimaryProfessionId, out var primary); + Profession.TryParse(templateContext.SecondaryProfessionId, out var secondary); + + singleBuildEntry.Primary = primary ?? Profession.None; + singleBuildEntry.Secondary = secondary ?? Profession.None; + singleBuildEntry.Attributes = [.. templateContext.AttributesIds + .Select((id, index) => new AttributeEntry + { + Attribute = Shared.Models.Guildwars.Attribute.TryParse(id, out var attr) ? attr : Shared.Models.Guildwars.Attribute.None, + Points = templateContext.AttributePoints[index] + })]; + singleBuildEntry.Skills = [.. templateContext.SkillIds.Select(id => Skill.TryParse(id, out var skill) ? skill : Skill.None)]; + return singleBuildEntry; + } + + public bool CanEncode(IBuildEntry buildEntry) + { + return false; + } + + public string Encode(EncodeContext context) + { + throw new NotSupportedException("Legacy skill templates cannot be encoded."); + } +} diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/PartyLoadoutTemplateParser.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/PartyLoadoutTemplateParser.cs new file mode 100644 index 00000000..b6a6c13f --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/PartyLoadoutTemplateParser.cs @@ -0,0 +1,215 @@ +using Daybreak.Shared.Models.Api; +using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Models.Guildwars; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +/// +/// Parser for party loadout templates (extended template header 15, type 1). +/// See for format details. +/// +public sealed class PartyLoadoutTemplateParser : SkillTemplateParserBase, ITemplateParser +{ + private const int ExtendedTemplateHeader = 15; + private const int PartyLoadoutType = 1; + private const int CurrentVersion = 1; + + public bool CanDecode(TemplateHeader header) + { + return header == TemplateHeader.Extension; + } + + public PartyLoadoutTemplateMetadata Decode(DecodeContext context) + { + // Header 15 was already read, now read type (8 bits) + var type = context.DecodeCharStream.Read(8); + if (type != PartyLoadoutType) + { + throw new InvalidOperationException($"Unknown extended template type: {type}"); + } + + // Read version (4 bits) + var version = context.DecodeCharStream.Read(4); + + // Read party size (4 bits) + var partySize = context.DecodeCharStream.Read(4); + + var members = new List(); + for (int i = 0; i < partySize; i++) + { + var member = DecodePartyMember(context); + members.Add(member); + } + + return new PartyLoadoutTemplateMetadata(version, partySize, members); + } + + private static PartyLoadoutMemberMetadata DecodePartyMember(DecodeContext context) + { + // Read member type (2 bits) + var memberTypeCode = context.DecodeCharStream.Read(2); + var memberType = memberTypeCode switch + { + 0 => PartyCompositionMemberType.Player, + 1 => PartyCompositionMemberType.Henchman, + 2 => PartyCompositionMemberType.Hero, + _ => PartyCompositionMemberType.Unknown + }; + + // Read hero ID (6 bits) - only meaningful for heroes + var heroId = context.DecodeCharStream.Read(6); + + // Read behavior (2 bits) + var behavior = context.DecodeCharStream.Read(2); + + // Read embedded build + var (primaryId, secondaryId, attributeIds, attributePoints, skillIds) = DecodeEmbeddedBuild(context); + + return new PartyLoadoutMemberMetadata( + memberType, + heroId, + behavior, + primaryId, + secondaryId, + attributeIds, + attributePoints, + skillIds); + } + + public IBuildEntry CreateBuildEntry(PartyLoadoutTemplateMetadata templateContext) + { + var teamBuild = new TeamBuildEntry(); + var partyComposition = new List(); + + for (int i = 0; i < templateContext.Members.Count; i++) + { + var member = templateContext.Members[i]; + + var singleBuild = new SingleBuildEntry(); + Profession.TryParse(member.PrimaryProfessionId, out var primary); + Profession.TryParse(member.SecondaryProfessionId, out var secondary); + + singleBuild.Primary = primary ?? Profession.None; + singleBuild.Secondary = secondary ?? Profession.None; + singleBuild.Attributes = [.. member.AttributeIds + .Select((id, idx) => new Shared.Models.Builds.AttributeEntry + { + Attribute = Shared.Models.Guildwars.Attribute.TryParse(id, out var attr) ? attr : Shared.Models.Guildwars.Attribute.None, + Points = member.AttributePoints[idx] + })]; + singleBuild.Skills = [.. member.SkillIds.Select(id => Skill.TryParse(id, out var skill) ? skill : Skill.None)]; + + teamBuild.Builds.Add(singleBuild); + + // Build party composition metadata + var behavior = member.Behavior switch + { + 0 => HeroBehavior.Fight, + 1 => HeroBehavior.Guard, + 2 => HeroBehavior.Avoid, + _ => HeroBehavior.Undefined + }; + + // The first player in the party is the main player + var memberType = member.MemberType == PartyCompositionMemberType.Player && i == 0 + ? PartyCompositionMemberType.MainPlayer + : member.MemberType; + + partyComposition.Add(new PartyCompositionMetadataEntry + { + Type = memberType, + Index = i, + HeroId = member.MemberType == PartyCompositionMemberType.Hero ? member.HeroId : null, + Behavior = behavior + }); + } + + // Set party composition all at once (the property serializes to Metadata) + teamBuild.PartyComposition = partyComposition; + + return teamBuild; + } + + public bool CanEncode(IBuildEntry buildEntry) + { + return buildEntry is TeamBuildEntry; + } + + public string Encode(EncodeContext context) + { + if (context.BuildEntry is not TeamBuildEntry teamBuild) + { + throw new InvalidOperationException("PartyLoadoutTemplateParser can only encode TeamBuildEntry."); + } + + var stream = context.EncodeCharStream; + + // Write header (15) + stream.Write(ExtendedTemplateHeader, 4); + + // Write type (1 = party loadout) + stream.Write(PartyLoadoutType, 8); + + // Write version (1) + stream.Write(CurrentVersion, 4); + + // Write party size + var partySize = teamBuild.Builds.Count; + stream.Write(partySize, 4); + + var partyComposition = teamBuild.PartyComposition ?? []; + + // Write each party member + for (int i = 0; i < partySize; i++) + { + var build = teamBuild.Builds[i]; + var composition = i < partyComposition.Count + ? partyComposition[i] + : new PartyCompositionMetadataEntry + { + Type = PartyCompositionMemberType.Player, + Index = i, + HeroId = null, + Behavior = HeroBehavior.Guard + }; + + EncodePartyMember(stream, build, composition); + } + + return stream.GetEncodedString(); + } + + private static void EncodePartyMember( + Models.EncodeCharStream stream, + SingleBuildEntry build, + PartyCompositionMetadataEntry composition) + { + // Write member type (2 bits) + var memberTypeCode = composition.Type switch + { + PartyCompositionMemberType.Player => 0, + PartyCompositionMemberType.MainPlayer => 0, + PartyCompositionMemberType.Henchman => 1, + PartyCompositionMemberType.Hero => 2, + _ => 0 + }; + stream.Write(memberTypeCode, 2); + + // Write hero ID (6 bits) + var heroId = composition.HeroId ?? 0; + stream.Write(heroId, 6); + + // Write behavior (2 bits) + var behaviorCode = composition.Behavior switch + { + HeroBehavior.Fight => 0, + HeroBehavior.Guard => 1, + HeroBehavior.Avoid => 2, + _ => 1 // Default to Guard + }; + stream.Write(behaviorCode, 2); + + // Write embedded build + EncodeEmbeddedBuild(stream, build); + } +} diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParser.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParser.cs new file mode 100644 index 00000000..dd41f6df --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParser.cs @@ -0,0 +1,103 @@ +using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Models.Guildwars; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +/// +/// See for details on the skill template format. +/// +public sealed class SkillTemplateParser : SkillTemplateParserBase, ITemplateParser +{ + private const int SkillTemplateHeader = 14; + private const int CurrentVersion = 0; + + public bool CanDecode(TemplateHeader header) + { + return header == TemplateHeader.Skill; + } + + public SkillTemplateMetadata Decode(DecodeContext context) + { + // Header 14 was already read, now read version + var version = context.DecodeCharStream.Read(4); + + // Decode embedded build (professions, attributes, skills) + var (primaryProfessionId, secondaryProfessionId, attributeIds, attributePoints, skillIds) = DecodeEmbeddedBuild(context); + + // Calculate lengths for metadata (reverse the formulas) + var professionIdLength = GetBitLength(Math.Max(primaryProfessionId, secondaryProfessionId)); + professionIdLength = Math.Max(4, ((professionIdLength - 4) / 2 * 2) + 4); // Normalize to valid length + var attributesLength = GetBitLength(attributeIds.Count > 0 ? attributeIds.Max() : 0); + attributesLength = Math.Max(4, attributesLength); + var skillsLength = GetBitLength(skillIds.Count > 0 ? skillIds.Max() : 0); + skillsLength = Math.Max(8, skillsLength); + + // Check for optional trailing bit + var tailPresent = context.DecodeCharStream.Position < context.DecodeCharStream.Length - 1; + + return new SkillTemplateMetadata( + base64Decoded: [], + binaryDecoded: [], + header: TemplateHeader.Skill, + version: version, + professionIdLength: professionIdLength, + primaryProfessionId: primaryProfessionId, + secondaryProfessionId: secondaryProfessionId, + attributeCount: attributeIds.Count, + attributesLength: attributesLength, + skillLength: skillsLength, + tailPresent: tailPresent, + newTemplate: true, + skillIds: skillIds, + attributeIds: attributeIds, + attributePoints: attributePoints + ); + } + + public IBuildEntry CreateBuildEntry(SkillTemplateMetadata templateContext) + { + var singleBuildEntry = new SingleBuildEntry(); + Profession.TryParse(templateContext.PrimaryProfessionId, out var primary); + Profession.TryParse(templateContext.SecondaryProfessionId, out var secondary); + + singleBuildEntry.Primary = primary ?? Profession.None; + singleBuildEntry.Secondary = secondary ?? Profession.None; + singleBuildEntry.Attributes = [.. templateContext.AttributesIds + .Select((id, index) => new AttributeEntry + { + Attribute = Shared.Models.Guildwars.Attribute.TryParse(id, out var attr) ? attr : Shared.Models.Guildwars.Attribute.None, + Points = templateContext.AttributePoints[index] + })]; + singleBuildEntry.Skills = [.. templateContext.SkillIds.Select(id => Skill.TryParse(id, out var skill) ? skill : Skill.None)]; + return singleBuildEntry; + } + + public bool CanEncode(IBuildEntry buildEntry) + { + return buildEntry is SingleBuildEntry; + } + + public string Encode(EncodeContext context) + { + if (context.BuildEntry is not SingleBuildEntry build) + { + throw new InvalidOperationException("SkillTemplateParser can only encode Build entries."); + } + + var stream = context.EncodeCharStream; + + // Write header (14) + stream.Write(SkillTemplateHeader, 4); + + // Write version (0) + stream.Write(CurrentVersion, 4); + + // Encode embedded build (professions, attributes, skills) + EncodeEmbeddedBuild(stream, build); + + // Write trailing bit + stream.Write(0, 1); + + return stream.GetEncodedString(); + } +} diff --git a/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParserBase.cs b/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParserBase.cs new file mode 100644 index 00000000..8e616156 --- /dev/null +++ b/Daybreak.Shared/Services/BuildTemplates/Parsers/SkillTemplateParserBase.cs @@ -0,0 +1,132 @@ +using Daybreak.Shared.Models.Builds; + +namespace Daybreak.Shared.Services.BuildTemplates.Parsers; + +/// +/// Base class providing shared encoding/decoding logic for skill templates. +/// See for format details. +/// +public abstract class SkillTemplateParserBase +{ + /// + /// Decodes the embedded build portion of a skill template (professions, attributes, skills). + /// Does not read header or version - those are template-specific. + /// + protected static (int primaryId, int secondaryId, List attributeIds, List attributePoints, List skillIds) + DecodeEmbeddedBuild(DecodeContext context) + { + // Read profession length code (2 bits) + // p = code * 2 + 4 + var professionLengthCode = context.DecodeCharStream.Read(2); + var professionIdLength = (professionLengthCode * 2) + 4; + + var primaryId = context.DecodeCharStream.Read(professionIdLength); + var secondaryId = context.DecodeCharStream.Read(professionIdLength); + + // Read attribute count (4 bits) + var attributeCount = context.DecodeCharStream.Read(4); + + // Read attribute length code (4 bits) + // a = code + 4 + var attributesLengthCode = context.DecodeCharStream.Read(4); + var attributesLength = attributesLengthCode + 4; + + var attributeIds = new List(); + var attributePoints = new List(); + for (int i = 0; i < attributeCount; i++) + { + attributeIds.Add(context.DecodeCharStream.Read(attributesLength)); + attributePoints.Add(context.DecodeCharStream.Read(4)); + } + + // Read skill length code (4 bits) + // s = code + 8 + var skillsLengthCode = context.DecodeCharStream.Read(4); + var skillsLength = skillsLengthCode + 8; + + var skillIds = new List(); + for (int i = 0; i < 8; i++) + { + skillIds.Add(context.DecodeCharStream.Read(skillsLength)); + } + + return (primaryId, secondaryId, attributeIds, attributePoints, skillIds); + } + + /// + /// Encodes the embedded build portion of a skill template (professions, attributes, skills). + /// Does not write header or version - those are template-specific. + /// + protected static void EncodeEmbeddedBuild(Models.EncodeCharStream stream, SingleBuildEntry build) + { + // Calculate profession length code + // p = code * 2 + 4, so code = (p - 4) / 2 + var primaryId = build.Primary?.Id ?? 0; + var secondaryId = build.Secondary?.Id ?? 0; + var maxProfessionId = Math.Max(primaryId, secondaryId); + var desiredProfessionBits = GetBitLength(maxProfessionId); + var professionLengthCode = Math.Max((desiredProfessionBits - 4) / 2, 0); + var professionIdLength = (professionLengthCode * 2) + 4; + + stream.Write(professionLengthCode, 2); + stream.Write(primaryId, professionIdLength); + stream.Write(secondaryId, professionIdLength); + + // Write attributes + var attributeCount = build.Attributes.Count; + stream.Write(attributeCount, 4); + + // Calculate attribute length code + // a = code + 4, so code = a - 4 + var maxAttributeId = attributeCount > 0 + ? build.Attributes.Max(a => a.Attribute?.Id ?? 0) + : 0; + var desiredAttributeBits = GetBitLength(maxAttributeId); + var attributesLengthCode = Math.Max(desiredAttributeBits - 4, 0); + var attributesLength = attributesLengthCode + 4; + + stream.Write(attributesLengthCode, 4); + for (int i = 0; i < attributeCount; i++) + { + var attrEntry = build.Attributes[i]; + stream.Write(attrEntry.Attribute?.Id ?? 0, attributesLength); + stream.Write(attrEntry.Points, 4); + } + + // Write skills + // s = code + 8, so code = s - 8 + var skillIds = build.Skills.Select(s => s?.Id ?? 0).ToList(); + var maxSkillId = skillIds.Count > 0 ? skillIds.Max() : 0; + var desiredSkillBits = GetBitLength(maxSkillId); + var skillsLengthCode = Math.Max(desiredSkillBits - 8, 0); + var skillsLength = skillsLengthCode + 8; + + stream.Write(skillsLengthCode, 4); + for (int i = 0; i < 8; i++) + { + var skillId = i < skillIds.Count ? skillIds[i] : 0; + stream.Write(skillId, skillsLength); + } + } + + /// + /// Gets the number of bits required to represent a value. + /// + protected static int GetBitLength(int value) + { + if (value <= 0) + { + return 1; + } + + var bits = 1; + value /= 2; + while (value > 0) + { + bits++; + value /= 2; + } + + return bits; + } +} diff --git a/Daybreak.Tests/Services/BuildTemplateManagerTests.cs b/Daybreak.Tests/Services/BuildTemplateManagerTests.cs index b49ca693..1f84bfa1 100644 --- a/Daybreak.Tests/Services/BuildTemplateManagerTests.cs +++ b/Daybreak.Tests/Services/BuildTemplateManagerTests.cs @@ -1,6 +1,7 @@ using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.BuildTemplates; +using Daybreak.Shared.Services.BuildTemplates.Parsers; using FluentAssertions; using Microsoft.Extensions.Logging; using NSubstitute; @@ -12,13 +13,14 @@ namespace Daybreak.Tests.Services; public class BuildTemplateManagerTests { private const string EncodedSingleTemplate = "OwBk0texXNu0Dj/z+TDzBj+TN4AE"; - private const string EncodedTeamTemplate = "OQJUAMxOEMLnw0nDXQGY6aw2B OQNCA8wDP9B8DyzmOUi1veC OggjYxXTIPWbp5krZfxEAAAoD OwUTM4HDn5gc9TJSh6xddmETA"; + private const string EncodedTeamTemplate = "OQJUAMxOEMLnw0nDXQGY6aw2B OQNCA8wDP9B8DyzmOUi1veC OggjcNWcIPWbp5krZfxEAAAoD OwUTAnHP45gc9TJSh6xddmETA"; private BuildTemplateManager buildTemplateManager = default!; [TestInitialize] public void Initialize() { - this.buildTemplateManager = new BuildTemplateManager(Substitute.For>()); + ITemplateParser[] templateParsers = [new SkillTemplateParser(), new LegacySkillTemplateParser(), new PartyLoadoutTemplateParser()]; + this.buildTemplateManager = new BuildTemplateManager(templateParsers, Substitute.For>()); } [TestMethod] @@ -30,14 +32,14 @@ public void TestSingleDecode() singleBuildEntry.Primary.Should().Be(Profession.Assassin); singleBuildEntry.Secondary.Should().Be(Profession.None); singleBuildEntry.Attributes.Count.Should().Be(4); - singleBuildEntry.Attributes[1].Attribute.Should().Be(Attribute.DaggerMastery); - singleBuildEntry.Attributes[1].Points.Should().Be(11); - singleBuildEntry.Attributes[2].Attribute.Should().Be(Attribute.DeadlyArts); - singleBuildEntry.Attributes[2].Points.Should().Be(1); - singleBuildEntry.Attributes[3].Attribute.Should().Be(Attribute.ShadowArts); - singleBuildEntry.Attributes[3].Points.Should().Be(5); - singleBuildEntry.Attributes[0].Attribute.Should().Be(Attribute.CriticalStrikes); + singleBuildEntry.Attributes[0].Attribute.Should().Be(Attribute.DaggerMastery); singleBuildEntry.Attributes[0].Points.Should().Be(11); + singleBuildEntry.Attributes[1].Attribute.Should().Be(Attribute.DeadlyArts); + singleBuildEntry.Attributes[1].Points.Should().Be(1); + singleBuildEntry.Attributes[2].Attribute.Should().Be(Attribute.ShadowArts); + singleBuildEntry.Attributes[2].Points.Should().Be(5); + singleBuildEntry.Attributes[3].Attribute.Should().Be(Attribute.CriticalStrikes); + singleBuildEntry.Attributes[3].Points.Should().Be(11); singleBuildEntry.Skills.Count.Should().Be(8); singleBuildEntry.Skills[0].Should().Be(Skill.UnsuspectingStrike); singleBuildEntry.Skills[1].Should().Be(Skill.WildStrike); @@ -73,26 +75,11 @@ public void TestTeamDecode() Points = 11 }, new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 2 }, new AttributeEntry - { - Attribute = Attribute.BeastMastery, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.Marksmanship, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.WildernessSurvival, Points = 12 @@ -121,35 +108,10 @@ public void TestTeamDecode() Points = 12 }, new AttributeEntry - { - Attribute = Attribute.DominationMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 12 }, - new AttributeEntry - { - Attribute = Attribute.HealingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.SmitingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.ProtectionPrayers, - Points = 0 - }, ]); secondBuild.Skills.Should().BeEquivalentTo( [ @@ -179,26 +141,6 @@ public void TestTeamDecode() Points = 12 }, new AttributeEntry - { - Attribute = Attribute.Marksmanship, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.WildernessSurvival, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.ChannelingMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.Communing, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.RestorationMagic, Points = 12 @@ -227,31 +169,11 @@ public void TestTeamDecode() Points = 3 }, new AttributeEntry - { - Attribute = Attribute.HealingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.SmitingPrayers, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.ProtectionPrayers, Points = 12 }, new AttributeEntry - { - Attribute = Attribute.DominationMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 12 @@ -339,26 +261,11 @@ public void TestTeamEncode() Points = 11 }, new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 2 }, new AttributeEntry - { - Attribute = Attribute.BeastMastery, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.Marksmanship, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.WildernessSurvival, Points = 12 @@ -386,35 +293,10 @@ public void TestTeamEncode() Points = 12 }, new AttributeEntry - { - Attribute = Attribute.DominationMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 12 }, - new AttributeEntry - { - Attribute = Attribute.HealingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.SmitingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.ProtectionPrayers, - Points = 0 - }, ], Skills = [ Skill.SymbolicCelerity, @@ -443,26 +325,6 @@ public void TestTeamEncode() Points = 12 }, new AttributeEntry - { - Attribute = Attribute.Marksmanship, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.WildernessSurvival, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.ChannelingMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.Communing, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.RestorationMagic, Points = 12 @@ -490,31 +352,11 @@ public void TestTeamEncode() Points = 3 }, new AttributeEntry - { - Attribute = Attribute.HealingPrayers, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.SmitingPrayers, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.ProtectionPrayers, Points = 12 }, new AttributeEntry - { - Attribute = Attribute.DominationMagic, - Points = 0 - }, - new AttributeEntry - { - Attribute = Attribute.IllusionMagic, - Points = 0 - }, - new AttributeEntry { Attribute = Attribute.InspirationMagic, Points = 12 diff --git a/Daybreak.slnx b/Daybreak.slnx index c97d7cae..47562e34 100644 --- a/Daybreak.slnx +++ b/Daybreak.slnx @@ -48,6 +48,6 @@ - + diff --git a/Daybreak.wiki b/Daybreak.wiki index c3945f83..9f0b034e 160000 --- a/Daybreak.wiki +++ b/Daybreak.wiki @@ -1 +1 @@ -Subproject commit c3945f831be611e83a0119be59b09ade3da102d0 +Subproject commit 9f0b034e07cd20e4045bcddfa246af4bfe9755a8 diff --git a/Dependencies/GWCA/Include/GWCA/Constants/AgentIDs.h b/Dependencies/GWCA/Include/GWCA/Constants/AgentIDs.h new file mode 100644 index 00000000..a84cd004 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/AgentIDs.h @@ -0,0 +1,518 @@ +#pragma once + +namespace GW +{ + namespace Constants + { + namespace ModelID + { + // this is actually agent->PlayerNumber for agents + namespace Minipet + { + // First Year + constexpr int Charr = 230; // Miniature Charr Shaman (purple) + constexpr int Dragon = 231; // Miniature Bone Dragon (green) + constexpr int Rurik = 232; // Miniature Prince Rurik (gold) + constexpr int Shiro = 233; // Miniature Shiro (gold) + constexpr int Titan = 234; // Miniature Burning Titan (purple) + constexpr int Kirin = 235; // Miniature Kirin (purple) + constexpr int NecridHorseman = 236; // Miniature Necrid Horseman (white) + constexpr int JadeArmor = 237; // Miniature Jade Armor (white) + constexpr int Hydra = 238; // Miniature Hydra (white) + constexpr int FungalWallow = 239; // Miniature Fungal Wallow (white) + constexpr int SiegeTurtle = 240; // Miniature Siege Turtle (white) + constexpr int TempleGuardian = 241; // Miniature Temple Guardian (white) + constexpr int JungleTroll = 242; // Miniature Jungle Troll (white) + constexpr int WhiptailDevourer = 243; // Miniature Whiptail Devourer (white) + // Second Year + constexpr int Gwen = 244; // Miniature Gwen (green) + constexpr int GwenDoll = 245; // Miniature Gwen Doll (??) + constexpr int WaterDjinn = 246; // Miniature Water Djinn (gold) + constexpr int Lich = 247; // Miniature Lich (gold) + constexpr int Elf = 248; // Miniature Elf (purple) + constexpr int PalawaJoko = 249; // Miniature Palawa Joko (purple) + constexpr int Koss = 250; // Miniature Koss (purple) + constexpr int MandragorImp = 251; // Miniature Mandragor Imp (white) + constexpr int HeketWarrior = 252; // Miniature Heket Warrior (white) + constexpr int HarpyRanger = 253; // Miniature Harpy Ranger (white) + constexpr int Juggernaut = 254; // Miniature Juggernaut (white) + constexpr int WindRider = 255; // Miniature Wind Rider (white) + constexpr int FireImp = 256; // Miniature Fire Imp (white) + constexpr int Aatxe = 257; // Miniature Aatxe (white) + constexpr int ThornWolf = 258; // Miniature Thorn Wolf (white) + // Third Year + constexpr int Abyssal = 259; // Miniature Abyssal (white) + constexpr int BlackBeast = 260; // Miniature Black Beast of Aaaaarrrrrrgghh (gold) + constexpr int Freezie = 261; // Miniature Freezie (purple) + constexpr int Irukandji = 262; // Miniature Irukandji (white) + constexpr int MadKingThorn = 263; // Miniature Mad King Thorn (green) + constexpr int ForestMinotaur = 264; // Miniature Forest Minotaur (white) + constexpr int Mursaat = 265; // Miniature Mursaat (white) + constexpr int Nornbear = 266; // Miniature Nornbear (purple) + constexpr int Ooze = 267; // Miniature Ooze (purple) + constexpr int Raptor = 268; // Miniature Raptor (white) + constexpr int RoaringEther = 269; // Miniature Roaring Ether (white) + constexpr int CloudtouchedSimian = 270; // Miniature Cloudtouched Simian (white) + constexpr int CaveSpider = 271; // Miniature Cave Spider (white) + constexpr int WhiteRabbit = 272; // White Rabbit (gold) + // Fourth Year + constexpr int WordofMadness = 273; // Miniature Word of Madness (white) + constexpr int DredgeBrute = 274; // Miniature Dredge Brute (white) + constexpr int TerrorwebDryder = 275; // Miniature Terrorweb Dryder (white) + constexpr int Abomination = 276; // Miniature Abomination (white) + constexpr int KraitNeoss = 277; // Miniature Krait Neoss (white) + constexpr int DesertGriffon = 278; // Miniature Desert Griffon (white) + constexpr int Kveldulf = 279; // Miniature Kveldulf (white) + constexpr int QuetzalSly = 280; // Miniature Quetzal Sly (white) + constexpr int Jora = 281; // Miniature Jora (purple) + constexpr int FlowstoneElemental = 282; // Miniature Flowstone Elemental (purple) + constexpr int Nian = 283; // Miniature Nian (purple) + constexpr int DagnarStonepate = 284; // Miniature Dagnar Stonepate (gold) + constexpr int FlameDjinn = 285; // Miniature Flame Djinn (gold) + constexpr int EyeOfJanthir = 286; // Miniature Eye of Janthir (green) + // Fifth Year + constexpr int Seer = 287; // Miniature Seer (white) + constexpr int SiegeDevourer = 288; // Miniature Siege Devourer (white) + constexpr int ShardWolf = 289; // Miniature Shard Wolf (white) + constexpr int FireDrake = 290; // Miniature Fire Drake (white) + constexpr int SummitGiantHerder = 291; // Miniature Summit Giant Herder (white) + constexpr int OphilNahualli = 292; // Miniature Ophil Nahualli (white) + constexpr int CobaltScabara = 293; // Miniature Cobalt Scabara (white) + constexpr int ScourgeManta = 294; // Miniature Scourge Manta (white) + constexpr int Ventari = 295; // Miniature Ventari (purple) + constexpr int Oola = 296; // Miniature Oola (purple) + constexpr int CandysmithMarley = 297; // Miniature CandysmithMarley (purple) + constexpr int ZhuHanuku = 298; // Miniature Zhu Hanuku (gold) + constexpr int KingAdelbern = 299; // Miniature King Adelbern (gold) + constexpr int MOX1 = 300; // Miniature M.O.X. (color?) + constexpr int MOX2 = 301; // Miniature M.O.X. (color?) + constexpr int MOX3 = 302; // Miniature M.O.X. (green) + constexpr int MOX4 = 303; // Miniature M.O.X. (color?) + constexpr int MOX5 = 304; // Miniature M.O.X. (color?) + constexpr int MOX6 = 305; // Miniature M.O.X. (color?) + + // In-game rewards and promotionals + constexpr int BrownRabbit = 306; // Miniature Brown Rabbit + constexpr int Yakkington = 307; // Miniature Yakkington + // constexpr int Unknown308 = 308; + constexpr int CollectorsEditionKuunavang = 309; // Miniature Kuunavang (green) + constexpr int GrayGiant = 310; + constexpr int Asura = 311; + constexpr int DestroyerOfFlesh = 312; + constexpr int PolarBear = 313; + constexpr int CollectorsEditionVaresh = 314; + constexpr int Mallyx = 315; + constexpr int Ceratadon = 316; + + // Misc. + constexpr int Kanaxai = 317; + constexpr int Panda = 318; + constexpr int IslandGuardian = 319; + constexpr int NagaRaincaller = 320; + constexpr int LonghairYeti = 321; + constexpr int Oni = 322; + constexpr int ShirokenAssassin = 323; + constexpr int Vizu = 324; + constexpr int ZhedShadowhoof = 325; + constexpr int Grawl = 326; + constexpr int GhostlyHero = 327; + + // Special events + constexpr int Pig = 328; + constexpr int GreasedLightning = 329; + constexpr int WorldFamousRacingBeetle = 330; + constexpr int CelestialPig = 331; + constexpr int CelestialRat = 332; + constexpr int CelestialOx = 333; + constexpr int CelestialTiger = 334; + constexpr int CelestialRabbit = 335; + constexpr int CelestialDragon = 336; + constexpr int CelestialSnake = 337; + constexpr int CelestialHorse = 338; + constexpr int CelestialSheep = 339; + constexpr int CelestialMonkey = 340; + constexpr int CelestialRooster = 341; + constexpr int CelestialDog = 342; + + // In-game + constexpr int BlackMoaChick = 343; + constexpr int Dhuum = 344; + constexpr int MadKingsGuard = 345; + constexpr int SmiteCrawler = 346; + + // Zaishen strongboxes, and targetable minipets + constexpr int GuildLord = 347; + constexpr int HighPriestZhang = 348; + constexpr int GhostlyPriest = 349; + constexpr int RiftWarden = 350; + } + + namespace SummoningStone + { + constexpr int MercantileMerchant = 467; + constexpr int ZaishenArcher = 468; + constexpr int ZaishenAvatarOfBalthazar = 469; + constexpr int ZaishenChampionOfBalthazar = 470; + constexpr int ZaishenPriestOfBalthazar = 471; + constexpr int ZaishenFootman = 472; + constexpr int ZaishenGuildLord = 473; + constexpr int MysteriousCrystalSpider = 490; + constexpr int MysteriousSaltsprayDragon = 491; + constexpr int MysteriousRestlessCorpse = 492; + constexpr int MysteriousSmokePhantom = 493; + constexpr int MysteriousSwarmOfBees = 494; + constexpr int AutomatonGolem = 512; + constexpr int IgneousFireImp = 513; + constexpr int JadeiteSiegeTurtle = 514; + constexpr int DemonicOni = 515; + constexpr int AmberJuggernaut = 516; + constexpr int MysticalGaki = 517; + constexpr int GelatinousOoze = 518; + constexpr int ChitinousDevourer = 519; + constexpr int ArcticKveldulf = 520; + constexpr int FossilizedRaptor = 521; + constexpr int MischievousGrentch = 522; + constexpr int FrostySnowman = 523; + constexpr int GhastlyDreamRider = 524; + } + + // New bosses 2020-04-22 + enum + { + AbaddonsCursed = 1338, + BladeAncientSyuShai = 1339, + YoannhTheRebuilber = 1340, + FureystSharpsight = 1341 + }; + + namespace FoW + { + constexpr int NimrosTheHunter = 1485; + constexpr int MikoTheUnchained = 2015; + } + + namespace UW + { + constexpr int ChainedSoul = 2317; + constexpr int DyingNightmare = 2318; + constexpr int ObsidianBehemoth = 2319; + constexpr int ObsidianGuardian = 2320; + constexpr int TerrorwebDryder = 2321; + constexpr int TerrorwebDryderSilver = 2322; + constexpr int KeeperOfSouls = 2323; + constexpr int TerrorwebQueen = 2324; // boss-like + constexpr int SmiteCrawler = 2325; + constexpr int WailingLord = 2326; // Note: same as FoW::Banshee + constexpr int BanishedDreamRider = 2327; + // 2324 ? + constexpr int FourHorseman = 2329; // all four share the same id + constexpr int MindbladeSpectre = 2330; + + constexpr int DeadCollector = 2332; + constexpr int DeadThresher = 2333; + constexpr int ColdfireNight = 2334; + constexpr int StalkingNight = 2335; + // 2332 ? + constexpr int ChargedBlackness = 2337; + constexpr int GraspingDarkness = 2338; + constexpr int BladedAatxe = 2339; + + // 2336 ? + constexpr int Slayer = 2391; + constexpr int SkeletonOfDhuum1 = 2392; + constexpr int SkeletonOfDhuum2 = 2393; + constexpr int ChampionOfDhuum = 2394; + constexpr int MinionOfDhuum = 2395; + constexpr int Dhuum = 2396; + + constexpr int Reapers = 2399; // outside dhuum chamber + constexpr int ReapersAtDhuum = 2400; // in dhuum chamber + constexpr int IceElemental = 2401; // friendly, during waste quest near dhuum. + constexpr int KingFrozenwind = 2403; + constexpr int TorturedSpirit1 = 2404; // friendly, during quest + constexpr int Escort1 = 2407; // souls npc spawned by escort quest + constexpr int Escort2 = 2408; + constexpr int Escort3 = 2409; + constexpr int Escort4 = 2410; + constexpr int Escort5 = 2411; + constexpr int Escort6 = 2412; + constexpr int PitsSoul1 = 2413; + constexpr int PitsSoul2 = 2414; + constexpr int PitsSoul3 = 2415; + constexpr int PitsSoul4 = 2416; + + constexpr int TorturedSpirit = 2422; + constexpr int MajorAlgheri = 2424; + } + + namespace FoW + { + constexpr int Banshee = 2377; // Note: same as UW::WailingLord + + constexpr int MahgoHydra = 2847; + constexpr int ArmoredCaveSpider = 2851; + constexpr int SmokeWalker = 2852; + constexpr int ObsidianFurnanceDrake = 2853; + constexpr int DoubtersDryder = 2854; + constexpr int ShadowMesmer = 2855; + constexpr int ShadowElemental = 2856; + constexpr int ShadowMonk = 2857; + constexpr int ShadowWarrior = 2858; + constexpr int ShadowRanger = 2859; + constexpr int ShadowBeast = 2860; + constexpr int Abyssal = 2861; // Note: same as ShadowOverlord. + constexpr int ShadowOverlord = 2861; // Note: same as Abyssal. + constexpr int SeedOfCorruption = 2862; + constexpr int SpiritWood = 2863; + constexpr int SpiritShepherd = 2864; + constexpr int AncientSkale = 2865; + constexpr int SnarlingDriftwood = 2866; + constexpr int SkeletalEtherBreaker = 2867; + constexpr int SkeletalIcehand = 2868; + constexpr int SkeletalBond = 2869; + constexpr int SkeletalBerserker = 2870; + constexpr int SkeletalImpaler = 2871; + constexpr int RockBorerWorm = 2872; + constexpr int InfernalWurm = 2873; + constexpr int DragonLich = 2874; + constexpr int Menzies = 2875; + // 2821 ? + constexpr int Rastigan = 2877; // Friendly NPC + constexpr int Griffons = 2878; // Friendly NPC + constexpr int LordKhobay = 2879; // Unfriendly NPC + constexpr int Forgemaster = 2880; // Friendly NPC + // 2826 ? + constexpr int TraitorousTempleGuard1 = 2882; + constexpr int TraitorousTempleGuard2 = 2883; + constexpr int TraitorousTempleGuard3 = 2884; + // 2830 ? + constexpr int ShardWolf = 2886; + } + + constexpr int Rotscale = 2888; + + constexpr int Winnowing = 2926; + constexpr int EoE = 2927; + constexpr int FrozenSoil = 2933; + constexpr int QZ = 2937; + + namespace Urgoz + { + constexpr int HoppingVampire = 3796; + constexpr int Urgoz = 3805; + } + + namespace Deep + { + constexpr int Kanaxai = 4110; + constexpr int KanaxaiAspect = 4111; + } + + constexpr int Lacerate = 4283; + constexpr int Equinox = 4287; + constexpr int Famine = 4289; + + namespace DoA + { + // Friendly + constexpr int FoundrySnakes = 5272; + + constexpr int BlackBeastOfArgh = 5201; + constexpr int SmotheringTendril = 5265; + constexpr int Fury = 5200; + constexpr int LordJadoth = 5195; + + // stygian lords + constexpr int StygianLordNecro = 5196; + constexpr int StygianLordMesmer = 5197; + constexpr int StygianLordEle = 5198; + constexpr int StygianLordMonk = 5199; + constexpr int StygianLordDerv = 5214; + constexpr int StygianLordRanger = 5215; + + // margonites + constexpr int MargoniteAnurKaya = 5217; + constexpr int MargoniteAnurDabi = 5218; + constexpr int MargoniteAnurSu = 5219; + constexpr int MargoniteAnurKi = 5220; + constexpr int MargoniteAnurVu = 5221; + constexpr int MargoniteAnurTuk = 5222; + constexpr int MargoniteAnurRuk = 5223; + constexpr int MargoniteAnurRund = 5224; + constexpr int MargoniteAnurMank = 5225; + + // stygians + constexpr int StygianHunger = 5226; + constexpr int StygianBrute = 5227; + constexpr int StygianGolem = 5228; + constexpr int StygianHorror = 5229; + constexpr int StygianFiend = 5230; + + // tormentors in veil + constexpr int VeilMindTormentor = 5231; + constexpr int VeilSoulTormentor = 5232; + constexpr int VeilWaterTormentor = 5233; + constexpr int VeilHeartTormentor = 5234; + constexpr int VeilFleshTormentor = 5235; + constexpr int VeilSpiritTormentor = 5236; + constexpr int VeilEarthTormentor = 5237; + constexpr int VeilSanityTormentor = 5238; + // tormentors + constexpr int MindTormentor = 5255; + constexpr int SoulTormentor = 5256; + constexpr int WaterTormentor = 5257; + constexpr int HeartTormentor = 5258; + constexpr int FleshTormentor = 5259; + constexpr int SpiritTormentor = 5260; + constexpr int EarthTormentor = 5261; + constexpr int SanityTormentor = 5263; + + // titans + constexpr int MiseryTitan = 5246; + constexpr int RageTitan = 5247; + constexpr int DementiaTitan = 5248; + constexpr int AnguishTitan = 5249; + constexpr int DespairTitan = 5250; + constexpr int FuryTitan = 5251; + constexpr int RageTitan2 = 5252; + constexpr int DementiaTitan2 = 5253; + constexpr int DespairTitan2 = 5254; + + constexpr int TorturewebDryder = 5266; + constexpr int GreaterDreamRider = 5267; + constexpr int GreaterDreamRider2 = 5268; + } + + constexpr int ProphetVaresh = 5343; + constexpr int CommanderVaresh = 5344; + + // Spirits + constexpr int InfuriatingHeat = 5766; + constexpr int Quicksand = 5769; + + namespace PolymockSummon + { + enum + { + // Polymocks + MursaatElementalist = 5898, + FlameDjinn = 5899, + IceImp = 5900, + NagaShaman = 5901 + }; + } + + constexpr int EbonVanguardAssassin = 5903; + + namespace EotnDungeons + { + constexpr int DiscOfChaos = 6122; + constexpr int PlagueOfDestruction = 6134; + constexpr int ZhimMonns = 6297; + constexpr int Khabuus = 6299; + constexpr int DuncanTheBlack = 6456; + constexpr int JusticiarThommis = 6457; + constexpr int RandStormweaver = 6458; + constexpr int Selvetarm = 6459; + constexpr int Forgewright = 6460; + constexpr int HavokSoulwail = 6478; + constexpr int RragarManeater3 = 6609; // lvl 3 + constexpr int RragarManeater12 = 6610; // lvl 1 and 2 + constexpr int Arachni = 6844; + constexpr int Hidesplitter = 6852; + constexpr int PrismaticOoze = 6857; + constexpr int IlsundurLordofFire = 6865; + constexpr int EldritchEttin = 6872; + constexpr int TPSRegulartorGolem = 6883; + constexpr int MalfunctioningEnduringGolem = 6885; + constexpr int StormcloudIncubus = 6902; + constexpr int CyndrTheMountainHeart = 6965; + constexpr int InfernalSiegeWurm = 6978; // kath lvl1 boss + constexpr int Frostmaw = 6983; + constexpr int RemnantOfAntiquities = 6985; + constexpr int MurakaiLadyOfTheNight = 7059; + constexpr int ZoldarkTheUnholy = 7061; + + constexpr int Brigand = 7060; // soo + constexpr int FendiNin = 7064; + constexpr int SoulOfFendiNin = 7065; + + constexpr int KeymasterOfMurakai = 7069; + } + + namespace BonusMissionPack + { + constexpr int WarAshenskull = 7130; + constexpr int RoxAshreign = 7131; + constexpr int AnrakTindershot = 7132; + constexpr int DettMortash = 7133; + constexpr int AkinCinderspire = 7134; + constexpr int TwangSootpaws = 7135; + constexpr int MagisEmberglow = 7136; + constexpr int MerciaTheSmug = 7165; + constexpr int OptimusCaliph = 7166; + constexpr int LazarusTheDire = 7167; + constexpr int AdmiralJakman = 7230; + constexpr int PalawaJoko = 7249; + constexpr int YuriTheHand = 7197; + constexpr int MasterRiyo = 7198; + constexpr int CaptainSunpu = 7200; + constexpr int MinisterWona = 7201; + } + + namespace EotnDungeons + { + constexpr int AngrySnowman = 7462; + } + + constexpr int Boo = 7500; + + /* Birthday Minis */ + /* unknowns are commented as a guess as inventory name but fit a pattern of id schema */ + namespace Minipet + { + // More in-game drops and rewards + constexpr int MiniatureLegionnaire = 8035; + } + + constexpr int LockedChest = 8192; // this is actually ->ExtraType + + namespace Minipet + { + constexpr int MiniatureConfessorDorian = 8344; + constexpr int MiniaturePrincessSalma = 8349; + constexpr int MiniatureLivia = 8350; + constexpr int MiniatureEvennia = 8351; + constexpr int MiniatureConfessorIsaiah = 8352; + // missing miniature 8298 ? + constexpr int MiniaturePeacekeeperEnforcer = 8354; + constexpr int MiniatureMinisterReiko = 9038; + constexpr int MiniatureEcclesiateXunRao = 9039; + } + + namespace SummoningStone + { + constexpr int ImperialCripplingSlash = 9043; + constexpr int ImperialTripleChop = 9044; + constexpr int ImperialBarrage = 9045; + constexpr int ImperialQuiveringBlade = 9046; + constexpr int TenguHundredBlades = 9047; + constexpr int TenguBroadHeadArrow = 9048; + constexpr int TenguPalmStrike = 9049; + constexpr int TenguLifeSheath = 9050; + constexpr int TenguAngchuElementalist = 9051; + constexpr int TenguFeveredDreams = 9052; + constexpr int TenguSpitefulSpirit = 9053; + constexpr int TenguPreservation = 9054; + constexpr int TenguPrimalRage = 9055; + constexpr int TenguGlassArrows = 9056; + constexpr int TenguWayOftheAssassin = 9057; + constexpr int TenguPeaceandHarmony = 9058; + constexpr int TenguSandstorm = 9059; + constexpr int TenguPanic = 9060; + constexpr int TenguAuraOftheLich = 9061; + constexpr int TenguDefiantWasXinrae = 9062; + } + } + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/Constants.h b/Dependencies/GWCA/Include/GWCA/Constants/Constants.h new file mode 100644 index 00000000..ae669ea2 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/Constants.h @@ -0,0 +1,361 @@ +// ReSharper disable CppUnusedIncludeDirective +#pragma once + +#include "AgentIDs.h" +#include "ItemIDs.h" +#include "Maps.h" +#include "QuestIDs.h" +#include "Skills.h" + +namespace GW { + namespace Constants { + + enum class Campaign : uint32_t { Core, Prophecies, Factions, Nightfall, EyeOfTheNorth, BonusMissionPack }; + enum class Difficulty { Normal, Hard }; + enum class InstanceType { Outpost, Explorable, Loading }; + + enum class Profession : uint32_t { + None, Warrior, Ranger, Monk, Necromancer, Mesmer, + Elementalist, Assassin, Ritualist, Paragon, Dervish + }; + enum class ProfessionByte : uint8_t { + None, Warrior, Ranger, Monk, Necromancer, Mesmer, + Elementalist, Assassin, Ritualist, Paragon, Dervish + }; + static const char* GetProfessionAcronym(Profession prof) { + switch (prof) { + case GW::Constants::Profession::None: return "X"; + case GW::Constants::Profession::Warrior: return "W"; + case GW::Constants::Profession::Ranger: return "R"; + case GW::Constants::Profession::Monk: return "Mo"; + case GW::Constants::Profession::Necromancer: return "N"; + case GW::Constants::Profession::Mesmer: return "Me"; + case GW::Constants::Profession::Elementalist: return "E"; + case GW::Constants::Profession::Assassin: return "A"; + case GW::Constants::Profession::Ritualist: return "Rt"; + case GW::Constants::Profession::Paragon: return "P"; + case GW::Constants::Profession::Dervish: return "D"; + default: return ""; + } + } + static const wchar_t* GetWProfessionAcronym(Profession prof) { + switch (prof) { + case GW::Constants::Profession::None: return L"X"; + case GW::Constants::Profession::Warrior: return L"W"; + case GW::Constants::Profession::Ranger: return L"R"; + case GW::Constants::Profession::Monk: return L"Mo"; + case GW::Constants::Profession::Necromancer: return L"N"; + case GW::Constants::Profession::Mesmer: return L"Me"; + case GW::Constants::Profession::Elementalist: return L"E"; + case GW::Constants::Profession::Assassin: return L"A"; + case GW::Constants::Profession::Ritualist: return L"Rt"; + case GW::Constants::Profession::Paragon: return L"P"; + case GW::Constants::Profession::Dervish: return L"D"; + default: return L""; + } + } + + namespace Preference { + enum class CharSortOrder : uint32_t { + None, Alphabetize, PvPRP + }; + } + + enum class Attribute : uint32_t { + FastCasting, IllusionMagic, DominationMagic, InspirationMagic, // mesmer + BloodMagic, DeathMagic, SoulReaping, Curses, // necro + AirMagic, EarthMagic, FireMagic, WaterMagic, EnergyStorage, // ele + HealingPrayers, SmitingPrayers, ProtectionPrayers, DivineFavor, // monk + Strength, AxeMastery, HammerMastery, Swordsmanship, Tactics, // warrior + BeastMastery, Expertise, WildernessSurvival, Marksmanship, // ranger + DaggerMastery = 29, DeadlyArts, ShadowArts, // assassin (most) + Communing, RestorationMagic, ChannelingMagic, // ritualist (most) + CriticalStrikes, SpawningPower, // sin/rit primary (gw is weird) + SpearMastery, Command, Motivation, Leadership, // paragon + ScytheMastery, WindPrayers, EarthPrayers, Mysticism, // derv + None = 0xff + }; + enum class AttributeByte : uint8_t { + FastCasting, IllusionMagic, DominationMagic, InspirationMagic, // mesmer + BloodMagic, DeathMagic, SoulReaping, Curses, // necro + AirMagic, EarthMagic, FireMagic, WaterMagic, EnergyStorage, // ele + HealingPrayers, SmitingPrayers, ProtectionPrayers, DivineFavor, // monk + Strength, AxeMastery, HammerMastery, Swordsmanship, Tactics, // warrior + BeastMastery, Expertise, WildernessSurvival, Marksmanship, // ranger + DaggerMastery = 29, DeadlyArts, ShadowArts, // assassin (most) + Communing, RestorationMagic, ChannelingMagic, // ritualist (most) + CriticalStrikes, SpawningPower, // sin/rit primary (gw is weird) + SpearMastery, Command, Motivation, Leadership, // paragon + ScytheMastery, WindPrayers, EarthPrayers, Mysticism, // derv + None = 0xff + }; + + enum class Bag : uint8_t { + None, Backpack, Belt_Pouch, Bag_1, Bag_2, Equipment_Pack, + Material_Storage, Unclaimed_Items, Storage_1, Storage_2, + Storage_3, Storage_4, Storage_5, Storage_6, Storage_7, + Storage_8, Storage_9, Storage_10, Storage_11, Storage_12, + Storage_13, Storage_14, Equipped_Items, Max + }; + inline Bag& operator++(Bag& bag) { + if (bag == Bag::Max) return bag; + bag = static_cast(static_cast(bag) + 1); + return bag; + } + inline Bag operator++(Bag& bag, int) { + const Bag cpy = bag; + ++bag; + return cpy; + } + + // Order of storage panes. + enum class StoragePane : uint8_t { + Storage_1,Storage_2,Storage_3,Storage_4,Storage_5, + Storage_6,Storage_7,Storage_8,Storage_9,Storage_10, + Storage_11,Storage_12,Storage_13,Storage_14,Material_Storage + }; + + constexpr size_t BagMax = (size_t)Bag::Max; + + enum class AgentType { + Living = 0xDB, Gadget = 0x200, Item = 0x400 + }; + + enum class Allegiance : uint8_t { + Ally_NonAttackable = 0x1, Neutral = 0x2, Enemy = 0x3, Spirit_Pet = 0x4, Minion = 0x5, Npc_Minipet = 0x6 + }; + + enum class ItemType : uint8_t { + Salvage, Axe = 2, Bag, Boots, Bow, Bundle, Chestpiece, Rune_Mod, Usable, Dye, + Materials_Zcoins, Offhand, Gloves, Hammer = 15, Headpiece, CC_Shards, + Key, Leggings, Gold_Coin, Quest_Item, Wand, Shield = 24, Staff = 26, Sword, + Kit = 29, Trophy, Scroll, Daggers, Present, Minipet, Scythe, Spear, Storybook = 43, Costume, Costume_Headpiece, Unknown = 0xff + }; + + enum HeroID : uint32_t { + NoHero, Norgu, Goren, Tahlkora, MasterOfWhispers, AcolyteJin, Koss, + Dunkoro, AcolyteSousuke, Melonni, ZhedShadowhoof, GeneralMorgahn, + MargridTheSly, Zenmai, Olias, Razah, MOX, KeiranThackeray, Jora, + PyreFierceshot, Anton, Livia, Hayda, Kahmu, Gwen, Xandra, Vekk, + Ogden, Merc1, Merc2, Merc3, Merc4, Merc5, Merc6, Merc7, Merc8, + Miku, ZeiRi, Devona, GhostofAlthea, Count + }; + + enum class MaterialSlot : uint32_t { + Bone, IronIngot, TannedHideSquare, Scale, ChitinFragment, + BoltofCloth, WoodPlank, GraniteSlab = 8, + PileofGlitteringDust, PlantFiber, Feather, + + FurSquare, BoltofLinen, BoltofDamask, BoltofSilk, + GlobofEctoplasm, SteelIngot, DeldrimorSteelIngot, + MonstrousClaw, MonstrousEye, MonstrousFang, Ruby, + Sapphire, Diamond, OnyxGemstone, LumpofCharcoal, + ObsidianShard, TemperedGlassVial = 29, LeatherSquare, + ElonianLeatherSquare, VialofInk, RollofParchment, + RollofVellum, SpiritwoodPlank, AmberChunk, JadeiteShard, + + BronzeZCoin, SilverZCoin, GoldZCoin, + + Count + }; + + constexpr std::array HeroProfs = { + Profession::None, + Profession::Mesmer, // Norgu + Profession::Warrior,// Goren + Profession::Monk, // Tahlkora + Profession::Necromancer, // Master Of Whispers + Profession::Ranger, // Acolyte Jin + Profession::Warrior, // Koss + Profession::Monk, // Dunkoro + Profession::Elementalist, // Acolyte Sousuke + Profession::Dervish, // Melonni + Profession::Elementalist, // Zhed Shadowhoof + Profession::Paragon, // General Morgahn + Profession::Ranger, // Magrid The Sly + Profession::Assassin, // Zenmai + Profession::Necromancer, // Olias + Profession::None, // Razah + Profession::Dervish, // MOX + Profession::Paragon, // Keiran Thackeray + Profession::Warrior, // Jora + Profession::Ranger, // Pyre Fierceshot + Profession::Assassin, // Anton + Profession::Necromancer, // Livia + Profession::Paragon, // Hayda + Profession::Dervish, // Kahmu + Profession::Mesmer, // Gwen + Profession::Ritualist, // Xandra + Profession::Elementalist, // Vekk + Profession::Monk, // Ogden + Profession::None, // Mercenary Hero 1 + Profession::None, // Mercenary Hero 2 + Profession::None, // Mercenary Hero 3 + Profession::None, // Mercenary Hero 4 + Profession::None, // Mercenary Hero 5 + Profession::None, // Mercenary Hero 6 + Profession::None, // Mercenary Hero 7 + Profession::None, // Mercenary Hero 8 + Profession::Assassin, // Miku + Profession::Ritualist, // Zei Ri + Profession::Warrior, // Devona + Profession::Mesmer // Ghost of Althea + }; + + enum class TitleID : uint32_t { + Hero, TyrianCarto, CanthanCarto, Gladiator, Champion, Kurzick, + Luxon, Drunkard, + Deprecated_SkillHunter, // Pre hard mode update version + Survivor, KoaBD, + Deprecated_TreasureHunter, // Old title, non-account bound + Deprecated_Wisdom, // Old title, non-account bound + ProtectorTyria, + ProtectorCantha, Lucky, Unlucky, Sunspear, ElonianCarto, + ProtectorElona, Lightbringer, LDoA, Commander, Gamer, + SkillHunterTyria, VanquisherTyria, SkillHunterCantha, + VanquisherCantha, SkillHunterElona, VanquisherElona, + LegendaryCarto, LegendaryGuardian, LegendarySkillHunter, + LegendaryVanquisher, Sweets, GuardianTyria, GuardianCantha, + GuardianElona, Asuran, Deldrimor, Vanguard, Norn, MasterOfTheNorth, + Party, Zaishen, TreasureHunter, Wisdom, Codex, + None = 0xff + }; + + enum class Tick { NOT_READY, READY }; + + enum class InterfaceSize { SMALL = -1, NORMAL, LARGE, LARGER }; + namespace HealthbarHeight { + constexpr size_t Small = 24; + constexpr size_t Normal = 22; + constexpr size_t Large = 26; + constexpr size_t Larger = 30; + } + + // travel, region, districts + enum class ServerRegion { + International = -2, + America = 0, + Korea, + Europe, + China, + Japan, + Unknown = 0xff + }; + + // in-game language for maps and in-game text + enum class Language { + English, + Korean, + French, + German, + Italian, + Spanish, + TraditionalChinese, + Japanese = 8, + Polish, + Russian, + BorkBorkBork = 17, + Unknown = 0xff + }; + + enum class District { // arbitrary enum for game district + Current, + International, + American, + EuropeEnglish, + EuropeFrench, + EuropeGerman, + EuropeItalian, + EuropeSpanish, + EuropePolish, + EuropeRussian, + AsiaKorean, + AsiaChinese, + AsiaJapanese, + Unknown = 0xff + }; + + namespace Range { + constexpr float Touch = 144.f; + constexpr float Adjacent = 166.0f; + constexpr float Nearby = 252.0f; + constexpr float Area = 322.0f; + constexpr float Earshot = 1012.0f; + constexpr float Spellcast = 1248.0f; + constexpr float Spirit = 2512.0f; + constexpr float SpiritExtended = 3500.0f; + constexpr float Compass = 5000.0f; + }; + + namespace SqrRange { + constexpr float Adjacent = Range::Adjacent * Range::Adjacent; + constexpr float Nearby = Range::Nearby * Range::Nearby; + constexpr float Area = Range::Area * Range::Area; + constexpr float Earshot = Range::Earshot * Range::Earshot; + constexpr float Spellcast = Range::Spellcast * Range::Spellcast; + constexpr float Spirit = Range::Spirit * Range::Spirit; + constexpr float Compass = Range::Compass * Range::Compass; + }; + + namespace DialogID { + constexpr int UwTeleEnquire = 127; // "where can you teleport us to" + constexpr int UwTelePlanes = 139; + constexpr int UwTeleWastes = 140; + constexpr int UwTeleLab = 141; + constexpr int UwTeleMnt = 142; + constexpr int UwTelePits = 143; + constexpr int UwTelePools = 144; + constexpr int UwTeleVale = 145; + + constexpr int FowCraftArmor = 127; + + constexpr int FerryKamadanToDocks = 133; // Assistant Hahnna + constexpr int FerryDocksToKaineng = 136; // Mhenlo + constexpr int FerryDocksToLA = 137; // Mhenlo + constexpr int FerryGateToLA = 133; // Lionguard Neiro + + // Profession Changer Dialogs. + constexpr int ProfChangeWarrior = 0x184; + constexpr int ProfChangeRanger = 0x284; + constexpr int ProfChangeMonk = 0x384; + constexpr int ProfChangeNecro = 0x484; + constexpr int ProfChangeMesmer = 0x584; + constexpr int ProfChangeEle = 0x684; + constexpr int ProfChangeAssassin = 0x784; + constexpr int ProfChangeRitualist = 0x884; + constexpr int ProfChangeParagon = 0x984; + constexpr int ProfChangeDervish = 0xA84; + + constexpr int FactionMissionOutpost = 0x80000B; + constexpr int NightfallMissionOutpost = 0x85; + } + + enum class EffectID : uint32_t { + black_cloud = 1, + mesmer_symbol = 4, + green_cloud = 7, + green_sparks = 8, + necro_symbol = 9, + ele_symbol = 11, + white_clouds = 13, + monk_symbol = 18, + bleeding = 23, + blind = 24, + burning = 25, + disease = 26, + poison = 27, + dazed = 28, + weakness = 29, //cracked_armor has same EffectID + assasin_symbol = 34, + ritualist_symbol = 35, + dervish_symbol = 36, + }; + + namespace Camera { + constexpr float FIRST_PERSON_DIST = 2.f; + constexpr float DEFAULT_DIST = 750.f; + } + + constexpr size_t SkillMax = 0xd69; + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/ItemIDs.h b/Dependencies/GWCA/Include/GWCA/Constants/ItemIDs.h new file mode 100644 index 00000000..2704a8fa --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/ItemIDs.h @@ -0,0 +1,203 @@ +#pragma once + +namespace GW { + namespace Constants { + namespace ItemID { // aka item modelIDs + constexpr int Dye = 146; + + // items that make agents + constexpr int GhostInTheBox = 6368; + constexpr int GhastlyStone = 32557; + constexpr int LegionnaireStone = 37810; + + // materials + constexpr int Bone = 921; + constexpr int BoltofCloth = 925; + constexpr int PileofGlitteringDust = 929; + constexpr int Feather = 933; + constexpr int PlantFiber = 934; + constexpr int TannedHideSquare = 940; + constexpr int WoodPlank = 946; + constexpr int IronIngot = 948; + constexpr int Scale = 953; + constexpr int ChitinFragment = 954; + constexpr int GraniteSlab = 955; + + constexpr int AmberChunk = 6532; + constexpr int BoltofDamask = 927; + constexpr int BoltofLinen = 926; + constexpr int BoltofSilk = 928; + constexpr int DeldrimorSteelIngot = 950; + constexpr int Diamond = 935; + constexpr int ElonianLeatherSquare = 943; + constexpr int FurSquare = 941; + constexpr int GlobofEctoplasm = 930; + constexpr int JadeiteShard = 6533; + constexpr int LeatherSquare = 942; + constexpr int LumpofCharcoal = 922; + constexpr int MonstrousClaw = 923; + constexpr int MonstrousEye = 931; + constexpr int MonstrousFang = 932; + constexpr int ObsidianShard = 945; + constexpr int OnyxGemstone = 936; + constexpr int RollofParchment = 951; + constexpr int RollofVellum = 952; + constexpr int Ruby = 937; + constexpr int Sapphire = 938; + constexpr int SpiritwoodPlank = 956; + constexpr int SteelIngot = 949; + constexpr int TemperedGlassVial = 939; + constexpr int VialofInk = 944; + + // XP scrolls + constexpr int ScrollOfAdventurersInsight = 5853; + constexpr int ScrollOfBerserkersInsight = 5595; + constexpr int ScrollOfHerosInsight = 5594; + constexpr int ScrollOfHuntersInsight = 5976; + constexpr int ScrollOfRampagersInsight = 5975; + constexpr int ScrollOfSlayersInsight = 5611; + constexpr int ScrollOfTheLightbringer = 21233; + + // pcons + constexpr int SkalefinSoup = 17061; + constexpr int PahnaiSalad = 17062; + constexpr int MandragorRootCake = 19170; + constexpr int Pies = 28436; + constexpr int Cupcakes = 22269; + constexpr int Apples = 28431; + constexpr int Corns = 28432; + constexpr int Eggs = 22752; + constexpr int Kabobs = 17060; + constexpr int Warsupplies = 35121; + constexpr int LunarPig = 29424; + constexpr int LunarRat = 29425; + constexpr int LunarOx = 29426; + constexpr int LunarTiger = 29427; + constexpr int LunarRabbit = 29428; + constexpr int LunarDragon = 29429; + constexpr int LunarSnake = 29430; + constexpr int LunarHorse = 29431; + constexpr int LunarSheep = 29432; + constexpr int LunarMonkey = 29433; + constexpr int LunarRooster = 29434; + constexpr int LunarDog = 29435; + constexpr int ConsEssence = 24859; + constexpr int ConsArmor = 24860; + constexpr int ConsGrail = 24861; + constexpr int ResScrolls = 26501; + constexpr int Mobstopper = 32558; + constexpr int Powerstone = 24862; + + constexpr int Fruitcake = 21492; + constexpr int RedBeanCake = 15479; + constexpr int CremeBrulee = 15528; + constexpr int SugaryBlueDrink = 21812; + constexpr int ChocolateBunny = 22644; + constexpr int JarOfHoney = 31150; + constexpr int BRC = 31151; + constexpr int GRC = 31152; + constexpr int RRC = 31153; + constexpr int KrytalLokum = 35125; + constexpr int MinistreatOfPurity = 30208; + + // level-1 alcohol + constexpr int Eggnog = 6375; + constexpr int DwarvenAle = 5585; + constexpr int HuntersAle = 910; + constexpr int Absinthe = 6367; + constexpr int WitchsBrew = 6049; + constexpr int Ricewine = 15477; + constexpr int ShamrockAle = 22190; + constexpr int Cider = 28435; + + // level-5 alcohol + constexpr int Grog = 30855; + constexpr int SpikedEggnog = 6366; + constexpr int AgedDwarvenAle = 24593; + constexpr int AgedHuntersAle = 31145; + constexpr int Keg = 31146; + constexpr int FlaskOfFirewater = 2513; + constexpr int KrytanBrandy = 35124; + + // DoA Gemstones + constexpr int MargoniteGem = 21128; + constexpr int StygianGem = 21129; + constexpr int TitanGem = 21130; + constexpr int TormentGem = 21131; + + // Holiday Drops + constexpr int LunarToken = 21833; + + constexpr int Lockpick = 22751; + + constexpr int IdentificationKit = 2989; + constexpr int IdentificationKit_Superior = 5899; + constexpr int SalvageKit = 2992; + constexpr int SalvageKit_Expert = 2991; + constexpr int SalvageKit_Superior = 5900; + + // Alcohol + constexpr int BattleIsleIcedTea = 36682; + constexpr int BottleOfJuniberryGin = 19172; + constexpr int BottleOfVabbianWine = 19173; + constexpr int ZehtukasJug = 19171; + + // DP + constexpr int FourLeafClover = 22191; // party-wide + constexpr int OathOfPurity = 30206; // party-wide + constexpr int PeppermintCandyCane = 6370; + constexpr int RefinedJelly = 19039; + constexpr int ShiningBladeRations = 35127; + constexpr int WintergreenCandyCane = 21488; + + // Morale + constexpr int ElixirOfValor = 21227; // party-wide + constexpr int Honeycomb = 26784; // party-wide + constexpr int PumpkinCookie = 28433; + constexpr int RainbowCandyCane = 21489; // party-wide + constexpr int SealOfTheDragonEmpire = 30211; // party-wide + + // Summons + constexpr int GakiSummon = 30960; + constexpr int TurtleSummon = 30966; + + // Summons x3 + constexpr int TenguSummon = 30209; + constexpr int ImperialGuardSummon = 30210; + constexpr int WarhornSummon = 35126; + + // Tonics + constexpr int ELGwen = 36442; + constexpr int ELMiku = 36451; + constexpr int ELMargo = 36456; + constexpr int ELZenmai = 36493; + + // Other Consumables + constexpr int ArmbraceOfTruth = 21127; + constexpr int PhantomKey = 5882; + constexpr int ResScroll = 26501; + + // Weapons + constexpr int DSR = 32823; + constexpr int EternalBlade = 1045; + constexpr int ObsidianEdge = 1900; + constexpr int VoltaicSpear = 2071; + constexpr int CrystallineSword = 399; + + // Minis + constexpr int MiniDhuum = 32822; + + // Bundles + constexpr int UnholyText = 2619; + constexpr int DungeonKey = 25410; + constexpr int BossKey = 25416; + constexpr int EnchantedTorch = 503; + constexpr int LightOfSeborhin = 15531; + constexpr int IstaniFireOil = 16339; + + // Money + constexpr int GoldCoin = 2510; + constexpr int GoldCoins = 2511; + } + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/Maps.h b/Dependencies/GWCA/Include/GWCA/Constants/Maps.h new file mode 100644 index 00000000..dc135038 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/Maps.h @@ -0,0 +1,898 @@ +#pragma once + +namespace GW { + namespace Constants { + enum class MapID : uint32_t { + None = 0, + Gladiators_Arena, + DEV_Test_Arena_1v1, + Test_map, + Warriors_Isle_outpost, + Hunters_Isle_outpost, + Wizards_Isle_outpost, + Warriors_Isle, + Hunters_Isle, + Wizards_Isle, + Bloodstone_Fen, + The_Wilds, + Aurora_Glade, + Diessa_Lowlands, + Gates_of_Kryta, + DAlessio_Seaboard, + Divinity_Coast, + Talmark_Wilderness, + The_Black_Curtain, + Sanctum_Cay, + Droknars_Forge_outpost, + The_Frost_Gate, + Ice_Caves_of_Sorrow, + Thunderhead_Keep, + Iron_Mines_of_Moladune, + Borlis_Pass, + Talus_Chute, + Griffons_Mouth, + The_Great_Northern_Wall, + Fort_Ranik, + Ruins_of_Surmia, + Xaquang_Skyway, + Nolani_Academy, + Old_Ascalon, + The_Fissure_of_Woe, + Ember_Light_Camp_outpost, + Grendich_Courthouse_outpost, + Glints_Challenge_mission, + Augury_Rock_outpost, + Sardelac_Sanitarium_outpost, + Piken_Square_outpost, + Sage_Lands, + Mamnoon_Lagoon, + Silverwood, + Ettins_Back, + Reed_Bog, + The_Falls, + Dry_Top, + Tangle_Root, + Henge_of_Denravi_outpost, + Test_Map_species_art, // "This is a debug map to allow testing of species art." + Senjis_Corner_outpost, + Burning_Isle_outpost, + Tears_of_the_Fallen, + Scoundrels_Rise, + Lions_Arch_outpost, + Cursed_Lands, + Bergen_Hot_Springs_outpost, + North_Kryta_Province, + Nebo_Terrace, + Majestys_Rest, + Twin_Serpent_Lakes, + Watchtower_Coast, + Stingray_Strand, + Kessex_Peak, + DAlessio_Arena_mission, + All_Call_Click_Point_1, + Burning_Isle, + Frozen_Isle, + Nomads_Isle, + Druids_Isle, + Isle_of_the_Dead_guild_hall, + The_Underworld, + Riverside_Province, + Tournament_6, // Shares description with HoH arena below + The_Hall_of_Heroes_arena_mission, + Broken_Tower_mission, + House_zu_Heltzer_outpost, + The_Courtyard_arena_mission, + Unholy_Temples_mission, + Burial_Mounds_mission, + Ascalon_City_outpost, + Tomb_of_the_Primeval_Kings, + The_Vault_mission, + The_Underworld_arena_mission, + Ascalon_Arena, + Sacred_Temples_mission, + Icedome, + Iron_Horse_Mine, + Anvil_Rock, + Lornars_Pass, + Snake_Dance, + Tascas_Demise, + Spearhead_Peak, + Ice_Floe, + Witmans_Folly, + Mineral_Springs, + Dreadnoughts_Drift, + Frozen_Forest, + Travelers_Vale, + Deldrimor_Bowl, + Regent_Valley, + The_Breach, + Ascalon_Foothills, + Pockmark_Flats, + Dragons_Gullet, + Flame_Temple_Corridor, + Eastern_Frontier, + The_Scar, + The_Amnoon_Oasis_outpost, + Diviners_Ascent, + Vulture_Drifts, + The_Arid_Sea, + Prophets_Path, + Salt_Flats, + Skyward_Reach, + Dunes_of_Despair, + Thirsty_River, + Elona_Reach, + Augury_Rock_mission, + The_Dragons_Lair, + Perdition_Rock, + Ring_of_Fire, + Abaddons_Mouth, + Hells_Precipice, + Titans_Tears, + Golden_Gates_mission, + Scarred_Earth2, + The_Eternal_Grove, + Lutgardis_Conservatory_outpost, + Vasburg_Armory_outpost, + Serenity_Temple_outpost, + Ice_Tooth_Cave_outpost, + Beacons_Perch_outpost, + Yaks_Bend_outpost, + Frontier_Gate_outpost, + Beetletun_outpost, + Fishermens_Haven_outpost, + Temple_of_the_Ages, + Ventaris_Refuge_outpost, + Druids_Overlook_outpost, + Maguuma_Stade_outpost, + Quarrel_Falls_outpost, + Ascalon_Academy_outpost, // not in live game + Gyala_Hatchery, + The_Catacombs, + Lakeside_County, + The_Northlands, + Ascalon_City_pre_searing, // ? + Ascalon_Academy_PvP_battle_mission_1, + Ascalon_Academy_PvP_battle_mission_2, + Ascalon_Academy_explorable, + Heroes_Audience_outpost, + Seekers_Passage_outpost, + Destinys_Gorge_outpost, + Camp_Rankor_outpost, + The_Granite_Citadel_outpost, + Marhans_Grotto_outpost, + Port_Sledge_outpost, + Copperhammer_Mines_outpost, + Green_Hills_County, + Wizards_Folly, + Regent_Valley_pre_Searing, + The_Barradin_Estate_outpost, + Ashford_Abbey_outpost, + Foibles_Fair_outpost, + Fort_Ranik_pre_Searing_outpost, + Burning_Isle_mission, + Druids_Isle_mission, + + Frozen_Isle_mission = 170, + Warriors_Isle_mission, + Hunters_Isle_mission, + Wizards_Isle_mission, + Nomads_Isle_mission, + Isle_of_the_Dead_guild_hall_mission, + Frozen_Isle_outpost, + Nomads_Isle_outpost, + Druids_Isle_outpost, + Isle_of_the_Dead_guild_hall_outpost, + Fort_Koga_mission, + Shiverpeak_Arena, + Amnoon_Arena_mission, + Deldrimor_Arena_mission, + The_Crag_mission, + The_Underworld_gvg_mission, // UW guild hall not in live game + The_Underworld_guild_hall, + The_Underworld_guild_hall_preview, + Random_Arenas_outpost, + Team_Arenas_outpost, + Sorrows_Furnace, + Grenths_Footprint, + All_Call_Click_Point_2, + Cavalon_outpost, + Kaineng_Center_outpost, + Drazach_Thicket, + Jaya_Bluffs, + Shenzun_Tunnels, + Archipelagos, + Maishang_Hills, + Mount_Qinkai, + Melandrus_Hope, + Rheas_Crater, + Silent_Surf, + Unwaking_Waters_mission, + Morostav_Trail, + Deldrimor_War_Camp_outpost, + Dragons_Thieves, + Heroes_Crypt_mission, + Mourning_Veil_Falls, + Ferndale, + Pongmei_Valley, + Monastery_Overlook1, + Zen_Daijun_outpost_mission, + Minister_Chos_Estate_outpost_mission, + Vizunah_Square_mission, + Nahpui_Quarter_outpost_mission, + Tahnnakai_Temple_outpost_mission, + Arborstone_outpost_mission, + Boreas_Seabed_outpost_mission, + Sunjiang_District_outpost_mission, + Fort_Aspenwood_mission, + The_Eternal_Grove_outpost_mission, + The_Jade_Quarry_mission, + Gyala_Hatchery_outpost_mission, + Raisu_Palace_outpost_mission, + Imperial_Sanctum_outpost_mission, + Unwaking_Waters, + Grenz_Frontier_mission, + The_Ancestral_Lands_mission, + Amatz_Basin, + Kaanai_Canyon_mission, + Shadows_Passage, + Raisu_Palace, + The_Aurios_Mines, + Panjiang_Peninsula, + Kinya_Province, + Haiju_Lagoon, + Sunqua_Vale, + Wajjun_Bazaar, + Bukdek_Byway, + The_Undercity, + Shing_Jea_Monastery_outpost, + Shing_Jea_Arena, + Arborstone_explorable, + Minister_Chos_Estate_explorable, + Zen_Daijun_explorable, + Boreas_Seabed_explorable, + Great_Temple_of_Balthazar_outpost, + Tsumei_Village_outpost, + Seitung_Harbor_outpost, + Ran_Musu_Gardens_outpost, + Linnok_Courtyard, + Dwayna_Vs_Grenth, + Dwaynas_Camp, + Grenths_Camp, + Sunjiang_District_explorable, + Minister_Chos_Estate_cinematic, + Zen_Daijun_cinematic, + The_Jade_Quarry_Kurzick_cinematic, + Nahpui_Quarter_cinematic, + Tahnnaka_Temple_cinematic, + Arborstone_cinematic, + Boreas_Seabed_cinematic, + Sunjiang_District_cinematic, + Nahpui_Quarter_explorable, + Urgozs_Warren, + The_Eternal_Grove_cinematic, + Gyala_Hatchery_cinematic, + Tahnnakai_Temple_explorable, + Raisu_Palace_cinematic, + Imperial_Sanctum_cinematic, + Altrumm_Ruins, + Zos_Shivros_Channel, + Dragons_Throat, + Isle_of_Weeping_Stone_outpost, + Isle_of_Jade_outpost, + Harvest_Temple_outpost, + Breaker_Hollow_outpost, + Leviathan_Pits_outpost, + Isle_of_the_Nameless, + Zaishen_Challenge_outpost, + Zaishen_Elite_outpost, + Maatu_Keep_outpost, + Zin_Ku_Corridor_outpost, + Monastery_Overlook2, + Brauer_Academy_outpost, + Durheim_Archives_outpost, + Bai_Paasu_Reach_outpost, + Seafarers_Rest_outpost, + Bejunkan_Pier, + Vizunah_Square_Local_Quarter_outpost, + Vizunah_Square_Foreign_Quarter_outpost, + Fort_Aspenwood_Luxon_outpost, + Fort_Aspenwood_Kurzick_outpost, + The_Jade_Quarry_Luxon_outpost, + The_Jade_Quarry_Kurzick_outpost, + Unwaking_Waters_Luxon_outpost, + Unwaking_Waters_Kurzick_outpost, + Saltspray_Beach_mission, + Etnaran_Keys_mission, + Raisu_Pavilion, + Kaineng_Docks, + The_Marketplace_outpost, + Vizunah_Square_Local_Quarter_cinematic, + Vizunah_Square_Foreign_Quarter_cinematic, + The_Jade_Quarry_Luxon_cinematic, + The_Deep, + Ascalon_Arena_mission, + Annihilation_mission, + Kill_Count_Training_mission, + Priest_Annihilation_Training, + Obelisk_Annihilation_Training_mission, + Saoshang_Trail, + Shiverpeak_Arena_mission, + + // The boat map icon for cross-campaign travel. NF one is later + Travel_Battle_Isles, + Travel_Tyria, + Travel_Cantha, + + // Zaishen battles + DAlessio_Arena_mission3 = 318, + Amnoon_Arena_mission3, + Fort_Koga_mission3, + Heroes_Crypt_mission3, + Shiverpeak_Arena_mission3, + + Fort_Aspenwood_Kurzick_cinematic, + Fort_Aspenwood_Luxon_cinematic, + The_Harvest_Ceremony_Kurzick_cinematic, // same cinematic but different teleport destination + The_Harvest_Ceremony_Luxon_cinematic, // same cinematic but different teleport destination + Imperial_Sanctum_explorable, + Saltspray_Beach_Luxon_outpost, + Saltspray_Beach_Kurzick_outpost, + Heroes_Ascent_outpost, + Grenz_Frontier_Luxon_outpost, + Grenz_Frontier_Kurzick_outpost, + The_Ancestral_Lands_Luxon_outpost, + The_Ancestral_Lands_Kurzick_outpost, + Etnaran_Keys_Luxon_outpost, + Etnaran_Keys_Kurzick_outpost, + Kaanai_Canyon_Luxon_outpost, + Kaanai_Canyon_Kurzick_outpost, + DAlessio_Arena_mission2, + Amnoon_Arena_mission2, + Fort_Koga_mission2, + Heroes_Crypt_mission2, + Shiverpeak_Arena_mission2, + The_Hall_of_Heroes, + The_Courtyard, + Scarred_Earth, + The_Underworld_PvP, + Tanglewood_Copse_outpost, + Saint_Anjekas_Shrine_outpost, + Eredon_Terrace_outpost, + Divine_Path, + Brawlers_Pit_mission, + Petrified_Arena_mission, + Seabed_Arena_mission, + Isle_of_Weeping_Stone_mission, + Isle_of_Jade_mission, + Imperial_Isle_mission, + Isle_of_Meditation_mission, + Imperial_Isle_outpost, + Isle_of_Meditation_outpost, + Isle_of_Weeping_Stone, + Isle_of_Jade, + Imperial_Isle, + Isle_of_Meditation, + Random_Arenas_Test, + Shing_Jea_Arena_mission, + All_Skills, // "This is a debug map which forces download of all skill effects" + Dragon_Arena, + Jahai_Bluffs, + Kamadan_mission, + Marga_Coast, + Fahranur_mission, + Sunward_Marches, + Vortex_Elona, // Vortex travel icon on the Elona world map + Barbarous_Shore, + Camp_Hojanu_outpost, + Bahdok_Caverns, + Wehhan_Terraces_outpost, + Dejarin_Estate, + Arkjok_Ward, + Yohlon_Haven_outpost, + Gandara_the_Moon_Fortress, + Vortex_Realm_of_Torment, // Vortex travel icon on the Realm of Torment world map + The_Floodplain_of_Mahnkelon, + Lions_Arch_Sunspears_in_Kryta, + Turais_Procession, + Sunspear_Sanctuary_outpost, + Aspenwood_Gate_Kurzick_outpost, + Aspenwood_Gate_Luxon_outpost, + Jade_Flats_Kurzick_outpost, + Jade_Flats_Luxon_outpost, + Yatendi_Canyons, + Chantry_of_Secrets_outpost, + Garden_of_Seborhin, + Holdings_of_Chokhin, + Mihanu_Township_outpost, + Vehjin_Mines, + Basalt_Grotto_outpost, + Forum_Highlands, + Kaineng_Center_Sunspears_in_Cantha, + Sebelkeh_Basilica, // Not in live game + Resplendent_Makuun, + Honur_Hill_outpost, + Wilderness_of_Bahdza, + Sun_Docks_cinematic, // Arriving in Elona? + Vehtendi_Valley, + Yahnur_Market_outpost, + + // 408-412 are explorable maps all called "Here Be Dragons" + + The_Hidden_City_of_Ahdashim = 413, + The_Kodash_Bazaar_outpost, + Lions_Gate, + Monastery_Overlook_cinematic, // Factions opening cutscene + Bejunkan_Pier_cinematic, + Lions_Gate_cinematic, + The_Mirror_of_Lyss, + Secure_the_Refuge, + Venta_Cemetery, + Kamadan_Jewel_of_Istan_explorable, + The_Tribunal, + Kodonur_Crossroads, + Rilohn_Refuge, + Pogahn_Passage, + Moddok_Crevice, + Tihark_Orchard, + Consulate, + Plains_of_Jarin, + Sunspear_Great_Hall_outpost, + Cliffs_of_Dohjok, + Dzagonur_Bastion, + Dasha_Vestibule, + Grand_Court_of_Sebelkeh, + Command_Post, + Jokos_Domain, + Bone_Palace_outpost, + The_Ruptured_Heart, + The_Mouth_of_Torment_outpost, + The_Shattered_Ravines, + Lair_of_the_Forgotten_outpost, + Poisoned_Outcrops, + The_Sulfurous_Wastes, + The_Ebony_Citadel_of_Mallyx_mission, + The_Alkali_Pan, + A_Land_of_Heroes, + Crystal_Overlook, + Kamadan_Jewel_of_Istan_outpost, + Gate_of_Torment_outpost, + Gate_of_Anguish_elite_mission, + Secure_the_Refuge_cinematic, + Evacuation_cinematic, + Test_Map_solo_areas, // "This is a debug map to allow multiplayer testing of current solo areas." + Nightfallen_Garden, + Churrhir_Fields, + Beknur_Harbor_outpost, + Kodonur_Crossroads_cinematic, + Rilohn_Refuge_cinematic, + Pogahn_Passage_cinematic, + The_Underworld2, + Heart_of_Abaddon, + The_Underworld3, + Nightfallen_Coast, + Nightfallen_Jahai, + Depths_of_Madness, + Rollerbeetle_Racing, + Domain_of_Fear, + Gate_of_Fear_outpost, + Domain_of_Pain, + Bloodstone_Fen_quest, + Domain_of_Secrets, + Gate_of_Secrets_outpost, + Domain_of_Anguish, + Ooze_Pit_mission, + Jennurs_Horde, + Nundu_Bay, + Gate_of_Desolation, + Champions_Dawn_outpost, + Ruins_of_Morah, + Fahranur_The_First_City, + Bjora_Marches, + Zehlon_Reach, + Lahtenda_Bog, + Arbor_Bay, + Issnur_Isles, + Beknur_Harbor, + Mehtani_Keys, + Kodlonu_Hamlet_outpost, + Island_of_Shehkah, + Jokanur_Diggings, + Blacktide_Den, + Consulate_Docks, + Gate_of_Pain, + Gate_of_Madness, + Abaddons_Gate, + Sunspear_Arena, + Travel_Elona, // Boat travel icon in Elona + Ice_Cliff_Chasms, + Bokka_Amphitheatre, + Riven_Earth, + The_Astralarium_outpost, + Throne_of_Secrets, + Churranu_Island_Arena_mission, + Shing_Jea_Monastery_mission, + Haiju_Lagoon_mission, + Jaya_Bluffs_mission, + Seitung_Harbor_mission, + Tsumei_Village_mission, + Seitung_Harbor_mission_2, + Tsumei_Village_mission_2, + Minister_Chos_Estate_mission_2, + Drakkar_Lake, + Island_of_Shehkah_cinematic, // Nightfall opening cutscene + Jokanur_Diggings_cinematic, + Blacktide_Den_cinematic, + Consulate_Docks_cinematic, + Tihark_Orchard_cinematic, + Dzagonur_Bastion_cinematic, + Hidden_City_of_Ahdashim_cinematic, + Grand_Court_of_Sebelkeh_cinematic, + Jennurs_Horde_cinematic, + Nundu_Bay_cinematic, + Gates_of_Desolation_cinematic, + Ruins_of_Morah_cinematic, + Domain_of_Pain_cinematic, + Gate_of_Madness_cinematic, + Abaddons_Gate_cinematic, + Uncharted_Isle_outpost, + Isle_of_Wurms_outpost, + Uncharted_Isle, + Isle_of_Wurms, + Uncharted_Isle_mission, + Isle_of_Wurms_mission, + Ahmtur_Arena_mission, // Not in live game + Sunspear_Arena_mission, + Corrupted_Isle_outpost, + Isle_of_Solitude_outpost, + Corrupted_Isle, + Isle_of_Solitude, + Corrupted_Isle_mission, + Isle_of_Solitude_mission, + Sun_Docks, + Chahbek_Village, + Remains_of_Sahlahja, + Jaga_Moraine, + Bombardment_mission, + Norrhart_Domains, + Hero_Battles_outpost, + The_Beachhead_mission, + The_Crossing_mission, + Desert_Sands_mission, + Varajar_Fells, + Dajkah_Inlet, + The_Shadow_Nexus, + Chahbek_Village_cutscene, + Throne_Of_Secrets_outpost, // Not in live game + Sparkfly_Swamp, + Gate_of_the_Nightfallen_Lands_outpost, + Cathedral_of_Flames_Level_1, + The_Troubled_Keeper, + + // Landmarks on the Elona world map + Fortress_of_Jahai, + Halls_of_Chokhin, + Citadel_of_Dzagon, + Dynastic_Tombs, + + Verdant_Cascades, + Cathedral_of_Flames_Level_2, + Cathedral_of_Flames_Level_3, + Magus_Stones, + Catacombs_of_Kathandrax_Level_1, + Catacombs_of_Kathandrax_Level_2, + Alcazia_Tangle, + Rragars_Menagerie_Level_1, + Rragars_Menagerie_Level_2, + Rragars_Menagerie_Level_3, + Ooze_Pit, + Slavers_Exile_Level_1, + Oolas_Lab_Level_1, + Oolas_Lab_Level_2, + Oolas_Lab_Level_3, + Shards_of_Orr_Level_1, + Shards_of_Orr_Level_2, + Shards_of_Orr_Level_3, + Arachnis_Haunt_Level_1, + Arachnis_Haunt_Level_2, + + // 586-591 are all dungeon maps called "TEMP" + + Five_Team_Test = 592, // "5 team test" + Fetid_River_mission, + Overlook_mission, // Heroes Ascent unused/prototype map + Cemetery_mission, // Heroes Ascent unused/prototype map + Forgotten_Shrines_mission, + Track_mission, // Heroes Ascent unused/prototype map + Antechamber_mission, + Collision_mission, // Heroes Ascent unused/prototype map + The_Hall_of_Heroes2, // Actual HA hall of heroes? Unused? + + // 601-603 are all dungeon maps called "TEMP" + + Vloxen_Excavations_Level_1 = 604, + Vloxen_Excavations_Level_2, + Vloxen_Excavations_Level_3, + Heart_of_the_Shiverpeaks_Level_1, + Heart_of_the_Shiverpeaks_Level_2, + Heart_of_the_Shiverpeaks_Level_3, + + // 610,611 are dungeon maps with no name + + Bloodstone_Caves_Level_1 = 612, + Bloodstone_Caves_Level_2, + Bloodstone_Caves_Level_3, + Bogroot_Growths_Level_1, + Bogroot_Growths_Level_2, + Ravens_Point_Level_1, + Ravens_Point_Level_2, + Ravens_Point_Level_3, + Slavers_Exile_Level_2, + Slavers_Exile_Level_3, + Slavers_Exile_Level_4, + Slavers_Exile_Level_5, + Vloxs_Falls, + Battledepths_Level_1, + Battledepths_Level_2, + Battledepths_Level_3, + Sepulchre_of_Dragrimmar_Level_1, + Sepulchre_of_Dragrimmar_Level_2, + Frostmaws_Burrows_Level_1, + Frostmaws_Burrows_Level_2, + Frostmaws_Burrows_Level_3, + Frostmaws_Burrows_Level_4, + Frostmaws_Burrows_Level_5, + Darkrime_Delves_Level_1, + Darkrime_Delves_Level_2, + Darkrime_Delves_Level_3, + Gadds_Encampment_outpost, + Umbral_Grotto_outpost, + Rata_Sum_outpost, + Tarnished_Haven_outpost, + Eye_of_the_North_outpost, + Sifhalla_outpost, + Gunnars_Hold_outpost, + Olafstead_outpost, + Hall_of_Monuments, + Dalada_Uplands, + Doomlore_Shrine_outpost, + Grothmar_Wardowns, + Longeyes_Ledge_outpost, + Sacnoth_Valley, + Central_Transfer_Chamber_outpost, + Curse_of_the_Nornbear, + Blood_Washes_Blood, + A_Gate_Too_Far_Level_1, + A_Gate_Too_Far_Level_2, + A_Gate_Too_Far_Level_3, + The_Elusive_Golemancer_Level_1, + The_Elusive_Golemancer_Level_2, + The_Elusive_Golemancer_Level_3, + Finding_the_Bloodstone_Level_1, + Finding_the_Bloodstone_Level_2, + Finding_the_Bloodstone_Level_3, + Genius_Operated_Living_Enchanted_Manifestation, + Against_the_Charr, + Warband_of_Brothers_Level_1, + Warband_of_Brothers_Level_2, + Warband_of_Brothers_Level_3, + Assault_on_the_Stronghold, + Destructions_Depths_Level_1, + Destructions_Depths_Level_2, + Destructions_Depths_Level_3, + A_Time_for_Heroes, + Warband_Training, + Boreal_Station_outpost, + Catacombs_of_Kathandrax_Level_3, + Hall_of_Primordus, // Unused explorable area + Attack_of_the_Nornbear, + Cinematic_Cave_Norn_Cursed, + Cinematic_Steppe_Interrogation, + Cinematic_Interior_Research, + Cinematic_Eye_Vision_A, + Cinematic_Eye_Vision_B, + Cinematic_Eye_Vision_C, + Cinematic_Eye_Vision_D, + Polymock_Coliseum, + Polymock_Glacier, + Polymock_Crossing, + Cinematic_Mountain_Resolution, + Cold_as_Ice, + Beneath_Lions_Arch, + Tunnels_Below_Cantha, + Caverns_Below_Kamadan, + Cinematic_Mountain_Dwarfs, + Service_In_Defense_of_the_Eye, + Mano_a_Norn_o, + Service_Practice_Dummy, + Hero_Tutorial, + Prototype_Map, + The_Norn_Fighting_Tournament = 700, + Secret_Lair_of_the_Snowmen, + Norn_Brawling_Championship, + Kilroys_Punchout_Training, + Fronis_Irontoes_Lair_mission, + The_Justiciars_End, + Designer_Test_Map, + The_Great_Norn_Alemoot, + Varajar_Fells_Bear_Club_quest, + The_Crossing_mission2, // Unused RA arena? + Epilogue, + Insidious_Remnants, + The_Beachhead_mission2, // Unused RA arena? + Bombardment_mission2, // Unused RA arena? + Desert_Sands_mission2, // Unused RA arena? + MISSION_CINEMATIC_MISSION_PACK_TYRIA_INTRODUCTION, + The_Battlefield_cinematic, + Attack_on_Jaliss_Camp, + The_Hierophants_Stronghold_cinematic, + The_Asura_Plan_cinematic, + Creature_Test_Map, + Costume_Brawl_outpost, + Whitefury_Rapids_mission, + Kysten_Shore_mission, + Deepway_Ruins_mission, + Plikkup_Works_mission, + Kilroys_Punchout_Tournament, + Special_Ops_Flame_Temple_Corridor, + Special_Ops_Dragons_Gullet, + Special_Ops_Grendich_Courthouse, + + // Cinematics replayed at the Scrying Pool in Hall of Monuments + Encounter_in_the_Depths_hom_cinematic, + Into_the_North_hom_cinematic, + Arrival_at_the_Eye_hom_cinematic, + Joras_Curse_hom_cinematic, + The_Nornbear_hom_cinematic, + Blood_Washes_Blood_hom_cinematic, + Joras_Redemption_hom_cinematic, + Sign_of_the_Raven_hom_cinematic, + Olaf_and_Ogden_hom_cinematic, + Audience_with_the_King_hom_cinematic, + The_Battlefield_hom_cinematic, + The_Charr_Prisoner_hom_cinematic, + The_Warband_hom_cinematic, + Questions_and_Answers_hom_cinematic, + The_Hierophants_Stronghold_hom_cinematic, + Revolution_hom_cinematic, + The_Asura_Plan_hom_cinematic, + Bookah_hom_cinematic, + Oola_hom_cinematic, + Gadd_hom_cinematic, + At_the_Bloodstone_hom_cinematic, + Before_the_Battle_hom_cinematic, + Price_of_Victory_hom_cinematic, + The_Great_Dwarf_hom_cinematic, + The_Great_Destroyer_hom_cinematic, + Ogdens_Benediction_hom_cinematic, + + // EotN map travel icons + Asura_Gate_Tyria, + Asura_Gate_Cantha, + Asura_Gate_Elona, + + // "Mission" maps, used for icon status on world map + Finding_the_Bloodstone_mission, + Genius_Operated_Living_Enchanted_Manifestation_mission, + Against_the_Charr_mission, + Warband_of_brothers_mission, + Assault_on_the_Stronghold_mission, + Destructions_Depths_mission, + A_Time_for_Heroes_mission, + Curse_of_the_Nornbear_mission, + Blood_Washes_Blood_mission, + A_Gate_Too_Far_mission, + The_Elusive_Golemancer_mission, + The_Tengu_Accords, + The_Battle_of_Jahai, + The_Flight_North, + The_Rise_of_the_White_Mantle, + Battle_Isles_Marketplace, // Xunlai Marketplace? + MISSION_CINEMATIC_MISSION_PACK_CANTHA_INTRODUCTION, + Mission_Pack_Test, + MISSION_CINEMATIC_MISSION_PACK_ELONA_INTRODUCTION, + MISSION_CINEMATIC_MISSION_PACK_GWX_INTRODUCTION, + Piken_Square_pre_Searing_outpost, + + // Map 780 has invalid continent, name and description + + Secret_Lair_of_the_Snowmen2 = 781, // ? + Secret_Lair_of_the_Snowmen3, // ? + Droknars_Forge_cinematic, // ? + Isle_of_the_Nameless_PvP, + Rollerbeetle_Racing_HeroBattles, + Dragon_Arena_gvg, + Dwayna_vs_Grenth_gvg, + Temple_of_the_Ages_ROX, + Wajjun_Bazaar_POX, + Bokka_Amphitheatre_NOX, + Secret_Underground_Lair, + Golem_Tutorial_Simulation, + Snowball_Dominance, + Zaishen_Menagerie_Grounds, + Zaishen_Menagerie_outpost, + Codex_Arena_outpost, + + // Maps 797-805 are dungeon maps with the name "..." + + The_Underworld_Something_Wicked_This_Way_Comes = 806, + The_Underworld_Dont_Fear_the_Reapers, + Lions_Arch_Halloween_outpost, + Lions_Arch_Wintersday_outpost, + Lions_Arch_Canthan_New_Year_outpost, + Ascalon_City_Wintersday_outpost, + Droknars_Forge_Halloween_outpost, + Droknars_Forge_Wintersday_outpost, + Tomb_of_the_Primeval_Kings_Halloween_outpost, + Shing_Jea_Monastery_Dragon_Festival_outpost, + Shing_Jea_Monastery_Canthan_New_Year_outpost, + Kaineng_Center_Canthan_New_Year_outpost, + Kamadan_Jewel_of_Istan_Halloween_outpost, + Kamadan_Jewel_of_Istan_Wintersday_outpost, + Kamadan_Jewel_of_Istan_Canthan_New_Year_outpost, + Eye_of_the_North_outpost_Wintersday_outpost, + Tester_HUB, + + DAlessio_Arena_mission4, + Amnoon_Arena_mission4, + Churranu_Island_Arena_mission2, + Fort_Koga_mission4, + Petrified_Arena_mission2, + Heroes_Crypt_mission4, + Seabed_Arena_mission2, + Deldrimor_Arena_mission2, + Brawlers_Pit_mission2, + The_Crag_mission2, + Sunspear_Arena_mission2, + Shing_Jea_Arena_mission2, + Ascalon_Arena_mission2, + Shiverpeak_Arena_mission4, + + War_in_Kryta_Talmark_Wilderness, + War_in_Kryta_Trial_of_Zinn, + War_in_Kryta_Divinity_Coast, + War_in_Kryta_Lions_Arch_Keep, + War_in_Kryta_DAlessio_Seaboard, + War_in_Kryta_The_Battle_for_Lions_Arch, + War_in_Kryta_Riverside_Province, + War_in_Kryta_Lions_Arch, + War_in_Kryta_The_Mausoleum, + War_in_Kryta_Rise, + War_in_Kryta_Shadows_in_the_Jungle, + War_in_Kryta_A_Vengeance_of_Blades, + War_in_Kryta_Auspicious_Beginnings, + Beetletun_explorable, // Is this part of War in Kryta? or Rise? + + // War in Kryta? Festival event quests? + Aurora_Glade2, // explorable + Majestys_Rest2, + Watchtower_Coast2, + + Olafstead_cinematic, + The_Great_Snowball_Fight_of_the_Gods__Operation_Crush_Spirits, + The_Great_Snowball_Fight_of_the_Gods__Fighting_in_a_Winter_Wonderland, + Embark_Beach, + Regent_Valley_1059_AE, + Lakeside_County_1059_AE, + Dragons_Throat_area__What_Waits_in_Shadow = 860, + Kaineng_Center_Winds_of_Change__A_Chance_Encounter, + The_Marketplace_area__Tracking_the_Corruption, + Bukdek_Byway_Winds_of_Change__Cantha_Courier_Crisis, + Tsumei_Village_Winds_of_Change__A_Treatys_a_Treaty, + Seitung_Harbor_area__Deadly_Cargo, + Tahnnakai_Temple_Winds_of_Change__The_Rescue_Attempt, + Wajjun_Bazaar_Winds_of_Change__Violence_in_the_Streets, + Scarred_Psyche_mission, + Shadows_Passage_Winds_of_Change__Calling_All_Thugs, + Altrumm_Ruins__Finding_Jinnai, + Shing_Jea_Monastery__Raid_on_Shing_Jea_Monastery, + Kaineng_Center_Winds_of_Change__Raid_on_Kaineng_Center, + Wajjun_Bazaar_Winds_of_Change__Ministry_of_Oppression, + The_Final_Confrontation, + Lakeside_County_1070_AE, + Ashford_Catacombs_1070_AE, + + Count = 0x370, + }; + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/QuestIDs.h b/Dependencies/GWCA/Include/GWCA/Constants/QuestIDs.h new file mode 100644 index 00000000..348074fc --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/QuestIDs.h @@ -0,0 +1,273 @@ +#pragma once + +namespace GW { + namespace Constants { + enum class QuestID : uint32_t { + None = 0, + // Underworld + UW_Chamber = 101, + UW_Wastes, + UW_UWG, + UW_Mnt, + UW_Pits, + UW_Planes, + UW_Pools, + UW_Escort, + UW_Restore, + UW_Vale, + + // Fissure of woe + Fow_Defend = 202, + Fow_ArmyOfDarknesses, + Fow_WailingLord, + Fow_Griffons, + Fow_Slaves, + Fow_Restore, + Fow_Hunt, + Fow_Forgemaster, + Fow_Tos = 211, + Fow_Toc, + Fow_Khobay = 224, + + //Doa + Doa_DeathbringerCompany = 749, + Doa_RiftBetweenUs = 752, + Doa_ToTheRescue = 753, + + // city + Doa_City = 751, + + // Veil + Doa_BreachingStygianVeil = 742, + Doa_BroodWars = 755, + + // Foundry + Doa_FoundryBreakout = 743, + Doa_FoundryOfFailedCreations = 744, + + // slavers + The_Last_Hierophant = 917, + + // Prophecies + ZaishenMission_The_Great_Northern_Wall = 936, + ZaishenMission_Fort_Ranik = 937, + ZaishenMission_Ruins_of_Surmia = 938, + ZaishenMission_Nolani_Academy = 939, + ZaishenMission_Borlis_Pass = 940, + ZaishenMission_The_Frost_Gate = 941, + ZaishenMission_Gates_of_Kryta = 942, + ZaishenMission_DAlessio_Seaboard = 943, + ZaishenMission_Divinity_Coast = 944, + ZaishenMission_The_Wilds = 945, + ZaishenMission_Bloodstone_Fen = 946, + ZaishenMission_Aurora_Glade = 947, + ZaishenMission_Riverside_Province = 948, + ZaishenMission_Sanctum_Cay = 949, + ZaishenMission_Dunes_of_Despair = 950, + ZaishenMission_Thirsty_River = 951, + ZaishenMission_Elona_Reach = 952, + ZaishenMission_Augury_Rock = 953, + ZaishenMission_The_Dragons_Lair = 954, + ZaishenMission_Ice_Caves_of_Sorrow = 955, + ZaishenMission_Iron_Mines_of_Moladune = 956, + ZaishenMission_Thunderhead_Keep = 957, + ZaishenMission_Ring_of_Fire = 958, + ZaishenMission_Abaddons_Mouth = 959, + ZaishenMission_Hells_Precipice = 960, + + // Factions + ZaishenMission_Minister_Chos_Estate = 1119, + ZaishenMission_Zen_Daijun = 961, + ZaishenMission_Vizunah_Square = 962, + ZaishenMission_Nahpui_Quarter = 963, + ZaishenMission_Tahnnakai_Temple = 964, + ZaishenMission_Arborstone = 965, + ZaishenMission_Boreas_Seabed = 966, + ZaishenMission_Sunjiang_District = 967, + ZaishenMission_The_Eternal_Grove = 968, + ZaishenMission_Gyala_Hatchery = 970, + ZaishenMission_Unwaking_Waters = 969, + ZaishenMission_Raisu_Palace = 971, + ZaishenMission_Imperial_Sanctum = 972, + + // Nightfall + ZaishenMission_Chahbek_Village = 978, + ZaishenMission_Jokanur_Diggings = 979, + ZaishenMission_Blacktide_Den = 980, + ZaishenMission_Consulate_Docks = 981, + ZaishenMission_Venta_Cemetery = 982, + ZaishenMission_Kodonur_Crossroads = 983, + ZaishenMission_Pogahn_Passage = 1181, + ZaishenMission_Rilohn_Refuge = 984, + ZaishenMission_Moddok_Crevice = 985, + ZaishenMission_Tihark_Orchard = 986, + ZaishenMission_Dasha_Vestibule = 988, + ZaishenMission_Dzagonur_Bastion = 987, + ZaishenMission_Grand_Court_of_Sebelkeh = 989, + ZaishenMission_Jennurs_Horde = 990, + ZaishenMission_Nundu_Bay = 991, + ZaishenMission_Gate_of_Desolation = 992, + ZaishenMission_Ruins_of_Morah = 993, + ZaishenMission_Gate_of_Pain = 994, + ZaishenMission_Gate_of_Madness = 995, + ZaishenMission_Abaddons_Gate = 996, + + // Eye of the North + ZaishenMission_Finding_the_Bloodstone = 1000, + ZaishenMission_The_Elusive_Golemancer = 1001, + ZaishenMission_G_O_L_E_M = 1002, + ZaishenMission_Against_the_Charr = 1003, + ZaishenMission_Warband_of_Brothers = 1004, + ZaishenMission_Assault_on_the_Stronghold = 1005, + ZaishenMission_Curse_of_the_Nornbear = 1006, + ZaishenMission_A_Gate_Too_Far = 1008, + ZaishenMission_Blood_Washes_Blood = 1007, + ZaishenMission_Destructions_Depths = 1009, + ZaishenMission_A_Time_for_Heroes = 1010, + + ZaishenBounty_Urgoz = 1025, + ZaishenBounty_Ilsundur_Lord_of_Fire = 1048, + ZaishenBounty_Chung_The_Attuned = 1026, + ZaishenBounty_Mungri_Magicbox = 1029, + ZaishenBounty_The_Stygian_Lords = 1046, + ZaishenBounty_Rragar_Maneater = 1049, + ZaishenBounty_Murakai_Lady_of_the_Night = 1050, + ZaishenBounty_Prismatic_Ooze = 1051, + ZaishenBounty_Havok_Soulwail = 1052, + ZaishenBounty_Frostmaw_the_Kinslayer = 1053, + ZaishenBounty_Remnant_of_Antiquities = 1054, + ZaishenBounty_Plague_of_Destruction = 1055, + ZaishenBounty_Zoldark_the_Unholy = 1056, + ZaishenBounty_Khabuus = 1057, + ZaishenBounty_Zhim_Monns = 1058, + ZaishenBounty_Eldritch_Ettin = 1059, + ZaishenBounty_Fendi_Nin = 1060, + ZaishenBounty_TPS_Regulator_Golem = 1061, + ZaishenBounty_Arachni = 1062, + ZaishenBounty_Forgewight = 1063, + ZaishenBounty_Selvetarm = 1064, + ZaishenBounty_Justiciar_Thommis = 1065, + ZaishenBounty_Rand_Stormweaver = 1066, + ZaishenBounty_Duncan_the_Black = 1067, + ZaishenBounty_Fronis_Irontoe = 1068, + ZaishenBounty_Magmus = 1070, + ZaishenBounty_Lord_Khobay = 1086, + + ZaishenVanquish_Dejarin_Estate = 1201, + ZaishenVanquish_Watchtower_Coast = 1202, + ZaishenVanquish_Arbor_Bay = 1203, + ZaishenVanquish_Barbarous_Shore = 1204, + ZaishenVanquish_Deldrimor_Bowl = 1205, + ZaishenVanquish_Boreas_Seabed = 1206, + ZaishenVanquish_Cliffs_of_Dohjok = 1207, + ZaishenVanquish_Diessa_Lowlands = 1208, + ZaishenVanquish_Bukdek_Byway = 1209, + ZaishenVanquish_Bjora_Marches = 1210, + ZaishenVanquish_Crystal_Overlook = 1211, + ZaishenVanquish_Diviners_Ascent = 1212, + ZaishenVanquish_Dalada_Uplands = 1213, + ZaishenVanquish_Drazach_Thicket = 1214, + ZaishenVanquish_Fahranur_the_First_City = 1215, + ZaishenVanquish_Dragons_Gullet = 1216, + ZaishenVanquish_Ferndale = 1217, + ZaishenVanquish_Forum_Highlands = 1218, + ZaishenVanquish_Dreadnoughts_Drift = 1219, + ZaishenVanquish_Drakkar_Lake = 1220, + ZaishenVanquish_Dry_Top = 1221, + ZaishenVanquish_Tears_of_the_Fallen = 1222, + ZaishenVanquish_Gyala_Hatchery = 1223, + ZaishenVanquish_Ettins_Back = 1224, + ZaishenVanquish_Gandara_the_Moon_Fortress = 1225, + ZaishenVanquish_Grothmar_Wardowns = 1226, + ZaishenVanquish_Flame_Temple_Corridor = 1227, + ZaishenVanquish_Haiju_Lagoon = 1228, + ZaishenVanquish_Frozen_Forest = 1229, + ZaishenVanquish_Garden_of_Seborhin = 1230, + ZaishenVanquish_Grenths_Footprint = 1231, + ZaishenVanquish_Jaya_Bluffs = 1232, + ZaishenVanquish_Holdings_of_Chokhin = 1233, + ZaishenVanquish_Ice_Cliff_Chasms = 1234, + ZaishenVanquish_Griffons_Mouth = 1235, + ZaishenVanquish_Kinya_Province = 1236, + ZaishenVanquish_Issnur_Isles = 1237, + ZaishenVanquish_Jaga_Moraine = 1238, + ZaishenVanquish_Ice_Floe = 1239, + ZaishenVanquish_Maishang_Hills = 1240, + ZaishenVanquish_Jahai_Bluffs = 1241, + ZaishenVanquish_Riven_Earth = 1242, + ZaishenVanquish_Icedome = 1243, + ZaishenVanquish_Minister_Chos_Estate = 1244, + ZaishenVanquish_Mehtani_Keys = 1245, + ZaishenVanquish_Sacnoth_Valley = 1246, + ZaishenVanquish_Iron_Horse_Mine = 1247, + ZaishenVanquish_Morostav_Trail = 1248, + ZaishenVanquish_Plains_of_Jarin = 1249, + ZaishenVanquish_Sparkfly_Swamp = 1250, + ZaishenVanquish_Kessex_Peak = 1251, + ZaishenVanquish_Mourning_Veil_Falls = 1252, + ZaishenVanquish_The_Alkali_Pan = 1253, + ZaishenVanquish_Varajar_Fells = 1254, + ZaishenVanquish_Lornars_Pass = 1255, + ZaishenVanquish_Pongmei_Valley = 1256, + ZaishenVanquish_The_Floodplain_of_Mahnkelon = 1257, + ZaishenVanquish_Verdant_Cascades = 1258, + ZaishenVanquish_Majestys_Rest = 1259, + ZaishenVanquish_Raisu_Palace = 1260, + ZaishenVanquish_The_Hidden_City_of_Ahdashim = 1261, + ZaishenVanquish_Rheas_Crater = 1262, + ZaishenVanquish_Mamnoon_Lagoon = 1263, + ZaishenVanquish_Shadows_Passage = 1264, + ZaishenVanquish_The_Mirror_of_Lyss = 1265, + ZaishenVanquish_Saoshang_Trail = 1266, + ZaishenVanquish_Nebo_Terrace = 1267, + ZaishenVanquish_Shenzun_Tunnels = 1268, + ZaishenVanquish_The_Ruptured_Heart = 1269, + ZaishenVanquish_Salt_Flats = 1270, + ZaishenVanquish_North_Kryta_Province = 1271, + ZaishenVanquish_Silent_Surf = 1272, + ZaishenVanquish_The_Shattered_Ravines = 1273, + ZaishenVanquish_Scoundrels_Rise = 1274, + ZaishenVanquish_Old_Ascalon = 1275, + ZaishenVanquish_Sunjiang_District = 1276, + ZaishenVanquish_The_Sulphurous_Wastes = 1277, + ZaishenVanquish_Magus_Stones = 1278, + ZaishenVanquish_Perdition_Rock = 1279, + ZaishenVanquish_Sunqua_Vale = 1280, + ZaishenVanquish_Turais_Procession = 1281, + ZaishenVanquish_Norrhart_Domains = 1282, + ZaishenVanquish_Pockmark_Flats = 1283, + ZaishenVanquish_Tahnnakai_Temple = 1284, + ZaishenVanquish_Vehjin_Mines = 1285, + ZaishenVanquish_Poisoned_Outcrops = 1286, + ZaishenVanquish_Prophets_Path = 1287, + ZaishenVanquish_The_Eternal_Grove = 1288, + ZaishenVanquish_Tascas_Demise = 1289, + ZaishenVanquish_Respendent_Makuun = 1290, + ZaishenVanquish_Reed_Bog = 1291, + ZaishenVanquish_Unwaking_Waters = 1292, + ZaishenVanquish_Stingray_Strand = 1293, + ZaishenVanquish_Sunward_Marches = 1294, + ZaishenVanquish_Regent_Valley = 1295, + ZaishenVanquish_Wajjun_Bazaar = 1296, + ZaishenVanquish_Yatendi_Canyons = 1297, + ZaishenVanquish_Twin_Serpent_Lakes = 1298, + ZaishenVanquish_Sage_Lands = 1299, + ZaishenVanquish_Xaquang_Skyway = 1300, + ZaishenVanquish_Zehlon_Reach = 1301, + ZaishenVanquish_Tangle_Root = 1302, + ZaishenVanquish_Silverwood = 1303, + ZaishenVanquish_Zen_Daijun = 1304, + ZaishenVanquish_The_Arid_Sea = 1305, + ZaishenVanquish_Nahpui_Quarter = 1306, + ZaishenVanquish_Skyward_Reach = 1307, + ZaishenVanquish_The_Scar = 1308, + ZaishenVanquish_The_Black_Curtain = 1309, + ZaishenVanquish_Panjiang_Peninsula = 1310, + ZaishenVanquish_Snake_Dance = 1311, + ZaishenVanquish_Travelers_Vale = 1312, + ZaishenVanquish_The_Breach = 1313, + ZaishenVanquish_Lahtenda_Bog = 1314, + ZaishenVanquish_Spearhead_Peak = 1315 + }; + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/Skills.h b/Dependencies/GWCA/Include/GWCA/Constants/Skills.h new file mode 100644 index 00000000..e745ee8e --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/Skills.h @@ -0,0 +1,3139 @@ +#pragma once + +namespace GW { + namespace Constants { + enum class SkillID : uint32_t { + No_Skill = 0, + Healing_Signet, + Resurrection_Signet, + Signet_of_Capture, + BAMPH, + Power_Block, + Mantra_of_Earth, + Mantra_of_Flame, + Mantra_of_Frost, + Mantra_of_Lightning, + Hex_Breaker, + Distortion, + Mantra_of_Celerity, + Mantra_of_Recovery, + Mantra_of_Persistence, + Mantra_of_Inscriptions, + Mantra_of_Concentration, + Mantra_of_Resolve, + Mantra_of_Signets, + Fragility, + Confusion, + Inspired_Enchantment, + Inspired_Hex, + Power_Spike, + Power_Leak, + Power_Drain, + Empathy, + Shatter_Delusions, + Backfire, + Blackout, + Diversion, + Conjure_Phantasm, + Illusion_of_Weakness, + Illusionary_Weaponry, + Sympathetic_Visage, + Ignorance, + Arcane_Conundrum, + Illusion_of_Haste, + Channeling, + Energy_Surge, + Ether_Feast, + Ether_Lord, + Energy_Burn, + Clumsiness, + Phantom_Pain, + Ethereal_Burden, + Guilt, + Ineptitude, + Spirit_of_Failure, + Mind_Wrack, + Wastrels_Worry, + Shame, + Panic, + Migraine, + Crippling_Anguish, + Fevered_Dreams, + Soothing_Images, + Cry_of_Frustration, + Signet_of_Midnight, + Signet_of_Weariness, + Signet_of_Illusions_beta_version, + Leech_Signet, + Signet_of_Humility, + Keystone_Signet, + Mimic, + Arcane_Mimicry, + Spirit_Shackles, + Shatter_Hex, + Drain_Enchantment, + Shatter_Enchantment, + Disappear, + Unnatural_Signet_alpha_version, + Elemental_Resistance, + Physical_Resistance, + Echo, + Arcane_Echo, + Imagined_Burden, + Chaos_Storm, + Epidemic, + Energy_Drain, + Energy_Tap, + Arcane_Thievery, + Mantra_of_Recall, + Animate_Bone_Horror, + Animate_Bone_Fiend, + Animate_Bone_Minions, + Grenths_Balance, + Veratas_Gaze, + Veratas_Aura, + Deathly_Chill, + Veratas_Sacrifice, + Well_of_Power, + Well_of_Blood, + Well_of_Suffering, + Well_of_the_Profane, + Putrid_Explosion, + Soul_Feast, + Necrotic_Traversal, + Consume_Corpse, + Parasitic_Bond, + Soul_Barbs, + Barbs, + Shadow_Strike, + Price_of_Failure, + Death_Nova, + Deathly_Swarm, + Rotting_Flesh, + Virulence, + Suffering, + Life_Siphon, + Unholy_Feast, + Awaken_the_Blood, + Desecrate_Enchantments, + Tainted_Flesh, + Aura_of_the_Lich, + Blood_Renewal, + Dark_Aura, + Enfeeble, + Enfeebling_Blood, + Blood_is_Power, + Blood_of_the_Master, + Spiteful_Spirit, + Malign_Intervention, + Insidious_Parasite, + Spinal_Shivers, + Wither, + Life_Transfer, + Mark_of_Subversion, + Soul_Leech, + Defile_Flesh, + Demonic_Flesh, + Barbed_Signet, + Plague_Signet, + Dark_Pact, + Order_of_Pain, + Faintheartedness, + Shadow_of_Fear, + Rigor_Mortis, + Dark_Bond, + Infuse_Condition, + Malaise, + Rend_Enchantments, + Lingering_Curse, + Strip_Enchantment, + Chilblains, + Signet_of_Agony, + Offering_of_Blood, + Dark_Fury, + Order_of_the_Vampire, + Plague_Sending, + Mark_of_Pain, + Feast_of_Corruption, + Taste_of_Death, + Vampiric_Gaze, + Plague_Touch, + Vile_Touch, + Vampiric_Touch, + Blood_Ritual, + Touch_of_Agony, + Weaken_Armor, + Windborne_Speed, + Lightning_Storm, + Gale, + Whirlwind, + Elemental_Attunement, + Armor_of_Earth, + Kinetic_Armor, + Eruption, + Magnetic_Aura, + Earth_Attunement, + Earthquake, + Stoning, + Stone_Daggers, + Grasping_Earth, + Aftershock, + Ward_Against_Elements, + Ward_Against_Melee, + Ward_Against_Foes, + Ether_Prodigy, + Incendiary_Bonds, + Aura_of_Restoration, + Ether_Renewal, + Conjure_Flame, + Inferno, + Fire_Attunement, + Mind_Burn, + Fireball, + Meteor, + Flame_Burst, + Rodgorts_Invocation, + Mark_of_Rodgort, + Immolate, + Meteor_Shower, + Phoenix, + Flare, + Lava_Font, + Searing_Heat, + Fire_Storm, + Glyph_of_Elemental_Power, + Glyph_of_Energy, + Glyph_of_Lesser_Energy, + Glyph_of_Concentration, + Glyph_of_Sacrifice, + Glyph_of_Renewal, + Rust, + Lightning_Surge, + Armor_of_Frost, + Conjure_Frost, + Water_Attunement, + Mind_Freeze, + Ice_Prison, + Ice_Spikes, + Frozen_Burst, + Shard_Storm, + Ice_Spear, + Maelstrom, + Iron_Mist, + Crystal_Wave, + Obsidian_Flesh, + Obsidian_Flame, + Blinding_Flash, + Conjure_Lightning, + Lightning_Strike, + Chain_Lightning, + Enervating_Charge, + Air_Attunement, + Mind_Shock, + Glimmering_Mark, + Thunderclap, + Lightning_Orb, + Lightning_Javelin, + Shock, + Lightning_Touch, + Swirling_Aura, + Deep_Freeze, + Blurred_Vision, + Mist_Form, + Water_Trident, + Armor_of_Mist, + Ward_Against_Harm, + Smite, + Life_Bond, + Balthazars_Spirit, + Strength_of_Honor, + Life_Attunement, + Protective_Spirit, + Divine_Intervention, + Symbol_of_Wrath, + Retribution, + Holy_Wrath, + Essence_Bond, + Scourge_Healing, + Banish, + Scourge_Sacrifice, + Vigorous_Spirit, + Watchful_Spirit, + Blessed_Aura, + Aegis, + Guardian, + Shield_of_Deflection, + Aura_of_Faith, + Shield_of_Regeneration, + Shield_of_Judgment, + Protective_Bond, + Pacifism, + Amity, + Peace_and_Harmony, + Judges_Insight, + Unyielding_Aura, + Mark_of_Protection, + Life_Barrier, + Zealots_Fire, + Balthazars_Aura, + Spell_Breaker, + Healing_Seed, + Mend_Condition, + Restore_Condition, + Mend_Ailment, + Purge_Conditions, + Divine_Healing, + Heal_Area, + Orison_of_Healing, + Word_of_Healing, + Dwaynas_Kiss, + Divine_Boon, + Healing_Hands, + Heal_Other, + Heal_Party, + Healing_Breeze, + Vital_Blessing, + Mending, + Live_Vicariously, + Infuse_Health, + Signet_of_Devotion, + Signet_of_Judgment, + Purge_Signet, + Bane_Signet, + Blessed_Signet, + Martyr, + Shielding_Hands, + Contemplation_of_Purity, + Remove_Hex, + Smite_Hex, + Convert_Hexes, + Light_of_Dwayna, + Resurrect, + Rebirth, + Reversal_of_Fortune, + Succor, + Holy_Veil, + Divine_Spirit, + Draw_Conditions, + Holy_Strike, + Healing_Touch, + Restore_Life, + Vengeance, + To_the_Limit, + Battle_Rage, + Defy_Pain, + Rush, + Hamstring, + Wild_Blow, + Power_Attack, + Desperation_Blow, + Thrill_of_Victory, + Distracting_Blow, + Protectors_Strike, + Griffons_Sweep, + Pure_Strike, + Skull_Crack, + Cyclone_Axe, + Hammer_Bash, + Bulls_Strike, + I_Will_Avenge_You, + Axe_Rake, + Cleave, + Executioners_Strike, + Dismember, + Eviscerate, + Penetrating_Blow, + Disrupting_Chop, + Swift_Chop, + Axe_Twist, + For_Great_Justice, + Flurry, + Defensive_Stance, + Frenzy, + Endure_Pain, + Watch_Yourself, + Sprint, + Belly_Smash, + Mighty_Blow, + Crushing_Blow, + Crude_Swing, + Earth_Shaker, + Devastating_Hammer, + Irresistible_Blow, + Counter_Blow, + Backbreaker, + Heavy_Blow, + Staggering_Blow, + Dolyak_Signet, + Warriors_Cunning, + Shield_Bash, + Charge, + Victory_Is_Mine, + Fear_Me, + Shields_Up, + I_Will_Survive, + Dont_Believe_Their_Lies, + Berserker_Stance, + Balanced_Stance, + Gladiators_Defense, + Deflect_Arrows, + Warriors_Endurance, + Dwarven_Battle_Stance, + Disciplined_Stance, + Wary_Stance, + Shield_Stance, + Bulls_Charge, + Bonettis_Defense, + Hundred_Blades, + Sever_Artery, + Galrath_Slash, + Gash, + Final_Thrust, + Seeking_Blade, + Riposte, + Deadly_Riposte, + Flourish, + Savage_Slash, + Hunters_Shot, + Pin_Down, + Crippling_Shot, + Power_Shot, + Barrage, + Dual_Shot, + Quick_Shot, + Penetrating_Attack, + Distracting_Shot, + Precision_Shot, + Splinter_Shot_monster_skill, + Determined_Shot, + Called_Shot, + Poison_Arrow, + Oath_Shot, + Debilitating_Shot, + Point_Blank_Shot, + Concussion_Shot, + Punishing_Shot, + Call_of_Ferocity, + Charm_Animal, + Call_of_Protection, + Call_of_Elemental_Protection, + Call_of_Vitality, + Call_of_Haste, + Call_of_Healing, + Call_of_Resilience, + Call_of_Feeding, + Call_of_the_Hunter, + Call_of_Brutality, + Call_of_Disruption, + Revive_Animal, + Symbiotic_Bond, + Throw_Dirt, + Dodge, + Savage_Shot, + Antidote_Signet, + Incendiary_Arrows, + Melandrus_Arrows, + Marksmans_Wager, + Ignite_Arrows, + Read_the_Wind, + Kindle_Arrows, + Choking_Gas, + Apply_Poison, + Comfort_Animal, + Bestial_Pounce, + Maiming_Strike, + Feral_Lunge, + Scavenger_Strike, + Melandrus_Assault, + Ferocious_Strike, + Predators_Pounce, + Brutal_Strike, + Disrupting_Lunge, + Troll_Unguent, + Otyughs_Cry, + Escape, + Practiced_Stance, + Whirling_Defense, + Melandrus_Resilience, + Dryders_Defenses, + Lightning_Reflexes, + Tigers_Fury, + Storm_Chaser, + Serpents_Quickness, + Dust_Trap, + Barbed_Trap, + Flame_Trap, + Healing_Spring, + Spike_Trap, + Winter, + Winnowing, + Edge_of_Extinction, + Greater_Conflagration, + Conflagration, + Fertile_Season, + Symbiosis, + Primal_Echoes, + Predatory_Season, + Frozen_Soil, + Favorable_Winds, + High_Winds, + Energizing_Wind, + Quickening_Zephyr, + Natures_Renewal, + Muddy_Terrain, + Bleeding, + Blind, + Burning, + Crippled, + Deep_Wound, + Disease, + Poison, + Dazed, + Weakness, + Cleansed, + Eruption_environment, + Fire_Storm_environment, + Vital_Blessing_monster_skill, + Fount_Of_Maguuma, + Healing_Fountain, + Icy_Ground, + Maelstrom_environment, + Mursaat_Tower_skill, + Quicksand_environment_effect, + Curse_of_the_Bloodstone, + Chain_Lightning_environment, + Obelisk_Lightning, + Tar, + Siege_Attack, + Resurrect_Party, + Scepter_of_Orrs_Aura, + Scepter_of_Orrs_Power, + Burden_Totem, + Splinter_Mine_skill, + Entanglement, + Dwarven_Powder_Keg, + Seed_of_Resurrection, + Deafening_Roar, + Brutal_Mauling, + Crippling_Attack, + Charm_Animal_monster_skill, + Breaking_Charm, + Charr_Buff, + Claim_Resource, + Claim_Resource1, + Claim_Resource2, + Claim_Resource3, + Claim_Resource4, + Claim_Resource5, + Claim_Resource6, + Claim_Resource7, + Dozen_Shot, + Nibble, + Claim_Resource8, + Claim_Resource9, + Reflection, + Spectral_Agony, + Giant_Stomp, + Agnars_Rage, + Healing_Breeze_Agnars_Rage, + Crystal_Haze, + Crystal_Bonds, + Jagged_Crystal_Skin, + Crystal_Hibernation, + Stun_Immunity, + Invulnerability, + Hunger_of_the_Lich, + Embrace_the_Pain, + Life_Vortex, + Oracle_Link, + Guardian_Pacify, + Soul_Vortex, + Soul_Vortex2, + Spectral_Agony1, + Natural_Resistance, + Natural_Resistance1, + Guild_Lord_Aura, + Critical_Hit_Probability, + Stun_on_Critical_Hit, + Blood_Splattering, + Inanimate_Object, + Undead_sensitivity_to_Light, + Energy_Boost, + Health_Drain, + Immunity_to_Critical_Hits, + Titans_get_plus_Health_regen_and_set_enemies_on_fire_each_time_he_is_hit, + Undying, + Resurrect_Gargoyle, + Seal_Regen, + Lightning_Orb1, + Wurm_Siege_Dunes_of_Despair, + Wurm_Siege, + Claim_Resource10, + Shiver_Touch, + Spontaneous_Combustion, + Vanish, + Victory_or_Death, + Mark_of_Insecurity, + Disrupting_Dagger, + Deadly_Paradox, + Teleport_Players, + Quest_skill_for_Coastal_Exam, + Holy_Blessing, + Statues_Blessing, + Siege_Attack1, + Siege_Attack2, + Domain_of_Skill_Damage, + Domain_of_Energy_Draining, + Domain_of_Elements, + Domain_of_Health_Draining, + Domain_of_Slow, + Divine_Fire, + Swamp_Water, + Janthirs_Gaze, + Fake_Spell, + Charm_Animal_monster, + Stormcaller_skill, + Knock, + Quest_Skill, + Rurik_Must_Live, + Blessing_of_the_Kurzicks, + Lichs_Phylactery, + Restore_Life_monster_skill, + Chimera_of_Intensity, + Life_Draining = 657, + Jaundiced_Gaze = 763, + Wail_of_Doom, + Heros_Insight, + Gaze_of_Contempt, + Berserkers_Insight, + Slayers_Insight, + Vipers_Defense, + Return, + Aura_of_Displacement, + Generous_Was_Tsungrai, + Mighty_Was_Vorizun, + To_the_Death, + Death_Blossom, + Twisting_Fangs, + Horns_of_the_Ox, + Falling_Spider, + Black_Lotus_Strike, + Fox_Fangs, + Moebius_Strike, + Jagged_Strike, + Unsuspecting_Strike, + Entangling_Asp, + Mark_of_Death, + Iron_Palm, + Resilient_Weapon, + Blind_Was_Mingson, + Grasping_Was_Kuurong, + Vengeful_Was_Khanhei, + Flesh_of_My_Flesh, + Splinter_Weapon, + Weapon_of_Warding, + Wailing_Weapon, + Nightmare_Weapon, + Sorrows_Flame, + Sorrows_Fist, + Blast_Furnace, + Beguiling_Haze, + Enduring_Toxin, + Shroud_of_Silence, + Expose_Defenses, + Power_Leech, + Arcane_Languor, + Animate_Vampiric_Horror, + Cultists_Fervor, + Reapers_Mark = 808, + Shatterstone, + Protectors_Defense, + Run_as_One, + Defiant_Was_Xinrae, + Lyssas_Aura, + Shadow_Refuge, + Scorpion_Wire, + Mirrored_Stance, + Discord, + Well_of_Weariness, + Vampiric_Spirit, + Depravity, + Icy_Veins, + Weaken_Knees, + Burning_Speed, + Lava_Arrows, + Bed_of_Coals, + Shadow_Form, + Siphon_Strength, + Vile_Miasma, + Veratas_Promise, + Ray_of_Judgment, + Primal_Rage, + Animate_Flesh_Golem, + Borrowed_Energy, + Reckless_Haste, + Blood_Bond, + Ride_the_Lightning, + Energy_Boon, + Dwaynas_Sorrow, + Retreat, + Poisoned_Heart, + Fetid_Ground, + Arc_Lightning, + Gust, + Churning_Earth, + Liquid_Flame, + Steam, + Boon_Signet, + Reverse_Hex, + Lacerating_Chop, + Fierce_Blow, + Sun_and_Moon_Slash, + Splinter_Shot, + Melandrus_Shot, + Snare, + Chomper, + Kilroy_Stonekin, + Adventurers_Insight, + Dancing_Daggers, + Conjure_Nightmare, + Signet_of_Disruption, + Dissipation, + Ravenous_Gaze, + Order_of_Apostasy, + Oppressive_Gaze, + Lightning_Hammer, + Vapor_Blade, + Healing_Light, + Aim_True, + Coward, + Pestilence, + Shadowsong, + Shadowsong_attack, + Resurrect_monster_skill, + Consuming_Flames, + Chains_of_Enslavement, + Signet_of_Shadows, + Lyssas_Balance, + Visions_of_Regret, + Illusion_of_Pain, + Stolen_Speed, + Ether_Signet, + Signet_of_Disenchantment, + Vocal_Minority, + Searing_Flames, + Shield_Guardian, + Restful_Breeze, + Signet_of_Rejuvenation, + Whirling_Axe, + Forceful_Blow, + Headshot, + None_Shall_Pass, + Quivering_Blade, + Seeking_Arrows, + Rampagers_Insight, + Hunters_Insight, + Amulet_of_Protection, + Oath_of_Healing, + Overload, + Images_of_Remorse, + Shared_Burden, + Soul_Bind, + Blood_of_the_Aggressor, + Icy_Prism, + Furious_Axe, + Auspicious_Blow, + On_Your_Knees, + Dragon_Slash, + Marauders_Shot, + Focused_Shot, + Spirit_Rift, + Union, + Blessing_of_the_Kurzicks1, + Tranquil_Was_Tanasen, + Consume_Soul, + Spirit_Light, + Lamentation, + Rupture_Soul, + Spirit_to_Flesh, + Spirit_Burn, + Destruction, + Dissonance, + Dissonance_attack, + Disenchantment, + Disenchantment_attack, + Recall, + Sharpen_Daggers, + Shameful_Fear, + Shadow_Shroud, + Shadow_of_Haste, + Auspicious_Incantation, + Power_Return, + Complicate, + Shatter_Storm, + Unnatural_Signet, + Rising_Bile, + Envenom_Enchantments, + Shockwave, + Ward_of_Stability, + Icy_Shackles, + Cry_of_Lament, + Blessed_Light, + Withdraw_Hexes, + Extinguish, + Signet_of_Strength, + REMOVE_With_Haste, + Trappers_Focus, + Brambles, + Desperate_Strike, + Way_of_the_Fox, + Shadowy_Burden, + Siphon_Speed, + Deaths_Charge, + Power_Flux, + Expel_Hexes, + Rip_Enchantment, + Energy_Font, + Spell_Shield, + Healing_Whisper, + Ethereal_Light, + Release_Enchantments, + Lacerate, + Spirit_Transfer, + Restoration, + Vengeful_Weapon, + Archemorus_Strike, + Spear_of_Archemorus_Level_1, + Spear_of_Archemorus_Level_2, + Spear_of_Archemorus_Level_3, + Spear_of_Archemorus_Level_4, + Spear_of_Archemorus_Level_5, + Argos_Cry, + Jade_Fury, + Blinding_Powder, + Mantis_Touch, + Exhausting_Assault, + Repeating_Strike, + Way_of_the_Lotus, + Mark_of_Instability, + Mistrust, + Feast_of_Souls, + Recuperation, + Shelter, + Weapon_of_Shadow, + Torch_Enchantment, + Caltrops, + Nine_Tail_Strike, + Way_of_the_Empty_Palm, + Temple_Strike, + Golden_Phoenix_Strike, + Expunge_Enchantments, + Deny_Hexes, + Triple_Chop, + Enraged_Smash, + Renewing_Smash, + Tiger_Stance, + Standing_Slash, + Famine, + Torch_Hex, + Torch_Degeneration_Hex, + Blinding_Snow, + Avalanche_skill, + Snowball, + Mega_Snowball, + Yuletide, + Ice_Skates, + Ice_Fort, + Yellow_Snow, + Hidden_Rock, + Snow_Down_the_Shirt, + Mmmm_Snowcone, + Holiday_Blues, + Icicles, + Ice_Breaker, + Lets_Get_Em, + Flurry_of_Ice, + Snowball_NPC, + Undying1, + Critical_Eye, + Critical_Strike, + Blades_of_Steel, + Jungle_Strike, + Wild_Strike, + Leaping_Mantis_Sting, + Black_Mantis_Thrust, + Disrupting_Stab, + Golden_Lotus_Strike, + Critical_Defenses, + Way_of_Perfection, + Dark_Apostasy, + Locusts_Fury, + Shroud_of_Distress, + Heart_of_Shadow, + Impale, + Seeping_Wound, + Assassins_Promise, + Signet_of_Malice, + Dark_Escape, + Crippling_Dagger, + Star_Strike, + Spirit_Walk, + Unseen_Fury, + Flashing_Blades, + Dash, + Dark_Prison, + Palm_Strike, + Assassin_of_Lyssa, + Mesmer_of_Lyssa, + Revealed_Enchantment, + Revealed_Hex, + Disciple_of_Energy, + Empathy_Koro, + Accumulated_Pain, + Psychic_Distraction, + Ancestors_Visage, + Recurring_Insecurity, + Kitahs_Burden, + Psychic_Instability, + Chaotic_Power, + Hex_Eater_Signet, + Celestial_Haste, + Feedback, + Arcane_Larceny, + Chaotic_Ward, + Favor_of_the_Gods, + Dark_Aura_blessing, + Spoil_Victor, + Lifebane_Strike, + Bitter_Chill, + Taste_of_Pain, + Defile_Enchantments, + Shivers_of_Dread, + Star_Servant, + Necromancer_of_Grenth, + Ritualist_of_Grenth, + Vampiric_Swarm, + Blood_Drinker, + Vampiric_Bite, + Wallows_Bite, + Enfeebling_Touch, + Disciple_of_Ice, + Teinais_Wind, + Shock_Arrow, + Unsteady_Ground, + Sliver_Armor, + Ash_Blast, + Dragons_Stomp, + Unnatural_Resistance, + Second_Wind, + Cloak_of_Faith, + Smoldering_Embers, + Double_Dragon, + Disciple_of_the_Air, + Teinais_Heat, + Breath_of_Fire, + Star_Burst, + Glyph_of_Essence, + Teinais_Prison, + Mirror_of_Ice, + Teinais_Crystals, + Celestial_Storm, + Monk_of_Dwayna, + Aura_of_the_Grove, + Cathedral_Collapse, + Miasma, + Acid_Trap, + Shield_of_Saint_Viktor, + Urn_of_Saint_Viktor_Level_1, + Urn_of_Saint_Viktor_Level_2, + Urn_of_Saint_Viktor_Level_3, + Urn_of_Saint_Viktor_Level_4, + Urn_of_Saint_Viktor_Level_5, + Aura_of_Light, + Kirins_Wrath, + Spirit_Bond, + Air_of_Enchantment, + Warriors_Might, + Heavens_Delight, + Healing_Burst, + Kareis_Healing_Circle, + Jameis_Gaze, + Gift_of_Health, + Battle_Fervor, + Life_Sheath, + Star_Shine, + Disciple_of_Fire, + Empathic_Removal, + Warrior_of_Balthazar, + Resurrection_Chant, + Word_of_Censure, + Spear_of_Light, + Stonesoul_Strike, + Shielding_Branches, + Drunken_Blow, + Leviathans_Sweep, + Jaizhenju_Strike, + Penetrating_Chop, + Yeti_Smash, + Disciple_of_the_Earth, + Ranger_of_Melandru, + Storm_of_Swords, + You_Will_Die, + Auspicious_Parry, + Strength_of_the_Oak, + Silverwing_Slash, + Destroy_Enchantment, + Shove, + Base_Defense, + Carrier_Defense, + The_Chalice_of_Corruption, + Song_of_the_Mists = 1151, + Demonic_Agility, + Blessing_of_the_Kirin, + Emperor_Degen, + Juggernaut_Toss, + Aura_of_the_Juggernaut, + Star_Shards, + Turtle_Shell = 1172, + Exposed_Underbelly, + Cathedral_Collapse1, + Blood_of_zu_Heltzer, + Afflicted_Soul_Explosion, + Invincibility, + Last_Stand, + Dark_Chain_Lightning, + Seadragon_Health_Trigger, + Corrupted_Breath, + Renewing_Corruption, + Corrupted_Dragon_Spores, + Corrupted_Dragon_Scales, + Construct_Possession, + Siege_Turtle_Attack_The_Eternal_Grove, + Siege_Turtle_Attack_Fort_Aspenwood, + Siege_Turtle_Attack_Gyala_Hatchery, + Of_Royal_Blood, + Passage_to_Tahnnakai, + Sundering_Attack, + Zojuns_Shot, + Consume_Spirit, + Predatory_Bond, + Heal_as_One, + Zojuns_Haste, + Needling_Shot, + Broad_Head_Arrow, + Glass_Arrows, + Archers_Signet, + Savage_Pounce, + Enraged_Lunge, + Bestial_Mauling, + Energy_Drain_effect, + Poisonous_Bite, + Pounce, + Celestial_Stance, + Sheer_Exhaustion, + Bestial_Fury, + Life_Drain, + Vipers_Nest, + Equinox, + Tranquility, + Acute_Weakness, + Clamor_of_Souls, + Ritual_Lord = 1217, + Cruel_Was_Daoshen, + Protective_Was_Kaolai, + Attuned_Was_Songkai, + Resilient_Was_Xiko, + Lively_Was_Naomei, + Anguished_Was_Lingwah, + Draw_Spirit, + Channeled_Strike, + Spirit_Boon_Strike, + Essence_Strike, + Spirit_Siphon, + Explosive_Growth, + Boon_of_Creation, + Spirit_Channeling, + Armor_of_Unfeeling, + Soothing_Memories, + Mend_Body_and_Soul, + Dulled_Weapon, + Binding_Chains, + Painful_Bond, + Signet_of_Creation, + Signet_of_Spirits, + Soul_Twisting, + Celestial_Summoning, + Archemorus_Strike_Celestial_Summoning, + Shield_of_Saint_Viktor_Celestial_Summoning, + Ghostly_Haste, + Gaze_from_Beyond, + Ancestors_Rage, + Pain, + Pain_attack, + Displacement, + Preservation, + Life, + Earthbind, + Bloodsong, + Bloodsong_attack, + Wanderlust, + Wanderlust_attack, + Spirit_Light_Weapon, + Brutal_Weapon, + Guided_Weapon, + Meekness, + Frigid_Armor, + Healing_Ring, + Renew_Life, + Doom, + Wielders_Boon, + Soothing, + Vital_Weapon, + Weapon_of_Quickening, + Signet_of_Rage, + Fingers_of_Chaos, + Echoing_Banishment, + Suicidal_Impulse, + Impossible_Odds, + Battle_Scars, + Riposting_Shadows, + Meditation_of_the_Reaper, + Battle_Cry, + Elemental_Defense_Zone, + Melee_Defense_Zone, + Blessed_Water, + Defiled_Water, + Stone_Spores, + Turret_Arrow, + Blood_Flower_skill, + Fire_Flower_skill, + Poison_Arrow_flower, + Haiju_Lagoon_Water, + Aspect_of_Exhaustion, + Aspect_of_Exposure, + Aspect_of_Surrender, + Aspect_of_Death, + Aspect_of_Soothing, + Aspect_of_Pain, + Aspect_of_Lethargy, + Aspect_of_Depletion_energy_loss, + Aspect_of_Failure, + Aspect_of_Shadows, + Scorpion_Aspect, + Aspect_of_Fear, + Aspect_of_Depletion_energy_depletion_damage, + Aspect_of_Decay, + Aspect_of_Torment, + Nightmare_Aspect, + Spiked_Coral, + Shielding_Urn_skill, + Extensive_Plague_Exposure, + Forests_Binding, + Exploding_Spores, + Suicide_Energy, + Suicide_Health, + Nightmare_Refuge, + Oni_Health_Lock, + Oni_Shadow_Health_Lock, + Signet_of_Attainment, + Rage_of_the_Sea, + Meditation_of_the_Reaper1, + Fireball_obelisk = 1318, + Final_Thrust1, + Sugar_Rush_medium = 1323, + Torment_Slash, + Spirit_of_the_Festival, + Trade_Winds, + Dragon_Blast, + Imperial_Majesty, + Monster_doesnt_get_death_penalty, + Twisted_Spikes, + Marble_Trap, + Shadow_Tripwire, + Extend_Conditions, + Hypochondria, + Wastrels_Demise, + Spiritual_Pain, + Drain_Delusions, + Persistence_of_Memory, + Symbols_of_Inspiration, + Symbolic_Celerity, + Frustration, + Tease, + Ether_Phantom, + Web_of_Disruption, + Enchanters_Conundrum, + Signet_of_Illusions, + Discharge_Enchantment, + Hex_Eater_Vortex, + Mirror_of_Disenchantment, + Simple_Thievery, + Animate_Shambling_Horror, + Order_of_Undeath, + Putrid_Flesh, + Feast_for_the_Dead, + Jagged_Bones, + Contagion, + Bloodletting, + Ulcerous_Lungs, + Pain_of_Disenchantment, + Mark_of_Fury, + Recurring_Scourge, + Corrupt_Enchantment, + Signet_of_Sorrow, + Signet_of_Suffering, + Signet_of_Lost_Souls, + Well_of_Darkness, + Blinding_Surge, + Chilling_Winds, + Lightning_Bolt, + Storm_Djinns_Haste, + Stone_Striker, + Sandstorm, + Stone_Sheath, + Ebon_Hawk, + Stoneflesh_Aura, + Glyph_of_Restoration, + Ether_Prism, + Master_of_Magic, + Glowing_Gaze, + Savannah_Heat, + Flame_Djinns_Haste, + Freezing_Gust, + Rocky_Ground, + Sulfurous_Haze, + Siege_Attack3, + Sentry_Trap_skill, + Caltrops_monster, + Sacred_Branch, + Light_of_Seborhin, + Judges_Intervention, + Supportive_Spirit, + Watchful_Healing, + Healers_Boon, + Healers_Covenant, + Balthazars_Pendulum, + Words_of_Comfort, + Light_of_Deliverance, + Scourge_Enchantment, + Shield_of_Absorption, + Reversal_of_Damage, + Mending_Touch, + Critical_Chop, + Agonizing_Chop, + Flail, + Charging_Strike, + Headbutt, + Lions_Comfort, + Rage_of_the_Ntouka, + Mokele_Smash, + Overbearing_Smash, + Signet_of_Stamina, + Youre_All_Alone, + Burst_of_Aggression, + Enraging_Charge, + Crippling_Slash, + Barbarous_Slice, + Vial_of_Purified_Water, + Disarm_Trap, + Feeding_Frenzy_skill, + Quake_Of_Ahdashim, + Shield_of_Madness, + Create_Light_of_Seborhin, + Unlock_Cell, + Stop_Pump, + Shield_of_Madness1 = 1426, + Shield_of_Ether, + Shield_of_Iron, + Shield_of_Strength, + Wave_of_Torment, + Corsairs_Net = 1433, + Corrupted_Healing, + Corrupted_Roots, + Corrupted_Strength, + Desert_Wurm_disguise, + Junundu_Feast, + Junundu_Strike, + Junundu_Smash, + Junundu_Siege, + Junundu_Tunnel, + Leave_Junundu, + Summon_Torment, + Signal_Flare, + The_Elixir_of_Strength, + Ehzah_from_Above, + Last_Rites_of_Torment = 1449, + Abaddons_Conspiracy, + Hungers_Bite, + From_Hell, + Pains_Embrace, + Call_to_the_Torment, + Command_of_Torment, + Abaddons_Favor, + Abaddons_Chosen, + Enchantment_Collapse, + Call_of_Sacrifice, + Enemies_Must_Die, + Earth_Vortex, + Frost_Vortex, + Rough_Current, + Turbulent_Flow, + Prepared_Shot, + Burning_Arrow, + Arcing_Shot, + Strike_as_One, + Crossfire, + Barbed_Arrows, + Scavengers_Focus, + Toxicity, + Quicksand, + Storms_Embrace, + Trappers_Speed, + Tripwire, + Kournan_Guardsman, + Renewing_Surge, + Offering_of_Spirit, + Spirits_Gift, + Death_Pact_Signet, + Reclaim_Essence, + Banishing_Strike, + Mystic_Sweep, + Eremites_Attack, + Reap_Impurities, + Twin_Moon_Sweep, + Victorious_Sweep, + Irresistible_Sweep, + Pious_Assault, + Mystic_Twister, + REMOVE_Wind_Prayers_skill, + Grenths_Fingers, + REMOVE_Boon_of_the_Gods, + Aura_of_Thorns, + Balthazars_Rage, + Dust_Cloak, + Staggering_Force, + Pious_Renewal, + Mirage_Cloak, + REMOVE_Balthazars_Rage, + Arcane_Zeal, + Mystic_Vigor, + Watchful_Intervention, + Vow_of_Piety, + Vital_Boon, + Heart_of_Holy_Flame, + Extend_Enchantments, + Faithful_Intervention, + Sand_Shards, + Intimidating_Aura_beta_version, + Lyssas_Haste, + Guiding_Hands, + Fleeting_Stability, + Armor_of_Sanctity, + Mystic_Regeneration, + Vow_of_Silence, + Avatar_of_Balthazar, + Avatar_of_Dwayna, + Avatar_of_Grenth, + Avatar_of_Lyssa, + Avatar_of_Melandru, + Meditation, + Eremites_Zeal, + Natural_Healing, + Imbue_Health, + Mystic_Healing, + Dwaynas_Touch, + Pious_Restoration, + Signet_of_Pious_Light, + Intimidating_Aura, + Mystic_Sandstorm, + Winds_of_Disenchantment, + Rending_Touch, + Crippling_Sweep, + Wounding_Strike, + Wearying_Strike, + Lyssas_Assault, + Chilling_Victory, + Conviction, + Enchanted_Haste, + Pious_Concentration, + Pious_Haste, + Whirling_Charge, + Test_of_Faith, + Blazing_Spear, + Mighty_Throw, + Cruel_Spear, + Harriers_Toss, + Unblockable_Throw, + Spear_of_Lightning, + Wearying_Spear, + Anthem_of_Fury, + Crippling_Anthem, + Defensive_Anthem, + Godspeed, + Anthem_of_Flame, + Go_for_the_Eyes, + Anthem_of_Envy, + Song_of_Power, + Zealous_Anthem, + Aria_of_Zeal, + Lyric_of_Zeal, + Ballad_of_Restoration, + Chorus_of_Restoration, + Aria_of_Restoration, + Song_of_Concentration, + Anthem_of_Guidance, + Energizing_Chorus, + Song_of_Purification, + Hexbreaker_Aria, + Brace_Yourself, + Awe, + Enduring_Harmony, + Blazing_Finale, + Burning_Refrain, + Finale_of_Restoration, + Mending_Refrain, + Purifying_Finale, + Bladeturn_Refrain, + Glowing_Signet, + REMOVE_Leadership_skill, + Leaders_Zeal, + Leaders_Comfort, + Signet_of_Synergy, + Angelic_Protection, + Angelic_Bond, + Cautery_Signet, + Stand_Your_Ground, + Lead_the_Way, + Make_Haste, + We_Shall_Return, + Never_Give_Up, + Help_Me, + Fall_Back, + Incoming, + Theyre_on_Fire, + Never_Surrender, + Its_Just_a_Flesh_Wound, + Barbed_Spear, + Vicious_Attack, + Stunning_Strike, + Merciless_Spear, + Disrupting_Throw, + Wild_Throw, + Curse_of_the_Staff_of_the_Mists, + Aura_of_the_Staff_of_the_Mists, + Power_of_the_Staff_of_the_Mists, + Scepter_of_Ether, + Summoning_of_the_Scepter, + Rise_From_Your_Grave, + Sugar_Rush_long, // 5 minutes + Corsair_disguise, + REMOVE_Queen_Wail, + REMOVE_Queen_Armor, + Queen_Heal, + Queen_Wail, + Queen_Armor, + Queen_Bite, + Queen_Thump, + Queen_Siege, + Junundu_Tunnel_monster_skill, + Skin_of_Stone, + Dervish_of_the_Mystic, + Dervish_of_the_Wind, + Paragon_of_Leadership, + Paragon_of_Motivation, + Dervish_of_the_Blade, + Paragon_of_Command, + Paragon_of_the_Spear, + Dervish_of_the_Earth, + Master_of_DPS, + Malicious_Strike, + Shattering_Assault, + Golden_Skull_Strike, + Black_Spider_Strike, + Golden_Fox_Strike, + Deadly_Haste, + Assassins_Remedy, + Foxs_Promise, + Feigned_Neutrality, + Hidden_Caltrops, + Assault_Enchantments, + Wastrels_Collapse, + Lift_Enchantment, + Augury_of_Death, + Signet_of_Toxic_Shock, + Signet_of_Twilight, + Way_of_the_Assassin, + Shadow_Walk, + Deaths_Retreat, + Shadow_Prison, + Swap, + Shadow_Meld, + Price_of_Pride, + Air_of_Disenchantment, + Signet_of_Clumsiness, + Symbolic_Posture, + Toxic_Chill, + Well_of_Silence, + Glowstone, + Mind_Blast, + Elemental_Flame, + Invoke_Lightning, + Battle_Cry1, + Mending_Shrine_Bonus, + Energy_Shrine_Bonus, + Northern_Health_Shrine_Bonus, + Southern_Health_Shrine_Bonus, + Siege_Attack_Bombardment, + Curse_of_Silence, + To_the_Pain_Hero_Battles, + Edge_of_Reason, + Depths_of_Madness_environment_effect, + Cower_in_Fear, + Dreadful_Pain, + Veiled_Nightmare, + Base_Protection, + Kournan_Siege_Flame, + Drake_Skin, + Skale_Vigor, + Pahnai_Salad_item_effect, + Pensive_Guardian, + Scribes_Insight, + Holy_Haste, + Glimmer_of_Light, + Zealous_Benediction, + Defenders_Zeal, + Signet_of_Mystic_Wrath, + Signet_of_Removal, + Dismiss_Condition, + Divert_Hexes, + Counterattack, + Magehunter_Strike, + Soldiers_Strike, + Decapitate, + Magehunters_Smash, + Soldiers_Stance, + Soldiers_Defense, + Frenzied_Defense, + Steady_Stance, + Steelfang_Slash, + Sunspear_Battle_Call, + Untouchable, + Earth_Shattering_Blow, + Corrupt_Power, + Words_of_Madness_Qwytzylkak, + Gaze_of_MoavuKaal, + Presence_of_the_Skale_Lord, + Madness_Dart, + The_Apocrypha_is_changing_to_another_form, + Reform_Carvings = 1715, + Sunspear_Siege = 1717, + Soul_Torture, + Screaming_Shot, + Keen_Arrow, + Rampage_as_One, + Forked_Arrow, + Disrupting_Accuracy, + Experts_Dexterity, + Roaring_Winds, + Magebane_Shot, + Natural_Stride, + Hekets_Rampage, + Smoke_Trap, + Infuriating_Heat, + Vocal_Was_Sogolon, + Destructive_Was_Glaive, + Wielders_Strike, + Gaze_of_Fury, + Gaze_of_Fury_attack, + Spirits_Strength, + Wielders_Zeal, + Sight_Beyond_Sight, + Renewing_Memories, + Wielders_Remedy, + Ghostmirror_Light, + Signet_of_Ghostly_Might, + Signet_of_Binding, + Caretakers_Charge, + Anguish, + Anguish_attack, + Empowerment, + Recovery, + Weapon_of_Fury, + Xinraes_Weapon, + Warmongers_Weapon, + Weapon_of_Remedy, + Rending_Sweep, + Onslaught, + Mystic_Corruption, + Grenths_Grasp, + Veil_of_Thorns, + Harriers_Grasp, + Vow_of_Strength, + Ebon_Dust_Aura, + Zealous_Vow, + Heart_of_Fury, + Zealous_Renewal, + Attackers_Insight, + Rending_Aura, + Featherfoot_Grace, + Reapers_Sweep, + Harriers_Haste, + Focused_Anger, + Natural_Temper, + Song_of_Restoration, + Lyric_of_Purification, + Soldiers_Fury, + Aggressive_Refrain, + Energizing_Finale, + Signet_of_Aggression, + Remedy_Signet, + Signet_of_Return, + Make_Your_Time, + Cant_Touch_This, + Find_Their_Weakness, + The_Power_Is_Yours, + Slayers_Spear, + Swift_Javelin, + Natures_Speed, + Weapon_of_Mastery, + Accelerated_Growth, + Forge_the_Way, + Anthem_of_Aggression, + Skale_Hunt, + Mandragor_Hunt, + Skree_Battle, + Insect_Hunt, + Corsair_Bounty, + Plant_Hunt, + Undead_Hunt, + Eternal_Suffering, + Eternal_Suffering1, + Eternal_Suffering2, + Eternal_Languor, + Eternal_Languor1, + Eternal_Languor2, + Eternal_Lethargy, + Eternal_Lethargy1, + Eternal_Lethargy2, + Thirst_of_the_Drought = 1808, + Thirst_of_the_Drought1, + Thirst_of_the_Drought2, + Thirst_of_the_Drought3, + Thirst_of_the_Drought4, + Lightbringer, + Lightbringers_Gaze, + Lightbringer_Signet, + Sunspear_Rebirth_Signet, + Wisdom, + Maddened_Strike, + Maddened_Stance, + Spirit_Form_Remains_of_Sahlahja, + Gods_Blessing, + Monster_Hunt, + Monster_Hunt1, + Monster_Hunt2, + Monster_Hunt3, + Elemental_Hunt, + Elemental_Hunt1, + Skree_Battle1, + Insect_Hunt1, + Insect_Hunt2, + Demon_Hunt, + Minotaur_Hunt, + Plant_Hunt1, + Plant_Hunt2, + Skale_Hunt1, + Skale_Hunt2, + Heket_Hunt, + Heket_Hunt1, + Kournan_Bounty, + Mandragor_Hunt1, + Mandragor_Hunt2, + Corsair_Bounty1, + Kournan_Bounty1, + Dhuum_Battle, + Menzies_Battle, + Elemental_Hunt2, + Monolith_Hunt, + Monolith_Hunt1, + Margonite_Battle, + Monster_Hunt4, + Titan_Hunt, + Mandragor_Hunt3, + Giant_Hunt, + Undead_Hunt1, + Kournan_Siege, + Lose_your_Head, + Wandering_Mind, + Altar_Buff = 1859, + Sugar_Rush_short, // 3 minutes + Choking_Breath, + Junundu_Bite, + Blinding_Breath, + Burning_Breath, + Junundu_Wail, + Capture_Point, + Approaching_the_Vortex, + Avatar_of_Sweetness = 1871, + Corrupted_Lands = 1873, + Words_of_Madness = 1875, + Unknown_Junundu_Ability, + Torment_Slash_Smothering_Tendrils = 1880, + Bonds_of_Torment, + Shadow_Smash, + Bonds_of_Torment_effect, + Consume_Torment, + Banish_Enchantment, + Summoning_Shadows, + Lightbringers_Insight, + Repressive_Energy = 1889, + Enduring_Torment, + Shroud_of_Darkness, + Demonic_Miasma, + Enraged, + Touch_of_Aaaaarrrrrrggghhh, + Wild_Smash, + Unyielding_Anguish, + Jadoths_Storm_of_Judgment, + Anguish_Hunt, + Avatar_of_Holiday_Cheer, + Side_Step, + Jack_Frost, + Avatar_of_Grenth_snow_fighting_skill, + Avatar_of_Dwayna_snow_fighting_skill, + Steady_Aim, + Rudis_Red_Nose, + Charm_Animal_White_Mantle = 1910, + Volatile_Charr_Crystal, + Hard_mode, + Claim_Resource_Heroes_Ascent, + Hard_mode1, + Hard_Mode_NPC_Buff, + Sugar_Jolt_short, // 2 minutes + Rollerbeetle_Racer, + Ram, + Harden_Shell, + Rollerbeetle_Dash, + Super_Rollerbeetle, + Rollerbeetle_Echo, + Distracting_Lunge, + Rollerbeetle_Blast, + Spit_Rocks, + Lunar_Blessing, + Lucky_Aura, + Spiritual_Possession, + Water, + Pig_Form, + Beetle_Metamorphosis, + Sugar_Jolt_long = 1933, + Golden_Egg_skill, + Torturous_Embers, + Test_Buff, + Infernal_Rage, + Putrid_Flames, + Shroud_of_Ash, + Flame_Call, + Torturers_Inferno, + Whirling_Fires, + Charr_Siege_Attack_What_Must_Be_Done, + Charr_Siege_Attack_Against_the_Charr, + Birthday_Cupcake_skill, + Blessing_of_the_Luxons = 1947, + Shadow_Sanctuary_luxon, + Ether_Nightmare_luxon, + Signet_of_Corruption_luxon, + Elemental_Lord_luxon, + Selfless_Spirit_luxon, + Triple_Shot_luxon, + Save_Yourselves_luxon, + Aura_of_Holy_Might_luxon, + Spear_of_Fury_luxon = 1957, + Attribute_Balance, + Monster_Hunt5, + Monster_Hunt6, + Mandragor_Hunt4, + Mandragor_Hunt5, + Giant_Hunt1, + Giant_Hunt2, + Skree_Battle2, + Skree_Battle3, + Insect_Hunt3, + Insect_Hunt4, + Minotaur_Hunt1, + Minotaur_Hunt2, + Corsair_Bounty2, + Corsair_Bounty3, + Plant_Hunt3, + Plant_Hunt4, + Skale_Hunt3, + Skale_Hunt4, + Heket_Hunt2, + Heket_Hunt3, + Kournan_Bounty2, + Kournan_Bounty3, + Undead_Hunt2, + Undead_Hunt3, + Fire_Dart, + Ice_Dart, + Poison_Dart, + Vampiric_Assault, + Lotus_Strike, + Golden_Fang_Strike, + Way_of_the_Mantis, + Falling_Lotus_Strike, + Sadists_Signet, + Signet_of_Distraction, + Signet_of_Recall, + Power_Lock, + Waste_Not_Want_Not, + Sum_of_All_Fears, + Withering_Aura, + Cacophony, + Winters_Embrace, + Earthen_Shackles, + Ward_of_Weakness, + Glyph_of_Swiftness, + Cure_Hex, + Smite_Condition, + Smiters_Boon, + Castigation_Signet, + Purifying_Veil, + Pulverizing_Smash, + Keen_Chop, + Knee_Cutter, + Grapple, + Radiant_Scythe, + Grenths_Aura, + Signet_of_Pious_Restraint, + Farmers_Scythe, + Energetic_Was_Lee_Sa, + Anthem_of_Weariness, + Anthem_of_Disruption, + Burning_Ground, + Freezing_Ground, + Poison_Ground, + Fire_Jet, + Ice_Jet, + Poison_Jet, + Lava_Pool, + Water_Pool, + Fire_Spout, + Ice_Spout, + Poison_Spout, + Dhuum_Battle1, + Dhuum_Battle2, + Elemental_Hunt3, + Elemental_Hunt4, + Monolith_Hunt2, + Monolith_Hunt3, + Margonite_Battle1, + Margonite_Battle2, + Menzies_Battle1, + Menzies_Battle2, + Anguish_Hunt1, + Titan_Hunt1, + Titan_Hunt2, + Monster_Hunt7, + Monster_Hunt8, + Sarcophagus_Spores, + Exploding_Barrel, + Greater_Hard_Mode_NPC_Buff, + Fire_Boulder, + Dire_Snowball, + Boulder, + Summon_Spirits_luxon, + Shadow_Fang, + Calculated_Risk, + Shrinking_Armor, + Aneurysm, + Wandering_Eye, + Foul_Feast, + Putrid_Bile, + Shell_Shock, + Glyph_of_Immolation, + Patient_Spirit, + Healing_Ribbon, + Aura_of_Stability, + Spotless_Mind, + Spotless_Soul, + Disarm, + I_Meant_to_Do_That, + Rapid_Fire, + Sloth_Hunters_Shot, + Aura_Slicer, + Zealous_Sweep, + Pure_Was_Li_Ming, + Weapon_of_Aggression, + Chest_Thumper, + Hasty_Refrain, + Drain_Minion, + Cracked_Armor, + Berserk, + Fleshreavers_Escape, + Chomp, + Twisting_Jaws, + Burning_Immunity, + Mandragors_Charge, + Rock_Slide, + Avalanche_effect, + Snaring_Web, + Ceiling_Collapse, + Trample, + Wurm_Bile, + Ground_Cover, + Shadow_Sanctuary_kurzick, + Ether_Nightmare_kurzick, + Signet_of_Corruption_kurzick, + Elemental_Lord_kurzick, + Selfless_Spirit_kurzick, + Triple_Shot_kurzick, + Save_Yourselves_kurzick, + Aura_of_Holy_Might_kurzick, + Spear_of_Fury_kurzick, + Summon_Spirits_kurzick, + Critical_Agility, + Cry_of_Pain, + Necrosis, + Intensity, + Seed_of_Life, + Call_of_the_Eye, + Whirlwind_Attack, + Never_Rampage_Alone, + Eternal_Aura, + Vampirism, + Vampirism_attack, + Theres_Nothing_to_Fear, + Ursan_Rage_Blood_Washes_Blood, + Ursan_Strike_Blood_Washes_Blood, + Sneak_Attack = 2116, + Firebomb_Explosion, + Firebomb, + Shield_of_Fire, + Respawn, + Marked_For_Death, + Spirit_World_Retreat, + Long_Claws, + Shattered_Spirit, + Spirit_Roar, + Spirit_Senses, + Unseen_Aggression, + Volfen_Pounce_Curse_of_the_Nornbear, + Volfen_Claw_Curse_of_the_Nornbear, + Volfen_Bloodlust_Curse_of_the_Nornbear = 2131, + Volfen_Agility_Curse_of_the_Nornbear, + Volfen_Blessing_Curse_of_the_Nornbear, + Charging_Spirit, + Trampling_Ox, + Smoke_Powder_Defense, + Confusing_Images, + Hexers_Vigor, + Masochism, + Piercing_Trap, + Companionship, + Feral_Aggression, + Disrupting_Shot, + Volley, + Expert_Focus, + Pious_Fury, + Crippling_Victory, + Sundering_Weapon, + Weapon_of_Renewal, + Maiming_Spear, + Temporal_Sheen, + Flux_Overload, + A_pool_of_water, + Phase_Shield_effect, + Phase_Shield_monster_skill, + Vitality_Transfer, + Golem_Strike, + Bloodstone_Slash, + Energy_Blast_golem, + Chaotic_Energy, + Golem_Fire_Shield, + The_Way_of_Duty, + The_Way_of_Kinship, + Diamondshard_Mist_environment_effect, + Diamondshard_Grave, + The_Way_of_Strength, + Diamondshard_Mist, + Raven_Blessing_A_Gate_Too_Far, + Raven_Flight_A_Gate_Too_Far = 2170, + Raven_Shriek_A_Gate_Too_Far, + Raven_Swoop_A_Gate_Too_Far, + Raven_Talons_A_Gate_Too_Far, + Aspect_of_Oak, + Long_Claws1, + Tremor, + Rage_of_the_Jotun, + Thundering_Roar, + Sundering_Soulcrush, + Pyroclastic_Shot, + Explosive_Force, + Rolling_Shift = 2184, + Powder_Keg_Explosion, + Signet_of_Deadly_Corruption, + Way_of_the_Master, + Defile_Defenses, + Angorodons_Gaze, + Magnetic_Surge, + Slippery_Ground, + Glowing_Ice, + Energy_Blast, + Distracting_Strike, + Symbolic_Strike, + Soldiers_Speed, + Body_Blow, + Body_Shot, + Poison_Tip_Signet, + Signet_of_Mystic_Speed, + Shield_of_Force, + Mending_Grip, + Spiritleech_Aura, + Rejuvenation, + Agony, + Ghostly_Weapon, + Inspirational_Speech, + Burning_Shield, + Holy_Spear, + Spear_Swipe, + Alkars_Alchemical_Acid, + Light_of_Deldrimor, + Ear_Bite, + Low_Blow, + Brawling_Headbutt, + Dont_Trip, + By_Urals_Hammer, + Drunken_Master, + Great_Dwarf_Weapon, + Great_Dwarf_Armor, + Breath_of_the_Great_Dwarf, + Snow_Storm, + Black_Powder_Mine, + Summon_Mursaat, + Summon_Ruby_Djinn, + Summon_Ice_Imp, + Summon_Naga_Shaman, + Deft_Strike, + Signet_of_Infection, + Tryptophan_Signet, + Ebon_Battle_Standard_of_Courage, + Ebon_Battle_Standard_of_Wisdom, + Ebon_Battle_Standard_of_Honor, + Ebon_Vanguard_Sniper_Support, + Ebon_Vanguard_Assassin_Support, + Well_of_Ruin, + Atrophy, + Spear_of_Redemption, + Gelatinous_Material_Explosion = 2240, + Gelatinous_Corpse_Consumption, + Gelatinous_Mutation, + Gelatinous_Absorption, + Unstable_Ooze_Explosion, + Golem_Shrapnel, + Unstable_Aura, + Unstable_Pulse, + Polymock_Power_Drain, + Polymock_Block, + Polymock_Glyph_of_Concentration, + Polymock_Ether_Signet, + Polymock_Glyph_of_Power, + Polymock_Overload, + Polymock_Glyph_Destabilization, + Polymock_Mind_Wreck, + Order_of_Unholy_Vigor, + Order_of_the_Lich, + Master_of_Necromancy, + Animate_Undead, + Polymock_Deathly_Chill, + Polymock_Rising_Bile, + Polymock_Rotting_Flesh, + Polymock_Lightning_Strike, + Polymock_Lightning_Orb, + Polymock_Lightning_Djinns_Haste, + Polymock_Flare, + Polymock_Immolate, + Polymock_Meteor, + Polymock_Ice_Spear, + Polymock_Icy_Prison, + Polymock_Mind_Freeze, + Polymock_Ice_Shard_Storm, + Polymock_Frozen_Trident, + Polymock_Smite, + Polymock_Smite_Hex, + Polymock_Bane_Signet, + Polymock_Stone_Daggers, + Polymock_Obsidian_Flame, + Polymock_Earthquake, + Polymock_Frozen_Armor, + Polymock_Glyph_Freeze, + Polymock_Fireball, + Polymock_Rodgorts_Invocation, + Polymock_Calculated_Risk, + Polymock_Recurring_Insecurity, + Polymock_Backfire, + Polymock_Guilt, + Polymock_Lamentation, + Polymock_Spirit_Rift, + Polymock_Painful_Bond, + Polymock_Signet_of_Clumsiness, + Polymock_Migraine, + Polymock_Glowing_Gaze, + Polymock_Searing_Flames, + Polymock_Signet_of_Revenge, + Polymock_Signet_of_Smiting, + Polymock_Stoning, + Polymock_Eruption, + Polymock_Shock_Arrow, + Polymock_Mind_Shock, + Polymock_Piercing_Light_Spear, + Polymock_Mind_Blast, + Polymock_Savannah_Heat, + Polymock_Diversion, + Polymock_Lightning_Blast, + Polymock_Poisoned_Ground, + Polymock_Icy_Bonds, + Polymock_Sandstorm, + Polymock_Banish, + Mergoyle_Form, + Skale_Form, + Gargoyle_Form, + Ice_Imp_Form, + Fire_Imp_Form, + Kappa_Form, + Aloe_Seed_Form, + Earth_Elemental_Form, + Fire_Elemental_Form, + Ice_Elemental_Form, + Mirage_Iboga_Form, + Wind_Rider_Form, + Naga_Shaman_Form, + Mantis_Dreamweaver_Form, + Ruby_Djinn_Form, + Gaki_Form, + Stone_Rain_Form, + Mursaat_Elementalist_Form, + Crystal_Shield, + Crystal_Snare, + Paranoid_Indignation, + Searing_Breath, + Kraks_Charge, + Brawling, + Brawling_Block, + Brawling_Jab, + Brawling_Jab1, + Brawling_Straight_Right, + Brawling_Hook, + Brawling_Hook1, + Brawling_Uppercut, + Brawling_Combo_Punch, + Brawling_Headbutt_Brawling_skill, + STAND_UP, + Call_of_Destruction, + Flame_Jet, + Lava_Ground, + Lava_Wave, + Spirit_Shield = 2349, + Summoning_Lord, + Charm_Animal_Ashlyn_Spiderfriend, + Charr_Siege_Attack_Assault_on_the_Stronghold, + Finish_Him, + Dodge_This, + I_Am_the_Strongest, + I_Am_Unstoppable, + A_Touch_of_Guile, + You_Move_Like_a_Dwarf, + You_Are_All_Weaklings, + Feel_No_Pain, + Club_of_a_Thousand_Bears, + Talon_Strike = 2363, + Lava_Blast, + Thunderfist_Strike, + Alkars_Concoction = 2367, + Murakais_Consumption, + Murakais_Censure, + Murakais_Calamity, + Murakais_Storm_of_Souls, + Edification, + Heart_of_the_Norn, + Ursan_Blessing, + Ursan_Strike, + Ursan_Rage, + Ursan_Roar, + Ursan_Force, + Volfen_Blessing, + Volfen_Claw, + Volfen_Pounce, + Volfen_Bloodlust, + Volfen_Agility, + Raven_Blessing, + Raven_Talons, + Raven_Swoop, + Raven_Shriek, + Raven_Flight, + Totem_of_Man, + Filthy_Explosion, + Murakais_Call, + Spawn_Pods, + Enraged_Blast, + Spawn_Hatchling, + Ursan_Roar_Blood_Washes_Blood, + Ursan_Force_Blood_Washes_Blood, + Ursan_Aura, + Consume_Flames, + Aura_of_the_Great_Destroyer, + Destroy_the_Humans, + Charr_Flame_Keeper_Form, + Titan_Form, + Skeletal_Mage_Form, + Smoke_Wraith_Form, + Bone_Dragon_Form, + Dwarven_Arcanist_Form = 2407, + Dolyak_Rider_Form, + Extract_Inscription, + Charr_Shaman_Form, + Mindbender, + Smooth_Criminal, + Technobabble, + Radiation_Field, + Asuran_Scan, + Air_of_Superiority, + Mental_Block, + Pain_Inverter, + Healing_Salve, + Ebon_Escape, + Weakness_Trap, + Winds, + Dwarven_Stability, + Stout_Hearted, + Inscribed_Ettin_Aura, + Decipher_Inscriptions, + Rebel_Yell, + Asuran_Flame_Staff = 2429, + Aura_of_the_Bloodstone, + Aura_of_the_Bloodstone1, + Aura_of_the_Bloodstone2, + Haunted_Ground, + Asuran_Bodyguard, + Asuran_Bodyguard1, + Asuran_Bodyguard2, + Energy_Channel, + Hunt_Rampage, + Boss_Bounty = 2440, + Hunt_Point_Bonus, + Hunt_Point_Bonus1, + Hunt_Point_Bonus2, + Time_Attack, + Dwarven_Raider, + Dwarven_Raider1, + Dwarven_Raider2, + Dwarven_Raider3, + Great_Dwarfs_Blessing, + Hunt_Rampage1, + Boss_Bounty1 = 2452, + Hunt_Point_Bonus3, + Hunt_Point_Bonus4, + Time_Attack1 = 2456, + Vanguard_Patrol, + Vanguard_Patrol1, + Vanguard_Patrol2, + Vanguard_Patrol3, + Vanguard_Commendation, + Hunt_Rampage2, + Boss_Bounty2 = 2464, + Norn_Hunting_Party = 2469, + Norn_Hunting_Party1, + Norn_Hunting_Party2, + Norn_Hunting_Party3, + Strength_of_the_Norn, + Hunt_Rampage3, + Asuran_Bodyguard3 = 2481, + Desperate_Howl, + Gloat, + Metamorphosis, + Inner_Fire, + Elemental_Shift, + Dryders_Feast, + Fungal_Explosion, + Blood_Rage, + Parasitic_Bite, + False_Death, + Ooze_Combination, + Ooze_Division, + Bear_Form, + Sweeping_Strikes, + Spore_Explosion, + Dormant_Husk, + Monkey_See_Monkey_Do, + Feeding_Frenzy, + Tengus_Mimicry, + Tongue_Lash, + Soulrending_Shriek, + Unreliable, + Siege_Devourer, + Siege_Devourer_Feast, + Devourer_Bite, + Siege_Devourer_Swipe, + Devourer_Siege, + HYAHHHHH, + HYAHHHHH1, + HYAHHHHH2, + HYAHHHHH3, + Dismount_Siege_Devourer, + The_Masters_Mark, + The_Snipers_Spear, + Mount, + Reverse_Polarity_Fire_Shield, + Tengus_Gaze, + Fix_Monster_Attributes, + Armor_of_Salvation_item_effect, + Grail_of_Might_item_effect, + Essence_of_Celerity_item_effect, + Stone_Dwarf_Transformation, + Forgewights_Blessing, + Selvetarms_Blessing, + Thommiss_Blessing, + Duncans_Defense, + Rands_Attack = 2529, + Selvetarms_Attack, + Thommiss_Attack, + Create_Spore, + Invigorating_Mist = 2536, + Courageous_Was_Saidra, + Animate_Undead_Palawa_Joko, + Order_of_Unholy_Vigor_Palawa_Joko, + Order_of_the_Lich_Palawa_Joko, + Golem_Boosters, + Charm_Animal_monster1, + Wurm_Siege_Eye_of_the_North, + Tongue_Whip, + Lit_Torch, + Dishonorable, + Hard_Mode_Dungeon_Boss, + Veteran_Asuran_Bodyguard, + Veteran_Dwarven_Raider, + Veteran_Vanguard_Patrol, + Veteran_Norn_Hunting_Party, + Dwarven_Raider4 = 2565, + Dwarven_Raider5, + Dwarven_Raider6, + Dwarven_Raider7, + Great_Dwarfs_Blessing1 = 2570, + Boss_Bounty3, + Hunt_Point_Bonus5 = 2574, + Hunt_Point_Bonus6, + Hunt_Rampage4, + Time_Attack2, + Vanguard_Patrol4, + Boss_Bounty4 = 2583, + Hunt_Point_Bonus7 = 2585, + Vanguard_Commendation1 = 2589, + Norn_Hunting_Party4 = 2591, + Norn_Hunting_Party5, + Norn_Hunting_Party6, + Norn_Hunting_Party7, + Boss_Bounty5 = 2596, + Strength_of_the_Norn1 = 2598, + Hunt_Point_Bonus8, + Hunt_Point_Bonus9 = 2601, + Hunt_Rampage5, + Time_Attack3, + Candy_Corn_skill, + Candy_Apple_skill, + Anton_Costume_Brawl_disguise, + Erys_Vasburg_Costume_Brawl_disguise, + Olias_Costume_Brawl_disguise, + Argo_Costume_Brawl_disguise, + Mhenlo_Costume_Brawl_disguise, + Lukas_Costume_Brawl_disguise, + Aidan_Costume_Brawl_disguise, + Kahmu_Costume_Brawl_disguise, + Razah_Costume_Brawl_disguise, + Morgahn_Costume_Brawl_disguise, + Nika_Costume_Brawl_disguise, + Seaguard_Hala_Costume_Brawl_disguise, + Livia_Costume_Brawl_disguise, + Cynn_Costume_Brawl_disguise, + Tahlkora_Costume_Brawl_disguise, + Devona_Costume_Brawl_disguise, + Zho_Costume_Brawl_disguise, + Melonni_Costume_Brawl_disguise, + Xandra_Costume_Brawl_disguise, + Hayda_Costume_Brawl_disguise, + UNUSED_Complicate, + UNUSED_Reapers_Mark, + UNUSED_Enfeeble, + UNUSED_Desecrate_Enchantments, + UNUSED_Signet_of_Lost_Souls, + UNUSED_Insidious_Parasite, + UNUSED_Searing_Flames, + UNUSED_Glowing_Gaze, + UNUSED_Steam, + UNUSED_Flame_Djinns_Haste, + UNUSED_Liquid_Flame, + UNUSED_Blessed_Light, + UNUSED_Shield_of_Absorption, + UNUSED_Smite_Condition, + UNUSED_Crippling_Slash, + UNUSED_Sun_and_Moon_Slash, + UNUSED_Enraging_Charge, + UNUSED_Tiger_Stance, + UNUSED_Burning_Arrow, + UNUSED_Natural_Stride, + UNUSED_Falling_Lotus_Strike, + UNUSED_Anthem_of_Weariness, + UNUSED_Pious_Fury, + Pie_Induced_Ecstasy, + Charm_Animal_Charr_Demolisher, + Togo_disguise, + Turai_Ossa_disguise, + Gwen_disguise, + Saul_DAlessio_disguise, + Dragon_Empire_Rage, + Call_to_the_Spirit_Realm, + Call_of_Haste_PvP, + Hide, + Feign_Death, + Flee, + Throw_Rock, + Nightmarish_Aura, + Siege_Strike, + Spike_Trap_spell, + Barbed_Bomb, + Fire_and_Brimstone, + Balm_Bomb, + Explosives, + Rations, + Form_Up_and_Advance, + Advance, + Spectral_Agony_Saul_DAlessio, + Stun_Bomb, + Banner_of_the_Unseen, + Signet_of_the_Unseen, + For_Elona, + Giant_Stomp_Turai_Ossa, + Whirlwind_Attack_Turai_Ossa, + Junundu_Siege1, + Distortion_Gwen, + Shared_Burden_Gwen, + Sum_of_All_Fears_Gwen, + Castigation_Signet_Saul_DAlessio, + Unnatural_Signet_Saul_DAlessio, + Dragon_Slash_Turai_Ossa, + Essence_Strike_Togo, + Spirit_Burn_Togo, + Spirit_Rift_Togo, + Mend_Body_and_Soul_Togo, + Offering_of_Spirit_Togo, + Disenchantment_Togo, + Fire_Dart1, + Corrupted_Haiju_Lagoon_Water = 2698, + Journey_to_the_North, + Rat_Form = 2701, + Ox_Form, + Tiger_Form, + Rabbit_Form, + Dragon_Form, + Snake_Form, + Horse_Form, + Sheep_Form, + Monkey_Form, + Rooster_Form, + Dog_Form, + Party_Time, + Victory_is_Ours, + Dark_Soul_Explosion, + Chaotic_Soul_Explosion, + Fiery_Soul_Explosion, + Rejuvenating_Soul_Explosion, + Plague_Spring, + Unbalancing_Soul_Explosion, + Shadowy_Soul_Explosion, + Ethereal_Soul_Explosion, + Redemption_of_Purity, + Purify_Energy, + Purifying_Flame, + Purifying_Prayer, + Strength_of_Purity, + Spring_of_Purity, + Way_of_the_Pure, + Purify_Soul, + Aura_of_Purity, + Anthem_of_Purity, + Falkens_Fire_Fist, + Falken_Quick, + Mind_Wrack_PvP, + Quickening_Terrain, + Massive_Damage, + Minion_Apocalypse, + Combat_Costume_Assassin = 2739, + Combat_Costume_Mesmer, + Combat_Costume_Necromancer, + Combat_Costume_Elementalist, + Combat_Costume_Monk, + Combat_Costume_Warrior, + Combat_Costume_Ranger, + Combat_Costume_Dervish, + Combat_Costume_Ritualist, + Combat_Costume_Paragon, + Jade_Brotherhood_Bomb = 2755, + Mad_Kings_Fan, + Candy_Corn_Strike = 2758, + Rocket_Propelled_Gobstopper, + Rain_of_Terror_spell, + Cry_of_Madness, + Sugar_Infusion, + Feast_of_Vengeance, + Animate_Candy_Minions, + Taste_of_Undeath, + Scourge_of_Candy, + Motivating_Insults, + Mad_King_Pony_Support, + Its_Good_to_Be_King, + Maddening_Laughter, + Mad_Kings_Influence, + Hidden_Talent = 2792, + Couriers_Haste, + Xinraes_Revenge, + Meek_Shall_Inherit = 2810, + Inverse_Ninja_Law = 2813, + Abyssal_Form = 2839, + Asura_Form, + Awakened_Head_Form, + Spider_Form, + Charr_Form, + Golem_Form, + Hellhound_Form, + Norn_Form, + Ooze_Form, + Rift_Warden_Form, + Yeti_Form = 2850, + Snowman_Form, + Energy_Drain_PvP, + Energy_Tap_PvP, + PvP_effect, + Ward_Against_Melee_PvP, + Lightning_Orb_PvP, + Aegis_PvP, + Watch_Yourself_PvP, + Enfeeble_PvP, + Ether_Renewal_PvP, + Penetrating_Attack_PvP, + Shadow_Form_PvP, + Discord_PvP, + Sundering_Attack_PvP, + Ritual_Lord_PvP, + Flesh_of_My_Flesh_PvP, + Ancestors_Rage_PvP, + Splinter_Weapon_PvP, + Assassins_Remedy_PvP, + Blinding_Surge_PvP, + Light_of_Deliverance_PvP, + Death_Pact_Signet_PvP, + Mystic_Sweep_PvP, + Eremites_Attack_PvP, + Harriers_Toss_PvP, + Defensive_Anthem_PvP, + Ballad_of_Restoration_PvP, + Song_of_Restoration_PvP, + Incoming_PvP, + Never_Surrender_PvP, + Mantra_of_Inscriptions_PvP = 2882, + For_Great_Justice_PvP, + Mystic_Regeneration_PvP, + Enfeebling_Blood_PvP, + Summoning_Sickness, + Signet_of_Judgment_PvP, + Chilling_Victory_PvP, + Unyielding_Aura_PvP = 2891, + Spirit_Bond_PvP, + Weapon_of_Warding_PvP, + Bamph_Lite, + Smiters_Boon_PvP, + Battle_Fervor_Deactivating_ROX, + Cloak_of_Faith_Deactivating_ROX, + Dark_Aura_Deactivating_ROX, + Chaotic_Power_Deactivating_ROX, + Strength_of_the_Oak_Deactivating_ROX, + Sinister_Golem_Form, + Reactor_Blast, + Reactor_Blast_Timer, + Jade_Brotherhood_Disguise, + Internal_Power_Engaged, + Target_Acquisition, + NOX_Beam, + NOX_Field_Dash, + NOXion_Buster, + Countdown, + Bit_Golem_Breaker, + Bit_Golem_Rectifier, + Bit_Golem_Crash, + Bit_Golem_Force, + NOX_Phantom = 2916, + NOX_Thunder, + NOX_Lock_On, + NOX_Driver, + NOX_Fire, + NOX_Knuckle, + NOX_Divider_Drive, + Yo_Ho_Ho_and_a_Bottle_of_Grog, + Oath_of_Protection, + Sloth_Hunters_Shot_PvP, + Bamph_Lifesteal, + Shrine_Backlash, + UNUSED_Amulet_of_Protection, + UNUSED_Eviscerate, + UNUSED_Rush, + UNUSED_Lions_Comfort, + UNUSED_Melandrus_Shot, + UNUSED_Sloth_Hunters_Shot, + UNUSED_Reversal_of_Damage, + UNUSED_Empathic_Removal, + UNUSED_Castigation_Signet, + UNUSED_Wail_of_Doom, + UNUSED_Rip_Enchantment, + UNUSED_Foul_Feast, + UNUSED_Plague_Sending, + UNUSED_Overload, + UNUSED_Wastrels_Worry, + UNUSED_Lyssas_Aura, + UNUSED_Empathy, + UNUSED_Shatterstone, + UNUSED_Glowing_Ice, + UNUSED_Freezing_Gust, + UNUSED_Glyph_of_Immolation, + UNUSED_Glyph_of_Restoration, + UNUSED_Hidden_Caltrops, + UNUSED_Black_Spider_Strike, + UNUSED_Caretakers_Charge, + UNUSED_Signet_of_Mystic_Speed, + UNUSED_Signet_of_Rage, + UNUSED_Signet_of_Judgement, + UNUSED_Vigorous_Spirit, + Western_Health_Shrine_Bonus, + Eastern_Health_Shrine_Bonus, + Experts_Dexterity_PvP, + Delayed_Blast_BAMPH = 2961, + Grentch_Form, + Snowball1 = 2964, + Signet_of_Spirits_PvP, + Signet_of_Ghostly_Might_PvP, + Avatar_of_Grenth_PvP, + Oversized_Tonic_Warning, + Read_the_Wind_PvP, + Mursaat_Form, + Blue_Rock_Candy_Rush, + Green_Rock_Candy_Rush, + Red_Rock_Candy_Rush, + Archer_Form, + Avatar_of_Balthazar_Form, + Champion_of_Balthazar_Form, + Priest_of_Balthazar_Form, + The_Black_Beast_of_Arrgh_Form, + Crystal_Guardian_Form, + Crystal_Spider_Form, + Bone_Dragon_Form1, + Saltspray_Dragon_Form, + Eye_of_Janthir_Form, + Footman_Form, + Ghostly_Hero_Form, + Guild_Lord_Form, + Gwen_Doll_Form, + Black_Moa_Form, + Black_Moa_Chick_Form, + Moa_Bird_Form, + White_Moa_Form, + Rainbow_Phoenix_Form, + Brown_Rabbit_Form, + White_Rabbit_Form, + Seer_Form, + Swarm_of_Bees_Form, + Seed_of_Resurrection1, + Fragility_PvP, + Strength_of_Honor_PvP, + Gunthers_Gaze, + Warriors_Endurance_PvP = 3002, + Armor_of_Unfeeling_PvP, + Signet_of_Creation_PvP, + Union_PvP, + Shadowsong_PvP, + Pain_PvP, + Destruction_PvP, + Soothing_PvP, + Displacement_PvP, + Preservation_PvP, + Life_PvP, + Recuperation_PvP, + Dissonance_PvP, + Earthbind_PvP, + Shelter_PvP, + Disenchantment_PvP, + Restoration_PvP, + Bloodsong_PvP, + Wanderlust_PvP, + Savannah_Heat_PvP, + Gaze_of_Fury_PvP, + Anguish_PvP, + Empowerment_PvP, + Recovery_PvP, + Go_for_the_Eyes_PvP, + Brace_Yourself_PvP, + Blazing_Finale_PvP, + Bladeturn_Refrain_PvP, + Signet_of_Return_PvP, + Cant_Touch_This_PvP, + Stand_Your_Ground_PvP, + We_Shall_Return_PvP, + Find_Their_Weakness_PvP, + Never_Give_Up_PvP, + Help_Me_PvP, + Fall_Back_PvP, + Agony_PvP, + Rejuvenation_PvP, + Anthem_of_Disruption_PvP, + Shadowsong_Master_Riyo, + Pain1, + Wanderlust1, + Spirit_Siphon_Master_Riyo, + Comfort_Animal_PvP, + Melandrus_Assault_PvP = 3047, + Shroud_of_Distress_PvP, + Unseen_Fury_PvP, + Predatory_Bond_PvP, + Enraged_Lunge_PvP, + Conviction_PvP, + Signet_of_Deadly_Corruption_PvP, + Masochism_PvP, + Pain_attack_Togo, + Pain_attack_Togo1, + Pain_attack_Togo2, + Unholy_Feast_PvP, + Signet_of_Agony_PvP, + Escape_PvP, + Death_Blossom_PvP, + Finale_of_Restoration_PvP, + Mantra_of_Resolve_PvP, + Lesser_Hard_Mode_NPC_Buff, + Charm_Animal1, + Charm_Animal2, + Henchman, + Charm_Animal_Codex, + Agent_of_the_Mad_King, + Sugar_Rush_Agent_of_the_Mad_King, + Sticky_Ground, + Sugar_Shock, + The_Mad_Kings_Influence, + Bone_Spike, + Flurry_of_Splinters, + Everlasting_Mobstopper_skill, + Weakened_by_Dhuum, + Curse_of_Dhuum, + Dhuums_Rest_Reaper_skill, + Dhuum_skill, + Summon_Champion, + Summon_Minions, + Touch_of_Dhuum, + Reaping_of_Dhuum, + Judgment_of_Dhuum, + Weight_of_Dhuum_hex, + Dhuums_Rest, + Spiritual_Healing, + Encase_Skeletal, + Reversal_of_Death, + Ghostly_Fury, + Henchman_Form_Pudash, + Henchman_Form_Dahlia, + Henchman_Form_Disenmaedel, + Henchman_Form_Errol_Hyl, + Henchman_Form_Lulu_Xan, + Henchman_Form_Tannaros, + Henchman_Form_Cassie_Santi, + Henchman_Form_Redemptor_Frohs, + Henchman_Form_Julyia, + Henchman_Form_Bellicus, + Henchman_Form_Dirk_Shadowrise, + Henchman_Form_Vincent_Evan, + Henchman_Form_Luzy_Fiera, + Henchman_Form_Motoko_Kai, + Henchman_Form_Hinata, + Henchman_Form_Kah_Xan, + Henchman_Form_Narcissia, + Henchman_Form_Zen_Siert, + Henchman_Form_Blenkeh, + Henchman_Form_Aurora_Allesandra, + Henchman_Form_Teena_the_Raptor, + Henchman_Form_Lora_Lanaya, + Henchman_Form_Adepte, + Henchman_Form_Haldibarn_Earendul, + Henchman_Form_Daky, + Henchman_Form_Syn_Spellstrike, + Henchman_Form_Divinus_Tutela, + Henchman_Form_Blahks, + Henchman_Form_Erick, + Henchman_Form_Ghavin, + Henchman_Form_Hobba_Inaste, + Henchman_Form_Bacchi_Coi, + Henchman_Form_Suzu, + Henchman_Form_Rollo_Lowlo, + Henchman_Form_Fuu_Rin, + Henchman_Form_Nuno, + Henchman_Form_Alsacien, + Henchman_Form_Uto_Wrotki, + Henchman_Form_Khai_Kemnebi, + Henchman_Form_Cole, + Weight_of_Dhuum = 3133, + Spirit_Form_disguise, + Spiritual_Healing_Reaper_skill, + Ghostly_Fury_Reaper_skill, + Reindeer_Form, + Reindeer_Form1, + Reindeer_Form2, + Staggering_Blow_PvP, + Lightning_Reflexes_PvP, + Fierce_Blow_PvP, + Renewing_Smash_PvP, + Heal_as_One_PvP, + Glass_Arrows_PvP, + Protective_Was_Kaolai_PvP, + Keen_Arrow_PvP, + Anthem_of_Envy_PvP, + Mending_Refrain_PvP, + Lesser_Flame_Sentinel_Resistance, + Empathy_PvP, + Crippling_Anguish_PvP, + Pain_attack_Signet_of_Spirits, + Pain_attack_Signet_of_Spirits1, + Pain_attack_Signet_of_Spirits2, + Soldiers_Stance_PvP, + Destructive_Was_Glaive_PvP, + Charm_Drake = 3159, + Theres_not_enough_time = 3162, + Keirans_Sniper_Shot, + Falken_Punch, + Golem_Pilebunker, + Drunken_Stumbling, + Koros_Gaze = 3170, + Ebon_Vanguard_Assassin_Support_NPC, + Ebon_Vanguard_Battle_Standard_of_Power, + Loose_Magic, + Well_Supplied, + Guild_Monument_Protected, + Strong_Natural_Resistance, + Elite_Regeneration, + Elite_Regeneration1, + Mantra_of_Signets_PvP, + Shatter_Delusions_PvP, + Illusionary_Weaponry_PvP, + Panic_PvP, + Migraine_PvP, + Accumulated_Pain_PvP, + Psychic_Instability_PvP, + Shared_Burden_PvP, + Stolen_Speed_PvP, + Unnatural_Signet_PvP, + Spiritual_Pain_PvP, + Frustration_PvP, + Mistrust_PvP, + Enchanters_Conundrum_PvP, + Signet_of_Clumsiness_PvP, + Mirror_of_Disenchantment_PvP, + Wandering_Eye_PvP, + Calculated_Risk_PvP, + Adoration, + Impending_Dhuum, + Sacrifice_Pawn, + Isaiahs_Balance, + Toriimos_Burning_Fury, + Oath_of_Protection1, + Defy_Pain_PvP = 3204, + Entourage, + Spectral_Infusion, + Entourage_Buffer, + Wastrels_Demise_PvP, + Shiro_Tagachi_Costume_Brawl_disguise = 3210, + Dunham_Costume_Brawl_disguise, + Palawa_Joko_Costume_Brawl_disguise, + Lawrence_Crafton_Costume_Brawl_disguise, + Saul_DAlessio_Costume_Brawl_disguise, + Turai_Ossa_Costume_Brawl_disguise, + Lieutenant_Thackeray_Costume_Brawl_disguise, + Gehraz_Costume_Brawl_disguise, + Master_Togo_Costume_Brawl_disguise, + Egil_Fireteller_Costume_Brawl_disguise, + Mysterious_Assassin_Costume_Brawl_disguise, + Gwen_Costume_Brawl_disguise, + Eve_Costume_Brawl_disguise, + Elementalist_Aziure_Costume_Brawl_disguise, + Jamei_Costume_Brawl_disguise, + Jora_Costume_Brawl_disguise, + Margrid_the_Sly_Costume_Brawl_disguise, + Varesh_Ossa_Costume_Brawl_disguise, + Headmaster_Quin_Costume_Brawl_disguise, + Kormir_Costume_Brawl_disguise, + Barbed_Signet_PvP = 3231, + Heal_Party_PvP, + Spoil_Victor_PvP, + Visions_of_Regret_PvP, + Keirans_Sniper_Shot_Hearts_of_the_North, + Gravestone_Marker, + Terminal_Velocity, + Relentless_Assault, + Natures_Blessing, + Find_Their_Weakness_Thackeray, + Theres_Nothing_to_Fear_Thackeray, + Coming_of_Spring, + Promise_of_Death, + Withering_Blade, + Deaths_Embrace, + Venom_Fang, + Survivors_Will, + Keiran_Thackeray_disguise, + Rain_of_Arrows, + Fox_Fangs_PvP = 3251, + Wild_Strike_PvP, + Ultra_Snowball, + Blizzard, + Ultra_Snowball1 = 3259, + Ultra_Snowball2, + Ultra_Snowball3, + Ultra_Snowball4, + Banishing_Strike_PvP, + Twin_Moon_Sweep_PvP, + Irresistible_Sweep_PvP, + Pious_Assault_PvP, + Ebon_Dust_Aura_PvP, + Heart_of_Holy_Flame_PvP, + Guiding_Hands_PvP, + Avatar_of_Dwayna_PvP, + Avatar_of_Melandru_PvP, + Mystic_Healing_PvP, + Signet_of_Pious_Restraint_PvP, + Vanguard_Initiate, + Victorious_Renewal = 3282, + A_Dying_Curse, + Rage_of_the_Djinn = 3288, + Fevered_Dreams_PvP, + Stun_Grenade, + Fragmentation_Grenade, + Tear_Gas, + Land_Mine, + Riot_Shield, + Club_Strike, + Bludgeon, + Tango_Down, + Ill_Be_Back, + Phased_Plasma_Burst, + Plasma_Shot, + Annihilator_Bash, + Sky_Net, + Damage_Assessment, + Going_Commando, + Koss_Form = 3306, + Dunkoro_Form, + Melonni_Form, + Acolyte_Jin_Form, + Acolyte_Sousuke_Form, + Tahlkora_Form, + Zhed_Shadowhoof_Form, + Margrid_the_Sly_Form, + Master_of_Whispers_Form, + Goren_Form, + Norgu_Form, + Morgahn_Form, + Razah_Form, + Olias_Form, + Zenmai_Form, + Ogden_Form, + Vekk_Form, + Gwen_Form, + Xandra_Form, + Kahmu_Form, + Jora_Form, + Pyre_Fierceshot_Form, + Anton_Form, + Hayda_Form, + Livia_Form, + Keiran_Thackeray_Form, + Miku_Form, + MOX_Form, + Shiro_Tagachi_Form, + Prince_Rurik_Form = 3336, + Margonite_Form, + Destroyer_Form, + Queen_Salma_Form, + Slightly_Mad_King_Thorn_Form, + Kuunavang_Form, + Lone_Wolf, + Stand_Together, + Unyielding_Spirit, + Reckless_Advance, + Aura_of_Thorns_PvP, + Dust_Cloak_PvP, + Lyssas_Haste_PvP, + Knight_Form, + Lord_Archer_Form, + Bodyguard_Form, + Guild_Thief_Form, + Ghostly_Priest_Form, + Flame_Sentinel_Form, + Solidarity = 3356, + There_Can_Be_Only_One, + Fight_Against_Despair, + Deaths_Succor, + Battle_of_Attrition, + Fight_or_Flight, + Renewing_Escape, + Battle_Frenzy, + The_Way_of_One, + Onslaught_PvP, + Heart_of_Fury_PvP, + Wounding_Strike_PvP, + Pious_Fury_PvP, + Party_Mode, + Smash_of_the_Titans, + Mirror_Shatter, + Illusion_of_Haste_PvP = 3373, + Illusion_of_Pain_PvP, + Aura_of_Restoration_PvP, + Shapeshift, + GOLEM_disguise, + Phase_Shield, + Reactor_Burst, + Ill_Be_Back1, + Annihilator_Strike, + Annihilator_Beam, + Annihilator_Knuckle, + Annihilator_Toss, + Web_of_Disruption_PvP = 3386, + Chain_Combo, + All_In = 3390, + Jack_of_All_Trades, + Amateur_Hour, + Odrans_Razor, + Like_a_Boss, + The_Boss, + Lightning_Hammer_PvP, + Elemental_Flame_PvP, + Slippery_Ground_PvP, + Disguised_when_using_everlasting_tonics_except_Everlasting_Legionnaire_Tonic, + Disguised_when_using_non_everlasting_tonics, + Disguised_verification_requested, + Tonic_Tipsiness, + Parting_Gift, + Gift_of_Battle, + Rolling_Start, + Disguised_when_using_Everlasting_Legionnaire_Tonic, + Time_Ward = 3422, + Soul_Taker, + Over_the_Limit, + Judgement_Strike, + Seven_Weapon_Stance, + Together_as_one, + Shadow_Theft , + Weapons_of_Three_Forges, + Vow_of_Revolution, + Heroic_Refrain, + Reforged_Mode=0xD6A, + Dhuums_Covenant_Broken, + Count = 0xD6c + }; + + enum class SkillType { + Bounty = 1, + Scroll = 2, + Stance = 3, + Hex = 4, + Spell = 5, + Enchantment = 6, + Signet = 7, + Condition = 8, + Well = 9, + Skill = 10, + Ward = 11, + Glyph = 12, + Title = 13, + Attack = 14, + Shout = 15, + Skill2 = 16, + Passive = 17, + Environmental = 18, + Preparation = 19, + PetAttack = 20, + Trap = 21, + Ritual = 22, + EnvironmentalTrap = 23, + ItemSpell = 24, + WeaponSpell = 25, + Form = 26, + Chant = 27, + EchoRefrain = 28, + Disguise = 29 + }; + + const SkillID unused_skill_ids[] { + SkillID::UNUSED_Amulet_of_Protection, + SkillID::UNUSED_Eviscerate, + SkillID::UNUSED_Rush, + SkillID::UNUSED_Lions_Comfort, + SkillID::UNUSED_Melandrus_Shot, + SkillID::UNUSED_Sloth_Hunters_Shot, + SkillID::UNUSED_Reversal_of_Damage, + SkillID::UNUSED_Empathic_Removal, + SkillID::UNUSED_Castigation_Signet, + SkillID::UNUSED_Wail_of_Doom, + SkillID::UNUSED_Rip_Enchantment, + SkillID::UNUSED_Foul_Feast, + SkillID::UNUSED_Plague_Sending, + SkillID::UNUSED_Overload, + SkillID::UNUSED_Wastrels_Worry, + SkillID::UNUSED_Lyssas_Aura, + SkillID::UNUSED_Empathy, + SkillID::UNUSED_Shatterstone, + SkillID::UNUSED_Glowing_Ice, + SkillID::UNUSED_Freezing_Gust, + SkillID::UNUSED_Glyph_of_Immolation, + SkillID::UNUSED_Glyph_of_Restoration, + SkillID::UNUSED_Hidden_Caltrops, + SkillID::UNUSED_Black_Spider_Strike, + SkillID::UNUSED_Caretakers_Charge, + SkillID::UNUSED_Signet_of_Mystic_Speed, + SkillID::UNUSED_Signet_of_Rage, + SkillID::UNUSED_Signet_of_Judgement, + SkillID::UNUSED_Vigorous_Spirit, + SkillID::REMOVE_Leadership_skill, + SkillID::Forge_the_Way, + SkillID::Anthem_of_Aggression, + SkillID::UNUSED_Complicate, + SkillID::UNUSED_Reapers_Mark, + SkillID::UNUSED_Enfeeble, + SkillID::UNUSED_Desecrate_Enchantments, + SkillID::UNUSED_Signet_of_Lost_Souls, + SkillID::UNUSED_Insidious_Parasite, + SkillID::UNUSED_Searing_Flames, + SkillID::UNUSED_Glowing_Gaze, + SkillID::UNUSED_Steam, + SkillID::UNUSED_Flame_Djinns_Haste, + SkillID::UNUSED_Liquid_Flame, + SkillID::UNUSED_Blessed_Light, + SkillID::UNUSED_Shield_of_Absorption, + SkillID::UNUSED_Smite_Condition, + SkillID::UNUSED_Crippling_Slash, + SkillID::UNUSED_Sun_and_Moon_Slash, + SkillID::UNUSED_Enraging_Charge, + SkillID::UNUSED_Tiger_Stance, + SkillID::UNUSED_Burning_Arrow, + SkillID::UNUSED_Natural_Stride, + SkillID::UNUSED_Falling_Lotus_Strike, + SkillID::UNUSED_Anthem_of_Weariness, + SkillID::UNUSED_Pious_Fury, + SkillID::Mantra_of_Celerity, + SkillID::REMOVE_Balthazars_Rage, + SkillID::REMOVE_Boon_of_the_Gods, + SkillID::REMOVE_Queen_Armor, + SkillID::REMOVE_Queen_Wail, + SkillID::REMOVE_Wind_Prayers_skill, + SkillID::REMOVE_With_Haste, + SkillID::Weapon_of_Mastery, + SkillID::Signet_of_Attainment + }; + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Constants/UIMessages.h b/Dependencies/GWCA/Include/GWCA/Constants/UIMessages.h new file mode 100644 index 00000000..47515e9c --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Constants/UIMessages.h @@ -0,0 +1,968 @@ +namespace GW { + enum class CallTargetType : uint32_t; + enum class WorldActionId : uint32_t; + struct GamePos; + struct Effect; + struct Vec2f; + typedef uint32_t AgentID; + + namespace Merchant { + enum class TransactionType : uint32_t; + } + namespace Constants { + enum class Language; + enum class MapID : uint32_t; + enum class InstanceType; + enum class QuestID : uint32_t; + enum class SkillID : uint32_t; + } + namespace Chat { + enum Channel : int; + typedef uint32_t Color; + } + + namespace Chat { + enum Channel : int; + } + namespace SkillbarMgr { + struct SkillTemplate; + } + namespace UI { + struct WindowPosition; + enum class FlagPreference : uint32_t; + enum class NumberPreference : uint32_t; + enum class StringPreference : uint32_t; + enum class EnumPreference : uint32_t; + struct CompassPoint; + + enum class UIMessage : uint32_t { + kNone = 0x0, + kFrameMessage_0x1, + kFrameMessage_0x2, + kFrameMessage_0x3, + kFrameMessage_0x4, + kFrameMessage_0x5, + kFrameMessage_0x6, + kFrameMessage_0x7, + kResize, // 0x8 + kInitFrame, // 0x9 + kFrameMessage_0xa, + kDestroyFrame, // 0xb + kFrameDisabledChange, // wparam = is_enabled + kFrameMessage_0xd, + kFrameMessage_0xe, + kFrameMessage_0xf, + kFrameMessage_0x10, + kFrameMessage_0x11, + kFrameMessage_0x12, + kFrameMessage_0x13, + kFrameMessage_0x14, + kFrameMessage_0x15, + kFrameMessage_0x16, + kFrameMessage_0x17, + kFrameMessage_0x18, + kFrameMessage_0x19, + kFrameMessage_0x1a, + kFrameMessage_0x1b, + kFrameMessage_0x1c, + kFrameMessage_0x1d, + kKeyDown = 0x20, // wparam = UIPacket::kKeyAction* - Updated from 0x1e to 0x20 + kSetFocus, // 0x1f, wparam = 1 or 0 + kKeyUp, // 0x20, wparam = UIPacket::kKeyAction* + kFrameMessage_0x21, // 0x21 + kMouseClick, // 0x22, wparam = UIPacket::kMouseClick* + kFrameMessage_0x23, // 0x23 + kMouseCoordsClick, // 0x24, wparam = UIPacket::kMouseCoordsClick* + kFrameMessage_0x25, // 0x25 + kMouseUp, // 0x26, wparam = UIPacket::kMouseCoordsClick* + kFrameMessage_0x27, // 0x27 + kFrameMessage_0x28, // 0x28 + kFrameMessage_0x29, // 0x29 + kFrameMessage_0x2a, // 0x2a + kFrameMessage_0x2b, // 0x2b + kToggleButtonDown, // 0x2c + kFrameMessage_0x2d, // 0x2d + kMouseClick2 = 0x31, // 0x2e, wparam = UIPacket::kMouseAction* + kMouseAction, // 0x2f, wparam = UIPacket::kMouseAction* + kRenderFrame_0x30, // 0x30 + kRenderFrame_0x31 = 0x35, // 0x31 + kFrameVisibilityChanged, // 0x32, wparam = is_visible + kSetLayout, // 0x33 + kMeasureContent, // 0x34 + kFrameMessage_0x35, // 0x35 + kFrameMessage_0x36, // 0x36 + kRefreshContent, // 0x37 + kFrameMessage_0x38, + kFrameMessage_0x39, + kFrameMessage_0x3a, + kFrameMessage_0x3b, + kFrameMessage_0x3c = 0x44, + kFrameMessage_0x3d, + kFrameMessage_0x3e, + kFrameMessage_0x3f, + kFrameMessage_0x40, + kFrameMessage_0x41, + kFrameMessage_0x42, + kRenderFrame_0x43, // 0x43 + kFrameMessage_0x44 = 0x52, + kFrameMessage_0x45, + kFrameMessage_0x46 = 0x56, + kFrameMessage_0x47, // 0x47, Multiple uses depending on frame + kFrameMessage_0x48, // 0x48, Multiple uses depending on frame + kFrameMessage_0x49, // 0x49, Multiple uses depending on frame + kFrameMessage_0x4a, // 0x4a, Multiple uses depending on frame + kFrameMessage_0x4b, // 0x4b, Multiple uses depending on frame + kFrameMessage_0x4c, // 0x4c, Multiple uses depending on frame + kFrameMessage_0x4d, // 0x4d, Multiple uses depending on frame + kFrameMessage_0x4e, // 0x4e, Multiple uses depending on frame + kFrameMessage_0x4f, // 0x4f, Multiple uses depending on frame + kFrameMessage_0x50, // 0x50, Multiple uses depending on frame + kFrameMessage_0x51, // 0x51, Multiple uses depending on frame + kFrameMessage_0x52, // 0x52, Multiple uses depending on frame + kFrameMessage_0x53, // 0x53, Multiple uses depending on frame + kFrameMessage_0x54, // 0x54, Multiple uses depending on frame + kFrameMessage_0x55, // 0x55, Multiple uses depending on frame + kFrameMessage_0x56, // 0x56, Multiple uses depending on frame + kFrameMessage_0x57, // 0x57, Multiple uses depending on frame + + // High bit messages start at 0x10000000 + kMessage_0x10000000 = 0x10000000, + kMessage_0x10000001, + kMessage_0x10000002, + kMessage_0x10000003, + kMessage_0x10000004, + kMessage_0x10000005, + kMessage_0x10000006, + kAgentUpdate, // 0x10000007, wparam = uint32_t agent_id + kAgentDestroy, // 0x10000008, wparam = uint32_t agent_id + kUpdateAgentEffects, // 0x10000009 + kMessage_0x1000000a, + kMessage_0x1000000b, + kDialogueMessage, // 0x1000000c + kMessage_0x1000000d, + kMessage_0x1000000e, + kMessage_0x1000000f, + kMessage_0x10000010, + kMessage_0x10000011, + kMessage_0x10000012, + kMessage_0x10000013, + kMessage_0x10000014, + kMessage_0x10000015, + kMessage_0x10000016, + kAgentSpeechBubble, // 0x10000017 + kMessage_0x10000018, + kShowAgentNameTag, // 0x10000019, wparam = AgentNameTagInfo* + kHideAgentNameTag, // 0x1000001A + kSetAgentNameTagAttribs, // 0x1000001B, wparam = AgentNameTagInfo* + kMessage_0x1000001c, + kSetAgentProfession, // 0x1000001D, wparam = UIPacket::kSetAgentProfession* + kMessage_0x1000001e, + kMessage_0x1000001f, + kChangeTarget, // 0x10000020, wparam = UIPacket::kChangeTarget* + kMessage_0x10000021, + kMessage_0x10000022, + kMessage_0x10000023, + kAgentSkillActivated, // 0x10000024, kAgentSkillPacket + kAgentSkillActivatedInstantly, // 0x10000025, kAgentSkillPacket + kAgentSkillCancelled, // 0x10000026, kAgentSkillPacket + kAgentSkillStartedCast, // 0x10000027, wparam = UIPacket::kAgentStartCasting* + kMessage_0x10000028, + kShowMapEntryMessage, // 0x10000029, wparam = { wchar_t* title, wchar_t* subtitle } + kSetCurrentPlayerData, // 0x1000002A, fired after setting the worldcontext player name + kMessage_0x1000002b, + kMessage_0x1000002c, + kMessage_0x1000002d, + kMessage_0x1000002e, + kMessage_0x1000002f, + kMessage_0x10000030, + kMessage_0x10000031, + kMessage_0x10000032, + kMessage_0x10000033, + kPostProcessingEffect, // 0x10000034, Triggered when drunk. wparam = UIPacket::kPostProcessingEffect + kMessage_0x10000035, + kMessage_0x10000036, + kMessage_0x10000037, + kHeroAgentAdded, // 0x10000038, hero assigned to agent/inventory/ai mode + kHeroDataAdded, // 0x10000039, hero info received from server (name, level etc) + kMessage_0x1000003a, + kMessage_0x1000003b, + kMessage_0x1000003c, + kMessage_0x1000003d, + kMessage_0x1000003e, + kMessage_0x1000003f, + kShowXunlaiChest, // 0x10000040 + kMessage_0x10000041, + kMessage_0x10000042, + kMessage_0x10000043, + kMessage_0x10000044, + kMessage_0x10000045, + kMinionCountUpdated, // 0x10000046 + kMoraleChange, // 0x10000047, wparam = {agent id, morale percent } + kMessage_0x10000048, + kMessage_0x10000049, + kMessage_0x1000004a, + kMessage_0x1000004b, + kMessage_0x1000004c, + kMessage_0x1000004d, + kMessage_0x1000004e, + kMessage_0x1000004f, + kLoginStateChanged, // 0x10000050, wparam = {bool is_logged_in, bool unk } + kMessage_0x10000051, + kMessage_0x10000052, + kMessage_0x10000053, + kMessage_0x10000054, + kEffectAdd, // 0x10000055, wparam = {agent_id, GW::Effect*} + kEffectRenew, // 0x10000056, wparam = GW::Effect* + kEffectRemove, // 0x10000057, wparam = effect id + kMessage_0x10000058, + kMessage_0x10000059, + kMessage_0x1000005a, + kSkillActivated, // 0x1000005b, wparam ={ uint32_t agent_id , uint32_t skill_id } + kMessage_0x1000005c, + kMessage_0x1000005d, + kUpdateSkillbar, // 0x1000005E, wparam ={ uint32_t agent_id , ... } + kUpdateSkillsAvailable, // 0x1000005f, Triggered on a skill unlock, profession change or map load + kMessage_0x10000060, + kMessage_0x10000061, + kMessage_0x10000062, + kMessage_0x10000063, + kPlayerTitleChanged, // 0x10000064, wparam = { uint32_t player_id, uint32_t title_id } + kTitleProgressUpdated, // 0x10000065, wparam = title_id + kExperienceGained, // 0x10000066, wparam = experience amount + kMessage_0x10000067, + kMessage_0x10000068, + kMessage_0x10000069, + kMessage_0x1000006a, + kMessage_0x1000006b, + kMessage_0x1000006c, + kMessage_0x1000006d, + kMessage_0x1000006e, + kMessage_0x1000006f, + kMessage_0x10000070, + kMessage_0x10000071, + kMessage_0x10000072, + kMessage_0x10000073, + kMessage_0x10000074, + kMessage_0x10000075, + kMessage_0x10000076, + kMessage_0x10000077, + kMessage_0x10000078, + kMessage_0x10000079, + kMessage_0x1000007a, + kMessage_0x1000007b, + kMessage_0x1000007c, + kMessage_0x1000007d, + kMessage_0x1000007e, + kWriteToChatLog, // 0x1000007F, wparam = UIPacket::kWriteToChatLog* + kWriteToChatLogWithSender, // 0x10000080, wparam = UIPacket::kWriteToChatLogWithSender* + kAllyOrGuildMessage, // 0x10000081, wparam = UIPacket::kAllyOrGuildMessage* + kPlayerChatMessage, // 0x10000082, wparam = UIPacket::kPlayerChatMessage* + kMessage_0x10000083, + kFloatingWindowMoved, // 0x10000084, wparam = frame_id + kMessage_0x10000085, + kMessage_0x10000086, + kMessage_0x10000087, + kMessage_0x10000088, + kMessage_0x10000089, + kMessage_0x1000008a, + kFriendUpdated, // 0x1000008B, wparam = { GW::Friend*, ... } + kMapLoaded, // 0x1000008C + kMessage_0x1000008d, + kMessage_0x1000008e, + kMessage_0x1000008f, + kMessage_0x10000090, + kMessage_0x10000091, + kOpenWhisper, // 0x10000092, wparam = wchar* name + kMessage_0x10000093, + kMessage_0x10000094, + kMessage_0x10000095, + kMessage_0x10000096, + kMessage_0x10000097, + kLoadMapContext, // 0x10000098, wparam = UIPacket::kLoadMapContext + kMessage_0x10000099, + kMessage_0x1000009a, + kMessage_0x1000009b, + kDialogueMessageUpdated, // 0x1000009c + kLogout, // 0x1000009D, wparam = { bool unknown, bool character_select } + kCompassDraw, // 0x1000009E, wparam = UIPacket::kCompassDraw* + kMessage_0x1000009f, + kMessage_0x100000a0, + kMessage_0x100000a1, + kOnScreenMessage, // 0x100000A2, wparam = wchar_** encoded_string + kDialogButton, // 0x100000A3, wparam = DialogButtonInfo* + kMessage_0x100000a4, + kMessage_0x100000a5, + kDialogBody, // 0x100000A6, wparam = DialogBodyInfo* + kMessage_0x100000a7, + kMessage_0x100000a8, + kMessage_0x100000a9, + kMessage_0x100000aa, + kMessage_0x100000ab, + kMessage_0x100000ac, + kMessage_0x100000ad, + kMessage_0x100000ae, + kMessage_0x100000af, + kMessage_0x100000b0, + kMessage_0x100000b1, + kMessage_0x100000b2, + kTargetNPCPartyMember, // 0x100000B3, wparam = { uint32_t unk, uint32_t agent_id } + kTargetPlayerPartyMember, // 0x100000B4, wparam = { uint32_t unk, uint32_t player_number } + kVendorWindow, // 0x100000B5, wparam = UIPacket::kVendorWindow + kMessage_0x100000b6, + kMessage_0x100000b7, + kMessage_0x100000b8, + kVendorItems, // 0x100000B9, wparam = UIPacket::kVendorItems + kMessage_0x100000ba, + kVendorTransComplete, // 0x100000BB, wparam = *TransactionType + kMessage_0x100000bc, + kVendorQuote, // 0x100000BD, wparam = UIPacket::kVendorQuote + kMessage_0x100000be, + kMessage_0x100000bf, + kMessage_0x100000c0, + kMessage_0x100000c1, + kStartMapLoad, // 0x100000C2, wparam = { uint32_t map_id, ...} + kMessage_0x100000c3, + kMessage_0x100000c4, + kMessage_0x100000c5, + kMessage_0x100000c6, + kWorldMapUpdated, // 0x100000C7, Triggered when an area in the world map has been discovered/updated + kMessage_0x100000c8, + kMessage_0x100000c9, + kMessage_0x100000ca, + kMessage_0x100000cb, + kMessage_0x100000cc, + kMessage_0x100000cd, + kMessage_0x100000ce, + kMessage_0x100000cf, + kMessage_0x100000d0, + kMessage_0x100000d1, + kMessage_0x100000d2, + kMessage_0x100000d3, + kMessage_0x100000d4, + kMessage_0x100000d5, + kMessage_0x100000d6, + kMessage_0x100000d7, + kMessage_0x100000d8, + kMessage_0x100000d9, + kGuildMemberUpdated, // 0x100000DA, wparam = { GuildPlayer::name_ptr } + kMessage_0x100000db, + kMessage_0x100000dc, + kMessage_0x100000dd, + kMessage_0x100000de, + kMessage_0x100000df, + kMessage_0x100000e0, + kShowHint, // 0x100000E1, wparam = { uint32_t icon_type, wchar_t* message_enc } + kMessage_0x100000e2, + kMessage_0x100000e3, + kMessage_0x100000e4, + kMessage_0x100000e5, + kMessage_0x100000e6, + kMessage_0x100000e7, + kMessage_0x100000e8, + kWeaponSetSwapComplete, // 0x100000E9, wparam = UIPacket::kWeaponSwap* + kWeaponSetSwapCancel, // 0x100000EA + kWeaponSetUpdated, // 0x100000EB + kUpdateGoldCharacter, // 0x100000EC, wparam = { uint32_t unk, uint32_t gold_character } + kUpdateGoldStorage, // 0x100000ED, wparam = { uint32_t unk, uint32_t gold_storage } + kInventorySlotUpdated, // 0x100000EE, Triggered when an item is moved into a slot + kEquipmentSlotUpdated, // 0x100000EF, Triggered when an item is moved into a slot + kMessage_0x100000f0, + kInventorySlotCleared, // 0x100000F1, Triggered when an item has been removed from a slot + kEquipmentSlotCleared, // 0x100000F2, Triggered when an item has been removed from a slot + kMessage_0x100000f3, + kMessage_0x100000f4, + kMessage_0x100000f5, + kMessage_0x100000f6, + kMessage_0x100000f7, + kMessage_0x100000f8, + kMessage_0x100000f9, + kPvPWindowContent, // 0x100000FA + kMessage_0x100000fb, + kMessage_0x100000fc, + kMessage_0x100000fd, + kMessage_0x100000fe, + kMessage_0x100000ff, + kMessage_0x10000100, + kMessage_0x10000101, + kPreStartSalvage, // 0x10000102, { uint32_t item_id, uint32_t kit_id } + kTomeSkillSelection, // 0x10000103, wparam = UIPacket::kTomeSkillSelection* + kMessage_0x10000104, + kTradePlayerUpdated, // 0x10000105, wparam = GW::TraderPlayer* + kItemUpdated, // 0x10000106, wparam = UIPacket::kItemUpdated* + kMessage_0x10000107, + kMessage_0x10000108, + kMessage_0x10000109, + kMessage_0x1000010a, + kMessage_0x1000010b, + kMessage_0x1000010c, + kMessage_0x1000010d, + kMessage_0x1000010e, + kMessage_0x1000010f, + kMessage_0x10000110, + kMapChange, // 0x10000111, wparam = map id + kMessage_0x10000112, + kMessage_0x10000113, + kMessage_0x10000114, + kCalledTargetChange, // 0x10000115, wparam = { player_number, target_id } + kMessage_0x10000116, + kMessage_0x10000117, + kMessage_0x10000118, + kErrorMessage, // 0x10000119, wparam = { int error_index, wchar_t* error_encoded_string } + kPartyHardModeChanged, // 0x1000011A, wparam = { int is_hard_mode } + kPartyAddHenchman, // 0x1000011B + kPartyRemoveHenchman, // 0x1000011C + kMessage_0x1000011d, + kPartyAddHero, // 0x1000011E + kPartyRemoveHero, // 0x1000011F + kMessage_0x10000120, + kMessage_0x10000121, + kMessage_0x10000122, + kMessage_0x10000123, + kPartyAddPlayer, // 0x10000124 + kMessage_0x10000125, + kPartyRemovePlayer, // 0x10000126 + kMessage_0x10000127, + kMessage_0x10000128, + kMessage_0x10000129, + kDisableEnterMissionBtn, // 0x1000012A, wparam = boolean (1 = disabled, 0 = enabled) + kMessage_0x1000012b, + kMessage_0x1000012c, + kShowCancelEnterMissionBtn, // 0x1000012D + kMessage_0x1000012e, + kPartyDefeated, // 0x1000012F + kMessage_0x10000130, + kMessage_0x10000131, + kMessage_0x10000132, + kPartySearchCreated, // 0x10000133, wparam = GW::PartySearch* + kPartySearchIdChanged, // 0x10000134, wparam = uint32_t* party_search_id + kPartySearchRemoved, // 0x10000135, wparam = uint32_t* party_search_id + kPartySearchUpdated, // 0x10000136, wparam = GW::PartySearch* + kPartySearchInviteReceived, // 0x10000137, wparam = UIPacket::kPartySearchInviteReceived* + kMessage_0x10000138, + kPartySearchInviteSent, // 0x10000139 + kPartyShowConfirmDialog, // 0x1000013A, wparam = UIPacket::kPartyShowConfirmDialog + kMessage_0x1000013b, + kMessage_0x1000013c, + kMessage_0x1000013d, + kMessage_0x1000013e, + kMessage_0x1000013f, + kPreferenceEnumChanged, // 0x10000140, wparam = UiPacket::kPreferenceEnumChanged + kPreferenceFlagChanged, // 0x10000141, wparam = UiPacket::kPreferenceFlagChanged + kPreferenceValueChanged, // 0x10000142, wparam = UiPacket::kPreferenceValueChanged + kUIPositionChanged, // 0x10000143, wparam = UIPacket::kUIPositionChanged + kPreBuildLoginScene, // 0x10000144, Called with no args right before login scene is drawn + kMessage_0x10000145, + kMessage_0x10000146, + kMessage_0x10000147, + kMessage_0x10000148, + kMessage_0x10000149, + kMessage_0x1000014a, + kMessage_0x1000014b, + kMessage_0x1000014c, + kMessage_0x1000014d, + kQuestAdded, // 0x1000014E, wparam = { quest_id, ... } + kQuestDetailsChanged, // 0x1000014F, wparam = { quest_id, ... } + kQuestRemoved, // 0x10000150, wparam = { quest_id, ... } + kClientActiveQuestChanged, // 0x10000151, wparam = { quest_id, ... }. Triggered when the game requests the current quest to change + kMessage_0x10000152, + kServerActiveQuestChanged, // 0x10000153, wparam = UIPacket::kServerActiveQuestChanged*. Triggered when the server requests the current quest to change + kUnknownQuestRelated, // 0x10000154 + kMessage_0x10000155, + kDungeonComplete, // 0x10000156 + kMissionComplete, // 0x10000157 + kMessage_0x10000158, + kVanquishComplete, // 0x10000159 + kObjectiveAdd, // 0x1000015A, wparam = UIPacket::kObjectiveAdd* + kObjectiveComplete, // 0x1000015B, wparam = UIPacket::kObjectiveComplete* + kObjectiveUpdated, // 0x1000015C, wparam = UIPacket::kObjectiveUpdated* + kMessage_0x1000015d, + kMessage_0x1000015e, + kMessage_0x1000015f, + kMessage_0x10000160, + kMessage_0x10000161, + kMessage_0x10000162, + kMessage_0x10000163, + kMessage_0x10000164, + kTradeSessionStart, // 0x10000165, wparam = { trade_state, player_number } + kMessage_0x10000166, + kMessage_0x10000167, + kMessage_0x10000168, + kMessage_0x10000169, + kMessage_0x1000016a, + kTradeSessionUpdated, // 0x1000016b, no args + kMessage_0x1000016c, + kMessage_0x1000016d, + kMessage_0x1000016e, + kMessage_0x1000016f, + kMessage_0x10000170, + kMessage_0x10000171, + kMessage_0x10000172, + kMessage_0x10000173, + kMessage_0x10000174, + kCheckUIState, // 0x10000175 + kMessage_0x10000176, + kMessage_0x10000177, + kMessage_0x10000178, + kMessage_0x10000178_1, // added to GW 2026-02-26 + kMessage_0x10000178_2, // added to GW 2026-02-26 + kMessage_0x10000178_3, // added to GW 2026-02-26 + kDestroyUIPositionOverlay, // 0x10000179 + kEnableUIPositionOverlay, // 0x1000017a, wparam = uint32_t enable + kMessage_0x1000017b, + kGuildHall, // 0x1000017C, wparam = gh key (uint32_t[4]) + kMessage_0x1000017d, + kLeaveGuildHall, // 0x1000017E + kTravel, // 0x1000017F + kOpenWikiUrl, // 0x10000180, wparam = char* url + kMessage_0x10000181, + kMessage_0x10000182, + kSetPreGameContext_Value0, // wparam = uint32_t value + kMessage_0x10000184, + kGetPreGameContext_Value0, // lparam = *uint32_t value_out + kSetPreGameContext_Value1, // wparam = uint32_t value , added to GW 2026-02-06 + kGetPreGameContext_Value1, // lparam = *uint32_t value_out, added to GW 2026-02-06 + kMessage_0x10000186, + kMessage_0x10000187, + kMessage_0x10000188, + kMessage_0x10000189, + kMessage_0x1000018a, + kMessage_0x1000018b, + kMessage_0x1000018c, + kMessage_0x1000018d, + kAppendMessageToChat, // 0x1000018E, wparam = wchar_t* message + kMessage_0x1000018f, + kMessage_0x10000190, + kMessage_0x10000191, + kMessage_0x10000192, + kMessage_0x10000193, + kMessage_0x10000194, + kMessage_0x10000195, + kMessage_0x10000196, + kMessage_0x10000197, + kMessage_0x10000198, + kMessage_0x10000199, + kMessage_0x1000019a, + kMessage_0x1000019b, + kHideHeroPanel, // 0x1000019C, wparam = hero_id + kShowHeroPanel, // 0x1000019D, wparam = hero_id + kMessage_0x1000019e, + kMessage_0x1000019f, + kMessage_0x100001a0, + kGetInventoryAgentId, // 0x100001A1, wparam = 0, lparam = uint32_t* agent_id_out. Used to fetch which agent is selected + kEquipItem, // 0x100001A2, wparam = { item_id, agent_id } + kMoveItem, // 0x100001A3, wparam = { item_id, to_bag, to_slot, bool prompt } + kMessage_0x100001a4, + kMessage_0x100001a5, + kInitiateTrade, // 0x100001A6 + kMessage_0x100001a7, + kMessage_0x100001a8, + kMessage_0x100001a9, + kMessage_0x100001aa, + kMessage_0x100001ab, + kMessage_0x100001ac, + kMessage_0x100001ad, + kMessage_0x100001ae, + kMessage_0x100001af, + kMessage_0x100001b0, + kMessage_0x100001b1, + kMessage_0x100001b2, + kMessage_0x100001b3, + kMessage_0x100001b4, + kMessage_0x100001b5, + kInventoryAgentChanged, // 0x100001B6, Triggered when inventory needs updating due to agent change; no args + kMessage_0x100001b7, + kMessage_0x100001b8, + kMessage_0x100001b9, + kMessage_0x100001ba, + kMessage_0x100001bb, + kMessage_0x100001bc, + kMessage_0x100001bd, + kPromptSaveTemplate, // 0x100001be + kOpenTemplate, // 0x100001Bf, wparam = GW::UI::ChatTemplate* + + // GWCA Client to Server commands. Only added the ones that are used for hooks, everything else goes straight into GW + + kSendLoadSkillTemplate = 0x30000000 | 0x3, // wparam = SkillbarMgr::SkillTemplate* + kSendPingWeaponSet = 0x30000000 | 0x4, // wparam = UIPacket::kSendPingWeaponSet* + kSendMoveItem = 0x30000000 | 0x5, // wparam = UIPacket::kSendMoveItem* + kSendMerchantRequestQuote = 0x30000000 | 0x6, // wparam = UIPacket::kSendMerchantRequestQuote* + kSendMerchantTransactItem = 0x30000000 | 0x7, // wparam = UIPacket::kSendMerchantTransactItem* + kSendUseItem = 0x30000000 | 0x8, // wparam = UIPacket::kSendUseItem* + kSendSetActiveQuest = 0x30000000 | 0x9, // wparam = uint32_t quest_id + kSendAbandonQuest = 0x30000000 | 0xA, // wparam = uint32_t quest_id + kSendChangeTarget = 0x30000000 | 0xB, // wparam = UIPacket::kSendChangeTarget* // e.g. tell the gw client to focus on a different target + kSendCallTarget = 0x30000000 | 0x13, // wparam = { uint32_t call_type, uint32_t agent_id } // also used to broadcast morale, death penalty, "I'm following X", etc + kSendDialog = 0x30000000 | 0x16, // wparam = dialog_id // internal use + + + kStartWhisper = 0x30000000 | 0x17, // wparam = UIPacket::kStartWhisper* + kGetSenderColor = 0x30000000 | 0x18, // wparam = UIPacket::kGetColor* // Get chat sender color depending on channel, output object passed by reference + kGetMessageColor = 0x30000000 | 0x19, // wparam = UIPacket::kGetColor* // Get chat message color depending on channel, output object passed by reference + kSendChatMessage = 0x30000000 | 0x1B, // wparam = UIPacket::kSendChatMessage* + kLogChatMessage = 0x30000000 | 0x1D, // wparam = UIPacket::kLogChatMessage*. Triggered when a message wants to be added to the persistent chat log. + kRecvWhisper = 0x30000000 | 0x1E, // wparam = UIPacket::kRecvWhisper* + kPrintChatMessage = 0x30000000 | 0x1F, // wparam = UIPacket::kPrintChatMessage*. Triggered when a message wants to be added to the in-game chat window. + kSendWorldAction = 0x30000000 | 0x20, // wparam = UIPacket::kSendWorldAction* + kSetRendererValue = 0x30000000 | 0x21, // wparam = UIPacket::kSetRendererValue + kIdentifyItem = 0x30000000 | 0x22, // wparam = UIPacket::kUseKitOnItem + kSalvageItem = 0x30000000 | 0x23 // wparam = UIPacket::kUseKitOnItem + }; + + static_assert(GW::UI::UIMessage::kOpenTemplate == (GW::UI::UIMessage)0x100001c4); + + namespace UIPacket { + struct kDialogueMessage { + uint32_t agent_id; + wchar_t* sender; + wchar_t* message; + uint32_t duration; + uint32_t is_dialogue_1_or_2; + }; + struct kErrorMessage { + uint32_t error_id; + wchar_t* message; + }; + struct kAgentSkillPacket { + uint32_t agent_id; + GW::Constants::SkillID skill_id; + }; + struct kLoadMapContext { + const wchar_t* file_name; + Constants::MapID map_id; + Constants::InstanceType map_type; + Vec2f spawn_point; + uint32_t h0014; + uint32_t h0018; + bool* success; + }; + static_assert(sizeof(kLoadMapContext) == 0x20); + struct kMouseCoordsClick { + float offset_x; + float offset_y; + uint32_t h0008; + uint32_t h000c; + uint32_t* h0010; + uint32_t h0014; + }; + struct kUseKitOnItem { + uint32_t item_id; + uint32_t kit_id; + }; + struct kShowXunlaiChest { + uint32_t h0000 = 0; + bool storage_pane_unlocked = true; + bool anniversary_pane_unlocked = true; + }; + struct kMoveItem { + uint32_t item_id; + uint32_t to_bag_index; + uint32_t to_slot; + uint32_t prompt; + }; + struct kResize { + uint32_t h0000 = 0xffffffff; + float content_width; + float content_height; + float h000c = 0; + float h0010 = 0; + float content_width2; + float content_height2; + float margin_x; + float margin_y; + // ... + }; + struct kTomeSkillSelection { + uint32_t item_id; + uint32_t h0004; + uint32_t h0008; + }; + struct kMeasureContent { + float max_width; // Maximum width constraint + float max_height; // Maximum height constraint + float* size_output; // Pointer to output buffer for calculated size + uint32_t flags; // Layout flags (similar to the 0x100 flag we saw) + }; + struct kSetLayout { + float field_0x0; + float field_0x4; + float field_0x8; + float field_0xc; + float available_width; + float available_height; + }; + struct kSetAgentProfession { + AgentID agent_id; + uint32_t primary; + uint32_t secondary; + }; + struct kWeaponSwap { + uint32_t weapon_bar_frame_id; + uint32_t weapon_set_id; + }; + struct kWeaponSetChanged { + uint32_t h0000; + uint32_t h0004; + uint32_t h0008; + uint32_t h000c; + }; + struct kChangeTarget { + uint32_t evaluated_target_id; + bool has_evaluated_target_changed; + uint32_t auto_target_id; + bool has_auto_target_changed; + uint32_t manual_target_id; + bool has_manual_target_changed; + }; + struct kSendLoadSkillTemplate { + uint32_t agent_id; + SkillbarMgr::SkillTemplate* skill_template; + }; + struct kVendorWindow { + Merchant::TransactionType transaction_type; + uint32_t unk; + uint32_t merchant_agent_id; + uint32_t is_pending; + }; + struct kVendorQuote { + uint32_t item_id; + uint32_t price; + }; + struct kVendorItems { + Merchant::TransactionType transaction_type; + uint32_t item_ids_count; + uint32_t* item_ids_buffer1; // world->merchant_items.buffer + uint32_t* item_ids_buffer2; // world->merchant_items2.buffer + }; + struct kSetRendererValue { + uint32_t renderer_mode; // 0 for window, 2 for full screen + uint32_t metric_id; // TODO: Enum this! + uint32_t value; + }; + struct kEffectAdd { + uint32_t agent_id; + Effect* effect; + }; + struct kAgentSpeechBubble { + uint32_t agent_id; + wchar_t* message; + uint32_t h0008; + uint32_t h000c; + }; + struct kAgentSkillStartedCast { + uint32_t agent_id; + Constants::SkillID skill_id; + float duration; + uint32_t h000c; + }; + struct kPreStartSalvage { + uint32_t item_id; + uint32_t kit_id; + }; + struct kServerActiveQuestChanged { + GW::Constants::QuestID quest_id; + GW::GamePos marker; + uint32_t h0024; + GW::Constants::MapID map_id; + uint32_t log_state; + }; + struct kPrintChatMessage { + GW::Chat::Channel channel; + wchar_t* message; + FILETIME timestamp; + uint32_t is_reprint; + }; + struct kPartyShowConfirmDialog { + uint32_t ui_message_to_send_to_party_frame; + uint32_t prompt_identitifier; + wchar_t* prompt_enc_str; + }; + struct kUIPositionChanged { + uint32_t window_id; + UI::WindowPosition* position; + }; + struct kPreferenceFlagChanged { + UI::FlagPreference preference_id; + uint32_t new_value; + }; + struct kPreferenceValueChanged { + UI::NumberPreference preference_id; + uint32_t new_value; + }; + struct kPreferenceEnumChanged { + UI::EnumPreference preference_id; + uint32_t enum_index; + }; + struct kPartySearchInvite { + uint32_t source_party_search_id; + uint32_t dest_party_search_id; + }; + struct kPostProcessingEffect { + uint32_t tint; + float amount; + }; + struct kLogout { + uint32_t unknown; + uint32_t character_select; + }; + static_assert(sizeof(kLogout) == 0x8); + + struct kKeyAction { + uint32_t gw_key; + uint32_t modifiers = 0; + uint32_t state_flags = 0; // shift held = 0x4, ctrl = 0x2, alt = 0x1 + }; + struct kMouseClick { + uint32_t mouse_button; // 0x0 = left, 0x1 = middle, 0x2 = right + uint32_t is_doubleclick; + uint32_t unknown_type_screen_pos; + uint32_t h000c; + uint32_t h0010; + }; + enum ActionState : uint32_t { + MouseDown = 0x6, + MouseUp = 0x7, + MouseClick = 0x8, + MouseDoubleClick = 0x9, + DragRelease = 0xb, + KeyDown = 0xe + }; + struct kMouseAction { + uint32_t frame_id; + uint32_t child_offset_id; + ActionState current_state; + void* wparam = 0; + void* lparam = 0; + }; + struct kWriteToChatLog { + GW::Chat::Channel channel; + wchar_t* message; + GW::Chat::Channel channel_dupe; + }; + struct kPlayerChatMessage { + GW::Chat::Channel channel; + wchar_t* message; + uint32_t player_number; + }; + + struct kInteractAgent { + uint32_t agent_id; + bool call_target; + }; + + struct kSendChangeTarget { + uint32_t target_id; + uint32_t auto_target_id; + }; + + struct kSendCallTarget { + CallTargetType call_type; + uint32_t agent_id; + }; + + struct kGetColor { + Chat::Color* color; + GW::Chat::Channel channel; + }; + + struct kWriteToChatLogWithSender { + uint32_t channel; + wchar_t* message; + wchar_t* sender_enc; + }; + + struct kSendPingWeaponSet { + uint32_t agent_id; + uint32_t weapon_item_id; + uint32_t offhand_item_id; + }; + struct kSendMoveItem { + uint32_t item_id; + uint32_t quantity; + uint32_t bag_index; + uint32_t slot; + }; + struct kSendMerchantRequestQuote { + Merchant::TransactionType type; + uint32_t item_id; + }; + struct kSendMerchantTransactItem { + Merchant::TransactionType type; + uint32_t h0004; + Merchant::QuoteInfo give; + uint32_t gold_recv; + Merchant::QuoteInfo recv; + }; + struct kSendUseItem { + uint32_t item_id; + uint16_t quantity; // Unused, but would be cool + }; + struct kSendChatMessage { + wchar_t* message; + uint32_t agent_id; + }; + struct kLogChatMessage { + wchar_t* message; + GW::Chat::Channel channel; + }; + struct kRecvWhisper { + uint32_t transaction_id; + wchar_t* from; + wchar_t* message; + }; + struct kStartWhisper { + wchar_t* player_name; + }; + struct kCompassDraw { + uint32_t player_number; + uint32_t session_id; + uint32_t number_of_points; + CompassPoint* points; + }; + struct kObjectiveAdd { + uint32_t objective_id; + wchar_t* name; + uint32_t type; + }; + struct kObjectiveComplete { + uint32_t objective_id; + }; + struct kObjectiveUpdated { + uint32_t objective_id; + }; + // Straight passthru of GW::Packets::StoC::ItemGeneral + struct kItemUpdated { + uint32_t item_id; + uint32_t model_file_id; + uint32_t type; + uint32_t unk1; + uint32_t extra_id; // Dye color + uint32_t materials; + uint32_t unk2; + uint32_t interaction; // Flags + uint32_t price; + uint32_t model_id; + uint32_t quantity; + wchar_t* enc_name; + uint32_t mod_struct_size; + uint32_t* mod_struct; + }; + struct kInventorySlotUpdated { + uint32_t unk; + uint32_t item_id; + uint32_t bag_index; + uint32_t slot_id; + }; + struct kSendWorldAction { + WorldActionId action_id; + GW::AgentID agent_id; + bool suppress_call_target; // 1 to block "I'm targetting X", but will also only trigger if the key thing is down + }; + struct kAllyOrGuildMessage { + GW::Chat::Channel channel; + wchar_t* message; + wchar_t* sender; + wchar_t* guild_tag; + }; + } + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/AccountContext.h b/Dependencies/GWCA/Include/GWCA/Context/AccountContext.h new file mode 100644 index 00000000..fd561cc0 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/AccountContext.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +namespace GW { + struct AccountContext; + GWCA_API AccountContext* GetAccountContext(); + + struct AccountUnlockedCount { + uint32_t id; + uint32_t unk1; + uint32_t unk2; + }; + + struct AccountUnlockedItemInfo { + uint32_t name_id; + uint32_t mod_struct_index; // Used to find mod struct in unlocked_pvp_items_mod_structs... + uint32_t mod_struct_size; + }; + + struct AccountContext { + /* +h0000 */ Array account_unlocked_counts; // e.g. number of unlocked storage panes + /* +h0010 */ uint8_t h0010[0xA4]; + /* +h00b4 */ Array unlocked_pvp_heros; // Unused, hero battles is no more :( + /* +h00c4 */ Array h00c4;// If an item is unlocked, the mod struct is stored here. Use unlocked_pvp_items_info to find the index. Idk why, chaos reigns I guess + /* +h00e4 */ Array unlocked_pvp_item_info; // If an item is unlocked, the details are stored here + /* +h00f4 */ Array unlocked_pvp_items; // Bitwise array of which pvp items are unlocked + /* +h0104 */ uint8_t h0104[0x30]; // Some arrays, some linked lists, meh + /* +h0124 */ Array unlocked_account_skills; // List of skills unlocked (but not learnt) for this account, i.e. skills that heros can use, tomes can unlock + /* +h0134 */ uint32_t account_flags; + }; + static_assert(sizeof(AccountContext) == 0x138); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/AgentContext.h b/Dependencies/GWCA/Include/GWCA/Context/AgentContext.h new file mode 100644 index 00000000..5d8c48f3 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/AgentContext.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +namespace GW { + struct AgentContext; + GWCA_API AgentContext* GetAgentContext(); + + struct AgentMovement; + struct Agent; + + struct AgentSummaryInfo { + struct AgentSummaryInfoSub { + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t gadget_id; + /* +h000C */ uint32_t h000C; + /* +h0010 */ wchar_t * gadget_name_enc; + /* +h0014 */ uint32_t h0014; + /* +h0018 */ uint32_t composite_agent_id; // 0x30000000 | player_id, 0x20000000 | npc_id etc + }; + + uint32_t h0000; + uint32_t h0004; + AgentSummaryInfoSub* extra_info_sub; + }; + + struct AgentContext { + /* +h0000 */ Array h0000; + /* +h0010 */ uint32_t h0010[5]; + /* +h0024 */ uint32_t h0024; // function + /* +h0028 */ uint32_t h0028[2]; + /* +h0030 */ uint32_t h0030; // function + /* +h0034 */ uint32_t h0034[2]; + /* +h003C */ uint32_t h003C; // function + /* +h0040 */ uint32_t h0040[2]; + /* +h0048 */ uint32_t h0048; // function + /* +h004C */ uint32_t h004C[2]; + /* +h0054 */ uint32_t h0054; // function + /* +h0058 */ uint32_t h0058[11]; + /* +h0084 */ Array h0084; + /* +h0094 */ uint32_t h0094; // this field and the next array are link together in a structure. + /* +h0098 */ Array agent_summary_info; // elements are of size 12. {ptr, func, ptr} + /* +h00A8 */ Array h00A8; + /* +h00B8 */ Array h00B8; + /* +h00C8 */ uint32_t rand1; // Number seems to be randomized quite a bit o.o seems to be accessed by textparser.cpp + /* +h00CC */ uint32_t rand2; + /* +h00D0 */ uint8_t h00D0[24]; + /* +h00E8 */ Array agent_movement; + /* +h00F8 */ Array h00F8; + /* +h0108 */ uint32_t h0108[0x11]; + /* +h014C */ Array agent_array1; + /* +h015C */ Array agent_async_movement; + /* +h016C */ uint32_t h016C[0x10]; + /* +h01AC */ uint32_t instance_timer; + //... more but meh + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/CharContext.h b/Dependencies/GWCA/Include/GWCA/Context/CharContext.h new file mode 100644 index 00000000..c8159942 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/CharContext.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include + +namespace GW { + namespace Constants { + enum class Language; + enum class MapID : uint32_t; + enum class InstanceType; + } + struct CharContext; + GWCA_API CharContext* GetCharContext(); + + struct ObserverMatch; + + struct ProgressBarContext { + int pips; + uint8_t color[4]; // RGBA + uint8_t background[4]; // RGBA + int unk[7]; + float progress; // 0 ... 1 + // possibly more + }; + + struct CharContext { // total: 0x42C + /* +h0000 */ Array h0000; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ Array h0014; + /* +h0024 */ uint32_t h0024[4]; + /* +h0034 */ Array h0034; + /* +h0044 */ Array h0044; + /* +h0054 */ uint32_t h0054[4]; // load head variables + /* +h0064 */ uint32_t player_uuid[4]; // uuid + /* +h0074 */ wchar_t player_name[0x14]; + /* +h009C */ uint32_t h009C[20]; + /* +h00EC */ Array h00EC; + /* +h00FC */ uint32_t h00FC[37]; // 40 + /* +h0190 */ uint32_t world_flags; + /* +h0194 */ uint32_t token1; // world id + /* +h0198 */ GW::Constants::MapID map_id; + /* +h019C */ uint32_t is_explorable; + /* +h01A0 */ uint8_t host[0x18]; + /* +h01B8 */ uint32_t token2; // player id + /* +h01BC */ uint32_t h01BC[25]; + /* +h0220 */ uint32_t district_number; + /* +h0224 */ GW::Constants::Language language; + /* +h0228 */ GW::Constants::MapID observe_map_id; + /* +h022C */ GW::Constants::MapID current_map_id; + /* +h0230 */ Constants::InstanceType observe_map_type; + /* +h0234 */ Constants::InstanceType current_map_type; + /* +h0238 */ uint32_t h0238[5]; + /* +h024C */ Array observer_matches; + /* +h025C */ uint32_t h025C[17]; + /* +h02a0 */ uint32_t player_flags; // bitwise something + /* +h02A4 */ uint32_t player_number; + /* +h02A8 */ uint32_t h02A8[40]; + /* +h0348 */ ProgressBarContext* progress_bar; // seems to never be nullptr + /* +h034C */ uint32_t h034C[27]; + /* +h03B8 */ wchar_t player_email[0x40]; + }; + static_assert(sizeof(CharContext) == 0x438, "struct CharContext has incorrect size"); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/Cinematic.h b/Dependencies/GWCA/Include/GWCA/Context/Cinematic.h new file mode 100644 index 00000000..4ea7c350 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/Cinematic.h @@ -0,0 +1,9 @@ +#pragma once + +namespace GW { + struct Cinematic { + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; // pointer to data + // ... + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/GadgetContext.h b/Dependencies/GWCA/Include/GWCA/Context/GadgetContext.h new file mode 100644 index 00000000..0dfd24b8 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/GadgetContext.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace GW { + struct GadgetInfo { + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ wchar_t *name_enc; + }; + + struct GadgetContext { + /* +h0000 */ Array GadgetInfo; + // ... + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/GameContext.h b/Dependencies/GWCA/Include/GWCA/Context/GameContext.h new file mode 100644 index 00000000..5cac7edd --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/GameContext.h @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace GW { + struct GameContext; + GWCA_API GameContext* GetGameContext(); + + struct Cinematic; + struct MapContext; + struct TextParser; + struct CharContext; + struct ItemContext; + struct AgentContext; + struct GuildContext; + struct PartyContext; + struct TradeContext; + struct WorldContext; + struct GadgetContext; + struct AccountContext; + struct EventContext; + + struct GameContext { + /* +h0000 */ void* h0000; + /* +h0004 */ void* h0004; + /* +h0008 */ AgentContext* agent; // Most functions that access are prefixed with Agent. + /* +h000C */ EventContext* event; + /* +h0010 */ void* h0010; + /* +h0014 */ MapContext* map; // Static object/collision data + /* +h0018 */ TextParser *text_parser; + /* +h001C */ void* h001C; + /* +h0020 */ uint32_t some_number; // 0x30 for me at the moment. + /* +h0024 */ void* h0024; + /* +h0028 */ AccountContext* account; + /* +h002C */ WorldContext* world; // Best name to fit it that I can think of. + /* +h0030 */ Cinematic *cinematic; + /* +h0034 */ void* h0034; + /* +h0038 */ GadgetContext* gadget; + /* +h003C */ GuildContext* guild; + /* +h0040 */ ItemContext* items; + /* +h0044 */ CharContext* character; + /* +h0048 */ void* h0048; + /* +h004C */ PartyContext* party; + /* +h0050 */ void* h0050; + /* +h0054 */ void* h0054; + /* +h0058 */ TradeContext* trade; + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/GameplayContext.h b/Dependencies/GWCA/Include/GWCA/Context/GameplayContext.h new file mode 100644 index 00000000..e8aed483 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/GameplayContext.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace GW { + struct GameplayContext; + GWCA_API GameplayContext* GetGameplayContext(); + + // Static stuff used at runtime + struct GameplayContext { + /* +h0000 */ uint32_t h0000[0x13]; + float mission_map_zoom; + uint32_t unk[10]; + }; + static_assert(sizeof(GameplayContext) == 0x78); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/GuildContext.h b/Dependencies/GWCA/Include/GWCA/Context/GuildContext.h new file mode 100644 index 00000000..35a2d56e --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/GuildContext.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include + +namespace GW { + struct GuildContext; + GWCA_API GuildContext* GetGuildContext(); + + typedef Array GuildArray; + typedef Array GuildRoster; + typedef Array GuildHistory; + + struct GuildContext { // total: 0x3BC/956 + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t h000C; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t h0014; + /* +h0018 */ uint32_t h0018; + /* +h001C */ uint32_t h001C; + /* +h0020 */ Array h0020; + /* +h0030 */ uint32_t h0030; + /* +h0034 */ wchar_t player_name[20]; + /* +h005C */ uint32_t h005C; + /* +h0060 */ uint32_t player_guild_index; + /* +h0064 */ GHKey player_gh_key; + /* +h0074 */ uint32_t h0074; + /* +h0078 */ wchar_t announcement[256]; + /* +h0278 */ wchar_t announcement_author[20]; + /* +h02A0 */ uint32_t player_guild_rank; + /* +h02A4 */ uint32_t h02A4; + /* +h02A8 */ Array factions_outpost_guilds; + /* +h02B8 */ uint32_t kurzick_town_count; + /* +h02BC */ uint32_t luxon_town_count; + /* +h02C0 */ uint32_t h02C0; + /* +h02C4 */ uint32_t h02C4; + /* +h02C8 */ uint32_t h02C8; + /* +h02CC */ GuildHistory player_guild_history; + /* +h02DC */ uint32_t h02DC[7]; + /* +h02F8 */ GuildArray guilds; + /* +h0308 */ uint32_t h0308[4]; + /* +h0318 */ Array h0318; + /* +h0328 */ uint32_t h0328; + /* +h032C */ Array h032C; + /* +h033C */ uint32_t h033C[7]; + /* +h0358 */ GuildRoster player_roster; + //... end of what i care about + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/ItemContext.h b/Dependencies/GWCA/Include/GWCA/Context/ItemContext.h new file mode 100644 index 00000000..041dcd3e --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/ItemContext.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +namespace GW { + struct ItemContext; + GWCA_API ItemContext* GetItemContext(); + + struct Bag; + struct Item; + struct Inventory; + + struct ItemContext { // total: 0x10C/268 BYTEs + /* +h0000 */ Array h0000; + /* +h0010 */ Array h0010; + /* +h0020 */ DWORD h0020; + /* +h0024 */ Array bags_array; + /* +h0034 */ char h0034[12]; + /* +h0040 */ Array h0040; + /* +h0050 */ Array h0050; + /* +h0060 */ char h0060[88]; + /* +h00B8 */ Array item_array; + /* +h00C8 */ char h00C8[48]; + /* +h00F8 */ Inventory *inventory; + /* +h00FC */ Array h00FC; + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/MapContext.h b/Dependencies/GWCA/Include/GWCA/Context/MapContext.h new file mode 100644 index 00000000..ea6a4222 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/MapContext.h @@ -0,0 +1,200 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace GW { + struct PathingMap; + struct MapProp; + struct PropByType; + struct PropModelInfo; + namespace Constants { + enum class MapID : uint32_t; + } + + typedef Array PathingMapArray; + + struct PropsContext { + /* +h0000 */ uint32_t pad1[0x1b]; + /* +h006C */ Array> propsByType; + /* +h007C */ uint32_t h007C[0xa]; + /* +h00A4 */ Array propModels; + /* +h00B4 */ uint32_t h00B4[0x38]; + /* +h0194 */ Array propArray; + }; + static_assert(sizeof(PropsContext) == 0x1A4, "struct PropsContext has incorrect size"); + + struct MapStaticData { + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t h000C; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t trapezoidCount; + /* +h0018 */ PathingMapArray map; + /* +h0028 */ uint32_t h0028; + /* +h002C */ uint32_t h002C; + /* +h0030 */ uint32_t h0030; + /* +h0034 */ uint32_t h0034; + /* +h0038 */ uint32_t h0038; + /* +h003C */ uint32_t h003C; + /* +h0040 */ uint32_t h0040; + /* +h0044 */ uint32_t h0044; + /* +h0048 */ uint32_t h0048; + /* +h004C */ uint32_t h004C; + /* +h0050 */ uint32_t h0050; + /* +h0054 */ uint32_t h0054; + /* +h0058 */ uint32_t h0058; + /* +h005C */ uint32_t h005C; + /* +h0060 */ uint32_t h0060; + /* +h0064 */ uint32_t h0064; + /* +h0068 */ uint32_t h0068; + /* +h006C */ uint32_t h006C; + /* +h0070 */ uint32_t h0070; + /* +h0074 */ uint32_t h0074; + /* +h0078 */ uint32_t h0078; + /* +h007C */ uint32_t h007C; + /* +h0080 */ uint32_t h0080; + /* +h0084 */ uint32_t nextTrapezoidId; // Starts at 0, increment everytime a trapezoid is created. It's used to assign a unique trapezoid id to every trapezoid. Used for path finding. + /* +h0088 */ uint32_t h0088; + /* +h008C */ GW::Constants::MapID map_id; + /* +h0090 */ uint32_t h0090; + /* +h0094 */ uint32_t h0094; + /* +h0098 */ uint32_t h0098; + /* +h009C */ uint32_t h009C; + }; + static_assert(sizeof(MapStaticData) == 0xA0, "struct MapStaticData has incorrect size"); + + // Those are planes that are blocked and can be unblocked at runtime. e.g., the gates in foundry + // Those aren't in the dat file, but sent from the server + typedef BaseArray BlockedPlaneArray; + static_assert(sizeof(BlockedPlaneArray) == 0xC, "struct BlockedPlaneArray has incorrect size"); + + // The game leak this type name and it's `IPath::PathNode` + struct PathNode { + /* +h0000 */ uint32_t closed; + /* +h0004 */ float costToNode; + /* +h0008 */ PrioQLink priority; + /* +h0018 */ GamePos nodePos; // This position is a guess on the best position to pass through. It's usually on one of the 4 edges of a trapezoid. + /* +h0024 */ struct PathingTrapezoid *currentTrapezoid; + /* +h0028 */ PathNode *parentPathMap; + }; + static_assert(sizeof(PathNode) == 0x2C, "struct PathNode has incorrect size"); + + typedef BaseArray PathNodeArray; + static_assert(sizeof(PathNodeArray) == 0xC, "struct PathNodeArray has incorrect size"); + + struct NodeCache { + /* +h0000 */ uint32_t* cachedCount; + /* +h0004 */ uint32_t m_mask; + /* +h0008 */ BaseArray buffer; + }; + static_assert(sizeof(NodeCache) == 0x14, "struct NodeCache has incorrect size"); + + struct PathWaypoint { + /* +h0000 */ float x; + /* +h0004 */ float y; + /* +h0008 */ float width; + /* +h000C */ float height; + /* +h0010 */ uint32_t plane; + /* +h0014 */ PathingTrapezoid *nextTrap; + }; + static_assert(sizeof(PathWaypoint) == 0x18, "struct PathWaypoint has incorrect size"); + + struct PathContext { + /* +h0000 */ MapStaticData* staticData; + /* +h0004 */ BlockedPlaneArray blockedPlanes; + /* +h0010 */ PathNodeArray pathNodes; // This array of pathNodes are indexed with the trapezoid id. + /* +h001C */ NodeCache nodeCache; + /* +h0030 */ PrioQ openList; + /* +h0044 */ ObjectPool freeIPathNode; + /* +h0050 */ PathNodeArray allocatedPathNodes; // This is just an array of all allocated path nodes used to cleanup. The order is the allocation order. + /* +h005C */ uint32_t h005C; + /* +h0060 */ uint32_t h0060; + /* +h0064 */ Array waypoints; + /* +h0074 */ Array nodeStack; + /* +h0084 */ uint32_t h0084; + /* +h0088 */ uint32_t h0088; + /* +h008C */ uint32_t h008C; + /* +h0090 */ uint32_t h0090; + }; + static_assert(sizeof(PathContext) == 0x94, "struct PathContext has incorrect size"); + + // The game can optionally load a DLL to do the path finding. + // The DLL is named "PathEngine.dll", but not clear if it's a 3rd party or just their name + // for development. + struct PathEngineContext { + /* +h0000 */ void **vtable; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ void *user_data; + /* +h0010 */ HMODULE hDll; + /* +h0014 */ uint32_t pfnCreateInterface; + }; + static_assert(sizeof(PathEngineContext) == 0x18, "struct PathEngineContext has incorrect size"); + + struct MapContext { + /* +h0000 */ uint32_t map_type; // less than 4 + /* +h0004 */ Vec2f start_pos; + /* +h000c */ Vec2f end_pos; + /* +h0014 */ uint32_t h0014[6]; + /* +h002C */ Array spawns1; // Seem to be arena spawns. struct is X,Y,unk 4 byte value,unk 4 byte value. + /* +h003C */ Array spawns2; // Same as above + /* +h004C */ Array spawns3; // Same as above + /* +h005C */ float h005C[6]; // Some trapezoid i think. + /* +h0074 */ PathContext* path; + /* +h0078 */ PathEngineContext* path_engine; + /* +h007C */ PropsContext* props; + /* +h0080 */ uint32_t h0080; + /* +h0084 */ void* terrain; + /* +h0088 */ uint32_t h0088; + /* +h008C */ GW::Constants::MapID map_id; + /* +h0090 */ uint32_t h0090; + /* +h0094 */ uint32_t h0094; + /* +h0098 */ uint32_t h0098; + /* +h009C */ uint32_t h009C; + /* +h00A0 */ uint32_t h00A0; + /* +h00A4 */ uint32_t h00A4; + /* +h00A8 */ uint32_t h00A8; + /* +h00AC */ uint32_t h00AC; + /* +h00B0 */ uint32_t h00B0; + /* +h00B4 */ uint32_t h00B4; + /* +h00B8 */ uint32_t h00B8; + /* +h00BC */ uint32_t h00BC; + /* +h00C0 */ uint32_t h00C0; + /* +h00C4 */ uint32_t h00C4; + /* +h00C8 */ uint32_t h00C8; + /* +h00CC */ uint32_t h00CC; + /* +h00D0 */ uint32_t h00D0; + /* +h00D4 */ uint32_t h00D4; + /* +h00D8 */ uint32_t h00D8; + /* +h00DC */ uint32_t h00DC; + /* +h00E0 */ uint32_t h00E0; + /* +h00E4 */ uint32_t h00E4; + /* +h00E8 */ uint32_t h00E8; + /* +h00EC */ uint32_t h00EC; + /* +h00F0 */ uint32_t h00F0; + /* +h00F4 */ uint32_t h00F4; + /* +h00F8 */ uint32_t h00F8; + /* +h00FC */ uint32_t h00FC; + /* +h0100 */ uint32_t h0100; + /* +h0104 */ uint32_t h0104; + /* +h0108 */ uint32_t h0108; + /* +h010C */ uint32_t h010C; + /* +h0110 */ uint32_t h0110; + /* +h0114 */ uint32_t h0114; + /* +h0118 */ uint32_t h0118; + /* +h011C */ uint32_t h011C; + /* +h0120 */ uint32_t h0120; + /* +h0124 */ uint32_t h0124; + /* +h0128 */ uint32_t h0128; + /* +h012C */ uint32_t h012C; + /* +h0130 */ void* zones; + /* +h0134 */ uint32_t h0134; + }; + static_assert(sizeof(MapContext) == 0x138, "struct MapContext has incorrect size"); + GWCA_API MapContext* GetMapContext(); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/PartyContext.h b/Dependencies/GWCA/Include/GWCA/Context/PartyContext.h new file mode 100644 index 00000000..5bbc043b --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/PartyContext.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +namespace GW { + struct PartyContext; + GWCA_API PartyContext* GetPartyContext(); + + struct PartyInfo; + struct PartySearch; + + struct PartySearchContext { + uint32_t h0000; + uint32_t h0004; + uint32_t h0008; + uint32_t h000c; + uint32_t flags; + }; + + struct PartyContext { // total: 0x58/88 + /* +h0000 */ uint32_t h0000; + /* +h0004 */ Array h0004; + /* +h0014 */ uint32_t flag; + /* +h0018 */ uint32_t h0018; + /* +h001C */ TList requests; + /* +h0028 */ uint32_t requests_count; + /* +h002C */ TList sending; + /* +h0038 */ uint32_t sending_count; + /* +h003C */ uint32_t h003C; + /* +h0040 */ Array parties; + /* +h0050 */ uint32_t h0050; + /* +h0054 */ PartyInfo* player_party; // Players party + /* +h0058 */ uint32_t h0058[17]; + /* +h009C */ uint32_t my_party_search_id; + /* +h00A0 */ uint32_t h00A0[8]; + /* +h00C0 */ Array party_search; + + bool InHardMode() const { return (flag & 0x10) > 0; } + bool IsDefeated() const { return (flag & 0x20) > 0; } + bool IsPartyLeader() const { return (flag >> 0x7) & 1; } + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/PreGameContext.h b/Dependencies/GWCA/Include/GWCA/Context/PreGameContext.h new file mode 100644 index 00000000..3e196fdd --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/PreGameContext.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +namespace GW { + struct PreGameContext; + struct CharacterInformation; + GWCA_API PreGameContext* GetPreGameContext(); + GWCA_API Array* GetAvailableChars(); + + struct LoginCharacter { + uint32_t unk0; // Some kind of function call + wchar_t character_name[20]; + }; + + // Character information available at login screen + struct CharacterInformation { + /* +h0000 */ uint32_t h0000[2]; + /* +h0008 */ uint32_t uuid[4]; + /* +h0018 */ wchar_t name[20]; + /* +h0040 */ uint32_t props[17]; + + uint32_t GetMapId() const { return (props[0] >> 16) & 0xFFFF; } + uint32_t GetPrimaryProfession() const { return (props[2] >> 20) & 0xF; } + uint32_t GetSecondaryProfession() const { return (props[7] >> 10) & 0xF; } + uint32_t GetCampaign() const { return props[7] & 0xF; } + uint32_t GetLevel() const { return (props[7] >> 4) & 0x3F; } + bool IsPvP() const { return ((props[7] >> 9) & 0x1) == 0x1; } + }; + struct PreGameContext { + /* +h0000 */ uint32_t frame_id; + /* +h0004 */ uint32_t h0004[72]; + /* +h0124 */ uint32_t chosen_character_index; + /* +h0128 */ uint32_t h0128[6]; + /* +h0140 */ uint32_t index_1; + /* +h0144 */ uint32_t index_2; + /* +h0148 */ GW::Array chars; + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetAvailableChars(); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/TextParser.h b/Dependencies/GWCA/Include/GWCA/Context/TextParser.h new file mode 100644 index 00000000..7826d5aa --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/TextParser.h @@ -0,0 +1,47 @@ +#pragma once + +#include + +namespace GW { + namespace Constants { + enum class Language; + } + struct TextCache { + /* +h0000 */ uint32_t h0000; + }; + + struct SubStruct1 { + /* +h0000 */ uint32_t h0000; + }; + + // Allocated @0078C243 + struct SubStructUnk { // total: 0x54/84 + /* +h0000 */ uint32_t AsyncDecodeStr_Callback; + /* +h0004 */ uint32_t AsyncDecodeStr_Param; + /* +h0008 */ uint32_t buffer_used; // if it's 1 then uses s1 & if it's 0 uses s2. + /* +h000C */ Array s1; + /* +h001C */ Array s2; + /* +h002C */ uint32_t h002C; + /* +h0030 */ uint32_t h0030; // tell us how many string will be enqueue before decoding. + /* +h0034 */ uint32_t h0034; // @0078B990 + /* +h0038 */ uint8_t h0038[28]; + }; + + struct TextParser { + /* +h0000 */ uint32_t h0000[8]; + /* +h0020 */ wchar_t *dec_start; + /* +h0024 */ wchar_t *dec_end; + /* +h0028 */ uint32_t substitute_1; // related to h0020 & h0024 + /* +h002C */ uint32_t substitute_2; // related to h0020 & h0024 + /* +h0030 */ TextCache *cache; + /* +h0034 */ uint32_t h0034[75]; + /* +h0160 */ uint32_t h0160; // @0078BEF5 + /* +h0164 */ uint32_t h0164; + /* +h0168 */ uint32_t h0168; // set to 0 @0078BF34 + /* +h016C */ uint32_t h016C[5]; + /* +h0180 */ SubStruct1 *sub_struct; + /* +h0184 */ uint32_t h0184[19]; + /* +h01d0 */ GW::Constants::Language language_id; + }; + +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/TradeContext.h b/Dependencies/GWCA/Include/GWCA/Context/TradeContext.h new file mode 100644 index 00000000..c6d0794f --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/TradeContext.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include + + +namespace GW { + + struct TradeItem { + uint32_t item_id; + uint32_t quantity; + }; + struct TradePlayer { + uint32_t gold; + Array items; + }; + + struct TradeContext { + enum TradeStatus { + TRADE_CLOSED = 0, + TRADE_INITIATED = 1, + TRADE_OFFER_SEND = 2, + TRADE_ACCEPTED = 4 + }; + + /* +h0000 */ uint32_t flags; // this is actually a flags + /* +h0004 */ uint32_t h0004[3]; // Seemingly 3 null dwords + /* +h0010 */ TradePlayer player; + /* +h0024 */ TradePlayer partner; + + // bool GetPartnerAccepted(); + // bool GetPartnerOfferSent(); + + bool GetIsTradeOffered() const { return (flags & TRADE_OFFER_SEND) != 0; } + bool GetIsTradeInitiated() const { return (flags & TRADE_INITIATED) != 0; } + bool GetIsTradeAccepted() const { return (flags & TRADE_ACCEPTED) != 0; } + }; + + GWCA_API TradeContext* GetTradeContext(); +} diff --git a/Dependencies/GWCA/Include/GWCA/Context/WorldContext.h b/Dependencies/GWCA/Include/GWCA/Context/WorldContext.h new file mode 100644 index 00000000..5ee23626 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Context/WorldContext.h @@ -0,0 +1,311 @@ +#pragma once + +#include +#include +#include + +namespace GW { + struct WorldContext; + GWCA_API WorldContext* GetWorldContext(); + + namespace Constants { + enum class Profession : uint32_t; + } + + typedef uint32_t ItemID; + enum class HeroBehavior : uint32_t; + + + struct NPC; + struct Quest; + struct Title; + struct Player; + struct HeroInfo; + struct HeroFlag; + struct MapAgent; + struct Skillbar; + struct AgentInfo; + struct AgentEffects; + struct PartyAttribute; + struct MissionMapIcon; + struct MissionObjective; + struct TitleTier; + + typedef Array NPCArray; + typedef Array QuestLog; + typedef Array TitleArray; + typedef Array<ItemID> MerchItemArray; + typedef Array<Player> PlayerArray; + typedef Array<HeroFlag> HeroFlagArray; + typedef Array<HeroInfo> HeroInfoArray; + typedef Array<MapAgent> MapAgentArray; + typedef Array<Skillbar> SkillbarArray; + typedef Array<AgentInfo> AgentInfoArray; + typedef Array<AgentEffects> AgentEffectsArray; + typedef Array<MissionMapIcon> MissionMapIconArray; + typedef Array<PartyAttribute> PartyAttributeArray; + + struct PartyAlly { + uint32_t agent_id; + uint32_t unk; + uint32_t composite_id; + }; + static_assert(sizeof(PartyAlly) == 0xc); + + namespace Constants { + enum class QuestID : uint32_t; + } + + struct ControlledMinions { + uint32_t agent_id; + uint32_t minion_count; + }; + struct DupeSkill { + uint32_t skill_id; + uint32_t count; + }; + struct ProfessionState { + uint32_t agent_id; + GW::Constants::Profession primary; + GW::Constants::Profession secondary; + uint32_t unlocked_professions; // bitwise + uint32_t unk; + + inline bool IsProfessionUnlocked(GW::Constants::Profession profession) const { + return (unlocked_professions & (1 << (uint32_t)profession)) != 0; + } + }; + static_assert(sizeof(ProfessionState) == 0x14); + + struct AccountInfo { + wchar_t* account_name; + uint32_t wins; + uint32_t losses; + uint32_t rating; + uint32_t qualifier_points; + uint32_t rank; + uint32_t tournament_reward_points; + }; + static_assert(sizeof(AccountInfo) == 0x1c); + + struct PartyMemberMoraleInfo { + uint32_t agent_id; + uint32_t agent_id_dup; + uint32_t unk[4]; + uint32_t morale; + // ... unknown size + }; + + struct PartyMoraleLink { + uint32_t unk; + uint32_t unk2; + PartyMemberMoraleInfo* party_member_info; + }; + static_assert(sizeof(PartyMoraleLink) == 0xc); + + struct PetInfo { + uint32_t agent_id; + uint32_t owner_agent_id; + wchar_t* pet_name; + uint32_t model_file_id1; + uint32_t model_file_id2; + HeroBehavior behavior; + uint32_t locked_target_id; + + }; + static_assert(sizeof(PetInfo) == 0x1c); + + struct PlayerControlledCharacter { + uint32_t field0_0x0; + uint32_t field1_0x4; + uint32_t field2_0x8; + uint32_t field3_0xc; + uint32_t field4_0x10; + uint32_t agent_id; + uint32_t composite_id; // 0x30000000 | player_number + uint32_t field7_0x1c; + uint32_t field8_0x20; + uint32_t field9_0x24; + uint32_t field10_0x28; + uint32_t field11_0x2c; + uint32_t field12_0x30; + uint32_t field13_0x34; + uint32_t field14_0x38; + uint32_t field15_0x3c; + uint32_t field16_0x40; + uint32_t field17_0x44; + uint32_t field18_0x48; + uint32_t field19_0x4c; + uint32_t field20_0x50; + uint32_t field21_0x54; + uint32_t field22_0x58; + uint32_t field23_0x5c; + uint32_t field24_0x60; + uint32_t more_flags; + uint32_t field26_0x68; + uint32_t field27_0x6c; + uint32_t field28_0x70; + uint32_t field29_0x74; + uint32_t field30_0x78; + uint32_t field31_0x7c; + uint32_t field32_0x80; + uint32_t field33_0x84; + uint32_t field34_0x88; + uint32_t field35_0x8c; + uint32_t field36_0x90; + uint32_t field37_0x94; + uint32_t field38_0x98; + uint32_t field39_0x9c; + uint32_t field40_0xa0; + uint32_t field41_0xa4; + uint32_t field42_0xa8; + uint32_t field43_0xac; + uint32_t field44_0xb0; + uint32_t field45_0xb4; + uint32_t field46_0xb8; + uint32_t field47_0xbc; + uint32_t field48_0xc0; + uint32_t field49_0xc4; + uint32_t field50_0xc8; + uint32_t field51_0xcc; + uint32_t field52_0xd0; + uint32_t field53_0xd4; + uint32_t field54_0xd8; + uint32_t field55_0xdc; + uint32_t field56_0xe0; + uint32_t field57_0xe4; + uint32_t field58_0xe8; + uint32_t field59_0xec; + uint32_t field60_0xf0; + uint32_t field61_0xf4; + uint32_t field62_0xf8; + uint32_t field63_0xfc; + uint32_t field64_0x100; + uint32_t field65_0x104; + uint32_t field66_0x108; + uint32_t flags; + uint32_t field68_0x110; + uint32_t field69_0x114; + uint32_t field70_0x118; + uint32_t field71_0x11c; + uint32_t field72_0x120; + uint32_t field73_0x124; + uint32_t field74_0x128; + uint32_t field75_0x12c; + uint32_t field76_0x130; + }; + static_assert(sizeof(PlayerControlledCharacter) == 0x134); + + + struct WorldContext { + /* +h0000 */ AccountInfo* accountInfo; + /* +h0004 */ Array<wchar_t> message_buff; + /* +h0014 */ Array<wchar_t> dialog_buff; + /* +h0024 */ MerchItemArray merch_items; + /* +h0034 */ MerchItemArray merch_items2; + /* +h0044 */ uint32_t accumMapInitUnk0; + /* +h0048 */ uint32_t accumMapInitUnk1; + /* +h004C */ uint32_t accumMapInitOffset; + /* +h0050 */ uint32_t accumMapInitLength; + /* +h0054 */ uint32_t h0054; + /* +h0058 */ uint32_t accumMapInitUnk2; + /* +h005C */ uint32_t h005C[8]; + /* +h007C */ MapAgentArray map_agents; + /* +h008C */ Array<PartyAlly> party_allies; // List of allies added to the current party + /* +h009C */ Vec3f all_flag; + /* +h00A8 */ uint32_t h00A8; + /* +h00AC */ PartyAttributeArray attributes; + /* +h00BC */ uint32_t h00BC[255]; + /* +h04B8 */ Array<void *> h04B8; + /* +h04C8 */ Array<void *> h04C8; + /* +h04D8 */ uint32_t h04D8; + /* +h04DC */ Array<void *> h04DC; + /* +h04EC */ uint32_t h04EC[7]; + /* +h0508 */ AgentEffectsArray party_effects; + /* +h0518 */ Array<void *> h0518; + /* +h0528 */ GW::Constants::QuestID active_quest_id; + /* +h052C */ QuestLog quest_log; + /* +h053C */ uint32_t h053C[10]; + /* +h0564 */ Array<MissionObjective> mission_objectives; + /* +h0574 */ Array<uint32_t> henchmen_agent_ids; + /* +h0584 */ HeroFlagArray hero_flags; + /* +h0594 */ HeroInfoArray hero_info; + /* +h05A4 */ Array<void *> cartographed_areas; // Struct size = 0x20 + /* +h05B4 */ uint32_t h05B4[2]; + /* +h05BC */ Array<ControlledMinions> controlled_minion_count; + /* +h05CC */ Array<uint32_t> missions_completed; + /* +h05DC */ Array<uint32_t> missions_bonus; + /* +h05EC */ Array<uint32_t> missions_completed_hm; + /* +h05FC */ Array<uint32_t> missions_bonus_hm; + /* +h060C */ Array<uint32_t> unlocked_map; + /* +h061C */ uint32_t h061C[2]; + /* +h0624 */ PartyMemberMoraleInfo* player_morale_info; + /* +h0628 */ uint32_t h028C; + /* +h062C */ Array<PartyMoraleLink> party_morale_related; + /* +h063C */ uint32_t h063C[16]; + /* +h067C */ uint32_t player_number; + /* +h0680 */ PlayerControlledCharacter* playerControlledChar; // Struct size = 0x134 ? + /* +h0684 */ uint32_t is_hard_mode_unlocked; + /* +h0688 */ uint32_t h0688[2]; + /* +h0690 */ uint32_t salvage_session_id; + /* +h0694 */ uint32_t h0694[5]; + /* +h06A8 */ uint32_t playerTeamToken; + /* +h06AC */ Array<PetInfo> pets; + /* +h06BC */ Array<ProfessionState> party_profession_states; // Current state of primary/secondary/unlocked for current player and party heroes, used in skill window. aka attribStates + /* +h06CC */ Array<void *> h06CC; + /* +h06DC */ uint32_t h06DC; + /* +h06E0 */ Array<void *> h06E0; + /* +h06F0 */ SkillbarArray skillbar; + /* +h0700 */ Array<uint32_t> learnable_character_skills; // populated at skill trainer and when using signet of capture + /* +h0710 */ Array<uint32_t> unlocked_character_skills; // bit field + /* +h0720 */ Array<DupeSkill> duplicated_character_skills; // When res signet is bought more than once, its mapped into this array. Used in skill window. + /* +h0730 */ Array<void *> h0730; + /* +h0740 */ uint32_t experience; + /* +h0744 */ uint32_t experience_dupe; + /* +h0748 */ uint32_t current_kurzick; + /* +h074C */ uint32_t current_kurzick_dupe; + /* +h0750 */ uint32_t total_earned_kurzick; + /* +h0754 */ uint32_t total_earned_kurzick_dupe; + /* +h0758 */ uint32_t current_luxon; + /* +h075C */ uint32_t current_luxon_dupe; + /* +h0760 */ uint32_t total_earned_luxon; + /* +h0764 */ uint32_t total_earned_luxon_dupe; + /* +h0768 */ uint32_t current_imperial; + /* +h076C */ uint32_t current_imperial_dupe; + /* +h0770 */ uint32_t total_earned_imperial; + /* +h0774 */ uint32_t total_earned_imperial_dupe; + /* +h0778 */ uint32_t unk_faction4; + /* +h077C */ uint32_t unk_faction4_dupe; + /* +h0780 */ uint32_t unk_faction5; + /* +h0784 */ uint32_t unk_faction5_dupe; + /* +h0788 */ uint32_t level; + /* +h078C */ uint32_t level_dupe; + /* +h0790 */ uint32_t morale; + /* +h0794 */ uint32_t morale_dupe; + /* +h0798 */ uint32_t current_balth; + /* +h079C */ uint32_t current_balth_dupe; + /* +h07A0 */ uint32_t total_earned_balth; + /* +h07A4 */ uint32_t total_earned_balth_dupe; + /* +h07A8 */ uint32_t current_skill_points; + /* +h07AC */ uint32_t current_skill_points_dupe; + /* +h07B0 */ uint32_t total_earned_skill_points; + /* +h07B4 */ uint32_t total_earned_skill_points_dupe; + /* +h07B8 */ uint32_t max_kurzick; + /* +h07BC */ uint32_t max_luxon; + /* +h07C0 */ uint32_t max_balth; + /* +h07C4 */ uint32_t max_imperial; + /* +h07C8 */ uint32_t equipment_status; + /* +h07CC */ AgentInfoArray agent_infos; + /* +h07DC */ Array<void *> h07DC; + /* +h07EC */ MissionMapIconArray mission_map_icons; + /* +h07FC */ NPCArray npcs; + /* +h080C */ PlayerArray players; + /* +h081C */ TitleArray titles; + /* +h082C */ Array<TitleTier> title_tiers; + /* +h083C */ Array<uint32_t> vanquished_areas; + /* +h084C */ uint32_t foes_killed; + /* +h0850 */ uint32_t foes_to_kill; + //... couple more arrays after this + }; + static_assert(sizeof(WorldContext) == 0x854); // Not the final size of WorldContext, but used to make sure offsets are correct. +} diff --git a/Dependencies/GWCA/Include/GWCA/GWCA.h b/Dependencies/GWCA/Include/GWCA/GWCA.h new file mode 100644 index 00000000..b988a954 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GWCA.h @@ -0,0 +1,46 @@ +#pragma once +#include "Utilities/Export.h" + +/**********************************************************************************\ + +_____ _ _ _____ ___ +| __ \ | | / __ \ / _ \ _ _ +| | \/ | | | / \// /_\ \_| |_ _| |_ +| | __| |/\| | | | _ |_ _|_ _| +| |_\ \ /\ / \__/\| | | | |_| |_| +\____/\/ \/ \____/\_| |_/ + + +Created by KAOS (a.k.a. 4D 1) and HasKha for use in GWToolbox++ + +Credits to: + +Sune C (a.k.a. Harboe) and ACB - +Most low level ground work of API via the GWCA and GWLP:R +projects as well as getting the gamerevision community rolling. +Much help from following these two gentlemen's breadcrumbs. + +Miracle444 - +GWA2, as well as helping me really understand how the game handles +its memory information. + +d8rken - +Zraw menu/api which acted as a gateway to get a grasp of cpp as well +as directx. + +HasKha - +For getting me to not make everything singletons :P + +Jon - +Current maintainer of the project, rework and rewrite since 2022 + +Dubble - +Packaging for distribution, cmake +\**********************************************************************************/ + +namespace GW { + GWCA_API bool Initialize(); + GWCA_API void DisableHooks(); + GWCA_API void EnableHooks(); + GWCA_API void Terminate(); +} diff --git a/Dependencies/GWCA/Include/GWCA/GWCAVersion.h b/Dependencies/GWCA/Include/GWCA/GWCAVersion.h new file mode 100644 index 00000000..1c207f3f --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GWCAVersion.h @@ -0,0 +1,15 @@ +#pragma once + +#define GWCA_VERSION_MAJOR 3 +#define GWCA_VERSION_MINOR 2 +#define GWCA_VERSION_PATCH 1 +#define GWCA_VERSION_BUILD 1 +#define GWCA_VERSION "3.2.1.1" + +namespace GWCA { + constexpr int VersionMajor = GWCA_VERSION_MAJOR; + constexpr int VersionMinor = GWCA_VERSION_MINOR; + constexpr int VersionPatch = GWCA_VERSION_PATCH; + constexpr int VersionBuild = GWCA_VERSION_BUILD; + constexpr const char* Version = GWCA_VERSION; +} diff --git a/Dependencies/GWCA/Include/GWCA/GWCAVersion.h.in b/Dependencies/GWCA/Include/GWCA/GWCAVersion.h.in new file mode 100644 index 00000000..e7401242 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GWCAVersion.h.in @@ -0,0 +1,15 @@ +#pragma once + +#define GWCA_VERSION_MAJOR @GWCA_VERSION_MAJOR@ +#define GWCA_VERSION_MINOR @GWCA_VERSION_MINOR@ +#define GWCA_VERSION_PATCH @GWCA_VERSION_PATCH@ +#define GWCA_VERSION_BUILD @GWCA_VERSION_BUILD@ +#define GWCA_VERSION "@GWCA_VERSION@" + +namespace GWCA { + constexpr int VersionMajor = GWCA_VERSION_MAJOR; + constexpr int VersionMinor = GWCA_VERSION_MINOR; + constexpr int VersionPatch = GWCA_VERSION_PATCH; + constexpr int VersionBuild = GWCA_VERSION_BUILD; + constexpr const char* Version = GWCA_VERSION; +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/Array.h b/Dependencies/GWCA/Include/GWCA/GameContainers/Array.h new file mode 100644 index 00000000..a3bb9e66 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/Array.h @@ -0,0 +1,75 @@ +#pragma once + +#include <GWCA/Utilities/Debug.h> + +namespace GW { + + // Base Array class without m_param + template <typename T> + class BaseArray { + public: + typedef T* iterator; + typedef const T* const_iterator; + + iterator begin() { return m_buffer; } + const_iterator begin() const { return m_buffer; } + iterator end() { return m_buffer + m_size; } + const_iterator end() const { return m_buffer + m_size; } + + BaseArray() + : m_buffer(nullptr) + , m_capacity(0) + , m_size(0) + { + } + + BaseArray(const BaseArray&) = delete; + BaseArray& operator=(const BaseArray&) = delete; + + T& at(size_t index) { + GWCA_ASSERT(m_buffer && index < m_size); + return m_buffer[index]; + } + + const T& at(size_t index) const { + GWCA_ASSERT(m_buffer && index < m_size); + return m_buffer[index]; + } + + T& operator[](uint32_t index) { + return at(index); + } + + const T& operator[](uint32_t index) const { + return at(index); + } + + bool valid() const { return m_buffer != nullptr; } + void clear() { m_size = 0; } + + uint32_t size() const { return m_size; } + uint32_t capacity() const { return m_capacity; } + + public: + T* m_buffer; // +h0000 + uint32_t m_capacity; // +h0004 + uint32_t m_size; // +h0008 + }; // Size: 0x000C + + // Extended Array class with m_param + template <typename T> + class Array : public BaseArray<T> { + public: + Array() + : BaseArray<T>() + , m_param(0) + { + } + + Array(const Array&) = delete; + Array& operator=(const Array&) = delete; + + uint32_t m_param; // +h000C + }; // Size: 0x0010 + +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/GamePos.h b/Dependencies/GWCA/Include/GWCA/GameContainers/GamePos.h new file mode 100644 index 00000000..d657e88a --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/GamePos.h @@ -0,0 +1,272 @@ +#pragma once +#include "../Utilities/Export.h" + +namespace GW { + typedef struct Mat4x3f { + float _11; + float _12; + float _13; + float _14; + float _21; + float _22; + float _23; + float _24; + float _31; + float _32; + float _33; + float _34; + uint32_t flags; + } Mat4x3f; + + struct Vec2f { + float x = 0.f; + float y = 0.f; + + constexpr Vec2f(float _x, float _y) + : x(_x), y(_y) + { + } + + constexpr Vec2f(int _x, int _y) + { + x = static_cast<float>(_x); + y = static_cast<float>(_y); + } + + Vec2f() = default; + }; + + struct Vec3f { + float x = 0.f; + float y = 0.f; + float z = 0.f; + + constexpr Vec3f(float _x, float _y, float _z = 0.f) + : x(_x), y(_y), z(_z) + { + } + + constexpr Vec3f(GW::Vec2f v, float _z = 0.f) + : x(v.x), y(v.y), z(_z) + { + } + + constexpr Vec3f(int _x, int _y, int _z) + { + x = static_cast<float>(_x); + y = static_cast<float>(_y); + z = static_cast<float>(_z); + } + + Vec3f() = default; + }; + + constexpr Vec3f& operator+=(Vec3f& lhs, const Vec3f& rhs) { + lhs.x += rhs.x; + lhs.y += rhs.y; + lhs.z += rhs.z; + return lhs; + } + + constexpr Vec3f operator+(Vec3f lhs, const Vec3f& rhs) { + lhs += rhs; + return lhs; + } + + constexpr Vec3f& operator-=(Vec3f& lhs, const Vec3f& rhs) { + lhs.x -= rhs.x; + lhs.y -= rhs.y; + lhs.z -= rhs.z; + return lhs; + } + + constexpr Vec3f operator-(Vec3f lhs, const Vec3f& rhs) { + lhs -= rhs; + return lhs; + } + + constexpr Vec3f operator-(const Vec3f& v) { + return {-v.x, -v.y, -v.z}; + } + + constexpr Vec3f& operator*=(Vec3f& lhs, float rhs) { + lhs.x *= rhs; + lhs.y *= rhs; + lhs.z *= rhs; + return lhs; + } + + constexpr Vec3f operator*(Vec3f lhs, float rhs) { + lhs *= rhs; + return lhs; + } + + constexpr Vec3f operator*(float lhs, Vec3f rhs) { + rhs *= lhs; + return rhs; + } + + constexpr Vec3f& operator/=(Vec3f& lhs, float rhs) { + lhs.x /= rhs; + lhs.y /= rhs; + lhs.z /= rhs; + return lhs; + } + + constexpr Vec3f operator/(Vec3f lhs, float rhs) { + lhs /= rhs; + return lhs; + } + + constexpr Vec3f operator/(float lhs, Vec3f rhs) { + rhs *= lhs; + return rhs; + } + + constexpr bool operator==(const Vec3f& lhs, const Vec3f& rhs) { + return (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.z == rhs.z); + } + + constexpr Vec2f& operator+=(Vec2f& lhs, Vec2f rhs) + { + lhs.x += rhs.x; + lhs.y += rhs.y; + return lhs; + } + + constexpr Vec2f operator+(Vec2f lhs, Vec2f rhs) { + lhs += rhs; + return lhs; + } + + constexpr Vec2f& operator-=(Vec2f& lhs, Vec2f rhs) + { + lhs.x -= rhs.x; + lhs.y -= rhs.y; + return lhs; + } + + constexpr Vec2f operator-(Vec2f lhs, Vec2f rhs) { + lhs -= rhs; + return lhs; + } + + constexpr Vec2f operator-(Vec2f v) { + return {-v.x, -v.y}; + } + + constexpr Vec2f& operator*=(Vec2f& lhs, float rhs) { + lhs.x *= rhs; + lhs.y *= rhs; + return lhs; + } + + constexpr Vec2f operator*(Vec2f lhs, float rhs) { + lhs *= rhs; + return lhs; + } + + constexpr Vec2f operator*(float lhs, Vec2f rhs) { + rhs *= lhs; + return rhs; + } + + constexpr Vec2f& operator/=(Vec2f& lhs, float rhs) { + lhs.x /= rhs; + lhs.y /= rhs; + return lhs; + } + + constexpr Vec2f operator/(Vec2f lhs, float rhs) { + lhs /= rhs; + return lhs; + } + + constexpr Vec2f operator/(float lhs, Vec2f rhs) { + rhs *= lhs; + return rhs; + } + + constexpr bool operator==(Vec2f lhs, Vec2f rhs) { + return (lhs.x == rhs.x) && (lhs.y == rhs.y); + } + + constexpr float GetSquareDistance(const Vec3f& p1, const Vec3f& p2) { + float dx = p1.x - p2.x; + float dy = p1.y - p2.y; + float dz = p1.z - p2.z; + return dx * dx + dy * dy + dz * dz; + } + + constexpr float GetSquareDistance(const Vec2f& p1, const Vec2f& p2) { + float dx = p1.x - p2.x; + float dy = p1.y - p2.y; + return dx * dx + dy * dy; + } + + GWCA_API float GetDistance(Vec3f p1, Vec3f p2); + GWCA_API float GetDistance(const Vec2f& p1, const Vec2f& p2); + + constexpr float GetSquaredNorm(const Vec3f& p) { + return (p.x * p.x) + (p.y * p.y) + (p.z * p.z); + } + + constexpr float GetSquaredNorm(const Vec2f& p) { + return (p.x * p.x) + (p.y * p.y); + } + + GWCA_API float GetNorm(Vec3f p); + GWCA_API float GetNorm(Vec2f p); + + inline Vec3f Normalize(Vec3f v) { + float n = GetNorm(v); + v.x /= n; + v.y /= n; + v.z /= n; + return v; + } + + inline Vec2f Normalize(Vec2f v) { + float n = GetNorm(v); + v.x /= n; + v.y /= n; + return v; + } + + constexpr Vec2f Rotate(Vec2f v, float cos, float sin) { + Vec2f res; + res.x = (v.x * cos) - (v.y * sin); + res.y = (v.x * sin) + (v.y * cos); + return res; + } + + Vec2f Rotate(Vec2f v, float rotation); + + struct GamePos { + float x; + float y; + uint32_t zplane; + + GamePos(float _x, float _y, uint32_t _zplane = 0) + : x(_x), y(_y), zplane(_zplane) + { + } + + GamePos() : GamePos(0.f, 0.f, 0) + { + } + + GamePos(Vec2f v) + : GamePos(v.x, v.y, 0) + { + } + + operator Vec2f() const { + return Vec2f(x, y); + } + }; + + constexpr bool operator==(const GamePos& lhs, const GamePos& rhs) { + return (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.zplane == rhs.zplane); + } +} diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/Hash.h b/Dependencies/GWCA/Include/GWCA/GameContainers/Hash.h new file mode 100644 index 00000000..abdaf9ec --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/Hash.h @@ -0,0 +1,34 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +#include <GWCA/GameContainers/List.h> +#include <GWCA/GameContainers/Array.h> + +namespace GW { + GWCA_API uint32_t Hash(const void *data, size_t size); + GWCA_API uint32_t Hash8(uint8_t data); + GWCA_API uint32_t Hash16(uint16_t data); + GWCA_API uint32_t Hash32(uint32_t data); + GWCA_API uint32_t HashWString(const wchar_t* str, uint32_t maxLength = -1); + + template <typename T> + struct THash { + /* +h0000 */ TList<T> m_fullList; + /* +h0008 */ uint32_t m_slotSize; + /* +h000C */ Array<TList<T>> m_slotListArray; + /* +h001C */ uint32_t m_mask; + /* +h0020 */ uint32_t m_maxCount; + }; + + template <typename T> + struct THashLink + { + /* +h0000 */ uint32_t hash; + /* +h0004 */ T *elem; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t h000C; + /* +h0010 */ TLink<T> m_fullListLink; + /* +h0018 */ TLink<T> m_slotListLink; + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/List.h b/Dependencies/GWCA/Include/GWCA/GameContainers/List.h new file mode 100644 index 00000000..fd56c92d --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/List.h @@ -0,0 +1,124 @@ +#pragma once + +namespace GW { + + template <typename T> + struct TLink { + bool IsLinked() const { return prev_link != this; } + + void Unlink() + { + RemoveFromList(); + + next_node = reinterpret_cast<T*>(reinterpret_cast<size_t>(this) + 1); + prev_link = this; + } + + T* Prev() + { + T* prevNode = prev_link->prev_link->next_node; + if (reinterpret_cast<size_t>(prevNode) & 1) + return nullptr; + return prevNode; + } + + T* Next() + { + if (reinterpret_cast<size_t>(next_node) & 1) + return nullptr; + return next_node; + } + + TLink* NextLink() + { + const size_t offset = reinterpret_cast<size_t>(this) - (reinterpret_cast<size_t>(prev_link->next_node) & ~1); + return reinterpret_cast<TLink*>((reinterpret_cast<size_t>(next_node) & ~1) + offset); + } + + TLink* PrevLink() { return prev_link; } + + protected: + TLink* prev_link; // +h0000 + T* next_node; // +h0004 + + void RemoveFromList() + { + NextLink()->prev_link = prev_link; + prev_link->next_node = next_node; + } + }; + + template <typename T> + struct TList { + class iterator { + public: + using difference_type = std::ptrdiff_t; + using value_type = T; + + iterator() + : current(nullptr) + , first(nullptr) + { + } + explicit iterator(TLink<T>* node, TLink<T>* first = nullptr) + : current(node) + , first(first) + { + } + + T& operator*() { return *current->Next(); } + T* operator->() { return current->Next(); } + T& operator*() const { return *current->Next(); } + T* operator->() const { return current->Next(); } + + iterator& operator++() + { + if (current->NextLink() == first && first != nullptr) + iteration++; + current = current->NextLink(); + return *this; + } + + iterator operator++(int) + { + iterator it(current); + ++*this; + return it; + } + + bool operator==(const iterator& other) const { return current == other.current && iteration == other.iteration; } + + bool operator!=(const iterator& other) const { return !(*this == other); } + + private: + TLink<T>* current; + TLink<T>* first; + int iteration = 0; + }; + + iterator begin() { return iterator(&link, &link); } + + iterator end() + { + TLink<T>* last = &link; + while (last->Next() != nullptr) { + if (last->NextLink() == &link) { + return ++iterator(last, &link); + } + last = last->NextLink(); + } + return iterator(last, &link); + } + + [[nodiscard]] iterator begin() const { return iterator(&link); } + [[nodiscard]] iterator end() const { return end(); } + + TLink<T>* Get() { return &link; } + + protected: + size_t offset{}; + TLink<T> link; + }; + + static_assert(sizeof(TList<void*>) == 0xc); +} diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/ObjectPool.h b/Dependencies/GWCA/Include/GWCA/GameContainers/ObjectPool.h new file mode 100644 index 00000000..871a10c0 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/ObjectPool.h @@ -0,0 +1,22 @@ +#pragma once + +namespace GW { + struct ObjectPoolBlock { + /* +h0000 */ ObjectPoolBlock* next; + /* +h0004 */ uint32_t h0004; + }; + static_assert(sizeof(ObjectPoolBlock) == 0x8, "struct ObjectPoolBlock has incorrect size"); + + struct ObjectPool { + /* +h0000 */ void** freeList; // This is a singly linked list of free object. The last object freed is always the pointer. + /* +h0004 */ ObjectPoolBlock* blocks; // This is a singly linked list of blocks that were allocated. Every blocks will generally be for many elements. + /* +h0008 */ uint32_t count; + }; + static_assert(sizeof(ObjectPool) == 0xC, "struct ObjectPool has incorrect size"); +} + +// The functions used to allocate looks like: +// void *__thiscall ObjectPool::Alloc(ObjectPool *pool, int32_t typesize, const char *typename); +// So, the typename & typesize are passed at every allocs, similar to `MemAlloc`. +// It's worth nothing that the minimum typesize is 4, though Guild Wars doesn't assert it, it just +// ends up crashing. This is due to the freeList pointer lists that are 4 bytes each. diff --git a/Dependencies/GWCA/Include/GWCA/GameContainers/PrioQ.h b/Dependencies/GWCA/Include/GWCA/GameContainers/PrioQ.h new file mode 100644 index 00000000..97522475 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameContainers/PrioQ.h @@ -0,0 +1,20 @@ +#pragma once + +namespace GW { + template <typename T> + struct PrioQ { + /* +h0000 */ uint32_t m_LinkOffset; + /* +h0004 */ Array<T> m_Nodes; + }; + static_assert(sizeof(PrioQ<int*>) == 0x14, "struct PrioQ has incorrect size"); + + template <typename T> + struct PrioQLink { + /* +h0000*/ + /* +h0000*/ void* vtable; + /* +h0004*/ PrioQ<T>* pq; + /* +h0008*/ uint32_t posIndex; + /* +h000C*/ float rank; // This is value used to order the PrioQ nodes. For a min-heap (e.g., A*), it put rank as -rank. + }; + static_assert(sizeof(PrioQLink<int*>) == 0x10, "struct PrioQLink has incorrect size"); +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Agent.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Agent.h new file mode 100644 index 00000000..00b930f2 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Agent.h @@ -0,0 +1,428 @@ +#pragma once + +#include <GWCA/GameContainers/List.h> +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameContainers/GamePos.h> +#include <GWCA/Constants/Constants.h> + +#include <GWCA/GameEntities/Item.h> + +namespace GW { + typedef uint32_t AgentID; + typedef uint32_t PlayerNumber; + typedef uint32_t ItemID; + + namespace Constants { + enum class Allegiance : uint8_t; + } + + struct Vec3f; + struct GamePos; + + struct VisibleEffect { + uint32_t unk; //enchantment = 1, weapon spell = 9 + Constants::EffectID id; + uint32_t has_ended; //effect no longer active, effect ending animation plays. + }; + + typedef TList<VisibleEffect> VisibleEffectList; + + struct NPCEquipment; + struct EquipmentVTable { + void(__fastcall* Destroy)(NPCEquipment* this_ptr); + void(__fastcall* GetItemClassFlags)(NPCEquipment* this_ptr, uint32_t edx, uint32_t slot); + void(__fastcall* EquipItem)(NPCEquipment* this_ptr, uint32_t edx, uint32_t slot); + void(__fastcall* LoadModelMaybe)(NPCEquipment* this_ptr, uint32_t edx, uint32_t slot); + void(__fastcall* RemoveItem)(NPCEquipment* this_ptr, uint32_t edx, uint32_t slot); + void(__fastcall* RefreshModelMaybe)(NPCEquipment* this_ptr); + bool(__fastcall* ModelRelatedBooleanCheck)(NPCEquipment* this_ptr); + uint32_t(__fastcall* GetType)(NPCEquipment* this_ptr); + }; + // Courtesy of DerMonech14 + struct NPCEquipment { + /* +h0000 */ EquipmentVTable* vtable; + /* +h0004 */ uint32_t h0004; // always 2 ? + /* +h0008 */ void* model_handle; // Ptr PlayerModelFile? + /* +h000C */ uint32_t h000C; // + /* +h0010 */ ItemData* left_hand_ptr; // Ptr Bow, Hammer, Focus, Daggers, Scythe + /* +h0014 */ ItemData* right_hand_ptr; // Ptr Sword, Spear, Staff, Daggers, Axe, Zepter, Bundle + /* +h0018 */ uint32_t h0018; // + /* +h001C */ ItemData* shield_ptr; // Ptr Shield + /* +h0020 */ uint8_t left_hand_map; // Weapon1 None = 9, Bow = 0, Hammer = 0, Focus = 1, Daggers = 0, Scythe = 0 + /* +h0021 */ uint8_t right_hand_map; // Weapon2 None = 9, Sword = 0, Spear = 0, Staff = 0, Daggers = 0, Axe = 0, Zepter = 0, Bundle + /* +h0022 */ uint8_t head_map; // Head None = 9, Headpiece Ele = 4 + /* +h0023 */ uint8_t shield_map; // Shield None = 9, Shield = 1 + union { + /* +h0024 */ ItemData items[9]; + struct { + /* +h0024 */ ItemData weapon; + /* +h0034 */ ItemData offhand; + /* +h0044 */ ItemData chest; + /* +h0054 */ ItemData legs; + /* +h0064 */ ItemData head; + /* +h0074 */ ItemData feet; + /* +h0084 */ ItemData hands; + /* +h0094 */ ItemData costume_body; + /* +h00A4 */ ItemData costume_head; + }; + }; + union { + /* +h00B4 */ ItemID item_ids[9]; + struct { + /* +h00B4 */ ItemID item_id_weapon; + /* +h00B8 */ ItemID item_id_offhand; + /* +h00BC */ ItemID item_id_chest; + /* +h00C0 */ ItemID item_id_legs; + /* +h00C4 */ ItemID item_id_head; + /* +h00C8 */ ItemID item_id_feet; + /* +h00CC */ ItemID item_id_hands; + /* +h00D0 */ ItemID item_id_costume_body; + /* +h00D4 */ ItemID item_id_costume_head; + }; + }; + /* +h00D8 */ uint32_t h00D8[0x7]; // Padding (28 bytes = 7 uint32_t) + /* +h00F4 */ uint8_t h00F4[5]; // Padding (5 bytes) + /* +h00F9 */ uint8_t weapon_item_type; // Weapon item type for stance/animation + /* +h00FA */ uint16_t weapon_item_id; // Weapon item id for stance/animation + /* +h00FC */ uint8_t h00FC[0xD]; // Padding (13 bytes) + /* +h0109 */ uint8_t offhand_item_type; // Offhand item type for stance/animation + /* +h010A */ uint16_t offhand_item_id; // Offhand item id for stance/animation + + inline uint32_t GetType() { + return vtable->GetType(this); + } + inline bool RedrawEquipmentSlot(uint32_t slot) { + if (!(slot < _countof(items) && items[slot].model_file_id)) + return false; + return vtable->EquipItem(this, 0, slot), true; + } + inline bool UndrawEquipmentSlot(uint32_t slot) { + if (!(slot < _countof(items) && items[slot].model_file_id)) + return false; + return vtable->RemoveItem(this, 0, slot), true; + } + }; + static_assert(sizeof(NPCEquipment) == 0x10C); + + struct PlayerEquipment : NPCEquipment { + /* +h010C */ uint32_t h010C; // From constructor param_3 + /* +h0110 */ uint32_t h0110[0xB2]; // Padding (178 uint32_t = 0x2C8 bytes) + /* +h03D8 */ uint32_t equipment_flags; // Equipment redraw flags (0xFFFFFFFF = needs draw, 0x00000000 = fully drawn) + /* +h03DC */ uint32_t h03DC; // Initialized to 0 + /* +h03E0 */ uint32_t visibility_flags; // Equipment visibility flags (0xFFFFFFFF initial) + /* +h03E4 */ uint32_t h03E4; // param_1 from constructor + /* +h03E8 */ uint32_t h03E8[4]; // Padding to reach 0x3F8 (16 bytes) + + // Check if any equipment is waiting for redraw (any bits set) + inline bool PendingRedraw() { + return equipment_flags != 0; + } + + // Check if equipment needs initial draw (all bits set) + inline bool PendingFirstDraw() { + return equipment_flags == 0xFFFFFFFF; + } + + // Check if equipment is fully drawn (all bits cleared) + inline bool IsFullyDrawn() { + return equipment_flags == 0; + } + }; + static_assert(sizeof(PlayerEquipment) == 0x3F8); + + + struct TagInfo { + /* +h0000 */ uint16_t guild_id; + /* +h0002 */ uint8_t primary; + /* +h0003 */ uint8_t secondary; + /* +h0004 */ uint16_t level; + // ... + }; + + struct AgentItem; + struct AgentGadget; + struct AgentLiving; + + struct Agent { + /* +h0000 */ uint32_t* vtable; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t h000C[2]; + /* +h0014 */ uint32_t timer; // Agent Instance Timer (in Frames) + /* +h0018 */ uint32_t timer2; + /* +h001C */ TLink<Agent> link; + /* +h0024 */ TLink<Agent> link2; + /* +h002C */ AgentID agent_id; + /* +h0030 */ float z; // Z coord in float + /* +h0034 */ float width1; // Width of the model's box + /* +h0038 */ float height1; // Height of the model's box + /* +h003C */ float width2; // Width of the model's box (same as 1) + /* +h0040 */ float height2; // Height of the model's box (same as 1) + /* +h0044 */ float width3; // Width of the model's box (usually same as 1) + /* +h0048 */ float height3; // Height of the model's box (usually same as 1) + /* +h004C */ float rotation_angle; // Rotation in radians from East (-pi to pi) + /* +h0050 */ float rotation_cos; // cosine of rotation + /* +h0054 */ float rotation_sin; // sine of rotation + /* +h0058 */ uint32_t name_properties; // Bitmap basically telling what the agent is + /* +h005C */ uint32_t ground; + /* +h0060 */ uint32_t h0060; + /* +h0064 */ Vec3f terrain_normal; + /* +h0070 */ uint8_t h0070[4]; + union { + struct { + /* +h0074 */ float x; + /* +h0078 */ float y; + /* +h007C */ uint32_t plane; + }; + /* +h0074 */ GamePos pos; + }; + /* +h0080 */ uint8_t h0080[4]; + /* +h0084 */ float name_tag_x; // Exactly the same as X above + /* +h0088 */ float name_tag_y; // Exactly the same as Y above + /* +h008C */ float name_tag_z; // Z coord in float + /* +h0090 */ uint16_t visual_effects; // Number of Visual Effects of Agent (Skills, Weapons); 1 = Always set; + /* +h0092 */ uint16_t h0092; + /* +h0094 */ uint32_t h0094[2]; + /* +h009C */ uint32_t type; // Livings = 0xDB, Gadgets = 0x200, Items = 0x400. + union { + struct { + /* +h00A0 */ float move_x; //If moving, how much on the X axis per second + /* +h00A4 */ float move_y; //If moving, how much on the Y axis per second + }; + /* +h00A0 */ Vec2f velocity; + }; + /* +h00A8 */ uint32_t h00A8; // always 0? + /* +h00AC */ float rotation_cos2; // same as cosine above + /* +h00B0 */ float rotation_sin2; // same as sine above + /* +h00B4 */ uint32_t h00B4[4]; + + // Agent Type Bitmasks. + inline bool GetIsItemType() const { return (type & 0x400) != 0; } + inline bool GetIsGadgetType() const { return (type & 0x200) != 0; } + inline bool GetIsLivingType() const { return (type & 0xDB) != 0; } + + inline AgentItem* GetAsAgentItem(); + inline AgentGadget* GetAsAgentGadget(); + inline AgentLiving* GetAsAgentLiving(); + + inline const AgentItem* GetAsAgentItem() const; + inline const AgentGadget* GetAsAgentGadget() const; + inline const AgentLiving* GetAsAgentLiving() const; + }; + + struct AgentItem : public Agent { // total: 0xD4/212 + /* +h00C4 */ AgentID owner; + /* +h00C8 */ ItemID item_id; + /* +h00CC */ uint32_t h00CC; + /* +h00D0 */ uint32_t extra_type; + }; + static_assert(sizeof(AgentItem) == 212, "struct AgentItem has incorrect size"); + static_assert(offsetof(AgentItem, owner) == 0xC4, "struct AgentItem offsets are incorrect"); + + struct AgentGadget : public Agent { // total: 0xE4/228 + /* +h00C4 */ uint32_t h00C4; + /* +h00C8 */ uint32_t h00C8; + /* +h00CC */ uint32_t extra_type; + /* +h00D0 */ uint32_t gadget_id; + /* +h00D4 */ uint32_t h00D4[4]; + }; + static_assert(sizeof(AgentGadget) == 228, "struct AgentGadget has incorrect size"); + static_assert(offsetof(AgentGadget, h00C4) == 0xC4, "struct AgentGadget offsets are incorrect"); + + struct AgentLiving : public Agent { // total: 0x1C4/452 + /* +h00C4 */ AgentID owner; + /* +h00C8 */ uint32_t h00C8; + /* +h00CC */ uint32_t h00CC; + /* +h00D0 */ uint32_t h00D0; + /* +h00D4 */ uint32_t h00D4[3]; + /* +h00E0 */ float animation_type; + /* +h00E4 */ uint32_t h00E4[2]; + /* +h00EC */ float weapon_attack_speed; // The base attack speed in float of last attacks weapon. 1.33 = axe, sWORD, daggers etc. + /* +h00F0 */ float attack_speed_modifier; // Attack speed modifier of the last attack. 0.67 = 33% increase (1-.33) + // NB: h00F4 is actually a composite uint32_t that the game uses to EITHER get the player model info or npc model info + /* +h00F4 */ uint16_t player_number; // Selfexplanatory. All non-players have identifiers for their type. Two of the same mob = same number + /* +h00F6 */ uint16_t agent_model_type; // Player = 0x3000, NPC = 0x2000 + /* +h00F8 */ uint32_t transmog_npc_id; // Actually, it's 0x20000000 | npc_id, It's not defined for npc, minipet, etc... + /* +h00FC */ NPCEquipment** equip; + /* +h0100 */ uint32_t h0100; + /* +h0104 */ uint32_t h0104; // New variable added here + /* +h0108 */ TagInfo* tags; // struct { uint16_t guild_id, uint8_t primary, uint8_t secondary, uint16_t level + /* +h010C */ uint16_t h010C; + /* +h010E */ uint8_t primary; // Primary profession 0-10 (None,W,R,Mo,N,Me,E,A,Rt,P,D) + /* +h010F */ uint8_t secondary; // Secondary profession 0-10 (None,W,R,Mo,N,Me,E,A,Rt,P,D) + /* +h0110 */ uint8_t level; // Duh! + /* +h0111 */ uint8_t team_id; // 0=None, 1=Blue, 2=Red, 3=Yellow + /* +h0112 */ uint8_t h0112[2]; + /* +h0114 */ uint32_t h0114; + /* +h0118 */ float energy_regen; + /* +h011C */ uint32_t h011C; + /* +h0120 */ float energy; // Only works for yourself + /* +h0124 */ uint32_t max_energy; // Only works for yourself + /* +h0128 */ uint32_t h0128; + /* +h012C */ float hp_pips; // Regen/degen as float + /* +h0130 */ uint32_t h0130; + /* +h0134 */ float hp; // Health in % where 1=100% and 0=0% + /* +h0138 */ uint32_t max_hp; // Only works for yourself + /* +h013C */ uint32_t effects; // Bitmap for effects to display when targetted. DOES include hexes + /* +h0140 */ uint32_t h0140; + /* +h0144 */ uint8_t hex; // Bitmap for the hex effect when targetted (apparently obsolete!) (yes) + /* +h0145 */ uint8_t h0145[19]; + /* +h0158 */ uint32_t model_state; // Different values for different states of the model. + /* +h015C */ uint32_t type_map; // Odd variable! 0x08 = dead, 0xC00 = boss, 0x40000 = spirit, 0x400000 = player + /* +h0160 */ uint32_t h0160[4]; + /* +h0170 */ uint32_t in_spirit_range; // Tells if agent is within spirit range of you. Doesn't work anymore? + /* +h0174 */ VisibleEffectList visible_effects; + /* +h0180 */ uint32_t h0180; + /* +h0184 */ uint32_t login_number; // Unique number in instance that only works for players + /* +h0188 */ float animation_speed; // Speed of the current animation + /* +h018C */ uint32_t animation_code; // related to animations + /* +h0190 */ uint32_t animation_id; // Id of the current animation + /* +h0194 */ uint8_t h0194[32]; + /* +h01B4 */ uint8_t dagger_status; // 0x1 = used lead attack, 0x2 = used offhand attack, 0x3 = used dual attack + /* +h01B5 */ Constants::Allegiance allegiance; // 0x1 = ally/non-attackable, 0x2 = neutral, 0x3 = enemy, 0x4 = spirit/pet, 0x5 = minion, 0x6 = npc/minipet + /* +h01B6 */ uint16_t weapon_type; // 1=bow, 2=axe, 3=hammer, 4=daggers, 5=scythe, 6=spear, 7=sWORD, 10=wand, 12=staff, 14=staff + /* +h01B8 */ uint16_t skill; // 0 = not using a skill. Anything else is the Id of that skill + /* +h01BA */ uint16_t h01BA; + /* +h01BC */ uint8_t weapon_item_type; + /* +h01BD */ uint8_t offhand_item_type; + /* +h01BE */ uint16_t weapon_item_id; + /* +h01C0 */ uint16_t offhand_item_id; + + // Health Bar Effect Bitmasks. + inline bool GetIsBleeding() const { return (effects & 0x0001) != 0; } + inline bool GetIsConditioned() const { return (effects & 0x0002) != 0; } + inline bool GetIsUsedCorpse() const { return (effects & 0x0004) != 0; } + inline bool GetIsCrippled() const { return (effects & 0x000A) == 0xA; } + inline bool GetIsDead() const { return (effects & 0x0010) != 0; } + inline bool GetIsDeepWounded() const { return (effects & 0x0020) != 0; } + inline bool GetIsPoisoned() const { return (effects & 0x0040) != 0; } + inline bool GetIsEnchanted() const { return (effects & 0x0080) != 0; } + inline bool GetIsDegenHexed() const { return (effects & 0x0400) != 0; } + inline bool GetIsHexed() const { return (effects & 0x0800) != 0; } + inline bool GetIsWeaponSpelled() const { return (effects & 0x8000) != 0; } + + // Agent TypeMap Bitmasks. + inline bool GetInCombatStance() const { return (type_map & 0x000001) != 0; } + inline bool GetHasQuest() const { return (type_map & 0x000002) != 0; } // if agent has quest marker + inline bool GetIsDeadByTypeMap() const { return (type_map & 0x000008) != 0; } + inline bool GetIsFemale() const { return (type_map & 0x000200) != 0; } + inline bool GetHasBossGlow() const { return (type_map & 0x000400) != 0; } + inline bool GetIsHidingCape() const { return (type_map & 0x001000) != 0; } + inline bool GetCanBeViewedInPartyWindow() const { return (type_map & 0x20000) != 0; } + inline bool GetIsSpawned() const { return (type_map & 0x040000) != 0; } + inline bool GetIsBeingObserved() const { return (type_map & 0x400000) != 0; } + + // Modelstates. + inline bool GetIsKnockedDown() const { return model_state == 1104; } + inline bool GetIsMoving() const { return model_state == 12 || model_state == 76 || model_state == 204; } + inline bool GetIsAttacking() const { return model_state == 96 || model_state == 1088 || model_state == 1120; } + inline bool GetIsCasting() const { return model_state == 65 || model_state == 581; } + inline bool GetIsIdle() const { return model_state == 68 || model_state == 64 || model_state == 100; } + + // Composite bool, sometimes agents can be dead but have hp (e.g. packets are received in wrong order) + inline bool GetIsAlive() const { return !GetIsDead() && hp > .0f; } + + inline bool IsPlayer() const { return login_number != 0; } + inline bool IsNPC() const { return login_number == 0; } + }; + static_assert(sizeof(AgentLiving) == 0x1C4, "struct AgentLiving has incorrect size"); + static_assert(offsetof(AgentLiving, owner) == 0xC4, "struct AgentLiving offsets are incorrect"); + + AgentItem* Agent::GetAsAgentItem() { + if (GetIsItemType()) + return static_cast<AgentItem*>(this); + else + return nullptr; + } + + AgentGadget* Agent::GetAsAgentGadget() { + if (GetIsGadgetType()) + return static_cast<AgentGadget*>(this); + else + return nullptr; + } + + AgentLiving* Agent::GetAsAgentLiving() { + if (GetIsLivingType()) + return static_cast<AgentLiving*>(this); + else + return nullptr; + } + + const AgentItem* Agent::GetAsAgentItem() const { + if (GetIsItemType()) + return static_cast<const AgentItem*>(this); + else + return nullptr; + } + + const AgentGadget* Agent::GetAsAgentGadget() const { + if (GetIsGadgetType()) + return static_cast<const AgentGadget*>(this); + else + return nullptr; + } + + const AgentLiving* Agent::GetAsAgentLiving() const { + if (GetIsLivingType()) + return static_cast<const AgentLiving*>(this); + else + return nullptr; + } + + struct MapAgent { + /* +h0000 */ float cur_energy; + /* +h0004 */ float max_energy; + /* +h0008 */ float energy_regen; + /* +h000C */ uint32_t skill_timestamp; + /* +h0010 */ float h0010; + /* +h0014 */ float max_energy2; + /* +h0018 */ float h0018; + /* +h001C */ uint32_t h001C; + /* +h0020 */ float cur_health; + /* +h0024 */ float max_health; + /* +h0028 */ float health_regen; + /* +h002C */ uint32_t h002C; + /* +h0030 */ uint32_t effects; + + // Health Bar Effect Bitmasks. + inline bool GetIsBleeding() const { return (effects & 0x0001) != 0; } + inline bool GetIsConditioned() const { return (effects & 0x0002) != 0; } + inline bool GetIsCrippled() const { return (effects & 0x000A) == 0xA; } + inline bool GetIsDead() const { return (effects & 0x0010) != 0; } + inline bool GetIsDeepWounded() const { return (effects & 0x0020) != 0; } + inline bool GetIsPoisoned() const { return (effects & 0x0040) != 0; } + inline bool GetIsEnchanted() const { return (effects & 0x0080) != 0; } + inline bool GetIsDegenHexed() const { return (effects & 0x0400) != 0; } + inline bool GetIsHexed() const { return (effects & 0x0800) != 0; } + inline bool GetIsWeaponSpelled() const { return (effects & 0x8000) != 0; } + }; + + struct AgentMovement { + /* +h0000 */ uint32_t h0000[3]; + /* +h000C */ uint32_t agent_id; + /* +h0010 */ uint32_t h0010[3]; + /* +h001C */ uint32_t agentDef; // GW_AGENTDEF_CHAR = 1 + /* +h0020 */ uint32_t h0020[6]; + /* +h0038 */ uint32_t moving1; //tells if you are stuck even if your client doesn't know + /* +h003C */ uint32_t h003C[2]; + /* +h0044 */ uint32_t moving2; //exactly same as Moving1 + /* +h0048 */ uint32_t h0048[7]; + /* +h0064 */ Vec3f h0064; + /* +h0070 */ uint32_t h0070; + /* +h0074 */ Vec3f h0074; + }; + + struct AgentInfo { + uint32_t h0000[13]; + wchar_t *name_enc; + }; + static_assert(sizeof(AgentInfo) == 0x38, "struct AgentInfo has incorrect size"); + + typedef TList<Agent> AgentList; + typedef Array<Agent *> AgentArray; + + typedef Array<MapAgent> MapAgentArray; + typedef Array<AgentInfo> AgentInfoArray; + typedef Array<AgentMovement *> AgentMovementArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Attribute.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Attribute.h new file mode 100644 index 00000000..7fcc5932 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Attribute.h @@ -0,0 +1,36 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + namespace Constants { + enum class Attribute : uint32_t; + enum class Profession : uint32_t; + } + + struct Attribute { // total: 0x14/20 + /* +h0000 */ Constants::Attribute id; // ID of attribute + /* +h0004 */ uint32_t level_base; // Level of attribute without modifiers (runes,pcons,etc) + /* +h0008 */ uint32_t level; // Level with modifiers + /* +h000C */ uint32_t decrement_points; // Points that you will receive back if you decrement level. + /* +h0010 */ uint32_t increment_points; // Points you will need to increment level. + }; + + struct AttributeInfo { + Constants::Profession profession_id; + Constants::Attribute attribute_id; + uint32_t name_id; + uint32_t desc_id; + uint32_t is_pve; + }; + static_assert(sizeof(AttributeInfo) == 0x14); + + + struct PartyAttribute { + uint32_t agent_id; + Attribute attribute[54]; + }; + static_assert(sizeof(PartyAttribute) == 0x43c); + + typedef Array<PartyAttribute> PartyAttributeArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Camera.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Camera.h new file mode 100644 index 00000000..f6941909 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Camera.h @@ -0,0 +1,113 @@ +#pragma once + +#include <GWCA/GameContainers/GamePos.h> + +namespace GW { + struct Camera { + /* +h0000 */ uint32_t look_at_agent_id; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ float h0008; + /* +h000C */ float h000C; + /* +h0010 */ float max_distance; + /* +h0014 */ float h0014; + /* +h0018 */ float yaw; // left/right camera angle, radians w/ origin @ east + /* +h001C */ float pitch; // up/down camera angle, range of [-1,1] + /* +h0020 */ float distance; // current distance from players head. + /* +h0024 */ uint32_t h0024[4]; + /* +h0034 */ float yaw_right_click; + /* +h0038 */ float yaw_right_click2; + /* +h003C */ float pitch_right_click; + /* +h0040 */ float distance2; + /* +h0044 */ float acceleration_constant; + /* +h0048 */ float time_since_last_keyboard_rotation; // In seconds it seems. + /* +h004C */ float time_since_last_mouse_rotation; + /* +h0050 */ float time_since_last_mouse_move; + /* +h0054 */ float time_since_last_agent_selection; + /* +h0058 */ float time_in_the_map; + /* +h005C */ float time_in_the_district; + /* +h0060 */ float yaw_to_go; + /* +h0064 */ float pitch_to_go; + /* +h0068 */ float dist_to_go; + /* +h006C */ float max_distance2; + /* +h0070 */ float h0070[2]; + /* +h0078 */ Vec3f position; + /* +h0084 */ Vec3f camera_pos_to_go; + /* +h0090 */ Vec3f cam_pos_inverted; + /* +h009C */ Vec3f cam_pos_inverted_to_go; + /* +h00A8 */ Vec3f look_at_target; + /* +h00B4 */ Vec3f look_at_to_go; + /* +h00C0 */ float field_of_view; + /* +h00C4 */ float field_of_view2; + /* +h00C8 */ uint32_t h00C8; + /* +h00CC */ uint32_t h00CC; + /* +h00D0 */ uint32_t h00D0; + /* +h00D4 */ uint32_t h00D4; + /* +h00D8 */ uint32_t h00D8; // Camera controller/mode handler pointer + /* +h00DC */ uint32_t h00DC; + /* +h00E0 */ uint32_t h00E0; + /* +h00E4 */ uint32_t h00E4; + /* +h00E8 */ uint32_t h00E8; + /* +h00EC */ uint32_t h00EC; + /* +h00F0 */ uint32_t h00F0; + /* +h00F4 */ uint32_t h00F4; + /* +h00F8 */ uint32_t h00F8; + /* +h00FC */ uint32_t h00FC; + /* +h0100 */ uint32_t h0100; + /* +h0104 */ uint32_t h0104; + /* +h0108 */ uint32_t h0108; + /* +h010C */ uint32_t h010C; + /* +h0110 */ uint32_t h0110; + /* +h0114 */ uint32_t h0114; + /* +h0118 */ uint32_t h0118; + /* +h011C */ uint32_t camera_mode; // 0=default, 1=?, 2=follow, 3=unlocked, 4=?, 5=?, 6=?, 7=?, 8=?, 9=? + // ... + + float GetYaw() const { return yaw; } + float GetPitch() const { return pitch; } + + /// \brief This is not the FoV that GW uses to render + /// see GW::Render::GetFieldOfView() + float GetFieldOfView() const { return field_of_view; } + + bool IsCameraUnlocked() const { return camera_mode == 3; } + + void SetYaw(float _yaw) { + yaw_to_go = _yaw; + yaw = _yaw; + } + float GetCurrentYaw() const + { + const Vec3f dir = position - look_at_target; + const float curtan = atan2(dir.y, dir.x); + constexpr float pi = 3.141592741f; + float curyaw; + if (curtan >= 0) { + curyaw = curtan - pi; + } + else { + curyaw = curtan + pi; + } + return curyaw; + } + + void SetPitch(float _pitch) { + pitch_to_go = _pitch; + } + + float GetCameraZoom() const { return distance; } + Vec3f GetLookAtTarget() const { return look_at_target; } + Vec3f GetCameraPosition() const { return position; } + + void SetCameraPos(Vec3f newPos) { + this->position.x = newPos.x; + this->position.y = newPos.y; + this->position.z = newPos.z; + } + + void SetLookAtTarget(Vec3f newPos) { + this->look_at_target.x = newPos.x; + this->look_at_target.y = newPos.y; + this->look_at_target.z = newPos.z; + } + }; +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Frame.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Frame.h new file mode 100644 index 00000000..a2d50ba5 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Frame.h @@ -0,0 +1,161 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameContainers/List.h> +#include <GWCA/GameContainers/GamePos.h> + +#include <GWCA/Managers/UIMgr.h> +#include <map> + +namespace GW { + struct Module; + extern Module FrameModule; + + namespace UI { + struct Frame; + GWCA_API bool SetFrameMargins(GW::UI::Frame* frame, uint32_t flags, float size[4], float input_mask[4], uint32_t type); + } + + struct ButtonFrame : UI::Frame { + GWCA_API static ButtonFrame* Create(uint32_t parent_frame_id, uint32_t flags = 0x300, uint32_t child_offset_id = 0xff, const wchar_t* button_label = nullptr, const wchar_t* frame_label = nullptr); + GWCA_API bool GetLabel(const wchar_t** enc_string); + GWCA_API bool SetLabel(const wchar_t* enc_string); + GWCA_API bool Click(); + GWCA_API bool MouseAction(UI::UIPacket::ActionState action); + GWCA_API bool DoubleClick(); + }; + + struct TabsFrame : UI::Frame { + GWCA_API GW::UI::Frame* AddTab(const wchar_t* tab_name_enc, uint32_t flags, uint32_t child_offset_id, GW::UI::UIInteractionCallback callback, void* wparam = 0); + GWCA_API bool DisableTab(uint32_t tab_id); + GWCA_API bool EnableTab(uint32_t tab_id); + GWCA_API bool RemoveTab(uint32_t tab_id); + GWCA_API bool GetCurrentTabIndex(uint32_t* tab_id); + GWCA_API bool GetTabFrameId(uint32_t tab_id, uint32_t* frame_id); + GWCA_API bool GetIsTabEnabled(uint32_t tab_id, uint32_t* is_enabled); + GWCA_API GW::UI::Frame* GetTabByLabel(const wchar_t* label); + GWCA_API GW::UI::Frame* GetCurrentTab(); + GWCA_API bool ChooseTab(GW::UI::Frame* tab_frame); + GWCA_API bool ChooseTab(uint32_t tab_index); + GWCA_API GW::ButtonFrame* GetTabButton(GW::UI::Frame* tab_frame); + + }; + struct ScrollableFrame : UI::Frame { + // Sorting handler is actually a boolean function - return "1" if frame_id_1 needs to be bubbled higher than frame_id_2 + typedef int(__cdecl* SortHandler_pt)(uint32_t frame_id_1, uint32_t frame_id_2); + // Scrollable frame always has an "inner" page that handles the content. Only really need to mess with this if you're doing something odd. + struct ScrollablePageContext { + uint32_t flags; + GW::UI::UIInteractionCallback page_callback; + uint32_t wparam; + }; + + // Scrollable Frames always need a valid context, but pass nullptr to use the default one used for most of the scrollable frames in the game + GWCA_API static ScrollableFrame* Create(uint32_t parent_frame_id, uint32_t flags = 0x20000, uint32_t child_offset_id = 0xff, ScrollablePageContext* context = nullptr, const wchar_t* frame_label = nullptr); + + GWCA_API bool SetSortHandler(SortHandler_pt sortHandler); + GWCA_API SortHandler_pt GetSortHandler(); + GWCA_API bool ClearItems(); + GWCA_API bool RemoveItem(uint32_t child_offset_id); + GWCA_API bool AddItem(uint32_t flags, uint32_t child_offset_id, GW::UI::UIInteractionCallback callback); + GWCA_API uint32_t GetItemFrameId(uint32_t child_offset_id); + // Returns false if the request failed, or nothing is selected + GWCA_API bool GetSelectedValue(uint32_t* selected_value); + GWCA_API uint32_t GetFirstChildFrameId(uint32_t* _offset_of_child_out = nullptr); + GWCA_API uint32_t GetNextChildFrameId(uint32_t _frame_id, uint32_t* _offset_of_child_out = nullptr); + GWCA_API uint32_t GetLastChildFrameId(uint32_t* _offset_of_child_out = nullptr); + GWCA_API uint32_t GetPrevChildFrameId(uint32_t _frame_id, uint32_t* _offset_of_child_out = nullptr); + GWCA_API bool GetItemRect(uint32_t child_offset_id, float rect[4]); + // This is actually the child_frame_id of the last child in the list - things that use sorting, or the child id to identify the frame, will not represent the size. + GWCA_API bool GetCount(uint32_t* size); + GWCA_API uint32_t GetItems(uint32_t* child_frame_id_buffer = nullptr, uint32_t buffer_len = 0); + + GWCA_API GW::UI::Frame* GetPage(); + // Scrollable frame always has an "inner" page that handles the content. Only really need to mess with this if you're doing something odd. + GWCA_API GW::UI::Frame* SetPage(ScrollablePageContext*); + }; + + + struct FrameWithValue { + FrameWithValue() = default; + virtual ~FrameWithValue() = default; + FrameWithValue(const FrameWithValue&) = default; + FrameWithValue(FrameWithValue&&) = default; + FrameWithValue& operator=(const FrameWithValue&) = default; + FrameWithValue& operator=(FrameWithValue&&) = default; + + virtual uint32_t GetValue(); + virtual bool SetValue(uint32_t value); + }; + + struct EditableTextFrame : UI::Frame { + GWCA_API const wchar_t* GetValue(); + GWCA_API bool SetValue(const wchar_t* value); + GWCA_API bool SetMaxLength(uint32_t max_length); + GWCA_API bool IsReadOnly(); + GWCA_API bool SetReadOnly(bool readonly); + }; + + struct ProgressBar final : ButtonFrame, FrameWithValue { + GWCA_API uint32_t GetValue() override; + GWCA_API bool SetValue(uint32_t value) override; + GWCA_API bool SetMax(uint32_t value); + GWCA_API bool SetColorId(uint32_t color_id); + enum class ProgressBarStyle : uint32_t { + kPeach, + kPink, + kGrey, + kBlue, + kGreen, + kRed, + kPurple, + kOlive, + kUnk + }; + GWCA_API bool SetStyle(ProgressBarStyle style); + }; + + struct CheckboxFrame final : ButtonFrame, FrameWithValue { + GWCA_API static CheckboxFrame* Create(uint32_t parent_frame_id, uint32_t flags = 0x8000, uint32_t child_offset_id = 0xff, const wchar_t* text_label_enc_string = nullptr, const wchar_t* frame_label = nullptr); + GWCA_API bool IsChecked(); + GWCA_API bool SetChecked(bool checked); + + GWCA_API uint32_t GetValue() override; + GWCA_API bool SetValue(uint32_t value) override; + }; + struct DropdownFrame final : UI::Frame, FrameWithValue { + GWCA_API std::vector<uint32_t> GetOptions(); + GWCA_API bool SelectOption(uint32_t value); + GWCA_API bool SelectIndex(uint32_t index); + GWCA_API bool AddOption(const wchar_t* label_enc_string, uint32_t value); + GWCA_API bool GetCount(uint32_t* count); + GWCA_API bool GetOptionValue(uint32_t index, uint32_t* value); + GWCA_API bool GetOptionIndex(uint32_t value, uint32_t* index); + GWCA_API bool GetSelectedIndex(uint32_t* index); + // Some dropdowns are only used by reference to their index. Others actually have values assigned to their indeces. + GWCA_API bool HasValueMapping(); + + GWCA_API uint32_t GetValue() override; + GWCA_API bool SetValue(uint32_t value) override; + }; + struct SliderFrame final : UI::Frame, FrameWithValue { + GWCA_API bool GetValue(uint32_t* selected_value); + GWCA_API bool SetValue(uint32_t value) override; + + GWCA_API uint32_t GetValue() override; + }; + + struct TextLabelFrame : UI::Frame { + GWCA_API static TextLabelFrame* Create(uint32_t parent_frame_id, uint32_t flags = 0x300, uint32_t child_offset_id = 0xff, const wchar_t* text_label_enc_string = nullptr, const wchar_t* frame_label = nullptr); + GWCA_API const wchar_t* GetEncodedLabel(); + GWCA_API const wchar_t* GetDecodedLabel(); + GWCA_API bool SetLabel(const wchar_t* enc_string); + GWCA_API bool SetFont(uint32_t); + }; + struct MultiLineTextLabelFrame final : TextLabelFrame { + GWCA_API const wchar_t* GetEncodedLabel(); + GWCA_API const wchar_t* GetDecodedLabel(); + GWCA_API bool SetLabel(const wchar_t* enc_string); + }; + +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Friendslist.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Friendslist.h new file mode 100644 index 00000000..18968380 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Friendslist.h @@ -0,0 +1,44 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + enum class FriendType : uint32_t { + Unknow = 0, + Friend = 1, + Ignore = 2, + Player = 3, + Trade = 4, + }; + + enum class FriendStatus : uint32_t { + Offline = 0, + Online = 1, + DND = 2, + Away = 3, + Unknown = 4 + }; + + struct Friend { + /* +h0000 */ FriendType type; + /* +h0004 */ FriendStatus status; + /* +h0008 */ uint8_t uuid[16]; + /* +h0018 */ wchar_t alias[20]; + /* +h002C */ wchar_t charname[20]; + /* +h0040 */ uint32_t friend_id; + /* +h0044 */ uint32_t zone_id; + }; + + typedef Array<Friend *> FriendsListArray; + + struct FriendList { + /* +h0000 */ FriendsListArray friends; + /* +h0010 */ uint8_t h0010[20]; + /* +h0024 */ uint32_t number_of_friend; + /* +h0028 */ uint32_t number_of_ignore; + /* +h002C */ uint32_t number_of_partner; + /* +h0030 */ uint32_t number_of_trade; + /* +h0034 */ uint8_t h0034[108]; + /* +h00A0 */ FriendStatus player_status; + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Guild.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Guild.h new file mode 100644 index 00000000..d59d1605 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Guild.h @@ -0,0 +1,84 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + + namespace Constants { + enum class MapID : uint32_t; + } + struct GHKey { + uint32_t k[4]{}; + + explicit operator bool() const { + return std::ranges::any_of(k, [](uint32_t i) { return i != 0; }); + } + }; + struct GuildPlayer { // total: 0x174/372 + /* +h0000 */ void* vtable; + /* +h0004 */ wchar_t *name_ptr; // ptr to invitedname, why? dunno + /* +h0008 */ wchar_t invited_name[20]; // name of character that was invited in + /* +h0030 */ wchar_t current_name[20]; // name of character currently being played + /* +h0058 */ wchar_t inviter_name[20]; // name of character that invited player + /* +h0080 */ uint32_t invite_time; // time in ms from game creation ?? + /* +h0084 */ wchar_t promoter_name[20]; // name of player that last modified rank + /* +h00AC */ uint32_t h00AC[12]; + /* +h00DC */ uint32_t offline; + /* +h00E0 */ uint32_t member_type; + /* +h00E4 */ uint32_t status; + /* +h00E8 */ uint32_t h00E8[35]; + }; + static_assert(sizeof(GuildPlayer) == 372, "struct GuildPlayer has incorrect size"); + + typedef Array<GuildPlayer *> GuildRoster; + + struct GuildHistoryEvent { // total: 0x208/520 + /* +h0000 */ uint32_t time1; // Guessing one of these is time in ms + /* +h0004 */ uint32_t time2; + /* +h0008 */ wchar_t name[256]; // Name of added/kicked person, then the adder/kicker, they seem to be in the same array + }; + static_assert(sizeof(GuildHistoryEvent) == 520, "struct GuildHistoryEvent has incorrect size"); + + typedef Array<GuildHistoryEvent *> GuildHistory; + + struct CapeDesign { // total: 0x1C/28 + /* +h0000 */ uint32_t cape_bg_color; + /* +h0004 */ uint32_t cape_detail_color; + /* +h0008 */ uint32_t cape_emblem_color; + /* +h000C */ uint32_t cape_shape; + /* +h0010 */ uint32_t cape_detail; + /* +h0014 */ uint32_t cape_emblem; + /* +h0018 */ uint32_t cape_trim; + }; + static_assert(sizeof(CapeDesign) == 0x1c, "struct CapeDesign has incorrect size"); + + struct Guild { // total: 0xAC/172 + /* +h0000 */ GHKey key; + /* +h0010 */ uint32_t h0010[5]; + /* +h0024 */ uint32_t index; // Same as PlayerGuildIndex + /* +h0028 */ uint32_t rank; + /* +h002C */ uint32_t features; + /* +h0030 */ wchar_t name[32]; + /* +h0070 */ uint32_t rating; + /* +h0074 */ uint32_t faction; // 0=kurzick, 1=luxon + /* +h0078 */ uint32_t faction_point; + /* +h007C */ uint32_t qualifier_point; + /* +h0080 */ wchar_t tag[8]; + /* +h0090 */ CapeDesign cape; + }; + static_assert(sizeof(Guild) == 172, "struct Guild has incorrect size"); + + typedef Array<Guild *> GuildArray; + + struct TownAlliance { // total: 0x78/120 + /* +h0000 */ uint32_t rank; + /* +h0004 */ uint32_t allegiance; + /* +h0008 */ uint32_t faction; + /* +h000C */ wchar_t name[32]; + /* +h004C */ wchar_t tag[5]; + /* +h0056 */ uint8_t _padding[2]; + /* +h0058 */ CapeDesign cape; + /* +h0074 */ GW::Constants::MapID map_id; + }; + static_assert(sizeof(TownAlliance) == 0x78, "struct TownAlliance has incorrect size"); +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Hero.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Hero.h new file mode 100644 index 00000000..a1c625f1 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Hero.h @@ -0,0 +1,74 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameContainers/GamePos.h> + +namespace GW { + typedef uint32_t AgentID; + namespace Constants { + enum HeroID : uint32_t; + } + + enum class HeroBehavior : uint32_t { + Fight, Guard, AvoidCombat + }; + + struct HeroFlag { // total: 0x20/36 + /* +h0000 */ GW::Constants::HeroID hero_id; + /* +h0004 */ AgentID agent_id; + /* +h0008 */ uint32_t level; + /* +h000C */ HeroBehavior hero_behavior; + /* +h0010 */ Vec2f flag; + /* +h0018 */ uint32_t h0018; + /* +h001C */ uint32_t h001c; + /* +h0020 */ AgentID locked_target_id; + }; + static_assert(sizeof(HeroFlag) == 0x24, "struct HeroFlag has incorrect size"); + + struct HeroInfo { // total: 0x9C/156 + /* +h0000 */ GW::Constants::HeroID hero_id; + /* +h0004 */ uint32_t agent_id; + /* +h0008 */ uint32_t level; + /* +h000C */ uint32_t primary; + /* +h0010 */ uint32_t secondary; + /* +h0014 */ uint32_t hero_file_id; + /* +h0018 */ uint32_t model_file_id; + /* +h001C */ uint32_t h001C; + /* +h0020 */ uint32_t h0020; + /* +h0024 */ uint32_t h0024; + /* +h0028 */ uint32_t h0028; + /* +h002C */ uint32_t h002C; + /* +h0030 */ uint32_t h0030; + /* +h0034 */ uint32_t h0034; + /* +h0038 */ uint32_t h0038; + /* +h003C */ uint32_t h003C; + /* +h0040 */ uint32_t h0040; + /* +h0044 */ uint32_t h0044; + /* +h0048 */ uint32_t h0048; + /* +h004C */ uint32_t h004C; + /* +h0050 */ wchar_t name[20]; + /* +h0078 */ uint32_t h0078; + /* +h007C */ uint32_t h007C; + /* +h0080 */ uint32_t h0080; + /* +h0084 */ uint32_t h0084; + /* +h0088 */ uint32_t h0088; + /* +h008C */ uint32_t h008C; + /* +h0090 */ uint32_t h0090; + /* +h0094 */ uint32_t h0094; + /* +h0098 */ uint32_t h0098; + }; + static_assert(sizeof(HeroInfo) == 0x9C, "struct HeroInfo has incorrect size"); + + struct HeroConstData { // total: 0x18/24 + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t name_id; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t description_id; + }; + static_assert(sizeof(HeroConstData) == 0x18, "struct HeroConstData has incorrect size"); + + typedef Array<HeroFlag> HeroFlagArray; + typedef Array<HeroInfo> HeroInfoArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Item.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Item.h new file mode 100644 index 00000000..a6c0f613 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Item.h @@ -0,0 +1,284 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/Constants/ItemIDs.h> + +namespace GW { + typedef uint32_t ItemID; + namespace Constants { + enum class Bag : uint8_t; + enum class ItemType : uint8_t; + + enum class MaterialSlot : uint32_t; + + enum class BagType { + None, + Inventory, + Equipped, + NotCollected, + Storage, + MaterialStorage + }; + } + + struct Item; + typedef Array<Item *> ItemArray; + + enum class DyeColor : uint8_t { + None = 0, + Blue = 2, + Green = 3, + Purple = 4, + Red = 5, + Yellow = 6, + Brown = 7, + Orange = 8, + Silver = 9, + Black = 10, + Gray = 11, + White = 12, + Pink = 13 + }; + struct DyeInfo { + uint8_t dye_tint; + DyeColor dye1 : 4; + DyeColor dye2 : 4; + DyeColor dye3 : 4; + DyeColor dye4 : 4; + }; + static_assert(sizeof(DyeInfo) == 3, "struct DyeInfo has incorrect size"); + + struct ItemData { + uint32_t model_file_id = 0; + GW::Constants::ItemType type = (GW::Constants::ItemType)0xff; + GW::DyeInfo dye = {}; + uint32_t value = 0; + uint32_t interaction = 0; + }; + static_assert(sizeof(ItemData) == 0x10, "struct ItemData has incorrect size"); + + struct MaterialCost { + GW::Constants::MaterialSlot material; + uint32_t amount; + uint32_t h0008; + uint32_t h000c; + }; + static_assert(sizeof(MaterialCost) == 0x10); + + struct ItemFormula { + uint32_t h0000; + uint32_t gold_cost; + uint32_t skill_point_cost; + uint32_t material_cost_count; + MaterialCost* material_cost_buffer; // NB: The game stores a cached array of material amounts that the player has in inventory; we don't care about it though! + }; + static_assert(sizeof(ItemFormula) == 0x14); + + struct Bag { // total: 0x28/40 + /* +h0000 */ Constants::BagType bag_type; + /* +h0004 */ uint32_t index; + /* +h0008 */ uint32_t _unknown0; + /* +h000C */ uint32_t container_item; + /* +h0010 */ uint32_t items_count; + /* +h0014 */ Bag *bag_array; + /* +h0018 */ ItemArray items; + + bool IsInventoryBag() const { return bag_type == Constants::BagType::Inventory; } + bool IsStorageBag() const { return bag_type == Constants::BagType::Storage; } + bool IsMaterialStorage() const { return bag_type == Constants::BagType::MaterialStorage; } + + static const size_t npos = (size_t)-1; + + size_t find_dye(uint32_t model_id, DyeInfo ExtraId, size_t pos = 0) const; + + size_t find1(uint32_t model_id, size_t pos = 0) const; + size_t find2(const Item *item, size_t pos = 0) const; + + [[nodiscard]] Constants::Bag bag_id() const + { + return static_cast<Constants::Bag>(index + 1); + } + }; + static_assert(sizeof(Bag) == 40, "struct Bag has incorrect size"); + + struct ItemModifier { + uint32_t mod = 0; + + uint32_t identifier() const { return mod >> 16; } + uint32_t arg1() const { return (mod & 0x0000FF00) >> 8; } + uint32_t arg2() const { return (mod & 0x000000FF); } + uint32_t arg() const { return (mod & 0x0000FFFF); } + operator bool() const { return mod != 0; } + }; + + struct Item { // total: 0x54/84 + /* +h0000 */ uint32_t item_id; + /* +h0004 */ uint32_t agent_id; + /* +h0008 */ Bag *bag_equipped; // Only valid if Item is a equipped Bag + /* +h000C */ Bag *bag; + /* +h0010 */ ItemModifier *mod_struct; // Pointer to an array of mods. + /* +h0014 */ uint32_t mod_struct_size; // Size of this array. + /* +h0018 */ wchar_t *customized; + /* +h001C */ uint32_t model_file_id; + /* +h0020 */ GW::Constants::ItemType type; + /* +h0021 */ DyeInfo dye; + /* +h0024 */ uint16_t value; + /* +h0026 */ uint16_t h0026; + /* +h0028 */ uint32_t interaction; + /* +h002C */ uint32_t model_id; + /* +h0030 */ wchar_t *info_string; + /* +h0034 */ wchar_t *name_enc; + /* +h0038 */ wchar_t *complete_name_enc; // with color, quantity, etc. + /* +h003C */ wchar_t *single_item_name; // with color, w/o quantity, named as single item + /* +h0040 */ uint32_t h0040[2]; + /* +h0048 */ uint16_t item_formula; + /* +h004A */ uint8_t is_material_salvageable; // Only valid for type 11 (Materials) + /* +h004B */ uint8_t h004B; // probably used for quantity extension for new material storage + /* +h004C */ uint16_t quantity; + /* +h004E */ uint8_t equipped; + /* +h004F */ uint8_t profession; + /* +h0050 */ uint8_t slot; + + inline bool GetIsStackable() const { + return (interaction & 0x80000) != 0; + } + + inline bool GetIsInscribable() const { + return (interaction & 0x08000000) != 0; + } + + GWCA_API bool GetIsMaterial() const; + GWCA_API bool GetIsZcoin() const; + GW::ItemModifier* GetModifier(const uint32_t identifier) const; + }; + static_assert(sizeof(Item) == 84, "struct Item has incorrect size"); + + struct WeaponSet { // total: 0x8/8 + /* +h0000 */ Item *weapon; + /* +h0004 */ Item *offhand; + }; + static_assert(sizeof(WeaponSet) == 8, "struct WeaponSet has incorrect size"); + + struct Inventory { // total: 0x98/152 + union { + /* +h0000 */ Bag *bags[23]; + struct { + /* +h0000 */ Bag *unused_bag; + /* +h0004 */ Bag *backpack; + /* +h0008 */ Bag *belt_pouch; + /* +h000C */ Bag *bag1; + /* +h0010 */ Bag *bag2; + /* +h0014 */ Bag *equipment_pack; + /* +h0018 */ Bag *material_storage; + /* +h001C */ Bag *unclaimed_items; + /* +h0020 */ Bag *storage1; + /* +h0024 */ Bag *storage2; + /* +h0028 */ Bag *storage3; + /* +h002C */ Bag *storage4; + /* +h0030 */ Bag *storage5; + /* +h0034 */ Bag *storage6; + /* +h0038 */ Bag *storage7; + /* +h003C */ Bag *storage8; + /* +h0040 */ Bag *storage9; + /* +h0044 */ Bag *storage10; + /* +h0048 */ Bag *storage11; + /* +h004C */ Bag *storage12; + /* +h0050 */ Bag *storage13; + /* +h0054 */ Bag *storage14; + /* +h0058 */ Bag *equipped_items; + }; + }; + /* +h005C */ Item *bundle; + /* +h0060 */ uint32_t storage_panes_unlocked; + union { + /* +h0064 */ WeaponSet weapon_sets[4]; + struct { + /* +h0064 */ Item *weapon_set0; + /* +h0068 */ Item *offhand_set0; + /* +h006C */ Item *weapon_set1; + /* +h0070 */ Item *offhand_set1; + /* +h0074 */ Item *weapon_set2; + /* +h0078 */ Item *offhand_set2; + /* +h007C */ Item *weapon_set3; + /* +h0080 */ Item *offhand_set3; + }; + }; + /* +h0084 */ uint32_t active_weapon_set; + /* +h0088 */ uint32_t h0088[2]; + /* +h0090 */ uint32_t gold_character; + /* +h0094 */ uint32_t gold_storage; + }; + static_assert(sizeof(Inventory) == 152, "struct Inventory has incorrect size"); + + // Static struct for info about available item upgrade info, used for PvP Equipment window + struct PvPItemUpgradeInfo { + uint32_t file_id; + uint32_t name_id; + uint32_t upgrade_type; // Axe, Bow, Inscription + uint32_t campaign_id; + uint32_t interaction; + uint32_t is_dev; // boolean; if 1, then don't use in-game + uint32_t profession; // if 0xb then is for all professions + uint32_t h0018; + uint32_t mod_struct_size; + uint32_t* mod_struct; + }; + static_assert(sizeof(PvPItemUpgradeInfo) == 0x28); + + struct PvPItemInfo { + uint32_t unk[9]; + }; + static_assert(sizeof(PvPItemInfo) == 0x24); + + struct CompositeModelInfo { + uint32_t class_flags; + uint32_t file_ids[11]; + }; + + static_assert(sizeof(CompositeModelInfo) == 0x30); + + struct SalvageSessionInfo { + void* vtable; + uint32_t frame_id; + uint32_t item_id; + uint32_t salvagable_1; // Prefix + uint32_t salvagable_2; // Suffix + uint32_t salvagable_3; // Inscription + uint32_t chosen_salvagable; // 3 for materials + uint32_t h001c; + uint32_t kit_id; + }; + static_assert(sizeof(SalvageSessionInfo) == 0x24); + + typedef Array<ItemID> MerchItemArray; + + inline size_t Bag::find1(uint32_t model_id, size_t pos) const { + for (size_t i = pos; i < items.size(); i++) { + Item *item = items[i]; + if (!item && model_id == 0) return i; + if (!item) continue; + if (item->model_id == model_id) + return i; + } + return npos; + } + + inline size_t Bag::find_dye(uint32_t model_id, DyeInfo extra_id, size_t pos) const { + for (size_t i = pos; i < items.size(); i++) { + Item *item = items[i]; + if (!item && model_id == 0) return i; + if (!item) continue; + if (item->model_id == model_id && memcmp(&item->dye,&extra_id,sizeof(item->dye)) == 0) + return i; + } + return npos; + } + + // Find a similar item + inline size_t Bag::find2(const Item *item, size_t pos) const { + if (item->model_id == Constants::ItemID::Dye) + return find_dye(item->model_id, item->dye, pos); + else + return find1(item->model_id, pos); + } +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Map.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Map.h new file mode 100644 index 00000000..f6ddd5a5 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Map.h @@ -0,0 +1,137 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + namespace Constants { + enum class Campaign: uint32_t; + } + struct MissionMapIcon { // total: 0x28/40 + /* +h0000 */ uint32_t index; + /* +h0004 */ float X; + /* +h0008 */ float Y; + /* +h000C */ uint32_t h000C; // = 0 + /* +h0010 */ uint32_t h0010; // = 0 + /* +h0014 */ uint32_t option; // Affilitation/color. gray = 0, blue, red, yellow, teal, purple, green, gray + /* +h0018 */ uint32_t h0018; // = 0 + /* +h001C */ uint32_t model_id; // Model of the displayed icon in the Minimap + /* +h0020 */ uint32_t h0020; // = 0 + /* +h0024 */ uint32_t h0024; // May concern the name + }; + static_assert(sizeof(MissionMapIcon) == 40, "struct MissionMapIcon has incorrect size"); + + typedef Array<MissionMapIcon> MissionMapIconArray; + + enum class Continent : uint32_t { + Kryta, + DevContinent, + Cantha, + BattleIsles, + Elona, + RealmOfTorment + }; + + enum class RegionType : uint32_t { + AllianceBattle, + Arena, + ExplorableZone, + GuildBattleArea, + GuildHall, + MissionOutpost, + CooperativeMission, + CompetitiveMission, + EliteMission, + Challenge, + Outpost, + ZaishenBattle, + HeroesAscent, + City, + MissionArea, + HeroBattleOutpost, + HeroBattleArea, + EotnMission, + Dungeon, + Marketplace, + Unknown, + DevRegion + }; + + enum Region : uint32_t { + Region_Kryta, + Region_Maguuma, + Region_Ascalon, + Region_NorthernShiverpeaks, + Region_HeroesAscent, + Region_CrystalDesert, + Region_FissureOfWoe, + Region_Presearing, + Region_Kaineng, + Region_Kurzick, + Region_Luxon, + Region_ShingJea, + Region_Kourna, + Region_Vaabi, + Region_Desolation, + Region_Istan, + Region_DomainOfAnguish, + Region_TarnishedCoast, + Region_DepthsOfTyria, + Region_FarShiverpeaks, + Region_CharrHomelands, + Region_BattleIslands, + Region_TheBattleOfJahai, + Region_TheFlightNorth, + Region_TheTenguAccords, + Region_TheRiseOfTheWhiteMantle, + Region_Swat, + Region_DevRegion + }; + + // https://github.com/entice/gw-interface/blob/master/GuildWarsInterface/Datastructures/Const/AreaInfo.cs + struct AreaInfo { // total: 0x7C/124 + /* +h0000 */ Constants::Campaign campaign; + /* +h0004 */ Continent continent; + /* +h0008 */ Region region; + /* +h000C */ RegionType type; + /* +h0010 */ uint32_t flags; + /* +h0014 */ uint32_t thumbnail_id; + /* +h0018 */ uint32_t min_party_size; + /* +h001C */ uint32_t max_party_size; + /* +h0020 */ uint32_t min_player_size; + /* +h0024 */ uint32_t max_player_size; + /* +h0028 */ uint32_t controlled_outpost_id; + /* +h002C */ uint32_t fraction_mission; + /* +h0030 */ uint32_t min_level; + /* +h0034 */ uint32_t max_level; + /* +h0038 */ uint32_t needed_pq; + /* +h003C */ uint32_t mission_maps_to; + /* +h0040 */ uint32_t x; // icon position on map. + /* +h0044 */ uint32_t y; + /* +h0048 */ uint32_t icon_start_x; + /* +h004C */ uint32_t icon_start_y; + /* +h0050 */ uint32_t icon_end_x; + /* +h0054 */ uint32_t icon_end_y; + /* +h0058 */ uint32_t icon_start_x_dupe; + /* +h005C */ uint32_t icon_start_y_dupe; + /* +h0060 */ uint32_t icon_end_x_dupe; + /* +h0064 */ uint32_t icon_end_y_dupe; + /* +h0068 */ uint32_t file_id; + /* +h006C */ uint32_t mission_chronology; + /* +h0070 */ uint32_t ha_map_chronology; + /* +h0074 */ uint32_t name_id; + /* +h0078 */ uint32_t description_id; + + uint32_t file_id1() const { return ((file_id - 1) % 0xff00) + 0x100; } + uint32_t file_id2() const { return ((file_id - 1) / 0xff00) + 0x100; } + + + bool GetHasEnterButton() const { return (flags & 0x100) != 0 || (flags & 0x40000) != 0; } + bool GetIsOnWorldMap() const { return (flags & 0x20) == 0; } + bool GetIsPvP() const { return (flags & 0x40001) != 0; } // 0x40000 = Explorable, 0x1 = Outpost + bool GetIsGuildHall() const { return (flags & 0x800000) != 0; } + bool GetIsVanquishableArea() const { return (flags & 0x10000000) != 0; } + bool GetIsUnlockable() const { return (flags & 0x10000) != 0; } + bool GetHasMissionMapsTo() const { return (flags & 0x8000000) != 0; } + }; + static_assert(sizeof(AreaInfo) == 124, "struct AreaInfo has incorrect size"); +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Match.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Match.h new file mode 100644 index 00000000..7c5656dd --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Match.h @@ -0,0 +1,47 @@ +#pragma once + +#include <cstdint> +#include <GWCA/GameEntities/Guild.h> + +namespace GW { + + namespace Constants { + enum class MapID : uint32_t; + } + + enum class ObserverMatchType : uint32_t { + SpecialEvent, + HallOfHeroe, + MyGuildsBattle, + MyGuildsHeroesAscentGame, + TopGuildBattle, + TopGuildHeroesAscentGame, + UploadedGame, + Top1v1Battle, + Top1v1TournamentBattle + }; + + struct ObserverMatchTeam { + /* +h0000 */ uint32_t id; // 0 - gray, 1 - blue, 2 - red + /* +h0004 */ uint32_t h0004; // indicates something with the tabard + /* +h0008 */ uint32_t h0008; // same. + /* +h000C */ CapeDesign cape; // aka. tabard in gw client + /* +h0028 */ wchar_t* name; // encoded name + }; + static_assert(sizeof(ObserverMatchTeam) == 0x2C, "struct ObserverMatchTeam has incorrect size"); + + struct ObserverMatch { // total: 0x4C/76 + /* +h0000 */ uint32_t match_id; + /* +h0004 */ uint32_t match_id_dup; + /* +h0008 */ GW::Constants::MapID map_id; + /* +h000C */ uint32_t age; // Elapsed time since match started [minutes] + /* +h0010 */ ObserverMatchType type; + /* +h0014 */ uint32_t match_title; // eg. 19 - "Monthly Championship Guild Tournament Finals", 18 - "Semifinals", 17 - "Quarterfinals", 16 - "Playoffs", 0 - No title + /* +h0018 */ uint32_t h0018; + /* +h001C */ uint32_t count; // number of teams + /* +h0020 */ ObserverMatchTeam team[2]; + /* +h0078 */ wchar_t* team1_name_dup; + /* +h007C */ uint32_t h007C[10]; + }; + static_assert(sizeof(ObserverMatch) == 0xA4, "struct ObserverMatch has incorrect size"); +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/NPC.h b/Dependencies/GWCA/Include/GWCA/GameEntities/NPC.h new file mode 100644 index 00000000..44375255 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/NPC.h @@ -0,0 +1,44 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + + namespace Constants { + enum class Profession : uint32_t; + } + + struct CharAdjustment { + char hue; + char saturation; + char lightness; + char scale; // percent + }; + + struct NPC { // total: 0x30/48 + /* +h0000 */ uint32_t model_file_id; + /* +h0004 */ uint32_t skin_file_id; + /* +h0008 */ CharAdjustment visual_adjustment; // may be overridden + /* +h000C */ uint32_t appearance; + /* +h0010 */ uint32_t npc_flags; // uses CHAR_CLASS_FLAG_* constants + /* +h0014 */ GW::Constants::Profession primary; + /* +h0018 */ GW::Constants::Profession secondary; + /* +h001C */ uint8_t default_level; + // +h001D uint8_t padding; + // +h001E uint16_t padding; + /* +h0020 */ wchar_t *name_enc; + /* +h0024 */ uint32_t *model_files; + /* +h0028 */ uint32_t files_count; // length of ModelFile + /* +h002C */ uint32_t files_capacity; // capacity of ModelFile + + inline bool IsHenchman() { return (npc_flags & 0x10) != 0; } + inline bool IsHero() { return (npc_flags & 0x20) != 0; } + inline bool IsSpirit() { return (npc_flags & 0x4000) != 0; } + inline bool IsMinion() { return (npc_flags & 0x100) != 0; } + inline bool IsPet() { return (npc_flags & 0xD) != 0; } + inline bool IsFleshy() const { return (npc_flags & 0x8) != 0; } + }; + static_assert(sizeof(NPC) == 0x30, "struct NPC has incorrect size"); + + typedef Array<NPC> NPCArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Party.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Party.h new file mode 100644 index 00000000..8ed0cb4a --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Party.h @@ -0,0 +1,85 @@ +#pragma once + +#include <GWCA/GameContainers/List.h> +#include <GWCA/GameContainers/Array.h> + +namespace GW { + typedef uint32_t AgentID; + typedef uint32_t PlayerID; + namespace Constants { + enum HeroID : uint32_t; + } + typedef uint32_t Profession; + + struct PlayerPartyMember { // total: 0xC/12 + /* +h0000 */ PlayerID login_number; + /* +h0004 */ AgentID calledTargetId; + /* +h0008 */ uint32_t state; + + bool connected() const { return (state & 1) > 0; } + bool ticked() const { return (state & 2) > 0; } + }; + static_assert(sizeof(PlayerPartyMember) == 12, "struct PlayerPartyMember has incorrect size"); + + struct HeroPartyMember { // total: 0x18/24 + /* +h0000 */ AgentID agent_id; + /* +h0004 */ PlayerID owner_player_id; + /* +h0008 */ GW::Constants::HeroID hero_id; + /* +h000C */ uint32_t h000C; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t level; + }; + static_assert(sizeof(HeroPartyMember) == 24, "struct HeroPartyMember has incorrect size"); + + struct HenchmanPartyMember { // total: 0x34/52 + /* +h0000 */ AgentID agent_id; + /* +h0004 */ uint32_t h0004[10]; + /* +h002C */ Profession profession; + /* +h0030 */ uint32_t level; + }; + static_assert(sizeof(HenchmanPartyMember) == 52, "struct HenchmanPartyMember has incorrect size"); + + typedef Array<HeroPartyMember> HeroPartyMemberArray; + typedef Array<PlayerPartyMember> PlayerPartyMemberArray; + typedef Array<HenchmanPartyMember> HenchmanPartyMemberArray; + + struct PartyInfo { // total: 0x84/132 + + size_t GetPartySize() { + return players.size() + henchmen.size() + heroes.size(); + } + + /* +h0000 */ uint32_t party_id; + /* +h0004 */ Array<PlayerPartyMember> players; + /* +h0014 */ Array<HenchmanPartyMember> henchmen; + /* +h0024 */ Array<HeroPartyMember> heroes; + /* +h0034 */ Array<AgentID> others; // agent id of allies, minions, pets. + /* +h0044 */ uint32_t h0044[14]; + /* +h007C */ TLink<PartyInfo> invite_link; + }; + static_assert(sizeof(PartyInfo) == 132, "struct PartyInfo has incorrect size"); + + enum PartySearchType { + PartySearchType_Hunting = 0, + PartySearchType_Mission = 1, + PartySearchType_Quest = 2, + PartySearchType_Trade = 3, + PartySearchType_Guild = 4, + }; + + struct PartySearch { + /* +h0000 */ uint32_t party_search_id; + /* +h0004 */ uint32_t party_search_type; + /* +h0008 */ uint32_t hardmode; + /* +h000C */ uint32_t district; + /* +h0010 */ uint32_t language; + /* +h0014 */ uint32_t party_size; + /* +h0018 */ uint32_t hero_count; + /* +h001C */ wchar_t message[32]; + /* +h005C */ wchar_t party_leader[20]; + /* +h0084 */ Profession primary; + /* +h0088 */ Profession secondary; + /* +h008C */ uint32_t level; + /* +h0090 */ uint32_t timestamp; + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Pathing.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Pathing.h new file mode 100644 index 00000000..eea4aee9 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Pathing.h @@ -0,0 +1,138 @@ +#pragma once +#include <GWCA/GameContainers/GamePos.h> +#include <GWCA/GameContainers/Array.h> + +namespace GW { + struct PathingTrapezoid { // total: 0x30/48 + /* +h0000 */ uint32_t id; + union { + /* +h0004 */ PathingTrapezoid* adjacent[4]; + struct { + /* +h0004 */ PathingTrapezoid* top_left; + /* +h0008 */ PathingTrapezoid* top_right; + /* +h000C */ PathingTrapezoid* bottom_left; + /* +h0010 */ PathingTrapezoid* bottom_right; + }; + }; + /* +h0014 */ uint16_t portal_left; + /* +h0016 */ uint16_t portal_right; + /* +h0018 */ float XTL; + /* +h001C */ float XTR; + /* +h0020 */ float YT; + /* +h0024 */ float XBL; + /* +h0028 */ float XBR; + /* +h002C */ float YB; + }; + static_assert(sizeof(PathingTrapezoid) == 48, "struct PathingTrapezoid has incorrect size"); + + struct Node { + /* +h0000 */ uint32_t type; //XNode = 0, YNode = 1, SinkNode = 2 + /* +h0004 */ uint32_t id; + }; + + struct XNode : Node { // type = 0 + /* +h0008 */ Vec2f pos; + /* +h0010 */ Vec2f dir; + /* +h0018 */ Node *left; + /* +h001C */ Node *right; + }; + static_assert(sizeof(XNode) == 32, "struct XNode has incorrect size"); + + struct YNode : Node { // type = 1 + /* +h0008 */ Vec2f pos; + /* +h0010 */ Node *above; + /* +h0014 */ Node *below; + }; + static_assert(sizeof(YNode) == 24, "struct YNode has incorrect size"); + + struct SinkNode : Node { // type = 2 + /* +h0008 */ PathingTrapezoid *trapezoid; + }; + static_assert(sizeof(SinkNode) == 12, "struct SinkNode has incorrect size"); + + struct Portal { // total: 0x14/20 + /* +h0000 */ uint16_t portal_plane; + /* +h0002 */ uint16_t neighbor_plane; + /* +h0004 */ uint32_t flags; // 0x4 => "Not used for path finding" + /* +h0008 */ Portal *pair; + /* +h000C */ uint32_t count; + /* +h0010 */ PathingTrapezoid **trapezoids; + }; + static_assert(sizeof(Portal) == 20, "struct Portal has incorrect size"); + + struct PathingMap { // total: 0x54/84 + /* +h0000 */ uint32_t zplane; // ground plane = UINT_MAX, rest 0 based index + /* +h0004 */ uint32_t h0004; + /* +h0008 */ void *allocatedBuffer; // All following data are stored in a buffer allocated with a single MemAlloc. This is the pointer. + /* +h000C */ uint32_t h0010_count; // count of number h0010 + /* +h0010 */ uint32_t *h0010; // elements of this array are 8 bytes + /* +h0014 */ uint32_t trapezoid_count; + /* +h0018 */ PathingTrapezoid* trapezoids; + /* +h001C */ uint32_t sink_node_count; + /* +h0020 */ SinkNode *sink_nodes; + /* +h0024 */ uint32_t x_node_count; + /* +h0028 */ XNode *x_nodes; + /* +h002C */ uint32_t y_node_count; + /* +h0030 */ YNode *y_nodes; + /* +h0034 */ uint32_t portal_trapezoids_count; + /* +h0038 */ PathingTrapezoid **portal_trapezoids; + /* +h003C */ uint32_t portal_count; + /* +h0040 */ Portal *portals; + /* +h0044 */ Node *root_node; + /* +h0048 */ BaseArray<Vec2f> dat_vectors; // this is an array of vectors read from the dat file. When reading the xnodes or ynodes from the dat file, an index will be used to get the pos. + }; + static_assert(sizeof(PathingMap) == 84, "struct PathingMap has incorrect size"); + + struct PropByType { + uint32_t object_id; + uint32_t prop_index; + }; + + struct PropModelInfo { + /* +h0000 */ uint32_t h0000; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t h0008; + /* +h000C */ uint32_t h000C; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t h0014; + }; + static_assert(sizeof(PropModelInfo) == 0x18, "struct PropModelInfo has incorrect size"); + + struct RecObject { + /* +h0000 */ void* vtable; + /* +h0004 */ uint32_t ref_count; + /* +h0008 */ uint32_t accessKey; // This is used by the game to make sure the data from the DAT matches the data in game + /* +h000c */ uint32_t standalone; + /* +h0010 */ uint32_t file_id; + /* +h0014 */ uint32_t stream_id; + /* +h0018 */ uint32_t flags; + /* +h001c */ uint32_t opened; + /* +h0020 */ uint32_t ref_count2; + }; + static_assert(sizeof(RecObject) == 0x24, "struct RecObject has incorrect size"); + + struct MapProp { // total: 0x54/84 + /* +h0000 */ uint32_t h0000[5]; + /* +h0014 */ uint32_t uptime_seconds; // time since spawned + /* +h0018 */ uint32_t h0018; + /* +h001C */ uint32_t prop_index; + /* +h0020 */ Vec3f position; + /* +h002C */ uint32_t model_file_id; + /* +h0030 */ uint32_t h0030[2]; + /* +h0038 */ float rotation_angle; + /* +h003C */ float rotation_cos; + /* +h003C */ float rotation_sin; + /* +h0040 */ uint32_t h0034[5]; + /* +h0058 */ RecObject* interactive_model; + /* +h005C */ uint32_t h005C[4]; + /* +h006C */ uint32_t appearance_bitmap; // Modified when animation changes + /* +h0070 */ uint32_t animation_bits; + /* +h0064 */ uint32_t h0064[5]; + /* +h0088 */ PropByType* prop_object_info; + /* +h008C */ uint32_t h008C; + }; + + static_assert(sizeof(MapProp) == 0x90, "struct MapProp has incorrect size"); + + typedef Array<PathingMap> PathingMapArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Player.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Player.h new file mode 100644 index 00000000..9fccc2c9 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Player.h @@ -0,0 +1,33 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + typedef uint32_t PlayerID; + + struct Player { // total: 0x4C/76 + /* +h0000 */ uint32_t agent_id; + /* +h0004 */ uint32_t h0004[3]; + /* +h0010 */ uint32_t appearance_bitmap; + /* +h0014 */ uint32_t flags; // Bitwise field + /* +h0018 */ uint32_t primary; + /* +h001C */ uint32_t secondary; + /* +h0020 */ uint32_t h0020; + /* +h0024 */ wchar_t *name_enc; + /* +h0028 */ wchar_t *name; + /* +h002C */ uint32_t party_leader_player_number; + /* +h0030 */ uint32_t active_title_tier; + /* +h0034 */ uint32_t reforged_or_dhuums_flags; + /* +h0038 */ uint32_t player_number; + /* +h003C */ uint32_t party_size; + /* +h0040 */ Array<void*> h0040; + + inline bool IsPvP() { + return (flags & 0x800) != 0; + } + + }; + static_assert(sizeof(Player) == 0x50, "struct Player has incorrect size"); + + typedef Array<Player> PlayerArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Quest.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Quest.h new file mode 100644 index 00000000..4db31708 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Quest.h @@ -0,0 +1,40 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameContainers/GamePos.h> + +namespace GW { + namespace Constants { + enum class QuestID : uint32_t; + enum class MapID : uint32_t; + } + + struct Quest { // total: 0x34/52 + /* +h0000 */ GW::Constants::QuestID quest_id; + /* +h0004 */ uint32_t log_state; + /* +h0008 */ wchar_t* location; // quest category + /* +h000C */ wchar_t* name; // quest name + /* +h0010 */ wchar_t* npc; // + /* +h0014 */ GW::Constants::MapID map_from; + /* +h0018 */ GamePos marker; + /* +h0024 */ uint32_t h0024; + /* +h0028 */ GW::Constants::MapID map_to; + /* +h002C */ wchar_t* description; // namestring reward + /* +h0030 */ wchar_t* objectives; // namestring objective + + inline bool IsCompleted() { return (log_state & 0x2) != 0; } + inline bool IsCurrentMissionQuest() { return (log_state & 0x10) != 0; } + inline bool IsAreaPrimary() { return (log_state & 0x40) != 0; } // e.g. "Primary Echovald Forest Quests" + inline bool IsPrimary() { return (log_state & 0x20) != 0; } // e.g. "Primary Quests" + }; + static_assert(sizeof(Quest) == 52, "struct Quest has incorrect size"); + + struct MissionObjective { // total: 0xC/12 + /* +h0000 */ uint32_t objective_id; + /* +h0004 */ wchar_t *enc_str; + /* +h0008 */ uint32_t type; // completed, bullet, etc... + }; + static_assert(sizeof(MissionObjective) == 12, "struct MissionObjective has incorrect size"); + + typedef Array<Quest> QuestLog; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Skill.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Skill.h new file mode 100644 index 00000000..b9b8fe42 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Skill.h @@ -0,0 +1,155 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + namespace Constants { + enum class ProfessionByte : uint8_t; + enum class AttributeByte : uint8_t; + enum class SkillID : uint32_t; + enum class Campaign : uint32_t; + enum class SkillType; + } + + struct Skill { // total : 0xA0/160 + /* +h0000 */ GW::Constants::SkillID skill_id; + /* +h0004 */ uint32_t h0004; + /* +h0008 */ GW::Constants::Campaign campaign; + /* +h000C */ GW::Constants::SkillType type; + /* +h0010 */ uint32_t special; + /* +h0014 */ uint32_t combo_req; + /* +h0018 */ uint32_t effect1; + /* +h001C */ uint32_t condition; + /* +h0020 */ uint32_t effect2; + /* +h0024 */ uint32_t weapon_req; + /* +h0028 */ GW::Constants::ProfessionByte profession; + /* +h0029 */ GW::Constants::AttributeByte attribute; + /* +h002A */ uint16_t title; + /* +h002C */ GW::Constants::SkillID skill_id_pvp; + /* +h0030 */ uint8_t combo; + /* +h0031 */ uint8_t target; + /* +h0032 */ uint8_t h0032; + /* +h0033 */ uint8_t skill_equip_type; + /* +h0034 */ uint8_t overcast; // only if special flag has 0x000001 set + /* +h0035 */ uint8_t energy_cost; + /* +h0036 */ uint8_t health_cost; + /* +h0037 */ uint8_t h0037; + /* +h0038 */ uint32_t adrenaline; + /* +h003C */ float activation; + /* +h0040 */ float aftercast; + /* +h0044 */ uint32_t duration0; + /* +h0048 */ uint32_t duration15; + /* +h004C */ uint32_t recharge; + /* +h0050 */ uint16_t h0050[4]; + /* +h0058 */ uint32_t skill_arguments; // 1 - duration set, 2 - scale set, 4 - bonus scale set (3 would mean duration and scale is set/used by the skill) + /* +h005C */ uint32_t scale0; + /* +h0060 */ uint32_t scale15; + /* +h0064 */ uint32_t bonusScale0; + /* +h0068 */ uint32_t bonusScale15; + /* +h006C */ float aoe_range; + /* +h0070 */ float const_effect; + /* +h0074 */ uint32_t caster_overhead_animation_id; //2077 == max == no animation + /* +h0078 */ uint32_t caster_body_animation_id; + /* +h007C */ uint32_t target_body_animation_id; + /* +h0080 */ uint32_t target_overhead_animation_id; + /* +h0084 */ uint32_t projectile_animation_1_id; + /* +h0088 */ uint32_t projectile_animation_2_id; + /* +h008C */ uint32_t icon_file_id; + /* +h0090 */ uint32_t icon_file_id_2; + /* +h0094 */ uint32_t icon_file_id_hi_res; + /* +h0098 */ uint32_t name; // String id + /* +h009C */ uint32_t concise; // String id + /* +h00A0 */ uint32_t description; // String id + + uint8_t GetEnergyCost() const { + switch (energy_cost) { + case 11: return 15; + case 12: return 25; + default: return energy_cost; + } + } + + [[nodiscard]] bool IsTouchRange() const { return (special & 0x2) != 0; } + [[nodiscard]] bool IsElite() const { return (special & 0x4) != 0; } + [[nodiscard]] bool IsHalfRange() const { return (special & 0x8) != 0; } + [[nodiscard]] bool IsPvP() const { return (special & 0x400000) != 0; } + [[nodiscard]] bool IsPvE() const { return (special & 0x80000) != 0; } + [[nodiscard]] bool IsPlayable() const { return (special & 0x2000000) == 0; } + [[nodiscard]] bool ExploitsCorpse() const { return (special & 0x40000) != 0; } + [[nodiscard]] bool CausesHealthDegen() const { return (special & 0x200) != 0; } + [[nodiscard]] bool IsResurrectionSkill() const { return (special & 0x800) == 0; } + + // NB: Guild Wars uses the skill array to build mods for weapons, so stuff like runes are skills too, and use stacking/non-stacking flags + [[nodiscard]] bool IsStacking() const { return (special & 0x10000) != 0; } + [[nodiscard]] bool IsNonStacking() const { return (special & 0x20000) != 0; } + [[nodiscard]] bool IsUnused() const; + }; + static_assert(sizeof(Skill) == 0xa4, "struct Skill has incorrect size"); + + struct SkillbarSkill { // total: 0x14/20 + /* +h0000 */ uint32_t adrenaline_a; + /* +h0004 */ uint32_t adrenaline_b; + /* +h0008 */ uint32_t recharge; + /* +h000C */ Constants::SkillID skill_id; // see GWConst::SkillIds + /* +h0010 */ uint32_t event; + + GWCA_API uint32_t GetRecharge() const; // returns recharge time remaining in milliseconds, or 0 if recharged + }; + static_assert(sizeof(SkillbarSkill) == 20, "struct SkillbarSkill has incorrect size"); + + struct SkillbarCast { + /* +h0000 */ uint16_t h0000; + /* +h0004 */ Constants::SkillID skill_id; + /* +h0008 */ uint32_t h0008; + }; + + typedef Array<SkillbarCast> SkillbarCastArray; + + struct Skillbar { // total: 0xBC/188 + /* +h0000 */ uint32_t agent_id; // id of the agent whose skillbar this is + /* +h0004 */ SkillbarSkill skills[8]; + /* +h00A4 */ uint32_t disabled; + /* +h00A8 */ SkillbarCastArray cast_array; + /* +h00B8 */ uint32_t h00B8; + + bool IsValid() const { return agent_id > 0; } + + GWCA_API SkillbarSkill* GetSkillById(Constants::SkillID skill_id, size_t* slot_out = nullptr); + }; + static_assert(sizeof(Skillbar) == 0xbc, "struct Skillbar has incorrect size"); + + typedef Array<Skillbar> SkillbarArray; + + struct Effect { // total: 0x18/24 + /* +h0000 */ GW::Constants::SkillID skill_id; // skill id of the effect + /* +h0004 */ uint32_t attribute_level; // attribute level for the skill used + /* +h0008 */ uint32_t effect_id; // unique identifier of effect + /* +h000C */ uint32_t agent_id; // non-zero means maintained enchantment - caster id + /* +h0010 */ float duration; // non-zero if effect has a duration + /* +h0014 */ DWORD timestamp; // GW-timestamp of when effect was applied - only with duration + + GWCA_API DWORD GetTimeElapsed() const; + GWCA_API DWORD GetTimeRemaining() const; + }; + static_assert(sizeof(Effect) == 24, "struct Effect has incorrect size"); + + struct Buff { // total: 0x10/16 + /* +h0000 */ GW::Constants::SkillID skill_id; // skill id of the buff + /* +h0004 */ uint32_t h0004; + /* +h0008 */ uint32_t buff_id; // id of buff in the buff array + /* +h000C */ uint32_t target_agent_id; // agent id of the target (0 if no target) + }; + static_assert(sizeof(Buff) == 16, "struct Buff has incorrect size"); + + typedef Array<Buff> BuffArray; + typedef Array<Effect> EffectArray; + + struct AgentEffects { // total: 0x24/36 + /* +h0000 */ uint32_t agent_id; + /* +h0004 */ BuffArray buffs; + /* +h0014 */ EffectArray effects; + }; + static_assert(sizeof(AgentEffects) == 36, "struct AgentEffects has incorrect size"); + + typedef Array<AgentEffects> AgentEffectsArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/GameEntities/Title.h b/Dependencies/GWCA/Include/GWCA/GameEntities/Title.h new file mode 100644 index 00000000..378577af --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/GameEntities/Title.h @@ -0,0 +1,44 @@ +#pragma once + +#include <stdint.h> + +#include <GWCA/GameContainers/Array.h> + +namespace GW { + namespace Constants { + enum class TitleID : uint32_t; + } + struct Title { // total: 0x28/40 + /* +h0000 */ uint32_t props; + /* +h0004 */ uint32_t current_points; + /* +h0008 */ uint32_t current_title_tier_index; + /* +h000C */ uint32_t points_needed_current_rank; + /* +h0010 */ uint32_t h0010; + /* +h0014 */ uint32_t next_title_tier_index; + /* +h0018 */ uint32_t points_needed_next_rank; + /* +h001c */ uint32_t max_title_rank; + /* +h0020 */ uint32_t max_title_tier_index; + /* +h0024 */ wchar_t* points_desc; // Pretty sure these are ptrs to title hash strings + /* +h0028 */ wchar_t* h0028; // Pretty sure these are ptrs to title hash strings + + inline bool is_percentage_based() { return (props & 1) != 0; }; + inline bool has_tiers() { return (props & 3) == 2; }; + + }; + static_assert(sizeof(Title) == 0x2c, "struct Title has incorrect size"); + + struct TitleTier { + uint32_t props; + uint32_t tier_number; + wchar_t* tier_name_enc; + inline bool is_percentage_based() { return (props & 1) != 0; }; + }; + static_assert(sizeof(TitleTier) == 0xc, "struct TitleTier has incorrect size"); + + struct TitleClientData { + uint32_t title_flags; + GW::Constants::TitleID title_id; + uint32_t name_id; + }; + typedef Array<Title> TitleArray; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/AgentMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/AgentMgr.h new file mode 100644 index 00000000..b1f9cf97 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/AgentMgr.h @@ -0,0 +1,160 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/Constants/Constants.h> + +#include <GWCA/Utilities/Export.h> + +namespace GW { + typedef uint32_t AgentID; + struct GamePos; + + struct NPC; + struct Agent; + struct Player; + struct MapAgent; + struct AgentLiving; + + typedef Array<NPC> NPCArray; + typedef Array<Agent *> AgentArray; + typedef Array<Player> PlayerArray; + typedef Array<MapAgent> MapAgentArray; + + struct Module; + extern Module AgentModule; + + enum class WorldActionId : uint32_t { + InteractEnemy, + InteractPlayerOrOther, + InteractNPC, + InteractItem, + InteractTrade, + InteractGadget + }; + + // NB: Theres more target types, and they're in the code, but not used for our context + enum class CallTargetType : uint32_t { + Following = 0x3, + Morale = 0x7, + AttackingOrTargetting = 0xA, + None = 0xFF + }; + + + namespace Agents { + // === Dialogs === + // Same as pressing button (id) while talking to an NPC. + GWCA_API bool SendDialog(uint32_t dialog_id); + + // Returns last dialog id sent to the server. Requires the hook. + GWCA_API bool GetIsAgentTargettable(const GW::Agent* agent); + + // === Agent Array === + + // Get Agent ID of currently observed agent + GWCA_API uint32_t GetObservingId(); + // Get Agent ID of client's logged in player + GWCA_API uint32_t GetControlledCharacterId(); + // Get Agent ID of current target + GWCA_API uint32_t GetTargetId(); + // Get Agent ID of current evaluated target - either auto target or actual target + GWCA_API uint32_t GetEvaluatedTargetId(); + + // Returns Agentstruct Array of agents in compass range, full structs. + GWCA_API AgentArray* GetAgentArray(); + + // Get AgentArray Structures of player or target. + GWCA_API Agent *GetAgentByID(uint32_t id); + // Get agent that we're currently observing + inline Agent *GetObservingAgent() { return GetAgentByID(GetObservingId()); } + // Get Agent of current target + inline Agent *GetTarget() { return GetAgentByID(GetTargetId()); } + // Get Agent of current evaluated target - either auto target or actual target + inline Agent *GetEvaluatedTarget() { return GetAgentByID(GetEvaluatedTargetId()); } + + GWCA_API Agent *GetPlayerByID(uint32_t player_id); + + // Get Agent of current logged in character + GWCA_API AgentLiving* GetControlledCharacter(); + + // Whether we're observing someone else + GWCA_API bool IsObserving(); + + // Get AgentLiving of current target + GWCA_API AgentLiving *GetTargetAsAgentLiving(); + + GWCA_API uint32_t GetAmountOfPlayersInInstance(); + + // Returns array of alternate agent array that can be read beyond compass range. + // Holds limited info and needs to be explored more. + GWCA_API MapAgentArray* GetMapAgentArray(); + GWCA_API uint32_t CountAllegianceInRange(GW::Constants::Allegiance allegiance, float sqr_range); + + GWCA_API MapAgent* GetMapAgentByID(uint32_t agent_id); + + // === Other Arrays === + GWCA_API PlayerArray* GetPlayerArray(); + + GWCA_API NPCArray* GetNPCArray(); + GWCA_API NPC *GetNPCByID(uint32_t npc_id); + + // Change targeted agent to (Agent) + GWCA_API bool ChangeTarget(const Agent *agent); + GWCA_API bool ChangeTarget(AgentID agent_id); + + // Move to specified coordinates. + // Note: will do nothing if coordinate is outside the map! + GWCA_API bool Move(float x, float y, uint32_t zplane = 0); + GWCA_API bool Move(GamePos pos); + + GWCA_API bool InteractAgent(const Agent* agent, bool call_target = false); + + // Returns name of player with selected login_number. + GWCA_API wchar_t *GetPlayerNameByLoginNumber(uint32_t login_number); + + // Returns AgentID of player with selected login_number. + GWCA_API uint32_t GetAgentIdByLoginNumber(uint32_t login_number); + + GWCA_API AgentID GetHeroAgentID(uint32_t hero_index); + + // Might be bugged, avoid to use. + GWCA_API wchar_t* GetAgentEncName(const Agent* agent); + GWCA_API wchar_t* GetAgentEncName(uint32_t agent_id); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API bool SendDialog(uint32_t dialog_id); + GWCA_API bool GetIsAgentTargettable(const void* agent); + + GWCA_API uint32_t GetObservingId(); + GWCA_API uint32_t GetControlledCharacterId(); + GWCA_API uint32_t GetTargetId(); + GWCA_API uint32_t GetEvaluatedTargetId(); + + GWCA_API void* GetAgentByID(uint32_t agent_id); + GWCA_API void* GetPlayerByID(uint32_t player_id); + GWCA_API void* GetControlledCharacter(); + GWCA_API void* GetTargetAsAgentLiving(); + GWCA_API void* GetMapAgentByID(uint32_t agent_id); + GWCA_API void* GetNPCByID(uint32_t npc_id); + + GWCA_API bool IsObserving(); + GWCA_API uint32_t GetAmountOfPlayersInInstance(); + GWCA_API uint32_t CountAllegianceInRange(uint32_t allegiance, float sqr_range); + + GWCA_API bool ChangeTargetByAgent(const void* agent); + GWCA_API bool ChangeTargetById(uint32_t agent_id); + + GWCA_API bool Move(float x, float y, uint32_t zplane); + GWCA_API bool InteractAgent(const void* agent, bool call_target); + + GWCA_API const wchar_t* GetPlayerNameByLoginNumber(uint32_t login_number); + GWCA_API uint32_t GetAgentIdByLoginNumber(uint32_t login_number); + GWCA_API uint32_t GetHeroAgentID(uint32_t hero_index); + + GWCA_API const wchar_t* GetAgentEncNameByAgent(const void* agent); + GWCA_API const wchar_t* GetAgentEncNameById(uint32_t agent_id); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/CameraMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/CameraMgr.h new file mode 100644 index 00000000..bd05dfd1 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/CameraMgr.h @@ -0,0 +1,51 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + struct Vec3f; + struct Camera; + struct Module; + + extern Module CameraModule; + + namespace CameraMgr { + // ==== Camera ==== + GWCA_API Camera *GetCamera(); + + // Change max zoom dist + GWCA_API bool SetMaxDist(float dist = 900.0f); + + GWCA_API bool SetFieldOfView(float fov); + + // Manual computation of the position of the Camera. (As close as possible to the original) + GWCA_API Vec3f ComputeCamPos(float dist = 0); // 2.f is the first person dist (const by gw) + GWCA_API bool UpdateCameraPos(); + + GWCA_API float GetFieldOfView(); + GWCA_API float GetYaw(); + + // ==== Camera patches ==== + // Unlock camera & return the new state of it + GWCA_API bool UnlockCam(bool flag); + GWCA_API bool GetCameraUnlock(); + + // Enable or Disable the fog & return the state of it + GWCA_API bool SetFog(bool flag); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetCamera(); + GWCA_API bool SetMaxDist(float dist); + GWCA_API bool SetFieldOfView(float fov); + GWCA_API void ComputeCamPos(float dist, float* out_x, float* out_y, float* out_z); + GWCA_API bool UpdateCameraPos(); + GWCA_API float GetFieldOfView(); + GWCA_API float GetYaw(); + GWCA_API bool UnlockCam(bool flag); + GWCA_API bool GetCameraUnlock(); + GWCA_API bool SetFog(bool flag); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/ChatMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/ChatMgr.h new file mode 100644 index 00000000..ee308a30 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/ChatMgr.h @@ -0,0 +1,122 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + struct Module; + extern Module ChatModule; + + struct HookStatus; + struct HookEntry; + + namespace Chat { + typedef uint32_t Color; +#pragma warning(push) +#pragma warning(disable: 4200) + struct ChatMessage { + uint32_t channel; + uint32_t unk1; + FILETIME timestamp; + wchar_t message[0]; + }; +#pragma warning(pop) + + const size_t CHAT_LOG_LENGTH = 0x200; + struct ChatBuffer { + uint32_t next; + uint32_t unk1; + uint32_t unk2; + ChatMessage* messages[CHAT_LOG_LENGTH]; + }; + namespace TextColor { + constexpr uint32_t ColorItemCommon = 0xFFFFFFFF; + constexpr uint32_t ColorItemEnhance = 0xFFA0F5F8; + constexpr uint32_t ColorItemUncommon = 0xFFB38AEC; + constexpr uint32_t ColorItemRare = 0xFFFFFD24; + constexpr uint32_t ColorItemUnique = 0xFF00FF00; + constexpr uint32_t ColorItemUniquePvp = 0xFFED1C24; + constexpr uint32_t ColorItemDull = 0xFFA0A0A0; + constexpr uint32_t ColorItemBasic = 0xFFFFFFFF; + constexpr uint32_t ColorItemBonus = 0xFFA0F5F8; + constexpr uint32_t ColorItemAssign = 0xFF6CC16D; + constexpr uint32_t ColorItemCustom = 0xFFA0A0A0; + constexpr uint32_t ColorItemRestrict = 0xFFF67D4D; + constexpr uint32_t ColorItemSell = 0xFFFFFF00; + constexpr uint32_t ColorLabel = 0xFFFFEAB8; + constexpr uint32_t ColorQuest = 0xFF00FF00; + constexpr uint32_t ColorSkillDull = 0xFFA0A0A0; + constexpr uint32_t ColorWarning = 0xFFED0002; + } + + enum Channel : int { + CHANNEL_ALLIANCE = 0, + CHANNEL_ALLIES = 1, + CHANNEL_GWCA1 = 2, + CHANNEL_ALL = 3, + CHANNEL_GWCA2 = 4, + CHANNEL_MODERATOR = 5, + CHANNEL_EMOTE = 6, + CHANNEL_WARNING = 7, + CHANNEL_GWCA3 = 8, + CHANNEL_GUILD = 9, + CHANNEL_GLOBAL = 10, + CHANNEL_GROUP = 11, + CHANNEL_TRADE = 12, + CHANNEL_ADVISORY = 13, + CHANNEL_WHISPER = 14, + CHANNEL_COUNT, + CHANNEL_COMMAND, + CHANNEL_UNKNOW = -1 + }; + + GWCA_API Chat::ChatBuffer* GetChatLog(); + GWCA_API bool AddToChatLog(wchar_t* message, uint32_t channel); + GWCA_API bool GetIsTyping(); + + GWCA_API bool SendChat(char channel, const char* msg); + GWCA_API bool SendChat(char channel, const wchar_t* msg); + GWCA_API bool SendChat(const wchar_t* to, const wchar_t* msg); + + GWCA_API void WriteChatF(Channel channel, const wchar_t* format, ...); + GWCA_API void WriteChat(Channel channel, const wchar_t* message, const wchar_t* sender = nullptr, bool transient = false); + GWCA_API void WriteChatEnc(Channel channel, const wchar_t* message, const wchar_t* sender = nullptr, bool transient = false); + + typedef void(__cdecl* ChatCommandCallback)(GW::HookStatus*, const wchar_t* cmd, int argc, const LPWSTR* argv); + GWCA_API void CreateCommand(GW::HookEntry* entry, const wchar_t* cmd, ChatCommandCallback callback); + GWCA_API void DeleteCommand(GW::HookEntry* entry, const wchar_t* cmd = 0); + + GWCA_API void ToggleTimestamps(bool enable); + GWCA_API void SetTimestampsFormat(bool use_24h, bool show_timestamp_seconds = false); + GWCA_API void SetTimestampsColor(Color color); + + GWCA_API Color SetSenderColor(Channel chan, Color col); + GWCA_API Color SetMessageColor(Channel chan, Color col); + GWCA_API void GetChannelColors(Channel chan, Color* sender, Color* message); + GWCA_API void GetDefaultColors(Channel chan, Color* sender, Color* message); + + GWCA_API Channel GetChannel(wchar_t opcode); + GWCA_API Channel GetChannel(char opcode); + }; +} + +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetChatLog(); + GWCA_API bool AddToChatLog(wchar_t* message, uint32_t channel); + GWCA_API bool GetIsTyping(); + GWCA_API bool SendChat(char channel, const wchar_t* message); + GWCA_API bool SendWhisper(const wchar_t* to, const wchar_t* message); + GWCA_API void WriteChat(int channel, const wchar_t* message, const wchar_t* sender, bool transient); + GWCA_API void WriteChatEnc(int channel, const wchar_t* message, const wchar_t* sender, bool transient); + GWCA_API void ToggleTimestamps(bool enable); + GWCA_API void SetTimestampsFormat(bool use_24h, bool show_timestamp_seconds); + GWCA_API void SetTimestampsColor(uint32_t color); + GWCA_API uint32_t SetSenderColor(int channel, uint32_t color); + GWCA_API uint32_t SetMessageColor(int channel, uint32_t color); + GWCA_API void GetChannelColors(int channel, uint32_t* sender, uint32_t* message); + GWCA_API void GetDefaultColors(int channel, uint32_t* sender, uint32_t* message); + GWCA_API int GetChannelFromWChar(wchar_t opcode); + GWCA_API int GetChannelFromChar(char opcode); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/EffectMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/EffectMgr.h new file mode 100644 index 00000000..f4b89608 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/EffectMgr.h @@ -0,0 +1,73 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + + struct Buff; + struct Effect; + struct AgentEffects; + + typedef Array<Buff> BuffArray; + typedef Array<Effect> EffectArray; + typedef Array<AgentEffects> AgentEffectsArray; + + namespace Constants { + enum class SkillID : uint32_t; + } + + struct Module; + extern Module EffectModule; + + namespace Effects { + // Returns current level of intoxication, 0-5 scale. + // If > 0 then skills that benefit from drunk will work. + // Important: requires SetupPostProcessingEffectHook() above. + GWCA_API uint32_t GetAlcoholLevel(); + + // Have fun with this ;)))))))))) + GWCA_API void GetDrunkAf(float intensity, uint32_t tint); + + // Get full array of effects and buffs for whole party. + GWCA_API AgentEffectsArray* GetPartyEffectsArray(); + + // Get full array of effects and buffs for agent. + GWCA_API AgentEffects* GetAgentEffectsArray(uint32_t agent_id); + + // Get full array of effects and buffs for player + GWCA_API AgentEffects* GetPlayerEffectsArray(); + + // Get array of effects on the agent. + GWCA_API EffectArray* GetAgentEffects(uint32_t agent_id); + + // Get array of buffs on the player. + GWCA_API BuffArray* GetAgentBuffs(uint32_t agent_id); + + // Get array of effects on the player. + GWCA_API EffectArray* GetPlayerEffects(); + + // Get array of buffs on the player. + GWCA_API BuffArray* GetPlayerBuffs(); + + // Drop buffid buff. + GWCA_API bool DropBuff(uint32_t buff_id); + + // Gets effect struct of effect on player with SkillID, returns Effect::Nil() if no match. + GWCA_API Effect * GetPlayerEffectBySkillId(Constants::SkillID skill_id); + + // Gets Buff struct of Buff on player with SkillID, returns Buff::Nil() if no match. + GWCA_API Buff *GetPlayerBuffBySkillId(Constants::SkillID skill_id); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API uint32_t GetAlcoholLevel(); + GWCA_API void GetDrunkAf(float intensity, uint32_t tint); + GWCA_API void* GetAgentEffectsArray(uint32_t agent_id); + GWCA_API void* GetPlayerEffectsArray(); + GWCA_API bool DropBuff(uint32_t buff_id); + GWCA_API void* GetPlayerEffectBySkillId(uint32_t skill_id); + GWCA_API void* GetPlayerBuffBySkillId(uint32_t skill_id); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/EventMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/EventMgr.h new file mode 100644 index 00000000..04da6627 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/EventMgr.h @@ -0,0 +1,33 @@ +#pragma once + +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> + +namespace GW { + + struct Module; + extern Module EventMgrModule; + + namespace EventMgr { + enum class EventID { + kRecvPing = 0x8, + kSendFriendState = 0x26, + kRecvFriendState = 0x2c, + + kNone = 0xffff + }; + + typedef HookCallback<EventID, void*,uint32_t> EventCallback; + GWCA_API void RegisterEventCallback( + HookEntry *entry, + EventID event_id, + const EventCallback& callback, + int altitude = -0x8000); + + GWCA_API void RemoveEventCallback( + HookEntry *entry, + EventID event_id = EventID::kNone); + + GWCA_API bool SendEventMessage(EventID, void*); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/FriendListMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/FriendListMgr.h new file mode 100644 index 00000000..75ec16d2 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/FriendListMgr.h @@ -0,0 +1,53 @@ +#pragma once +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> +namespace GW { + struct Friend; + struct FriendList; + enum class FriendStatus : uint32_t; + enum class FriendType : uint32_t; + struct Module; + extern Module FriendListModule; + namespace FriendListMgr { + GWCA_API FriendList* GetFriendList(); + GWCA_API Friend* GetFriend(const wchar_t* alias, const wchar_t* charname, FriendType type = (FriendType)1); + GWCA_API Friend* GetFriend(uint32_t index); + GWCA_API Friend* GetFriend(const uint8_t* uuid); + GWCA_API uint32_t GetNumberOfFriends(FriendType = (FriendType)1); + GWCA_API uint32_t GetNumberOfIgnores(); + GWCA_API uint32_t GetNumberOfPartners(); + GWCA_API uint32_t GetNumberOfTraders(); + GWCA_API FriendStatus GetMyStatus(); + GWCA_API bool SetFriendListStatus(FriendStatus status); + typedef HookCallback<const Friend*, const Friend*> FriendStatusCallback; + GWCA_API void RegisterFriendStatusCallback( + HookEntry* entry, + const FriendStatusCallback& callback); + GWCA_API void RemoveFriendStatusCallback( + HookEntry* entry); + GWCA_API bool AddFriend(const wchar_t* name, const wchar_t* alias = nullptr); + GWCA_API bool AddIgnore(const wchar_t* name, const wchar_t* alias = nullptr); + GWCA_API bool RemoveFriend(Friend* _friend); + GWCA_API bool ChangeFriendType(Friend* _friend, FriendType type); + }; +} + +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetFriendList(); + GWCA_API void* GetFriendByIndex(uint32_t index); + GWCA_API void* GetFriendByUuid(const uint8_t* uuid); + GWCA_API void* GetFriendByName(const wchar_t* alias, const wchar_t* charname, uint32_t type); + GWCA_API uint32_t GetNumberOfFriends(uint32_t type); + GWCA_API uint32_t GetNumberOfIgnores(); + GWCA_API uint32_t GetNumberOfPartners(); + GWCA_API uint32_t GetNumberOfTraders(); + GWCA_API uint32_t GetMyStatus(); + GWCA_API bool SetFriendListStatus(uint32_t status); + GWCA_API bool AddFriend(const wchar_t* name, const wchar_t* alias); + GWCA_API bool AddIgnore(const wchar_t* name, const wchar_t* alias); + GWCA_API bool RemoveFriend(void* _friend); + GWCA_API bool ChangeFriendType(void* _friend, uint32_t type); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/GameThreadMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/GameThreadMgr.h new file mode 100644 index 00000000..4311ac1a --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/GameThreadMgr.h @@ -0,0 +1,44 @@ +#pragma once + +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> + +#ifndef EXCEPT_EXPRESSION_LOOP + #define EXCEPT_EXPRESSION_LOOP EXCEPTION_CONTINUE_SEARCH +#endif +namespace GW { + + struct Module; + extern Module GameThreadModule; + + namespace GameThread { + GWCA_API void EnableHooks(); + + GWCA_API void ClearCalls(); + + // force_enqueue = false; will check if we're already in the game thread, and run immediately if we are. + // force_enqueue = true; enqueue the function for the next loop regardless + GWCA_API void Enqueue(std::function<void ()> f, bool force_enqueue = false); + + typedef HookCallback<> GameThreadCallback; + GWCA_API void RegisterGameThreadCallback( + HookEntry *entry, + const GameThreadCallback& callback, + int altitude = 0x4000); + + GWCA_API void RemoveGameThreadCallback(HookEntry *entry); + + GWCA_API bool IsInGameThread(); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + typedef void(__cdecl* GW_GameThreadCallback)(); + typedef void(__cdecl* GW_GameThreadHookCallback)(GW::HookStatus* status); + GWCA_API void Enqueue(GW_GameThreadCallback callback, bool force_enqueue); + GWCA_API bool IsInGameThread(); + GWCA_API void RegisterGameThreadCallback(GW::HookEntry* entry, GW_GameThreadHookCallback callback, int altitude); + GWCA_API void RemoveGameThreadCallback(GW::HookEntry* entry); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/GuildMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/GuildMgr.h new file mode 100644 index 00000000..b916363e --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/GuildMgr.h @@ -0,0 +1,36 @@ +#pragma once +#include <GWCA/Utilities/Export.h> +namespace GW { + struct Guild; + struct GuildContext; + typedef Array<Guild*> GuildArray; + struct GHKey; + struct Module; + extern Module GuildModule; + namespace GuildMgr { + GWCA_API GuildArray* GetGuildArray(); + GWCA_API Guild* GetPlayerGuild(); + GWCA_API Guild* GetCurrentGH(); + GWCA_API Guild* GetGuildInfo(uint32_t guild_id); + GWCA_API uint32_t GetPlayerGuildIndex(); + GWCA_API wchar_t* GetPlayerGuildAnnouncement(); + GWCA_API wchar_t* GetPlayerGuildAnnouncer(); + GWCA_API bool TravelGH(); + GWCA_API bool TravelGH(GHKey key); + GWCA_API bool LeaveGH(); + }; +} + +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetPlayerGuild(); + GWCA_API void* GetCurrentGH(); + GWCA_API void* GetGuildInfo(uint32_t guild_id); + GWCA_API uint32_t GetPlayerGuildIndex(); + GWCA_API const wchar_t* GetPlayerGuildAnnouncement(); + GWCA_API const wchar_t* GetPlayerGuildAnnouncer(); + GWCA_API bool TravelGH(); + GWCA_API bool LeaveGH(); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/ItemMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/ItemMgr.h new file mode 100644 index 00000000..790f3402 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/ItemMgr.h @@ -0,0 +1,160 @@ +#pragma once + +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameEntities/Item.h> + +namespace GW { + + struct Bag; + struct Item; + struct Inventory; + + typedef Array<Item*> ItemArray; + + struct PvPItemUpgradeInfo; + struct PvPItemInfo; + struct CompositeModelInfo; + + namespace Constants { + enum class Bag : uint8_t; + enum class StoragePane : uint8_t; + enum class MaterialSlot : uint32_t; + } + + namespace UI { + namespace UIPacket { + struct kMouseAction; + } + } + + enum class EquipmentType : uint32_t { + Cape = 0x0, Helm = 0x2, CostumeBody = 0x4, CostumeHeadpiece = 0x6, Unknown = 0xff + }; + enum class EquipmentStatus : uint32_t { + AlwaysHide, HideInTownsAndOutposts, HideInCombatAreas, AlwaysShow + }; + + struct Module; + extern Module ItemModule; + + namespace Items { + GWCA_API SalvageSessionInfo* GetSalvageSessionInfo(); + GWCA_API ItemArray* GetItemArray(); + GWCA_API Inventory* GetInventory(); + GWCA_API Bag** GetBagArray(); + GWCA_API Bag* GetBag(Constants::Bag bag_id); + GWCA_API Bag* GetBagByIndex(uint32_t bag_index); + GWCA_API uint32_t GetMaterialStorageStackSize(); + GWCA_API Item* GetItemBySlot(const Bag* bag, uint32_t slot); + GWCA_API Item* GetHoveredItem(); + GWCA_API Item* GetItemById(uint32_t item_id); + GWCA_API bool UseItem(const Item* item); + GWCA_API bool EquipItem(const Item* item, uint32_t agent_id = 0); + GWCA_API bool DropItem(const Item* item, uint32_t quantity); + GWCA_API bool PingWeaponSet(uint32_t agent_id, uint32_t weapon_item_id, uint32_t offhand_item_id); + GWCA_API bool CanInteractWithItem(const Item* item); + GWCA_API bool PickUpItem(const Item* item, uint32_t call_target = 0); + GWCA_API bool OpenXunlaiWindow(bool anniversary_pane_unlocked = true, bool storage_pane_unlocked = true); + GWCA_API bool CanAccessXunlaiChest(); + GWCA_API bool DropGold(uint32_t amount = 1); + GWCA_API bool SalvageStart(uint32_t salvage_kit_id, uint32_t item_id); + GWCA_API bool IdentifyItem(uint32_t identification_kit_id, uint32_t item_id); + GWCA_API bool SalvageSessionCancel(); + GWCA_API bool DestroyItem(uint32_t item_id); + GWCA_API bool SalvageMaterials(); + GWCA_API uint32_t GetGoldAmountOnCharacter(); + GWCA_API uint32_t GetGoldAmountInStorage(); + GWCA_API uint32_t DepositGold(uint32_t amount = 0); + GWCA_API uint32_t WithdrawGold(uint32_t amount = 0); + GWCA_API bool MoveItem(const Item* from, Constants::Bag bag_id, uint32_t slot, uint32_t quantity = 0); + GWCA_API bool MoveItem(const Item* item, const Bag* bag, uint32_t slot, uint32_t quantity = 0); + GWCA_API bool MoveItem(const Item* from, const Item* to, uint32_t quantity = 0); + GWCA_API bool UseItemByModelId(uint32_t model_id, int bag_start = 1, int bag_end = 4); + GWCA_API uint32_t CountItemByModelId(uint32_t model_id, int bag_start = 1, int bag_end = 4); + GWCA_API Item* GetItemByModelId(uint32_t model_id, int bag_start = 1, int bag_end = 4); + GWCA_API Item* GetItemByModelIdAndModifiers(uint32_t modelid, const ItemModifier* modifiers, uint32_t modifiers_len, int bagStart = 1, int bagEnd = 4); + GWCA_API GW::Constants::StoragePane GetStoragePage(void); + GWCA_API bool GetIsStorageOpen(void); + typedef HookCallback<GW::UI::UIPacket::kMouseAction*, GW::Item*> ItemClickCallback; + GWCA_API void RegisterItemClickCallback(HookEntry* entry, const ItemClickCallback& callback); + GWCA_API void RemoveItemClickCallback(HookEntry* entry); + GWCA_API Constants::MaterialSlot GetMaterialSlot(const Item* item); + GWCA_API EquipmentStatus GetEquipmentVisibility(EquipmentType type); + GWCA_API bool SetEquipmentVisibility(EquipmentType type, EquipmentStatus state); + GWCA_API const BaseArray<PvPItemUpgradeInfo>& GetPvPItemUpgradesArray(); + GWCA_API const PvPItemUpgradeInfo* GetPvPItemUpgrade(uint32_t pvp_item_upgrade_idx); + GWCA_API const PvPItemInfo* GetPvPItemInfo(uint32_t pvp_item_idx); + GWCA_API const BaseArray<PvPItemInfo>& GetPvPItemInfoArray(); + GWCA_API const CompositeModelInfo* GetCompositeModelInfo(uint32_t model_file_id); + GWCA_API const BaseArray<CompositeModelInfo>& GetCompositeModelInfoArray(); + GWCA_API bool GetPvPItemUpgradeEncodedName(uint32_t pvp_item_upgrade_idx, wchar_t** out); + GWCA_API bool GetPvPItemUpgradeEncodedDescription(uint32_t pvp_item_upgrade_idx, wchar_t** out); + GWCA_API const ItemFormula* GetItemFormula(const GW::Item* item); + }; +} + +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + // Lookups + GWCA_API void* GetSalvageSessionInfo(); + GWCA_API void* GetInventory(); + GWCA_API void* GetBag(uint8_t bag_id); + GWCA_API void* GetBagByIndex(uint32_t bag_index); + GWCA_API void* GetItemBySlot(const void* bag, uint32_t slot); + GWCA_API void* GetHoveredItem(); + GWCA_API void* GetItemById(uint32_t item_id); + GWCA_API void* GetItemByModelId(uint32_t model_id, int bag_start, int bag_end); + GWCA_API void* GetItemFormula(const void* item); + GWCA_API uint32_t GetMaterialStorageStackSize(); + GWCA_API uint32_t GetMaterialSlot(const void* item); + GWCA_API uint32_t GetStoragePage(); + GWCA_API bool GetIsStorageOpen(); + + // Actions + GWCA_API bool UseItem(const void* item); + GWCA_API bool EquipItem(const void* item, uint32_t agent_id); + GWCA_API bool DropItem(const void* item, uint32_t quantity); + GWCA_API bool PickUpItem(const void* item, uint32_t call_target); + GWCA_API bool CanInteractWithItem(const void* item); + GWCA_API bool PingWeaponSet(uint32_t agent_id, uint32_t weapon_item_id, uint32_t offhand_item_id); + GWCA_API bool InteractAgent(const void* agent, bool call_target); + + // Item management + GWCA_API bool MoveItemToBag(const void* item, uint8_t bag_id, uint32_t slot, uint32_t quantity); + GWCA_API bool MoveItemToItem(const void* from, const void* to, uint32_t quantity); + GWCA_API bool UseItemByModelId(uint32_t model_id, int bag_start, int bag_end); + GWCA_API uint32_t CountItemByModelId(uint32_t model_id, int bag_start, int bag_end); + GWCA_API bool DestroyItem(uint32_t item_id); + + // Salvage / Identify + GWCA_API bool SalvageStart(uint32_t salvage_kit_id, uint32_t item_id); + GWCA_API bool SalvageSessionCancel(); + GWCA_API bool SalvageMaterials(); + GWCA_API bool IdentifyItem(uint32_t identification_kit_id, uint32_t item_id); + + // Gold + GWCA_API uint32_t GetGoldAmountOnCharacter(); + GWCA_API uint32_t GetGoldAmountInStorage(); + GWCA_API uint32_t DepositGold(uint32_t amount); + GWCA_API uint32_t WithdrawGold(uint32_t amount); + GWCA_API bool DropGold(uint32_t amount); + + // Storage + GWCA_API bool OpenXunlaiWindow(bool anniversary_pane_unlocked, bool storage_pane_unlocked); + GWCA_API bool CanAccessXunlaiChest(); + + // Equipment visibility + GWCA_API uint32_t GetEquipmentVisibility(uint32_t type); + GWCA_API bool SetEquipmentVisibility(uint32_t type, uint32_t state); + + // PvP items + GWCA_API const void* GetPvPItemUpgrade(uint32_t idx); + GWCA_API const void* GetPvPItemInfo(uint32_t idx); + GWCA_API const void* GetCompositeModelInfo(uint32_t model_file_id); + GWCA_API bool GetPvPItemUpgradeEncodedName(uint32_t idx, wchar_t** out); + GWCA_API bool GetPvPItemUpgradeEncodedDescription(uint32_t idx, wchar_t** out); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/MapMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/MapMgr.h new file mode 100644 index 00000000..d7b4cc11 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/MapMgr.h @@ -0,0 +1,196 @@ +#pragma once + +#include <GWCA/GameContainers/GamePos.h> + +#include <GWCA/Utilities/Export.h> +#include <GWCA/GameContainers/Array.h> + +namespace GW { + + struct AreaInfo; + struct PathingMap; + struct MissionMapIcon; + enum class Continent : uint32_t; + + typedef Array<PathingMap> PathingMapArray; + typedef Array<MissionMapIcon> MissionMapIconArray; + + struct MapContext; + + namespace Constants { + enum class MapID : uint32_t; + enum class District; + enum class InstanceType; + enum class Language; + enum class ServerRegion; + } + + enum class RegionType : uint32_t; + struct MapTypeInstanceInfo { + uint32_t request_instance_map_type; // Used for auth server + bool is_outpost; + RegionType map_region_type; + }; + struct Module; + extern Module MapModule; + struct MissionMapSubContext { + uint32_t h0000[0xe]; // Could be 0x38, 0x3C or 0x68 depending on if observing etc. + }; + struct MissionMapSubContext2 { + uint32_t h0000; + Vec2f player_mission_map_pos; + uint32_t h000c; + GW::Vec2f mission_map_size; + float unk; + GW::Vec2f mission_map_pan_offset; + GW::Vec2f mission_map_pan_offset2; + float unk2[2]; + uint32_t unk3[9]; + }; + static_assert(sizeof(MissionMapSubContext2) == 0x58); + + struct MissionMapContext { + GW::Vec2f size; // Dimensions of the drawable area inside the mission map frame + uint32_t h0008; + GW::Vec2f last_mouse_location; // Percentage offset (-1.f to 1.f) relative to player_mission_map_pos + uint32_t frame_id; + GW::Vec2f player_mission_map_pos; // Position of player on the top down view of mission map (not in gwinches). Mission map centers on this point + GW::Array<MissionMapSubContext*> h0020; + uint32_t h0030; + uint32_t h0034; + uint32_t h0038; + MissionMapSubContext2* h003c; + uint32_t h0040; + uint32_t h0044; + }; + static_assert(sizeof(MissionMapContext) == 0x48); + + struct WorldMapContext { + uint32_t frame_id; + GW::Continent continent; + uint32_t h0008; + float h000c; + float h0010; + uint32_t h0014; + float h0018; + float h001c; + float h0020; + float h0024; + float h0028; + float h002c; + float h0030; + float h0034; + float zoom; // 1.0f if zoomed in, 0.0f if zoomed out + GW::Vec2f top_left; // Viewport position relative to world map, start + GW::Vec2f bottom_right; // Viewport position relative to world map, end + uint32_t h004c[7]; + float h0068; + float h006c; + uint32_t params[0x6d]; + }; + static_assert(sizeof(WorldMapContext) == 0x224); + + namespace Map { + + + GWCA_API MissionMapContext* GetMissionMapContext(); + + GWCA_API WorldMapContext* GetWorldMapContext(); + + // Allows you to load map geometry/pathing/props from the DAT file if you know a map's file_id. Be sure to call DestroyMapContext later to avoid a mem leak + GWCA_API MapContext* CreateMapContext(uint32_t map_file_id); + + // Call this to free a MapContext created via CreateMapContext + GWCA_API bool DestroyMapContext(MapContext*); + + GWCA_API float QueryAltitude(const GamePos* pos, float radius = 5.f, GW::MapContext* context = 0); + + GWCA_API bool GetIsMapLoaded(); + + // Get current map ID. + GWCA_API Constants::MapID GetMapID(); + + // Get current region you are in. + GWCA_API bool GetIsMapUnlocked(Constants::MapID map_id); + + // Get current region you are in. + GWCA_API GW::Constants::ServerRegion GetRegion(); + + // Get current language you are in. + GWCA_API GW::Constants::Language GetLanguage(); + + // Get whether current character is observing a match + GWCA_API bool GetIsObserving(); + + // Get the district number you are in. + GWCA_API int GetDistrict(); + + // Get time, in ms, since the instance you are residing in has been created. + GWCA_API uint32_t GetInstanceTime(); + + // Get the instance type (Outpost, Explorable or Loading) + GWCA_API Constants::InstanceType GetInstanceType(); + + // Travel to specified outpost. + GWCA_API bool Travel(Constants::MapID map_id, GW::Constants::ServerRegion region, int district_number = 0, GW::Constants::Language language = (GW::Constants::Language)0); + + GWCA_API bool Travel(Constants::MapID map_id, Constants::District district = (Constants::District)0, int district_number = 0); + + GWCA_API Constants::ServerRegion RegionFromDistrict(const GW::Constants::District _district); + + GWCA_API Constants::Language LanguageFromDistrict(const GW::Constants::District _district); + + // Returns array of icons (res shrines, quarries, traders, etc) on mission map. + // Look at MissionMapIcon struct for more info. + GWCA_API MissionMapIconArray* GetMissionMapIconArray(); + + // Returns pointer of collision trapezoid array. + GWCA_API PathingMapArray* GetPathingMap(); + + GWCA_API uint32_t GetFoesKilled(); + GWCA_API uint32_t GetFoesToKill(); + + GWCA_API AreaInfo *GetMapInfo(Constants::MapID map_id = (Constants::MapID)0); + + inline AreaInfo *GetCurrentMapInfo() { + Constants::MapID map_id = GetMapID(); + return GetMapInfo(map_id); + } + + GWCA_API bool GetIsInCinematic(); + GWCA_API bool SkipCinematic(); + + GWCA_API bool EnterChallenge(); + GWCA_API bool CancelEnterChallenge(); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API void* GetMissionMapContext(); + GWCA_API void* GetWorldMapContext(); + GWCA_API void* CreateMapContext(uint32_t map_file_id); + GWCA_API bool DestroyMapContext(void* context); + GWCA_API float QueryAltitude(const float* x, const float* y, float radius, void* context); + GWCA_API bool GetIsMapLoaded(); + GWCA_API uint32_t GetMapID(); + GWCA_API bool GetIsMapUnlocked(uint32_t map_id); + GWCA_API uint32_t GetRegion(); + GWCA_API uint32_t GetLanguage(); + GWCA_API bool GetIsObserving(); + GWCA_API int GetDistrict(); + GWCA_API uint32_t GetInstanceTime(); + GWCA_API uint32_t GetInstanceType(); + GWCA_API bool TravelByRegion(uint32_t map_id, uint32_t region, int district_number, uint32_t language); + GWCA_API bool TravelByDistrict(uint32_t map_id, uint32_t district, int district_number); + GWCA_API uint32_t RegionFromDistrict(uint32_t district); + GWCA_API uint32_t LanguageFromDistrict(uint32_t district); + GWCA_API uint32_t GetFoesKilled(); + GWCA_API uint32_t GetFoesToKill(); + GWCA_API void* GetMapInfo(uint32_t map_id); + GWCA_API bool GetIsInCinematic(); + GWCA_API bool SkipCinematic(); + GWCA_API bool EnterChallenge(); + GWCA_API bool CancelEnterChallenge(); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/MemoryMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/MemoryMgr.h new file mode 100644 index 00000000..ffc98d79 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/MemoryMgr.h @@ -0,0 +1,31 @@ +#pragma once + +namespace GW { + + struct HookEntry; + struct Module; + extern Module MemoryMgrModule; + + namespace MemoryMgr { + + GWCA_API uint32_t GetGWVersion(); + + GWCA_API DWORD GetSkillTimer(); + + GWCA_API bool GetPersonalDir(size_t buf_len, wchar_t* buf); + + GWCA_API HWND GetGWWindowHandle(); + + // You probably don't want to use these functions. These are for allocating + // memory on the Guild Wars game heap, rather than your own heap. Memory allocated with + // these functions cannot be used with RAII and must be manually freed. USE AT YOUR OWN RISK. + GWCA_API void* MemAlloc(size_t size); + GWCA_API void* MemRealloc(void* buf, size_t newSize); + GWCA_API void MemFree(void* buf); + + HMODULE GetModuleForPointer(void* ptr, bool refresh = false); + + void RemoveFreeLibraryCallback(GW::HookEntry*); + void RegisterFreeLibraryCallback(GW::HookEntry*, std::function<void(HMODULE)>); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/MerchantMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/MerchantMgr.h new file mode 100644 index 00000000..1c956af2 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/MerchantMgr.h @@ -0,0 +1,55 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> +#include <GWCA/GameContainers/Array.h> + +namespace GW { + + struct Module; + extern Module MerchantModule; + + typedef uint32_t ItemID; + typedef Array<ItemID> MerchItemArray; + + struct Item; + + namespace Merchant { + + struct TransactionInfo { + uint32_t item_count = 0; + uint32_t *item_ids = nullptr; + uint32_t *item_quantities = nullptr; + }; + + struct QuoteInfo { + uint32_t unknown = 0; + uint32_t item_count = 0; + uint32_t *item_ids = nullptr; + }; + + enum class TransactionType : uint32_t { + AccountName, + MerchantBuy, + CollectorBuy, + CrafterBuy, + WeaponsmithCustomize, + Services, + DonateFaction, + Unused, + GuildRegistration, + GuildCape, + SkillTrainer, + MerchantSell, + TraderBuy, + TraderSell, + UnlockHero, + UnlockItem, + UnlockSkill + }; + GWCA_API bool TransactItems(); + + GWCA_API bool RequestQuote(TransactionType type, uint32_t item_id); + + GWCA_API size_t GetMerchantItems(TransactionType type, size_t buffer_len = 0, uint32_t* buffer = 0); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/Module.h b/Dependencies/GWCA/Include/GWCA/Managers/Module.h new file mode 100644 index 00000000..bbde8281 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/Module.h @@ -0,0 +1,16 @@ +#pragma once + +namespace GW { + struct Module { + const char *name; + void *param; + + void (*init_module)(); + void (*exit_module)(); + + // Call those from game thread to be safe + // Do not free trampoline + void (*enable_hooks)(); + void (*disable_hooks)(); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/PartyMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/PartyMgr.h new file mode 100644 index 00000000..c0612462 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/PartyMgr.h @@ -0,0 +1,108 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + struct GamePos; + struct PartyInfo; + struct PartySearch; + struct PetInfo; + struct HeroInfo; + struct HeroConstData; + + struct Attribute; + enum class HeroBehavior : uint32_t; + + typedef uint32_t AgentID; + + struct Module; + extern Module PartyModule; + namespace Constants { + enum HeroID : uint32_t; + } + + namespace PartyMgr { + + // set or unset the fact that ticking will work as a toggle instead + // of showing a drop-down menu + + GWCA_API void SetTickToggle(bool enable); + + // Set party ready status. + GWCA_API bool Tick(bool flag = true); + + GWCA_API Attribute* GetAgentAttributes(uint32_t agent_id); + + GWCA_API PartySearch* GetPartySearch(uint32_t party_search_id = 0); + + GWCA_API PartyInfo *GetPartyInfo(uint32_t party_id = 0); + + GWCA_API uint32_t GetPartySize(); + GWCA_API uint32_t GetPartyPlayerCount(); + GWCA_API uint32_t GetPartyHeroCount(); + GWCA_API uint32_t GetPartyHenchmanCount(); + + GWCA_API bool GetIsPartyDefeated(); + + GWCA_API bool SetHardMode(bool flag); + + // When defeated, tell the client to return to outpost. + GWCA_API bool ReturnToOutpost(); + + GWCA_API bool GetIsPartyInHardMode(); + + GWCA_API bool GetIsHardModeUnlocked(); + + // check if the whole party is ticked + GWCA_API bool GetIsPartyTicked(); + + // check if selected party member is ticked + GWCA_API bool GetIsPlayerTicked(uint32_t player_index = -1); + + // check if the whole party is loaded + GWCA_API bool GetIsPartyLoaded(); + + // returns if the player agent is leader + GWCA_API bool GetIsLeader(); + + // Accept or reject a party invitation via party window + GWCA_API bool RespondToPartyRequest(uint32_t party_id, bool accept); + + GWCA_API bool LeaveParty(); + + // hero managment + GWCA_API bool AddHero(GW::Constants::HeroID heroid); + GWCA_API bool KickHero(GW::Constants::HeroID heroid); + GWCA_API bool KickAllHeroes(); + GWCA_API bool AddHenchman(uint32_t agent_id); + GWCA_API bool KickHenchman(uint32_t agent_id); + GWCA_API bool InvitePlayer(uint32_t player_id); + GWCA_API bool InvitePlayer(const wchar_t* player_name); + GWCA_API bool KickPlayer(uint32_t player_id); + + // hero flagging + GWCA_API bool FlagHero(uint32_t hero_index, GamePos pos); + GWCA_API bool UnflagHero(uint32_t hero_index); + + GWCA_API bool FlagAll(GamePos pos); + GWCA_API bool UnflagAll(); + GWCA_API bool SetHeroTarget(uint32_t hero_agent_id, uint32_t target_agent_id = 0); + GWCA_API bool SetHeroBehavior(uint32_t hero_agent_id, HeroBehavior behavior); + GWCA_API bool SetPetBehavior(uint32_t owner_agent_id, HeroBehavior behavior); + + GWCA_API PetInfo* GetPetInfo(uint32_t owner_agent_id = 0); + + GWCA_API uint32_t GetHeroAgentID(uint32_t hero_index); + + GWCA_API HeroInfo* GetHeroInfo(GW::Constants::HeroID hero_id); + + GWCA_API HeroConstData* GetHeroConstData(GW::Constants::HeroID hero_id); + + // Advertise your party in party search window + GWCA_API bool SearchParty(uint32_t search_type, const wchar_t* advertisement = nullptr); + // Cancel party advertisement + GWCA_API bool SearchPartyCancel(); + // Accept or reject a party invitation via party search window + GWCA_API bool SearchPartyReply(uint32_t party_search_id, bool accept); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/PlayerMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/PlayerMgr.h new file mode 100644 index 00000000..f18d70e8 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/PlayerMgr.h @@ -0,0 +1,72 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + + typedef uint32_t PlayerNumber; + + struct Player; + struct Title; + struct TitleClientData; + typedef Array<Player> PlayerArray; + + namespace Constants { + enum class TitleID : uint32_t; + enum class Profession: uint32_t; + enum class QuestID : uint32_t; + } + + struct Module; + extern Module PlayerModule; + + namespace PlayerMgr { + + GWCA_API bool SetActiveTitle(Constants::TitleID title_id); + + GWCA_API bool RemoveActiveTitle(); + + GWCA_API uint32_t GetPlayerAgentId(uint32_t player_id); + + GWCA_API uint32_t GetAmountOfPlayersInInstance(); + + GWCA_API PlayerArray* GetPlayerArray(); + + // Get the player number of the currently logged in character + GWCA_API PlayerNumber GetPlayerNumber(); + + GWCA_API Player *GetPlayerByID(uint32_t player_id = 0); + + GWCA_API wchar_t *GetPlayerName(uint32_t player_id = 0); + + GWCA_API wchar_t* SetPlayerName(uint32_t player_id, const wchar_t *replace_name); + + GWCA_API bool ChangeSecondProfession(Constants::Profession prof, uint32_t hero_index = 0); + + GWCA_API Player *GetPlayerByName(const wchar_t *name); + + // Get the current progress of a title by id. If the title has no progress, this function will return nullptr + GWCA_API Title* GetTitleTrack(Constants::TitleID title_id); + + GWCA_API Constants::TitleID GetActiveTitleId(); + + GWCA_API Title* GetActiveTitle(); + + GWCA_API TitleClientData* GetTitleData(Constants::TitleID title_id); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API bool SetActiveTitle(uint32_t title_id); + GWCA_API bool RemoveActiveTitle(); + GWCA_API uint32_t GetPlayerAgentId(uint32_t player_id); + GWCA_API uint32_t GetPlayerNumber(); + GWCA_API const wchar_t* SetPlayerName(uint32_t player_id, const wchar_t* replace_name); + GWCA_API bool ChangeSecondProfession(uint32_t profession, uint32_t hero_index); + GWCA_API void* GetTitleTrack(uint32_t title_id); + GWCA_API uint32_t GetActiveTitleId(); + GWCA_API void* GetActiveTitle(); + GWCA_API void* GetTitleData(uint32_t title_id); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/QuestMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/QuestMgr.h new file mode 100644 index 00000000..a439dd6c --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/QuestMgr.h @@ -0,0 +1,60 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + + struct Quest; + typedef Array<Quest> QuestLog; + + namespace Constants { + enum class QuestID : uint32_t; + enum class Profession: uint32_t; + } + + struct Module; + extern Module QuestModule; + + namespace QuestMgr { + + GWCA_API GW::Constants::QuestID GetActiveQuestId(); + + GWCA_API bool SetActiveQuestId(Constants::QuestID quest_id); + + GWCA_API Quest* GetActiveQuest(); + + GWCA_API bool SetActiveQuest(Quest* quest); + + GWCA_API bool AbandonQuest(Quest* quest); + + GWCA_API bool AbandonQuestId(Constants::QuestID quest_id); + + GWCA_API QuestLog* GetQuestLog(); + + GWCA_API Quest* GetQuest(GW::Constants::QuestID); + + // Find and populate a wchar_t* buffer with the encoded name of the category the quest belongs to in the quest log. Returns false on failure. + GWCA_API bool GetQuestEntryGroupName(GW::Constants::QuestID quest_id, wchar_t* out, size_t out_len); + + GWCA_API bool RequestQuestInfo(const Quest* quest, bool update_markers=false); + + GWCA_API bool RequestQuestInfoId(Constants::QuestID quest_id, bool update_markers=false); + + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API uint32_t GetActiveQuestId(); + GWCA_API bool SetActiveQuestId(uint32_t quest_id); + GWCA_API void* GetActiveQuest(); + GWCA_API bool SetActiveQuest(void* quest); + GWCA_API bool AbandonQuest(void* quest); + GWCA_API bool AbandonQuestId(uint32_t quest_id); + GWCA_API void* GetQuest(uint32_t quest_id); + GWCA_API bool GetQuestEntryGroupName(uint32_t quest_id, wchar_t* out, uint32_t out_len); + GWCA_API bool RequestQuestInfo(const void* quest, bool update_markers); + GWCA_API bool RequestQuestInfoId(uint32_t quest_id, bool update_markers); + GWCA_API void* GetQuestLog(size_t* count); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/RenderMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/RenderMgr.h new file mode 100644 index 00000000..93d1f730 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/RenderMgr.h @@ -0,0 +1,123 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +// forward declaration, we don't need to include the full directx header here +struct IDirect3DDevice9; + +namespace GW { + + struct Module; + extern Module RenderModule; + + namespace Render { + + typedef void(__cdecl* RenderCallback) (IDirect3DDevice9*); + + typedef struct Mat4x3f { + float _11; + float _12; + float _13; + float _14; + float _21; + float _22; + float _23; + float _24; + float _31; + float _32; + float _33; + float _34; + + + enum Flags { + Shear = 1 << 3 + }; + + uint32_t flags; + } Mat4x3f; + + enum Transform : int { + TRANSFORM_PROJECTION_MATRIX = 0, + TRANSFORM_MODEL_MATRIX = 1, + // TODO: + TRANSFORM_COUNT = 5 + }; + + enum Metric : uint32_t { + Metric0, + Metric1, + Metric2, + Metric3, + FullscreenGamma, + MultiSampling, + PosX, + PosY, + RefreshRate, + ShaderQuality, + SizeX, + SizeY, + TextureFiltering, + Metric13, + Metric14, + Vsync, + ScreenBorderless, + Metric17, + Metric18, + Metric19, + Metric20, + Metric21, + MonitorRefreshRate, + TextureMaxCX, + TextureMaxCY, + Metric25, + Count + }; + + // Careful, this doesn't return correct values if you have the U mission map, or other things open + // prefer to calculate the transformation matrix yourself using Render::GetFieldOfView() + [[deprecated]] GWCA_API Mat4x3f* GetTransform(Transform transform); + + GWCA_API void EnableHooks(); + + // this returns the FoV used for rendering + GWCA_API float GetFieldOfView(); + + // Set up a callback for drawing on screen. + // Will be called after GW render. + // + // Important: if you use this, you should call GW::Terminate() + // or at least GW::Render::RestoreHooks() from within the callback + GWCA_API void SetRenderCallback(RenderCallback callback); + + GWCA_API RenderCallback GetRenderCallback(); + + // Can be used to get information like vsync status or monitor refresh rate of the renderer + GWCA_API uint32_t GetGraphicsRendererValue(Metric metric_id, uint32_t renderer_mode = 0xf); + GWCA_API bool SetGraphicsRendererValue(Metric metric_id, uint32_t value, uint32_t renderer_mode = 0xf); + + // Returns actual hard frame limit, factoring in vsync, monitor refresh rate and in-game preferences + GWCA_API uint32_t GetFrameLimit(); + // Set a hard upper limit for frame rate. Actual limit may be lower (but not higher) depending on vsync/in-game preference + GWCA_API bool SetFrameLimit(uint32_t value); + + // Set up a callback for directx device reset + GWCA_API void SetResetCallback(RenderCallback callback); + + // Check if gw is in fullscreen + // Note: requires one or both callbacks to be set and called before + // Note: does not update while minimized + // Note: returns -1 if it doesn't know yet + GWCA_API int GetIsFullscreen(); + + GWCA_API bool SetFog(bool enabled); + + GWCA_API HWND GetWindowHandle(); + + GWCA_API IDirect3DDevice9* GetDevice(); + + GWCA_API bool GetIsInRenderLoop(); + + GWCA_API uint32_t GetViewportWidth(); + GWCA_API uint32_t GetViewportHeight(); + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/SkillbarMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/SkillbarMgr.h new file mode 100644 index 00000000..324faa17 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/SkillbarMgr.h @@ -0,0 +1,98 @@ +#pragma once + +#include <GWCA/GameContainers/Array.h> +#include <GWCA/Utilities/Export.h> + +namespace GW { + + namespace Constants { + enum class SkillID : uint32_t; + enum class Attribute : uint32_t; + enum class Profession: uint32_t; + } + + struct Skill; + struct AttributeInfo; + struct Skillbar; + + typedef Array<Skillbar> SkillbarArray; + + struct Module; + extern Module SkillbarModule; + + namespace SkillbarMgr { + struct Attribute { + Constants::Attribute attribute = (Constants::Attribute)0xFF; + uint32_t points{}; + }; + struct SkillTemplate { + Constants::Profession primary{}; + Constants::Profession secondary{}; + uint32_t attributes_count; + Constants::Attribute attribute_ids[12]; + uint32_t attribute_values[12]; + Constants::SkillID skills[8]{}; + }; + static_assert(sizeof(SkillTemplate) == 140); + + // Get the skill slot in the player bar of the player. + // Returns -1 if the skill is not there + GWCA_API int GetSkillSlot(Constants::SkillID skill_id); + + // Use Skill in slot (Slot) on (Agent), optionally call that you are using said skill. + GWCA_API bool UseSkill(uint32_t slot, uint32_t target = 0); + + // Send raw packet to use skill with ID (SkillID). + // Same as above except the skillbar client struct will not be registered as casting. + GWCA_API bool UseSkillByID(uint32_t skill_id, uint32_t target = 0); + + // Get skill structure of said id, houses pretty much everything you would want to know about the skill. + GWCA_API Skill* GetSkillConstantData(Constants::SkillID skill_id); + + // Name/Description/Profession etc for an attribute by id + GWCA_API AttributeInfo* GetAttributeConstantData(Constants::Attribute attribute_id); + + // Get array of skillbars, [0] = player [1-7] = heroes. + GWCA_API SkillbarArray* GetSkillbarArray(); + GWCA_API Skillbar* GetPlayerSkillbar(); + GWCA_API Skillbar* GetSkillbar(const uint32_t agent_id); + GWCA_API Skillbar* GetHeroSkillbar(uint32_t hero_index); + GWCA_API Skill* GetHoveredSkill(); + GWCA_API bool GetSkillTemplate(uint32_t agent_id, SkillTemplate& skill_template); + + // Whether this skill is unlocked at account level, not necessarily learnt by the current character + GWCA_API bool GetIsSkillUnlocked(Constants::SkillID skill_id); + // Whether the current character has learnt this skill + GWCA_API bool GetIsSkillLearnt(Constants::SkillID skill_id); + + GWCA_API bool ChangeSecondProfession(uint32_t agent_id, Constants::Profession profession); + GWCA_API bool DecodeSkillTemplate(SkillTemplate& skill_template, const char *temp); + GWCA_API bool EncodeSkillTemplate(const SkillTemplate& skill_template, char* result, size_t result_len); + + + GWCA_API bool LoadSkillTemplate(uint32_t agent_id, const char *temp); + GWCA_API bool LoadSkillTemplate(uint32_t agent_id, SkillTemplate& skill_template); + + GWCA_API bool LoadSkillTemplate(SkillTemplate& skill_template); + GWCA_API bool LoadSkillTemplate(const char* temp); + GWCA_API bool GetSkillTemplate(SkillTemplate& skill_template); + } +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API int GetSkillSlot(uint32_t skill_id); + GWCA_API bool UseSkill(uint32_t slot, uint32_t target); + GWCA_API bool UseSkillByID(uint32_t skill_id, uint32_t target); + GWCA_API void* GetSkillConstantData(uint32_t skill_id); + GWCA_API void* GetAttributeConstantData(uint32_t attribute_id); + GWCA_API void* GetPlayerSkillbar(); + GWCA_API void* GetSkillbar(uint32_t agent_id); + GWCA_API void* GetHeroSkillbar(uint32_t hero_index); + GWCA_API void* GetHoveredSkill(); + GWCA_API bool GetIsSkillUnlocked(uint32_t skill_id); + GWCA_API bool GetIsSkillLearnt(uint32_t skill_id); + GWCA_API bool LoadSkillTemplateForAgent(uint32_t agent_id, const char* skill_template); + GWCA_API bool LoadSkillTemplateString(const char* skill_template); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/StoCMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/StoCMgr.h new file mode 100644 index 00000000..51b9f04b --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/StoCMgr.h @@ -0,0 +1,89 @@ +#pragma once + +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> + +namespace GW { + + /* + StoC Manager + See https://github.com/GameRevision/GWLP-R/wiki/GStoC for some already explored packets. + */ + + namespace Packet { + namespace StoC { + struct PacketBase; + + template <typename T> + struct Packet; + } + } + + struct Module; + extern Module StoCModule; + + namespace StoC { + typedef HookCallback<Packet::StoC::PacketBase *> PacketCallback; + // Register a function to be called when a packet is received. + // An altitude of 0 or less will be triggered before the packet is processed. + // An altitude greater than 0 will be triggered after the packet has been processed. + GWCA_API bool RegisterPacketCallback( + HookEntry *entry, + uint32_t header, + const PacketCallback& callback, + int altitude = -0x8000); + + // @Deprecated: use RegisterPacketCallback with a positive altitude instead. + GWCA_API bool RegisterPostPacketCallback( + HookEntry* entry, + uint32_t header, + const PacketCallback& callback); + + /* Use this to add handlers to the stocmgr, primary function. */ + template <typename T> + bool RegisterPacketCallback(HookEntry *entry, const HookCallback<T*>& handler, int altitude = -0x8000) { + uint32_t header = Packet::StoC::Packet<T>::STATIC_HEADER; + return RegisterPacketCallback(entry, header, + [handler](HookStatus *status, Packet::StoC::PacketBase *pak) -> void { + return handler(status, static_cast<T *>(pak)); + }, altitude); + } + + + // @Deprecated: use RegisterPacketCallback with a positive altitude instead. + template <typename T> + bool RegisterPostPacketCallback(HookEntry* entry, const HookCallback<T*>& handler) { + uint32_t header = Packet::StoC::Packet<T>::STATIC_HEADER; + return RegisterPostPacketCallback(entry, header, + [handler](HookStatus* status, Packet::StoC::PacketBase* pak) -> void { + return handler(status, static_cast<T*>(pak)); + }); + } + + GWCA_API size_t RemoveCallback(uint32_t header, HookEntry *entry); + GWCA_API size_t RemoveCallbacks(HookEntry *entry); + + template <typename T> + void RemoveCallback(HookEntry* entry) { + uint32_t header = Packet::StoC::Packet<T>::STATIC_HEADER; + RemoveCallback(header, entry); + } + + // @Deprecated: use RegisterPacketCallback with a positive altitude instead. + GWCA_API void RemovePostCallback(uint32_t header, HookEntry* entry); + + template <typename T> + void RemovePostCallback(HookEntry* entry) { + uint32_t header = Packet::StoC::Packet<T>::STATIC_HEADER; + RemovePostCallback(header, entry); + } + + GWCA_API bool EmulatePacket(Packet::StoC::PacketBase *packet); + + template <typename T> + bool EmulatePacket(Packet::StoC::Packet<T> *packet) { + packet->header = Packet::StoC::Packet<T>::STATIC_HEADER; + return EmulatePacket((Packet::StoC::PacketBase *)packet); + } + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Managers/TradeMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/TradeMgr.h new file mode 100644 index 00000000..05b3c973 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/TradeMgr.h @@ -0,0 +1,36 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + struct Module; + extern Module TradeModule; + struct TradeItem; + + namespace Trade { + + GWCA_API bool OpenTradeWindow(uint32_t agent_id); + GWCA_API bool AcceptTrade(); + GWCA_API bool CancelTrade(); + GWCA_API bool ChangeOffer(); + GWCA_API bool SubmitOffer(uint32_t gold); + GWCA_API bool RemoveItem(uint32_t slot); + GWCA_API TradeItem* IsItemOffered(uint32_t item_id); + + // Passing quantity = 0 will prompt the player for the amount + GWCA_API bool OfferItem(uint32_t item_id, uint32_t quantity = 0); + }; +} +// ============================================================ +// C Interop API +// ============================================================ +extern "C" { + GWCA_API bool OpenTradeWindow(uint32_t agent_id); + GWCA_API bool AcceptTrade(); + GWCA_API bool CancelTrade(); + GWCA_API bool ChangeOffer(); + GWCA_API bool SubmitOffer(uint32_t gold); + GWCA_API bool OfferItem(uint32_t item_id, uint32_t quantity = 0); + GWCA_API bool RemoveOfferedItem(uint32_t slot); + GWCA_API void* IsItemOffered(uint32_t item_id); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Managers/UIMgr.h b/Dependencies/GWCA/Include/GWCA/Managers/UIMgr.h new file mode 100644 index 00000000..95088147 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Managers/UIMgr.h @@ -0,0 +1,938 @@ +#pragma once + +#include <GWCA/Utilities/Hook.h> +#include <GWCA/Utilities/Export.h> +#include <GWCA/GameContainers/Array.h> +#include <GWCA/GameContainers/List.h> +#include <GWCA/GameContainers/GamePos.h> +#include <GWCA/Managers/MerchantMgr.h> + +#include <GWCA/Constants/UIMessages.h> + +namespace GW { + + struct Module; + extern Module UIModule; + + struct Effect; + struct Vec2f; + + enum class CallTargetType : uint32_t; + enum class WorldActionId : uint32_t; + typedef uint32_t AgentID; + + namespace Merchant { + enum class TransactionType : uint32_t; + } + namespace Constants { + enum class Language; + enum class MapID : uint32_t; + enum class QuestID : uint32_t; + enum class SkillID : uint32_t; + } + namespace Chat { + enum Channel : int; + typedef uint32_t Color; + } + namespace SkillbarMgr { + struct SkillTemplate; + } + namespace UI { + struct TooltipInfo; + typedef GW::Array<unsigned char> ArrayByte; + + enum class UIMessage : uint32_t; + + struct CompassPoint { + CompassPoint() : x(0), y(0) {} + CompassPoint(int _x, int _y) : x(_x), y(_y) {} + int x; + int y; + }; + + typedef void(__cdecl* DecodeStr_Callback)(void* param, const wchar_t* s); + + struct ChatTemplate { + uint32_t agent_id; + uint32_t type; // 0 = build, 1 = equipment + Array<wchar_t> code; + wchar_t *name; + }; + + struct UIChatMessage { + uint32_t channel; + wchar_t* message; + uint32_t channel2; + }; + + struct InteractionMessage { + uint32_t frame_id; + UI::UIMessage message_id; // Same as UIMessage from UIMgr, but includes things like mouse move, click etc + void** wParam; + }; + + typedef void(__cdecl* UIInteractionCallback)(InteractionMessage* message, void* wParam, void* lParam); + typedef void(__fastcall* UICtlCallback)(void* frame_context, void* wParam, void* lParam); + + struct Frame; + + struct FrameRelation { + FrameRelation* parent; + uint32_t field67_0x124; + uint32_t field68_0x128; + uint32_t frame_hash_id; + TList<FrameRelation> siblings; + GWCA_API Frame* GetFrame(); + GWCA_API Frame* GetParent() const; + }; + + static_assert(sizeof(FrameRelation) == 0x1c); + + struct FramePosition { + uint32_t flags; + float left; + float bottom; + float right; + float top; + + float content_left; + float content_bottom; + float content_right; + float content_top; + + float unk; + float scale_factor; // Depends on UI scale + float viewport_width; // Width in px of available screen height; this may sometimes be scaled down, too! + float viewport_height; // Height in px of available screen height; this may sometimes be scaled down, too! + + float screen_left; + float screen_bottom; + float screen_right; + float screen_top; + + GWCA_API [[nodiscard]] GW::Vec2f GetTopLeftOnScreen(const Frame* frame = nullptr) const; + GWCA_API [[nodiscard]] GW::Vec2f GetBottomRightOnScreen(const Frame* frame = nullptr) const; + GWCA_API [[nodiscard]] GW::Vec2f GetContentTopLeft(const Frame* frame = nullptr) const; + GWCA_API [[nodiscard]] GW::Vec2f GetContentBottomRight(const Frame* frame = nullptr) const; + GWCA_API [[nodiscard]] GW::Vec2f GetSizeOnScreen(const Frame* frame = nullptr) const; + GWCA_API [[nodiscard]] GW::Vec2f GetViewportScale(const Frame* frame = nullptr) const; + }; + + struct FrameInteractionCallback { + UIInteractionCallback callback; + void* uictl_context; + uint32_t h0008; + }; + + struct Frame { + uint32_t field1_0x0; + uint32_t field2_0x4; + uint32_t frame_layout; + uint32_t field3_0xc; + uint32_t field4_0x10; + uint32_t field5_0x14; + uint32_t visibility_flags; + uint32_t field7_0x1c; + uint32_t type; + uint32_t template_type; + uint32_t field10_0x28; + uint32_t field11_0x2c; + uint32_t field12_0x30; + uint32_t field13_0x34; + uint32_t field14_0x38; + uint32_t field15_0x3c; + uint32_t field16_0x40; + uint32_t field17_0x44; + uint32_t field18_0x48; + uint32_t field19_0x4c; + uint32_t field20_0x50; + uint32_t field21_0x54; + uint32_t field22_0x58; + uint32_t field23_0x5c; + uint32_t field24_0x60; + uint32_t field24a_0x64; + uint32_t field24b_0x68; + uint32_t field25_0x6c; + uint32_t field26_0x70; + uint32_t field27_0x74; + uint32_t field28_0x78; + uint32_t field29_0x7c; + uint32_t field30_0x80; + GW::Array<void*> field31_0x84; + uint32_t field32_0x94; + uint32_t field33_0x98; + uint32_t field34_0x9c; + uint32_t field35_0xa0; + uint32_t field36_0xa4; + GW::Array<FrameInteractionCallback> frame_callbacks; + uint32_t child_offset_id; // Offset of this child in relation to its parent + uint32_t frame_id; // Offset in the global frame array + uint32_t field40_0xc0; + uint32_t field41_0xc4; + uint32_t field42_0xc8; + uint32_t field43_0xcc; + uint32_t field44_0xd0; + uint32_t field45_0xd4; + FramePosition position; + uint32_t field63_0x11c; + uint32_t field64_0x120; + uint32_t field65_0x124; + FrameRelation relation; + uint32_t field73_0x144; + uint32_t field74_0x148; + uint32_t field75_0x14c; + uint32_t field76_0x150; + uint32_t field77_0x154; + uint32_t field78_0x158; + uint32_t field79_0x15c; + uint32_t field80_0x160; + uint32_t field81_0x164; + uint32_t field82_0x168; + uint32_t field83_0x16c; + uint32_t field84_0x170; + uint32_t field85_0x174; + uint32_t field86_0x178; + uint32_t field87_0x17c; + uint32_t field88_0x180; + uint32_t field89_0x184; + uint32_t field90_0x188; + uint32_t frame_state; + uint32_t field92_0x190; + uint32_t field93_0x194; + uint32_t field94_0x198; + uint32_t field95_0x19c; + uint32_t field96_0x1a0; + uint32_t field97_0x1a4; + uint32_t field98_0x1a8; + TooltipInfo* tooltip_info; + uint32_t field100_0x1b0; + uint32_t field101_0x1b4; + uint32_t field102_0x1b8; + uint32_t field103_0x1bc; + uint32_t field104_0x1c0; + uint32_t field105_0x1c4; + + bool IsCreated() const { + return (frame_state & 0x4) != 0; + } + bool IsVisible() const { + return !IsHidden(); + } + bool IsHidden() const { + return (frame_state & 0x200) != 0; + } + bool IsDisabled() const { + return (frame_state & 0x10) != 0; + } + }; + static_assert(sizeof(Frame) == 0x1c8); + + static_assert(offsetof(Frame, relation) == 0x128); + + struct AgentNameTagInfo { + /* +h0000 */ uint32_t agent_id; + /* +h0004 */ uint32_t h0002; + /* +h0008 */ uint32_t h0003; + /* +h000C */ wchar_t* name_enc; + /* +h0010 */ uint8_t h0010; + /* +h0011 */ uint8_t h0012; + /* +h0012 */ uint8_t h0013; + /* +h0013 */ uint8_t background_alpha; // ARGB, NB: Actual color is ignored, only alpha is used + /* +h0014 */ uint32_t text_color; // ARGB + /* +h0014 */ uint32_t label_attributes; // bold/size etc + /* +h001C */ uint8_t font_style; // Text style (bitmask) / bold | 0x1 / strikthrough | 0x80 + /* +h001D */ uint8_t underline; // Text underline (bool) = 0x01 - 0xFF + /* +h001E */ uint8_t h001E; + /* +h001F */ uint8_t h001F; + /* +h0020 */ wchar_t* extra_info_enc; // Title etc + }; + + // Note: some windows are affected by UI scale (e.g. party members), others are not (e.g. compass) + struct WindowPosition { + uint32_t state; // & 0x1 == visible + Vec2f p1; + Vec2f p2; + bool visible() const { return (state & 0x1) != 0; } + // Returns vector of from X coord, to X coord. + GWCA_API Vec2f xAxis(float multiplier = 1.f, bool clamp_position = true) const; + // Returns vector of from Y coord, to Y coord. + GWCA_API Vec2f yAxis(float multiplier = 1.f, bool clamp_position = true) const; + float left(float multiplier = 1.f, bool clamp_position = true) const { return xAxis(multiplier, clamp_position).x; } + float right(float multiplier = 1.f, bool clamp_position = true) const { return xAxis(multiplier, clamp_position).y; } + float top(float multiplier = 1.f, bool clamp_position = true) const { return yAxis(multiplier, clamp_position).x; } + float bottom(float multiplier = 1.f, bool clamp_position = true) const { return yAxis(multiplier, clamp_position).y; } + float width(float multiplier = 1.f) const { return right(multiplier, false) - left(multiplier, false); } + float height(float multiplier = 1.f) const { return bottom(multiplier, false) - top(multiplier, false); } + }; + + struct MapEntryMessage { + wchar_t* title; + wchar_t* subtitle; + }; + + struct DialogBodyInfo { + uint32_t type; + uint32_t agent_id; + wchar_t* message_enc; + }; + struct DialogButtonInfo { + uint32_t button_icon; // byte + wchar_t* message; + uint32_t dialog_id; + uint32_t skill_id; // Default 0xFFFFFFF + }; + enum class FlagPreference : uint32_t; + enum class NumberPreference : uint32_t; + enum class EnumPreference : uint32_t; + + enum class NumberCommandLineParameter : uint32_t { + Unk1, + Unk2, + Unk3, + FPS, + Count + }; + + enum class EnumPreference : uint32_t { + CharSortOrder, + AntiAliasing, // multi sampling + Reflections, + ShaderQuality, + ShadowQuality, + TerrainQuality, + InterfaceSize, + FrameLimiter, + Count = 0x8 + }; + enum class StringPreference : uint32_t { + Unk1, + Unk2, + LastCharacterName, + Count = 0x3 + }; + + enum class NumberPreference : uint32_t { + AutoTournPartySort, + ChatState, + ChatTab, + DistrictLastVisitedLanguage, + DistrictLastVisitedLanguage2, + DistrictLastVisitedNonInternationalLanguage, + DistrictLastVisitedNonInternationalLanguage2, + FloaterScale, + FullscreenGamma, + InventoryBag, + Language, + LanguageAudio, + LastDevice, + Refresh, + ScreenSizeX, + ScreenSizeY, + SkillListFilterRarity, + SkillListSortMethod, + SkillListViewMode, + SoundQuality, + StorageBagPage, + TextureLod, + TexFilterMode, + VolBackground, + VolDialog, + VolEffect, + VolMusic, + VolUi, + Vote, + WindowPosX, + WindowPosY, + WindowSizeX, + WindowSizeY, + SealedSeed, + SealedCount, + CameraFov, + CameraRotationSpeed, + ScreenBorderless, + VolMaster, + ClockMode, + MobileUiScale, + GamepadCursorSpeed, + LastLoginMethod, + Count = 0x2b + }; + enum class FlagPreference : uint32_t { + FlagPref_0x0, + FlagPref_0x1, + FlagPref_0x2, + FlagPref_0x3, + // boolean preferences + ChannelAlliance, + FlagPref_0x5, + ChannelEmotes, + ChannelGuild, + ChannelLocal, + ChannelGroup, + ChannelTrade, + FlagPref_0xb, + FlagPref_0xc, + FlagPref_0xd, + FlagPref_0xe, + FlagPref_0xf, + FlagPref_0x10, + ShowTextInSkillFloaters, + ShowKRGBRatingsInGame, + FlagPref_0x13, + AutoHideUIOnLoginScreen, + DoubleClickToInteract, + InvertMouseControlOfCamera, + DisableMouseWalking, + AutoCameraInObserveMode, + AutoHideUIInObserveMode, + FlagPref_0x1a, + FlagPref_0x1b, + FlagPref_0x1c, + FlagPref_0x1d, + FlagPref_0x1e, + FlagPref_0x1f, + FlagPref_0x20, + FlagPref_0x21, + FlagPref_0x22, + FlagPref_0x23, + FlagPref_0x24, + FlagPref_0x25, + FlagPref_0x26, + FlagPref_0x27, + FlagPref_0x28, + FlagPref_0x29, + FlagPref_0x2a, + FlagPref_0x2b, + FlagPref_0x2c, + RememberAccountName, + IsWindowed, + FlagPref_0x2f, + FlagPref_0x30, + ShowSpendAttributesButton, // The game uses this hacky method of showing the "spend attributes" button next to the exp bar. + ConciseSkillDescriptions, + DoNotShowSkillTipsOnEffectMonitor, + DoNotShowSkillTipsOnSkillBars, + FlagPref_0x35, + FlagPref_0x36, + MuteWhenGuildWarsIsInBackground, + FlagPref_0x38, + AutoTargetFoes, + AutoTargetNPCs, + AlwaysShowNearbyNamesPvP, + FadeDistantNameTags, + FlagPref_0x3d, + FlagPref_0x3e, + FlagPref_0x3f, + FlagPref_0x40, + WaitForVSync, + FlagPref_0x42, + FlagPref_0x43, + FlagPref_0x44, + DoNotCloseWindowsOnEscape, + ShowMinimapOnWorldMap, + FlagPref_0x47, + FlagPref_0x48, + FlagPref_0x49, + FlagPref_0x4a, + FlagPref_0x4b, + FlagPref_0x4c, + FlagPref_0x4d, + FlagPref_0x4e, + FlagPref_0x4f, + FlagPref_0x50, + FlagPref_0x51, + HighResolutionPlayerTextures, + FlagPref_0x53, + EnhancedDrawDistance, + WhispersFromFriendsEtcOnly, + ShowChatTimestamps, + ShowCollapsedBags, + ItemRarityBorder, + AlwaysShowAllyNames, + AlwaysShowFoeNames, + FlagPref_0x5b, + LockCompassRotation, + EnableGamepad, + DpiScaling, + FlagPref_0x5f, + FlagPref_0x60, + HdSkillIcons, + HdBloom, + FlagPref_0x63, + Ssao, + FlagPref_0x65, + FlagPref_0x66, + FlagPref_0x67, + FlagPref_0x68, + FlagPref_0x69, + FlagPref_0x6a, + FlagPref_0x6b, + + Count + }; + static_assert(FlagPreference::Count == (FlagPreference)0x6c); + // Used with GetWindowPosition + enum WindowID : uint32_t { + WindowID_Dialogue1 = 0x0, + WindowID_Dialogue2 = 0x1, + WindowID_MissionGoals = 0x2, + WindowID_DropBundle = 0x3, + WindowID_Chat = 0x4, + WindowID_InGameClock = 0x6, + WindowID_Compass = 0x7, + WindowID_DamageMonitor = 0x8, + WindowID_PerformanceMonitor = 0xB, + WindowID_EffectsMonitor = 0xC, + WindowID_Hints = 0xD, + WindowID_MissionStatusAndScoreDisplay = 0xF, + WindowID_Notifications = 0x11, + WindowID_Skillbar = 0x14, + WindowID_SkillMonitor = 0x15, + WindowID_UpkeepMonitor = 0x17, + WindowID_SkillWarmup = 0x18, + WindowID_Menu = 0x1A, + WindowID_EnergyBar = 0x1C, + WindowID_ExperienceBar = 0x1D, + WindowID_HealthBar = 0x1E, + WindowID_TargetDisplay = 0x1F, + WindowID_MissionProgress = 0xE, + WindowID_TradeButton = 0x21, + WindowID_WeaponBar = 0x22, + WindowID_Hero1 = 0x33, + WindowID_Hero2 = 0x34, + WindowID_Hero3 = 0x35, + WindowID_Hero = 0x36, + WindowID_SkillsAndAttributes = 0x38, + WindowID_Friends = 0x3A, + WindowID_Guild = 0x3B, + WindowID_Help = 0x3D, + WindowID_Inventory = 0x3E, + WindowID_VaultBox = 0x3F, + WindowID_InventoryBags = 0x40, + WindowID_MissionMap = 0x42, + WindowID_Observe = 0x44, + WindowID_Options = 0x45, + WindowID_PartyWindow = 0x48, // NB: state flag is ignored for party window, but position is still good + WindowID_PartySearch = 0x49, + WindowID_QuestLog = 0x4F, + WindowID_Merchant = 0x5C, + WindowID_Hero4 = 0x5E, + WindowID_Hero5 = 0x5F, + WindowID_Hero6 = 0x60, + WindowID_Hero7 = 0x61, + WindowID_Count = 0x69 + }; + + enum ControlAction : uint32_t { + ControlAction_None = 0, + ControlAction_Screenshot = 0xAE, + // Panels + ControlAction_CloseAllPanels = 0x85, + ControlAction_ToggleInventoryWindow = 0x8B, + ControlAction_OpenScoreChart = 0xBD, + ControlAction_OpenTemplateManager = 0xD3, + ControlAction_OpenSaveEquipmentTemplate = 0xD4, + ControlAction_OpenSaveSkillTemplate = 0xD5, + ControlAction_OpenParty = 0xBF, + ControlAction_OpenGuild = 0xBA, + ControlAction_OpenFriends = 0xB9, + ControlAction_ToggleAllBags = 0xB8, + ControlAction_OpenMissionMap = 0xB6, + ControlAction_OpenBag2 = 0xB5, + ControlAction_OpenBag1 = 0xB4, + ControlAction_OpenBelt = 0xB3, + ControlAction_OpenBackpack = 0xB2, + ControlAction_OpenSkillsAndAttributes = 0x8F, + ControlAction_OpenQuestLog = 0x8E, + ControlAction_OpenWorldMap = 0x8C, + ControlAction_OpenOptions = 0x8D, + ControlAction_OpenHero = 0x8A, + + // Weapon sets + ControlAction_CycleEquipment = 0x86, + ControlAction_ActivateWeaponSet1 = 0x81, + ControlAction_ActivateWeaponSet2, + ControlAction_ActivateWeaponSet3, + ControlAction_ActivateWeaponSet4, + + ControlAction_DropItem = 0xCD, // drops bundle item >> flags, ashes, etc + + // Chat + ControlAction_ChatReply = 0xBE, + ControlAction_OpenChat = 0xA1, + ControlAction_OpenAlliance = 0x88, + + ControlAction_ReverseCamera = 0x90, + ControlAction_StrafeLeft = 0x91, + ControlAction_StrafeRight = 0x92, + ControlAction_TurnLeft = 0xA2, + ControlAction_TurnRight = 0xA3, + ControlAction_MoveBackward = 0xAC, + ControlAction_MoveForward = 0xAD, + ControlAction_CancelAction = 0xAF, + ControlAction_Interact = 0x80, + ControlAction_ReverseDirection = 0xB1, + ControlAction_Autorun = 0xB7, + ControlAction_Follow = 0xCC, + + // Targeting + ControlAction_TargetPartyMember1 = 0x96, + ControlAction_TargetPartyMember2, + ControlAction_TargetPartyMember3, + ControlAction_TargetPartyMember4, + ControlAction_TargetPartyMember5, + ControlAction_TargetPartyMember6, + ControlAction_TargetPartyMember7, + ControlAction_TargetPartyMember8, + ControlAction_TargetPartyMember9 = 0xC6, + ControlAction_TargetPartyMember10, + ControlAction_TargetPartyMember11, + ControlAction_TargetPartyMember12, + + ControlAction_TargetNearestItem = 0xC3, + ControlAction_TargetNextItem = 0xC4, + ControlAction_TargetPreviousItem = 0xC5, + ControlAction_TargetPartyMemberNext = 0xCA, + ControlAction_TargetPartyMemberPrevious = 0xCB, + ControlAction_TargetAllyNearest = 0xBC, + ControlAction_ClearTarget = 0xE3, + ControlAction_TargetSelf = 0xA0, // also 0x96 + ControlAction_TargetPriorityTarget = 0x9F, + ControlAction_TargetNearestEnemy = 0x93, + ControlAction_TargetNextEnemy = 0x95, + ControlAction_TargetPreviousEnemy = 0x9E, + + ControlAction_ShowOthers = 0x89, + ControlAction_ShowTargets = 0x94, + + ControlAction_CameraZoomIn = 0xCE, + ControlAction_CameraZoomOut = 0xCF, + + // Party/Hero commands + ControlAction_ClearPartyCommands = 0xDB, + ControlAction_CommandParty = 0xD6, + ControlAction_CommandHero1, + ControlAction_CommandHero2, + ControlAction_CommandHero3, + ControlAction_CommandHero4 = 0x102, + ControlAction_CommandHero5, + ControlAction_CommandHero6, + ControlAction_CommandHero7, + + ControlAction_OpenHero1PetCommander = 0xE0, + ControlAction_OpenHero2PetCommander, + ControlAction_OpenHero3PetCommander, + ControlAction_OpenHero4PetCommander = 0xFE, + ControlAction_OpenHero5PetCommander, + ControlAction_OpenHero6PetCommander, + ControlAction_OpenHero7PetCommander, + ControlAction_OpenHeroCommander1 = 0xDC, + ControlAction_OpenHeroCommander2, + ControlAction_OpenHeroCommander3, + ControlAction_OpenPetCommander, + ControlAction_OpenHeroCommander4 = 0x126, + ControlAction_OpenHeroCommander5, + ControlAction_OpenHeroCommander6, + ControlAction_OpenHeroCommander7, + + ControlAction_Hero1Skill1 = 0xE5, + ControlAction_Hero1Skill2, + ControlAction_Hero1Skill3, + ControlAction_Hero1Skill4, + ControlAction_Hero1Skill5, + ControlAction_Hero1Skill6, + ControlAction_Hero1Skill7, + ControlAction_Hero1Skill8, + ControlAction_Hero2Skill1, + ControlAction_Hero2Skill2, + ControlAction_Hero2Skill3, + ControlAction_Hero2Skill4, + ControlAction_Hero2Skill5, + ControlAction_Hero2Skill6, + ControlAction_Hero2Skill7, + ControlAction_Hero2Skill8, + ControlAction_Hero3Skill1, + ControlAction_Hero3Skill2, + ControlAction_Hero3Skill3, + ControlAction_Hero3Skill4, + ControlAction_Hero3Skill5, + ControlAction_Hero3Skill6, + ControlAction_Hero3Skill7, + ControlAction_Hero3Skill8, + ControlAction_Hero4Skill1 = 0x106, + ControlAction_Hero4Skill2, + ControlAction_Hero4Skill3, + ControlAction_Hero4Skill4, + ControlAction_Hero4Skill5, + ControlAction_Hero4Skill6, + ControlAction_Hero4Skill7, + ControlAction_Hero4Skill8, + ControlAction_Hero5Skill1, + ControlAction_Hero5Skill2, + ControlAction_Hero5Skill3, + ControlAction_Hero5Skill4, + ControlAction_Hero5Skill5, + ControlAction_Hero5Skill6, + ControlAction_Hero5Skill7, + ControlAction_Hero5Skill8, + ControlAction_Hero6Skill1, + ControlAction_Hero6Skill2, + ControlAction_Hero6Skill3, + ControlAction_Hero6Skill4, + ControlAction_Hero6Skill5, + ControlAction_Hero6Skill6, + ControlAction_Hero6Skill7, + ControlAction_Hero6Skill8, + ControlAction_Hero7Skill1, + ControlAction_Hero7Skill2, + ControlAction_Hero7Skill3, + ControlAction_Hero7Skill4, + ControlAction_Hero7Skill5, + ControlAction_Hero7Skill6, + ControlAction_Hero7Skill7, + ControlAction_Hero7Skill8, + + // Skills + ControlAction_UseSkill1 = 0xA4, + ControlAction_UseSkill2, + ControlAction_UseSkill3, + ControlAction_UseSkill4, + ControlAction_UseSkill5, + ControlAction_UseSkill6, + ControlAction_UseSkill7, + ControlAction_UseSkill8, + + ControlAction_ToggleGamepadCursorMode = 0x13d, // right dpad + + }; + struct FloatingWindow { + void* unk1; // Some kind of function call + wchar_t* name; + uint32_t unk2; + uint32_t unk3; + uint32_t save_preference; // 1 or 0; if 1, will save to UI layout preferences. + uint32_t unk4; + uint32_t unk5; + uint32_t unk6; + uint32_t window_id; // Maps to window array + }; + static_assert(sizeof(FloatingWindow) == 0x24); + + + + enum class TooltipType : uint32_t { + None = 0x0, + EncString1 = 0x4, + EncString2 = 0x6, + Item = 0x8, + WeaponSet = 0xC, + Skill = 0x14, + Attribute = 0x4000 + }; + + struct TooltipInfo { + uint32_t bit_field; + GW::UI::UIInteractionCallback* render; // Function that the game uses to draw the content + uint32_t* payload; // uint32_t* for skill or item, wchar_t* for encoded string + uint32_t payload_len; // Length in bytes of the payload + uint32_t unk1; + uint32_t unk2; + uint32_t unk3; + uint32_t unk4; + }; + + struct CreateUIComponentPacket { + uint32_t frame_id; + uint32_t component_flags; + uint32_t tab_index; + UI::UIInteractionCallback event_callback; + void* wparam; + wchar_t* component_label; + }; + + GWCA_API GW::Constants::Language GetTextLanguage(); + + GWCA_API bool ButtonClick(Frame* btn_frame); + + GWCA_API uint32_t CreateUIComponent(uint32_t parent_frame_id, uint32_t component_flags, uint32_t tab_index, UIInteractionCallback event_callback, void* wparam, const wchar_t* component_label); + + GWCA_API bool DestroyUIComponent(Frame* frame); + + GWCA_API bool SelectDropdownOption(Frame* frame, uint32_t value); + + GWCA_API void* GetFrameContext(GW::UI::Frame* frame); + + GWCA_API Frame* GetRootFrame(); + + GWCA_API Frame* GetChildFrame(Frame* parent, uint32_t child_offset); + template<typename First, typename... Rest> + requires (std::integral<First> && (std::integral<Rest> && ...)) + Frame* GetChildFrame(Frame* parent, First first, Rest... rest) { + Frame* intermediate = GetChildFrame(parent, static_cast<uint32_t>(first)); + if constexpr (sizeof...(rest) > 0) { + return GetChildFrame(intermediate, rest...); + } + else { + return intermediate; + } + } + + GWCA_API bool SetFrameTitle(GW::UI::Frame*, const wchar_t* title); + + GWCA_API Frame* GetParentFrame(Frame* frame); + GWCA_API Frame* GetFrameById(uint32_t frame_id); + GWCA_API Frame* GetFrameByLabel(const wchar_t* frame_label); + GWCA_API bool Default_UICallback(InteractionMessage* interaction, void* wparam, void* lparam); + + GWCA_API bool SendFrameUIMessage(UI::Frame* frame, UI::UIMessage message_id, void* wParam, void* lParam = nullptr); + + // SendMessage for Guild Wars UI messages, most UI interactions will use this. Returns true if not blocked + GWCA_API bool SendUIMessage(UI::UIMessage msgid, void* wParam = nullptr, void* lParam = nullptr); + + GWCA_API bool Keydown(ControlAction key, Frame* target = nullptr); + GWCA_API bool Keyup(ControlAction key, Frame* target = nullptr); + GWCA_API bool Keypress(ControlAction key, Frame* target = nullptr); + + GWCA_API UI::WindowPosition* GetWindowPosition(UI::WindowID window_id); + GWCA_API bool SetWindowVisible(UI::WindowID window_id, bool is_visible); + GWCA_API bool SetWindowPosition(UI::WindowID window_id, UI::WindowPosition* info); + + GWCA_API bool DrawOnCompass(unsigned session_id, unsigned pt_count, CompassPoint* pts); + + // Call from GameThread to be safe + GWCA_API ArrayByte* GetSettings(); + + GWCA_API bool GetIsUIDrawn(); + GWCA_API bool GetIsShiftScreenShot(); + GWCA_API bool GetIsWorldMapShowing(); + + GWCA_API void AsyncDecodeStr(const wchar_t *enc_str, wchar_t *buffer, size_t size); + GWCA_API void AsyncDecodeStr(const wchar_t* enc_str, DecodeStr_Callback callback, void* callback_param = 0, GW::Constants::Language language_id = (GW::Constants::Language)0xff); + + GWCA_API bool IsValidEncStr(const wchar_t* enc_str); + + GWCA_API bool UInt32ToEncStr(uint32_t value, wchar_t *buffer, size_t count); + GWCA_API uint32_t EncStrToUInt32(const wchar_t *enc_str); + + GWCA_API void SetOpenLinks(bool toggle); + + GWCA_API uint32_t GetPreference(EnumPreference pref); + GWCA_API uint32_t GetPreferenceOptions(EnumPreference pref, uint32_t** options_out = 0); + GWCA_API uint32_t GetPreference(NumberPreference pref); + GWCA_API bool GetPreference(FlagPreference pref); + GWCA_API wchar_t* GetPreference(StringPreference pref); + GWCA_API bool SetPreference(EnumPreference pref, uint32_t value); + GWCA_API bool SetPreference(NumberPreference pref, uint32_t value); + GWCA_API bool SetPreference(FlagPreference pref, bool value); + GWCA_API bool SetPreference(StringPreference pref, wchar_t* value); + + GWCA_API bool GetCommandLinePref(const wchar_t* label, wchar_t** out); + GWCA_API bool GetCommandLinePref(const wchar_t* label, uint32_t* out); + GWCA_API bool SetCommandLinePref(const wchar_t* label, wchar_t* value); + GWCA_API bool SetCommandLinePref(const wchar_t* label, uint32_t value); + + //GWCA_API void SetPreference(Preference pref, uint32_t value); + GWCA_API bool SetFrameVisible(UI::Frame* frame, bool flag); + GWCA_API bool SetFrameDisabled(UI::Frame* frame, bool flag); + + GWCA_API bool AddFrameUIInteractionCallback(GW::UI::Frame*, UI::UIInteractionCallback callback, void* wparam); + + GWCA_API bool TriggerFrameRedraw(UI::Frame* frame); + + // When the player is actively using a game controller + GWCA_API bool IsInControllerMode(); + + // When the player is using a game controller and is in cursor mode + GWCA_API bool IsInControllerCursorMode(); + + typedef HookCallback<uint32_t> KeyCallback; + // Listen for a gw hotkey press + GWCA_API void RegisterKeydownCallback( + HookEntry* entry, + const KeyCallback& callback); + GWCA_API void RemoveKeydownCallback( + HookEntry* entry); + // Listen for a gw hotkey release + GWCA_API void RegisterKeyupCallback( + HookEntry* entry, + const KeyCallback& callback); + GWCA_API void RemoveKeyupCallback( + HookEntry* entry); + + typedef HookCallback<UIMessage, void *, void *> UIMessageCallback; + + // Add a listener for a broadcasted UI message. If blocked here, will not cascade to individual listening frames. + GWCA_API void RegisterUIMessageCallback( + HookEntry *entry, + UIMessage message_id, + const UIMessageCallback& callback, + int altitude = -0x8000); + + GWCA_API void RemoveUIMessageCallback( + HookEntry *entry, UIMessage message_id = UIMessage::kNone); + + typedef HookCallback<const Frame*, UIMessage, void *, void *> FrameUIMessageCallback; + + // Add a listener for every frame that receives a UI message. Triggered onces for every frame that is listening for this message id. + GWCA_API void RegisterFrameUIMessageCallback( + HookEntry *entry, + UIMessage message_id, + const FrameUIMessageCallback& callback, + int altitude = -0x8000); + + GWCA_API void RemoveFrameUIMessageCallback( + HookEntry *entry); + + + + GWCA_API TooltipInfo* GetCurrentTooltip(); + + typedef std::function<void (CreateUIComponentPacket*)> CreateUIComponentCallback; + GWCA_API void RegisterCreateUIComponentCallback( + HookEntry *entry, + const CreateUIComponentCallback& callback, + int altitude = -0x8000); + + GWCA_API void RemoveCreateUIComponentCallback( + HookEntry *entry); + + } +} +extern "C" { + GWCA_API uint32_t GetTextLanguage(void); + GWCA_API bool ButtonClick(void* btn_frame); + GWCA_API bool SelectDropdownOption(void* frame, uint32_t value); + GWCA_API void* GetFrameContext(void* frame); + GWCA_API void* GetRootFrame(void); + GWCA_API void* GetChildFrame(void* parent, uint32_t child_offset); + GWCA_API bool SetFrameTitle(void* frame, const wchar_t* title); + GWCA_API void* GetParentFrame(void* frame); + GWCA_API void* GetFrameById(uint32_t frame_id); + GWCA_API void* GetFrameByLabel(const wchar_t* frame_label); + GWCA_API bool SendUIMessage(uint32_t msgid, void* wParam, void* lParam); + GWCA_API void* GetWindowPosition(uint32_t window_id); + GWCA_API bool SetWindowVisible(uint32_t window_id, bool is_visible); + GWCA_API bool SetWindowPosition(uint32_t window_id, void* info); + GWCA_API bool GetIsUIDrawn(); + GWCA_API bool GetIsShiftScreenShot(); + GWCA_API bool GetIsWorldMapShowing(); + GWCA_API bool IsValidEncStr(const wchar_t* enc_str); + GWCA_API bool UInt32ToEncStr(uint32_t value, wchar_t* buffer, size_t count); + GWCA_API uint32_t EncStrToUInt32(const wchar_t* enc_str); + GWCA_API uint32_t GetPreference_Enum(uint32_t pref); + GWCA_API uint32_t GetPreference_Number(uint32_t pref); + GWCA_API bool GetPreference_Flag(uint32_t pref); + GWCA_API wchar_t* GetPreference_String(uint32_t pref); + GWCA_API bool SetPreference_Enum(uint32_t pref, uint32_t value); + GWCA_API bool SetPreference_Number(uint32_t pref, uint32_t value); + GWCA_API bool SetPreference_Flag(uint32_t pref, bool value); + GWCA_API bool SetPreference_String(uint32_t pref, wchar_t* value); + GWCA_API bool GetCommandLinePref_String(const wchar_t* label, wchar_t** out); + GWCA_API bool GetCommandLinePref_UInt(const wchar_t* label, uint32_t* out); + GWCA_API bool SetCommandLinePref_String(const wchar_t* label, wchar_t* value); + GWCA_API bool SetCommandLinePref_UInt(const wchar_t* label, uint32_t value); + GWCA_API bool SetFrameVisible(void* frame, bool flag); + GWCA_API bool SetFrameDisabled(void* frame, bool flag); + GWCA_API bool IsInControllerMode(); + GWCA_API bool IsInControllerCursorMode(); +} \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Packets/Opcodes.h b/Dependencies/GWCA/Include/GWCA/Packets/Opcodes.h new file mode 100644 index 00000000..9d702a98 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Packets/Opcodes.h @@ -0,0 +1,220 @@ +#pragma once + +#define GAME_SMSG_TRADE_REQUEST (0x0000) // 0 +#define GAME_SMSG_TRADE_TERMINATE (0x0001) // 1 +#define GAME_SMSG_TRADE_CHANGE_OFFER (0x0002) // 2 +#define GAME_SMSG_TRADE_RECEIVE_OFFER (0x0003) // 3 +#define GAME_SMSG_TRADE_ADD_ITEM (0x0004) // 4 +#define GAME_SMSG_TRADE_ACKNOWLEDGE (0x0005) // 5 +#define GAME_SMSG_TRADE_ACCEPT (0x0006) // 6 +#define GAME_SMSG_TRADE_OFFERED_COUNT (0x0008) // 8 +#define GAME_SMSG_PING_REQUEST (0x000C) // 12 +#define GAME_SMSG_PING_REPLY (0x000D) // 13 +#define GAME_SMSG_FRIENDLIST_MESSAGE (0x000E) // 14 +#define GAME_SMSG_ACCOUNT_CURRENCY (0x000F) // 15 +#define GAME_SMSG_AGENT_MOVEMENT_TICK (0x001E) // 30 +#define GAME_SMSG_AGENT_INSTANCE_TIMER (0x001F) // 31 +#define GAME_SMSG_AGENT_SPAWNED (0x0020) // 32 +#define GAME_SMSG_AGENT_DESPAWNED (0x0021) // 33 +#define GAME_SMSG_AGENT_SET_PLAYER (0x0022) // 34 +#define GAME_SMSG_AGENT_UPDATE_DIRECTION (0x0025) // 37 +#define GAME_SMSG_AGENT_UPDATE_SPEED_BASE (0x0027) // 39 +#define GAME_SMSG_AGENT_STOP_MOVING (0x0028) // 40 +#define GAME_SMSG_AGENT_MOVE_TO_POINT (0x0029) // 41 +#define GAME_SMSG_AGENT_UPDATE_DESTINATION (0x002A) // 42 +#define GAME_SMSG_AGENT_UPDATE_SPEED (0x002B) // 43 +#define GAME_SMSG_AGENT_UPDATE_POSITION (0x002C) // 44 +#define GAME_SMSG_AGENT_PLAYER_DIE (0x002D) // 45 +#define GAME_SMSG_AGENT_UPDATE_ROTATION (0x002E) // 46 +#define GAME_SMSG_AGENT_UPDATE_ALLEGIANCE (0x002F) // 47 +#define GAME_SMSG_HERO_ACCOUNT_NAME (0x0031) // 49 +#define GAME_SMSG_MESSAGE_OF_THE_DAY (0x0033) // 51 +#define GAME_SMSG_AGENT_PINGED (0x0034) // 52 +#define GAME_SMSG_AGENT_UPDATE_ATTRIBUTE (0x003B) // 59 +#define GAME_SMSG_AGENT_ALLY_DESTROY (0x003E) // 62 +#define GAME_SMSG_EFFECT_UPKEEP_ADDED (0x003F) // 63 +#define GAME_SMSG_EFFECT_UPKEEP_REMOVED (0x0040) // 64 +#define GAME_SMSG_EFFECT_UPKEEP_APPLIED (0x0041) // 65 +#define GAME_SMSG_EFFECT_APPLIED (0x0042) // 66 +#define GAME_SMSG_EFFECT_RENEWED (0x0043) // 67 +#define GAME_SMSG_EFFECT_REMOVED (0x0044) // 68 +#define GAME_SMSG_SCREEN_SHAKE (0x0046) // 70 +#define GAME_SMSG_AGENT_DISPLAY_CAPE (0x0048) // 72 +#define GAME_SMSG_QUEST_ADD (0x0049) // 73 +#define GAME_SMSG_QUEST_DESCRIPTION (0x004C) // 76 +#define GAME_SMSG_QUEST_GENERAL_INFO (0x0050) // 80 +#define GAME_SMSG_QUEST_UPDATE_MARKER (0x0051) // 81 +#define GAME_SMSG_QUEST_REMOVE (0x0052) // 82 +#define GAME_SMSG_QUEST_ADD_MARKER (0x0053) // 83 +#define GAME_SMSG_QUEST_UPDATE_NAME (0x0054) // 84 +#define GAME_SMSG_NPC_UPDATE_PROPERTIES (0x0056) // 86 +#define GAME_SMSG_NPC_UPDATE_MODEL (0x0057) // 87 +#define GAME_SMSG_AGENT_CREATE_PLAYER (0x0059) // 89 +#define GAME_SMSG_AGENT_DESTROY_PLAYER (0x005A) // 90 +#define GAME_SMSG_CHAT_MESSAGE_CORE (0x005D) // 93 +#define GAME_SMSG_CHAT_MESSAGE_SERVER (0x005E) // 94 +#define GAME_SMSG_CHAT_MESSAGE_NPC (0x005F) // 95 +#define GAME_SMSG_CHAT_MESSAGE_GLOBAL (0x0060) // 96 +#define GAME_SMSG_CHAT_MESSAGE_LOCAL (0x0061) // 97 +#define GAME_SMSG_HERO_BEHAVIOR (0x0062) // 98 +#define GAME_SMSG_HERO_SKILL_STATUS (0x0064) // 100 +#define GAME_SMSG_HERO_SKILL_STATUS_BITMAP (0x0065) // 101 +#define GAME_SMSG_POST_PROCESS (0x006B) // 107 +#define GAME_SMSG_DUNGEON_REWARD (0x006C) // 108 +#define GAME_SMSG_NPC_UPDATE_WEAPONS (0x006D) // 109 +#define GAME_SMSG_MERCENARY_INFO (0x0074) // 116 +#define GAME_SMSG_DIALOG_BUTTON (0x007E) // 126 +#define GAME_SMSG_DIALOG_BODY (0x0080) // 128 +#define GAME_SMSG_DIALOG_SENDER (0x0081) // 129 +#define GAME_SMSG_WINDOW_OPEN (0x0083) // 131 +#define GAME_SMSG_WINDOW_ADD_ITEMS (0x0084) // 132 +#define GAME_SMSG_WINDOW_ITEMS_END (0x0085) // 133 +#define GAME_SMSG_WINDOW_ITEM_STREAM_END (0x0086) // 134 +#define GAME_SMSG_CARTOGRAPHY_DATA (0x008A) // 138 +#define GAME_SMSG_COMPASS_DRAWING (0x0091) // 145 +#define GAME_SMSG_MAPS_UNLOCKED (0x0094) // 148 +#define GAME_SMSG_AGENT_UPDATE_SCALE (0x009A) // 154 +#define GAME_SMSG_AGENT_UPDATE_NPC_NAME (0x009B) // 155 +#define GAME_SMSG_AGENT_DISPLAY_DIALOG (0x009E) // 158 +#define GAME_SMSG_AGENT_ATTR_UPDATE_INT (0x009F) // 159 +#define GAME_SMSG_AGENT_ATTR_UPDATE_INT_TARGET (0x00A0) // 160 +#define GAME_SMSG_AGENT_ATTR_PLAY_EFFECT (0x00A1) // 161 +#define GAME_SMSG_AGENT_ATTR_UPDATE_FLOAT (0x00A2) // 162 +#define GAME_SMSG_AGENT_ATTR_UPDATE_FLOAT_TARGET (0x00A3) // 163 +#define GAME_SMSG_AGENT_PROJECTILE_LAUNCHED (0x00A4) // 164 +#define GAME_SMSG_SPEECH_BUBBLE (0x00A5) // 165 +#define GAME_SMSG_AGENT_UPDATE_PROFESSION (0x00A6) // 166 +#define GAME_SMSG_AGENT_CREATE_NPC (0x00AA) // 170 +#define GAME_SMSG_UPDATE_AGENT_MODEL (0x00AE) // 174 +#define GAME_SMSG_UPDATE_AGENT_PARTYSIZE (0x00B0) // 176 +#define GAME_SMSG_PLAYER_UNLOCKED_PROFESSION (0x00B6) // 182 +#define GAME_SMSG_PLAYER_UPDATE_PROFESSION (0x00B7) // 183 +#define GAME_SMSG_MISSION_INFOBOX_ADD (0x00B9) // 185 +#define GAME_SMSG_MISSION_STREAM_START (0x00BA) // 186 +#define GAME_SMSG_MISSION_OBJECTIVE_ADD (0x00BB) // 187 +#define GAME_SMSG_MISSION_OBJECTIVE_COMPLETE (0x00BC) // 188 +#define GAME_SMSG_MISSION_OBJECTIVE_UPDATE_STRING (0x00BD) // 189 +#define GAME_SMSG_WINDOW_MERCHANT (0x00C3) // 195 +#define GAME_SMSG_WINDOW_OWNER (0x00C4) // 196 +#define GAME_SMSG_TRANSACTION_REJECT (0x00C6) // 198 +#define GAME_SMSG_TRANSACTION_DONE (0x00CC) // 204 +#define GAME_SMSG_SKILLBAR_UPDATE_SKILL (0x00D9) // 217 +#define GAME_SMSG_SKILLBAR_UPDATE (0x00DA) // 218 +#define GAME_SMSG_SKILLS_UNLOCKED (0x00DB) // 219 +#define GAME_SMSG_SKILL_UPDATE_SKILL_COUNT_1 (0x00DC) // 220 +#define GAME_SMSG_SKILL_UPDATE_SKILL_COUNT_2 (0x00DD) // 221 +#define GAME_SMSG_SKILL_ADD_TO_WINDOWS_DATA (0x00E0) // 224 +#define GAME_SMSG_SKILL_ADD_TO_WINDOWS_END (0x00E1) // 225 +#define GAME_SMSG_SKILL_INTERUPTED (0x00E2) // 226 +#define GAME_SMSG_SKILL_CANCEL (0x00E3) // 227 +#define GAME_SMSG_SKILL_ACTIVATED (0x00E3) // 227 +#define GAME_SMSG_SKILL_ACTIVATE (0x00E4) // 228 +#define GAME_SMSG_SKILL_RECHARGE (0x00E5) // 229 +#define GAME_SMSG_SKILL_RECHARGED (0x00E6) // 230 +#define GAME_SMSG_PLAYER_ATTR_SET (0x00E9) // 233 +#define GAME_SMSG_PLAYER_ATTR_MAX_KURZICK (0x00EA) // 234 +#define GAME_SMSG_PLAYER_ATTR_MAX_LUXON (0x00EB) // 235 +#define GAME_SMSG_PLAYER_ATTR_MAX_BALTHAZAR (0x00EC) // 236 +#define GAME_SMSG_PLAYER_ATTR_MAX_IMPERIAL (0x00ED) // 237 +#define GAME_SMSG_PLAYER_ATTR_UPDATE (0x00EE) // 238 +#define GAME_SMSG_AGENT_INITIAL_EFFECTS (0x00F0) // 240 +#define GAME_SMSG_AGENT_UPDATE_EFFECTS (0x00F1) // 241 +#define GAME_SMSG_INSTANCE_LOADED (0x00F2) // 242 +#define GAME_SMSG_TITLE_RANK_DATA (0x00F3) // 243 +#define GAME_SMSG_TITLE_RANK_DISPLAY (0x00F4) // 244 +#define GAME_SMSG_TITLE_UPDATE (0x00F5) // 245 +#define GAME_SMSG_TITLE_TRACK_INFO (0x00F6) // 246 +#define GAME_SMSG_ITEM_PRICE_QUOTE (0x00F7) // 247 +#define GAME_SMSG_ITEM_PRICES (0x00F9) // 249 +#define GAME_SMSG_VANQUISH_PROGRESS (0x00FA) // 250 +#define GAME_SMSG_VANQUISH_COMPLETE (0x00FB) // 251 +#define GAME_SMSG_CINEMATIC_SKIP_EVERYONE (0x00FE) // 254 +#define GAME_SMSG_CINEMATIC_SKIP_COUNT (0x00FF) // 255 +#define GAME_SMSG_CINEMATIC_START (0x0100) // 256 +#define GAME_SMSG_CINEMATIC_TEXT (0x0102) // 258 +#define GAME_SMSG_CINEMATIC_DATA_END (0x0103) // 259 +#define GAME_SMSG_CINEMATIC_DATA (0x0104) // 260 +#define GAME_SMSG_CINEMATIC_END (0x0105) // 261 +#define GAME_SMSG_SIGNPOST_BUTTON (0x010A) // 266 +#define GAME_SMSG_SIGNPOST_BODY (0x010B) // 267 +#define GAME_SMSG_SIGNPOST_SENDER (0x010C) // 268 +#define GAME_SMSG_MANIPULATE_MAP_OBJECT (0x010E) // 270 +#define GAME_SMSG_MANIPULATE_MAP_OBJECT2 (0x0111) // 273 +#define GAME_SMSG_GUILD_PLAYER_ROLE (0x0118) // 280 +#define GAME_SMSG_TOWN_ALLIANCE_OBJECT (0x011A) // 282 +#define GAME_SMSG_GUILD_ALLIANCE_INFO (0x0120) // 288 +#define GAME_SMSG_GUILD_GENERAL_INFO (0x0121) // 289 +#define GAME_SMSG_GUILD_CHANGE_FACTION (0x0122) // 290 +#define GAME_SMSG_GUILD_INVITE_RECEIVED (0x0123) // 291 +#define GAME_SMSG_GUILD_PLAYER_INFO (0x0127) // 295 +#define GAME_SMSG_GUILD_PLAYER_REMOVE (0x0128) // 296 +#define GAME_SMSG_GUILD_PLAYER_CHANGE_COMPLETE (0x012A) // 298 +#define GAME_SMSG_GUILD_CHANGE_PLAYER_CONTEXT (0x012B) // 299 +#define GAME_SMSG_GUILD_CHANGE_PLAYER_STATUS (0x012C) // 300 +#define GAME_SMSG_GUILD_CHANGE_PLAYER_TYPE (0x012D) // 301 +#define GAME_SMSG_ITEM_UPDATE_OWNER (0x0135) // 309 +#define GAME_SMSG_ITEM_UPDATE_QUANTITY (0x0139) // 313 +#define GAME_SMSG_ITEM_UPDATE_NAME (0x013A) // 314 +#define GAME_SMSG_ITEM_MOVED_TO_LOCATION (0x013E) // 318 +#define GAME_SMSG_INVENTORY_CREATE_BAG (0x013F) // 319 +#define GAME_SMSG_GOLD_CHARACTER_ADD (0x0140) // 320 +#define GAME_SMSG_GOLD_STORAGE_ADD (0x0141) // 321 +#define GAME_SMSG_ITEM_STREAM_CREATE (0x0144) // 324 +#define GAME_SMSG_ITEM_STREAM_DESTROY (0x0145) // 325 +#define GAME_SMSG_ITEM_WEAPON_SET (0x0147) // 327 +#define GAME_SMSG_ITEM_SET_ACTIVE_WEAPON_SET (0x0148) // 328 +#define GAME_SMSG_ITEM_CHANGE_LOCATION (0x014B) // 331 +#define GAME_SMSG_ITEM_REMOVE (0x014D) // 333 +#define GAME_SMSG_GOLD_CHARACTER_REMOVE (0x014F) // 335 +#define GAME_SMSG_GOLD_STORAGE_REMOVE (0x0150) // 336 +#define GAME_SMSG_TOME_SHOW_SKILLS (0x0154) // 340 +#define GAME_SMSG_ITEM_GENERAL_INFO (0x0161) // 353 +#define GAME_SMSG_ITEM_REUSE_ID (0x0162) // 354 +#define GAME_SMSG_ITEM_SALVAGE_SESSION_START (0x0163) // 355 +#define GAME_SMSG_ITEM_SALVAGE_SESSION_CANCEL (0x0164) // 356 +#define GAME_SMSG_ITEM_SALVAGE_SESSION_DONE (0x0165) // 357 +#define GAME_SMSG_ITEM_SALVAGE_SESSION_SUCCESS (0x0166) // 358 +#define GAME_SMSG_ITEM_SALVAGE_SESSION_ITEM_KEPT (0x0167) // 359 +#define GAME_SMSG_INSTANCE_SHOW_WIN (0x017B) // 379 +#define GAME_SMSG_INSTANCE_LOAD_HEAD (0x017C) // 380 +#define GAME_SMSG_INSTANCE_LOAD_PLAYER_NAME (0x017D) // 381 +#define GAME_SMSG_INSTANCE_COUNTDOWN_STOP (0x017E) // 382 +#define GAME_SMSG_INSTANCE_COUNTDOWN (0x0180) // 384 +#define GAME_SMSG_INSTANCE_LOAD_FINISH (0x018E) // 398 +#define GAME_SMSG_JUMBO_MESSAGE (0x0190) // 400 +#define GAME_SMSG_INSTANCE_LOAD_SPAWN_POINT (0x0195) // 405 +#define GAME_SMSG_INSTANCE_LOAD_INFO (0x0199) // 409 +#define GAME_SMSG_CREATE_MISSION_PROGRESS (0x01A0) // 416 +#define GAME_SMSG_UPDATE_MISSION_PROGRESS (0x01A2) // 418 +#define GAME_SMSG_TRANSFER_GAME_SERVER_INFO (0x01A5) // 421 +#define GAME_SMSG_READY_FOR_MAP_SPAWN (0x01AB) // 427 +#define GAME_SMSG_DOA_COMPLETE_ZONE (0x01AF) // 431 +#define GAME_SMSG_INSTANCE_TRAVEL_TIMER (0x01BB) // 443 +#define GAME_SMSG_INSTANCE_CANT_ENTER (0x01BC) // 444 +#define GAME_SMSG_PARTY_SET_DIFFICULTY (0x01BE) // 446 +#define GAME_SMSG_PARTY_HENCHMAN_ADD (0x01BF) // 447 +#define GAME_SMSG_PARTY_HENCHMAN_REMOVE (0x01C0) // 448 +#define GAME_SMSG_PARTY_HERO_ADD (0x01C2) // 450 +#define GAME_SMSG_PARTY_HERO_REMOVE (0x01C3) // 451 +#define GAME_SMSG_PARTY_INVITE_ADD (0x01C4) // 452 +#define GAME_SMSG_PARTY_JOIN_REQUEST (0x01C5) // 453 +#define GAME_SMSG_PARTY_INVITE_CANCEL (0x01C6) // 454 +#define GAME_SMSG_PARTY_REQUEST_CANCEL (0x01C7) // 455 +#define GAME_SMSG_PARTY_REQUEST_RESPONSE (0x01C8) // 456 +#define GAME_SMSG_PARTY_INVITE_RESPONSE (0x01C9) // 457 +#define GAME_SMSG_PARTY_YOU_ARE_LEADER (0x01CA) // 458 +#define GAME_SMSG_PARTY_PLAYER_ADD (0x01CB) // 459 +#define GAME_SMSG_PARTY_PLAYER_REMOVE (0x01D0) // 464 +#define GAME_SMSG_PARTY_PLAYER_READY (0x01D1) // 465 +#define GAME_SMSG_PARTY_CREATE (0x01D2) // 466 +#define GAME_SMSG_PARTY_MEMBER_STREAM_END (0x01D3) // 467 +#define GAME_SMSG_PARTY_DEFEATED (0x01D8) // 472 +#define GAME_SMSG_PARTY_LOCK (0x01D9) // 473 +// 474 happend when you start & stop group teleportation) +#define GAME_SMSG_PARTY_SEARCH_REQUEST_JOIN (0x01DB) // 475 +#define GAME_SMSG_PARTY_SEARCH_REQUEST_DONE (0x01DC) // 476 +#define GAME_SMSG_PARTY_SEARCH_ADVERTISEMENT (0x01DD) // 477 +#define GAME_SMSG_PARTY_SEARCH_SEEK (0x01DE) // 478 +#define GAME_SMSG_PARTY_SEARCH_REMOVE (0x01DF) // 479 +#define GAME_SMSG_PARTY_SEARCH_SIZE (0x01E0) // 480 +#define GAME_SMSG_PARTY_SEARCH_TYPE (0x01E1) // 481 \ No newline at end of file diff --git a/Dependencies/GWCA/Include/GWCA/Packets/StoC.h b/Dependencies/GWCA/Include/GWCA/Packets/StoC.h new file mode 100644 index 00000000..fb6fc700 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Packets/StoC.h @@ -0,0 +1,1100 @@ +#pragma once + +#include <GWCA/Packets/Opcodes.h> +#include <GWCA/GameContainers/GamePos.h> + +/* +Server to client packets, sorted by header + +most packets are not filled in, however the list and types of +fields is given as comments + +feel free to fill packets, and you can also add a suffix to +the packet name, e.g. P391 -> P391_InstanceLoadMap +*/ + +namespace GW { + typedef uint32_t AgentID; + typedef uint32_t ItemID; + namespace Chat { + enum Channel : int; + } + namespace Constants { + enum class QuestID : uint32_t; + enum class MapID : uint32_t; + } + namespace Packet { + namespace StoC { + struct PacketBase { + uint32_t header; + }; + // Used for: + // GenericValue + // GenericValueTarget + // GenericModifier (i.e. GenericFloatTarget) + // GenericFloat + namespace GenericValueID { + const uint32_t melee_attack_finished = 1; // GenericValue. Last melee attack finished successfully. + const uint32_t attack_stopped = 3; // GenericValue. Last melee/ranged attack stopped unsuccessfully. May be followed by interrupted (35). + const uint32_t attack_started = 4; // GenericTargetValue. caster_id is victim. target_id is attacker. + + const uint32_t add_effect = 6; + const uint32_t remove_effect = 7; + const uint32_t disabled = 8; // GenericValue. e.g. aftercast. value = 1: disabled. value = 0: not disabled. + const uint32_t skill_damage = 10; // GenericValue. The skill responsible for the last damage packet received (GenericTargetModifier). + const uint32_t apply_marker = 11; // Exclamation mark / arrow above NPC head + const uint32_t remove_marker = 12; // Exclamation mark / arrow above NPC head + const uint32_t damage = 16; // GenericTargetModifier. Non-armor-ignoring attack, spells + const uint32_t critical = 17; // GenericTargetModifier. Critical hit on autoattack + const uint32_t effect_on_target = 20; // e.g. casting a skill on someone + const uint32_t effect_on_agent = 21; // e.g. casting a skill on myself/location + const uint32_t animation = 22; + const uint32_t animation_special = 23; // When received before dance, makes it fancy e.g. CE dance, glowing hands + const uint32_t animation_loop = 28; // e.g. dance + const uint32_t max_hp_reached = 32; // GenericValue. Remove passive regen pips. + const uint32_t health = 34; + const uint32_t interrupted = 35; // GenericValue. The last action (skill or attack) was interrupted. Follows <action>_stopped. + const uint32_t change_health_regen = 44; // GenericFloat. Passive regen pips (?). + const uint32_t attack_skill_finished = 46; // GenericValue. Last attack skill finished successfully. + const uint32_t instant_skill_activated = 48; // GenericValue|(GenericTargetValue?). Unblocked skills - Stances, shouts, etc, not protectors defence. + const uint32_t attack_skill_stopped = 49; // GenericValue. Last attack skill stopped unsuccessfully. May be followed by interrupted (35). + const uint32_t attack_skill_activated = 50; // GenericValue|GenericValueTarget. caster_id is victim and target_id is caster. + const uint32_t energygain = 52; // For example from Critical Strikes or energy tap + const uint32_t armorignoring = 55; // GenericTargetModifier. All armor ignoring damage and heals + const uint32_t skill_finished = 58; // GenericValue. Last skill finished successfully. + const uint32_t skill_stopped = 59; // GenericValue. Last skill stopped unsuccessfully. May be followed by interrupted(35). + const uint32_t skill_activated = 60; // GenericValue|GenericValueTarget. caster_id is victim and target_id is caster. + const uint32_t casttime = 61; // Non-standard cast time, value in seconds + const uint32_t energy_spent = 62; // GenericFloat. The energy using your last skill. + const uint32_t knocked_down = 63; // GenericFloat. value: duration. + } + namespace P156_Type = GenericValueID; + + namespace JumboMessageType { + const uint8_t BASE_UNDER_ATTACK = 0; + const uint8_t GUILD_LORD_UNDER_ATTACK = 1; + const uint8_t CAPTURED_SHRINE = 3; + const uint8_t CAPTURED_TOWER = 5; + const uint8_t PARTY_DEFEATED = 6; // received in 3-way Heroes Ascent matches when one party is defeated + const uint8_t MORALE_BOOST = 9; + const uint8_t VICTORY = 16; + const uint8_t FLAWLESS_VICTORY = 17; + } + + namespace JumboMessageValue { + // The following values represent the first and second parties in an explorable areas + // (inc. observer mode) with 2 parties. + // if there are 3 parties in the explorable area (like some HA maps) then: + // - party 1 = 6579558 + // - party 2 = 1635021873 + // - party 3 = 1635021874 + + // TODO: + // These numbers appear big and random, their origin or relation to other values + // is not understood. + // In addition, there may be a danger these variables could change with GW updates... + // Consider these values as experimental and use with caution + const uint32_t PARTY_ONE = 1635021873; + const uint32_t PARTY_TWO = 1635021874; + } + + template <class Specific> + struct Packet : PacketBase { + static const uint32_t STATIC_HEADER; + }; + struct TradeStart : Packet<TradeStart> { + uint32_t player_number; + }; + constexpr uint32_t Packet<TradeStart>::STATIC_HEADER = GAME_SMSG_TRADE_REQUEST; + + struct TradeCancel : Packet<TradeCancel> { + uint32_t player_number; + }; + constexpr uint32_t Packet<TradeCancel>::STATIC_HEADER = GAME_SMSG_TRADE_TERMINATE; + + struct Ping : Packet<Ping> { + uint32_t ping; + }; + constexpr uint32_t Packet<Ping>::STATIC_HEADER = GAME_SMSG_PING_REQUEST; + + struct InstanceTimer : Packet<InstanceTimer> { + uint32_t instance_time; + }; + constexpr uint32_t Packet<InstanceTimer>::STATIC_HEADER = GAME_SMSG_AGENT_INSTANCE_TIMER; + + // Called when the client needs to add an agent to memory (i.e. agent appeared within compass range) + struct AgentAdd : Packet<AgentAdd> { + /* +h0000 */ uint32_t agent_id; + /* +h0004 */ uint32_t agent_type; // Bitwise field. 0x20000000 = NPC | PlayerNumber, 0x30000000 = Player | PlayerNumber, 0x00000000 = Signpost + /* +h0008 */ uint32_t type; // byte, agent_type > 0 ? 1 : 4 + /* +h000C */ uint32_t unk3; // byte + /* +h0010 */ Vec2f position; + /* +h0018 */ uint32_t unk4; // word + /* +h001C */ Vec2f unk5; + /* +h0020 */ uint32_t unk6; // word + /* +h0024 */ float speed; // default 288.0 + /* +h0028 */ float unk7; // default 1.0 + /* +h002C */ uint32_t unknown_bitwise_1; + /* +h0030 */ uint32_t allegiance_bits; + /* +h0034 */ uint32_t unk8[5]; + /* +h0048 */ Vec2f unk9; + /* +h0050 */ Vec2f unk10; // inf, inf + /* +h0058 */ uint32_t unk11[2]; + /* +h0060 */ Vec2f unk12; // inf, inf + /* +h0064 */ uint32_t unk13; + }; + constexpr uint32_t Packet<AgentAdd>::STATIC_HEADER = GAME_SMSG_AGENT_SPAWNED; + + // Called when the client needs to remove an agent from memory (e.g. out of range) + struct AgentRemove : Packet<AgentRemove> { + uint32_t agent_id; + }; + constexpr uint32_t Packet<AgentRemove>::STATIC_HEADER = GAME_SMSG_AGENT_DESPAWNED; + + struct AgentSetPlayer : Packet<AgentSetPlayer> { + uint32_t unk1; + uint32_t unk2; + }; + constexpr uint32_t Packet<AgentSetPlayer>::STATIC_HEADER = GAME_SMSG_AGENT_SET_PLAYER; + + struct AgentUpdateAllegiance : Packet<AgentUpdateAllegiance> { + uint32_t agent_id; + uint32_t allegiance_bits; // more than just allegiance, determines things that change. + }; + constexpr uint32_t Packet<AgentUpdateAllegiance>::STATIC_HEADER = GAME_SMSG_AGENT_UPDATE_ALLEGIANCE; + + // creates the "ping" on an enemy when some player targets it + struct AgentPinged : Packet<AgentPinged> { + uint32_t Player; // who sent the message + uint32_t agent_id; // target agent + }; + constexpr uint32_t Packet<AgentPinged>::STATIC_HEADER = GAME_SMSG_AGENT_PINGED; + + struct PartyRemoveAlly : Packet<PartyRemoveAlly> { + uint32_t agent_id; // target agent + }; + constexpr uint32_t Packet<PartyRemoveAlly>::STATIC_HEADER = GAME_SMSG_AGENT_ALLY_DESTROY; + + // prety much a bond from someone else / hero bond + struct AddExternalBond : Packet<AddExternalBond> { + uint32_t caster_id; + uint32_t receiver_id; + uint32_t skill_id; + uint32_t effect_type; + uint32_t effect_id; + }; + constexpr uint32_t Packet<AddExternalBond>::STATIC_HEADER = GAME_SMSG_EFFECT_UPKEEP_APPLIED; + + struct AddEffect : Packet<AddEffect> { + uint32_t agent_id; + uint32_t skill_id; + uint32_t attribute_level; + uint32_t effect_id; + uint32_t timestamp; + }; + constexpr uint32_t Packet<AddEffect>::STATIC_HEADER = GAME_SMSG_EFFECT_APPLIED; + + // Display Cape (?) + struct DisplayCape : Packet<DisplayCape> { + uint32_t agent_id; + uint8_t unk0; + }; + constexpr uint32_t Packet<DisplayCape>::STATIC_HEADER = GAME_SMSG_AGENT_DISPLAY_CAPE; + + struct QuestAdd : Packet<QuestAdd> { + GW::Constants::QuestID quest_id; + GW::GamePos marker; + GW::Constants::MapID map_to; + uint32_t log_state; + wchar_t location[8]; + wchar_t name[8]; + wchar_t npc[8]; + GW::Constants::MapID map_from; + }; + constexpr uint32_t Packet<QuestAdd>::STATIC_HEADER = GAME_SMSG_QUEST_ADD; + + static_assert(sizeof(QuestAdd) == 0x50); + + struct NpcGeneralStats : Packet<NpcGeneralStats> { + uint32_t npc_id; + uint32_t file_id; + uint32_t data1; + uint32_t scale; + uint32_t data2; + uint32_t flags; + uint32_t profession; + uint32_t level; + wchar_t name[8]; + }; + constexpr uint32_t Packet<NpcGeneralStats>::STATIC_HEADER = GAME_SMSG_NPC_UPDATE_PROPERTIES; + + // NPC model file (?) + struct NPCModelFile : Packet<NPCModelFile> { + uint32_t npc_id; + uint32_t count; + uint32_t data[8]; + }; + constexpr uint32_t Packet<NPCModelFile>::STATIC_HEADER = GAME_SMSG_NPC_UPDATE_MODEL; + + struct PlayerJoinInstance : Packet<PlayerJoinInstance> { + uint32_t player_number; + uint32_t agent_id; + uint32_t file_id1; // dword + uint32_t secondary_profession; // byte + uint32_t unk3; // dword + uint32_t file_id2; // dword + wchar_t player_name[32]; + }; + constexpr uint32_t Packet<PlayerJoinInstance>::STATIC_HEADER = GAME_SMSG_AGENT_CREATE_PLAYER; + + struct PlayerLeaveInstance : Packet<PlayerLeaveInstance> { + uint32_t player_number; + }; + constexpr uint32_t Packet<PlayerLeaveInstance>::STATIC_HEADER = GAME_SMSG_AGENT_DESTROY_PLAYER; + + // Define chat message + struct MessageCore : Packet<MessageCore> { + wchar_t message[122]; // prefixType="int16" + }; + constexpr uint32_t Packet<MessageCore>::STATIC_HEADER = GAME_SMSG_CHAT_MESSAGE_CORE; + + // Deliver chat message (no owner) + struct MessageServer : Packet<MessageServer> { + uint32_t id; // some kind of ID of the affected target + uint32_t channel; // enum ChatChannel above. + }; + constexpr uint32_t Packet<MessageServer>::STATIC_HEADER = GAME_SMSG_CHAT_MESSAGE_SERVER; + + // Deliver chat message (sender is an NPC) + struct MessageNPC : Packet<MessageNPC> { + uint32_t agent_id; + uint32_t channel; // enum ChatChannel above. + wchar_t sender_name[8]; + }; + constexpr uint32_t Packet<MessageNPC>::STATIC_HEADER = GAME_SMSG_CHAT_MESSAGE_NPC; + + // Deliver chat message (player sender in guild or alliance chat) + struct MessageGlobal : Packet<MessageGlobal> { + uint32_t channel; // enum ChatChannel above. + wchar_t sender_name[32]; // full in-game name + wchar_t sender_guild[6]; // guild tag for alliance chat, empty for guild chat + }; + constexpr uint32_t Packet<MessageGlobal>::STATIC_HEADER = GAME_SMSG_CHAT_MESSAGE_GLOBAL; + + // Deliver chat message (player sender in the instance) + struct MessageLocal : Packet<MessageLocal> { + uint32_t player_number; // PlayerNumber of the sender + Chat::Channel channel; // enum ChatChannel above. + }; + constexpr uint32_t Packet<MessageLocal>::STATIC_HEADER = GAME_SMSG_CHAT_MESSAGE_LOCAL; + + // Alcohol Post Process Effect + struct PostProcess : Packet<PostProcess> { + uint32_t level; + uint32_t tint; + }; + constexpr uint32_t Packet<PostProcess>::STATIC_HEADER = GAME_SMSG_POST_PROCESS; + + struct DungeonReward : Packet<DungeonReward> { + uint32_t experience; + uint32_t gold; + uint32_t skill_points; + }; + constexpr uint32_t Packet<DungeonReward>::STATIC_HEADER = GAME_SMSG_DUNGEON_REWARD; + + struct ScreenShake : Packet<ScreenShake> { + uint32_t unk1; + uint32_t unk2; + uint32_t agent_id; + }; + constexpr uint32_t Packet<ScreenShake>::STATIC_HEADER = GAME_SMSG_SCREEN_SHAKE; + + struct AgentUnk2 : Packet<AgentUnk2> { + uint32_t agent_id; + uint32_t unk1; // 1 = minipet, 2 = Ally?, 3 = summon + uint32_t unk2; // always 0 + }; + constexpr uint32_t Packet<AgentUnk2>::STATIC_HEADER = GAME_SMSG_NPC_UPDATE_WEAPONS; + + struct MercenaryHeroInfo : Packet<MercenaryHeroInfo> { + uint32_t hero_id; + uint32_t level; + uint32_t primary; + uint32_t secondary; + uint32_t unknown[15]; // Appearance etc + wchar_t name[20]; + }; + constexpr uint32_t Packet<MercenaryHeroInfo>::STATIC_HEADER = GAME_SMSG_MERCENARY_INFO; + + struct DialogButton : Packet<DialogButton> { + uint32_t button_icon; // byte + wchar_t message[128]; + uint32_t dialog_id; + uint32_t skill_id; // Default 0xFFFFFFF + }; + constexpr uint32_t Packet<DialogButton>::STATIC_HEADER = GAME_SMSG_DIALOG_BUTTON; + + struct DialogBody : Packet<DialogBody> { + wchar_t message[122]; + }; + constexpr uint32_t Packet<DialogBody>::STATIC_HEADER = GAME_SMSG_DIALOG_BODY; + + struct DialogSender : Packet<DialogSender> { + uint32_t agent_id; + }; + constexpr uint32_t Packet<DialogSender>::STATIC_HEADER = GAME_SMSG_DIALOG_SENDER; + + struct DataWindow : Packet<DataWindow> { + uint32_t agent; + uint32_t type; // 0=storage, 1=tournament, 2=records, 3=stylist + uint32_t data; + }; + constexpr uint32_t Packet<DataWindow>::STATIC_HEADER = GAME_SMSG_WINDOW_OPEN; + + struct WindowItems : Packet<WindowItems> { + uint32_t count; + uint32_t item_ids[16]; + }; + constexpr uint32_t Packet<WindowItems>::STATIC_HEADER = GAME_SMSG_WINDOW_ADD_ITEMS; + + struct WindowItemsEnd : Packet<WindowItemsEnd> { + uint32_t unk1; + }; + constexpr uint32_t Packet<WindowItemsEnd>::STATIC_HEADER = GAME_SMSG_WINDOW_ITEMS_END; + + struct ItemStreamEnd : Packet<ItemStreamEnd> { // AKA ItemPricesEnd + uint32_t unk1; + }; + constexpr uint32_t Packet<ItemStreamEnd>::STATIC_HEADER = GAME_SMSG_WINDOW_ITEM_STREAM_END; + + // Pings and drawing in compass + struct CompassEvent : Packet<CompassEvent> { + uint32_t Player; // player who sent the ping (PlayerNumber) + uint32_t SessionID; // Changes for different pings/lines/curves + uint32_t NumberPts; // Number of points in the data, between 1 and 8 + struct { + short x; // world coordinates divided by 10 + short y; // same + } points[8]; + // there *might* be another 8 uint32_ts, but they look like noise and they are not relayed by the server to other players + }; + constexpr uint32_t Packet<CompassEvent>::STATIC_HEADER = GAME_SMSG_COMPASS_DRAWING; + + struct MapsUnlocked : Packet<MapsUnlocked> { + uint32_t missions_bonus_length; + uint32_t missions_bonus[32]; + uint32_t missions_completed_length; + uint32_t missions_completed[32]; + uint32_t missions_bonus_hm_length; + uint32_t missions_bonus_hm[32]; + uint32_t missions_completed_hm_length; + uint32_t missions_completed_hm[32]; + uint32_t unlocked_map_length; + uint32_t unlocked_map[32]; + }; + constexpr uint32_t Packet<MapsUnlocked>::STATIC_HEADER = GAME_SMSG_MAPS_UNLOCKED; + + struct CartographyData : Packet<CartographyData> { + uint32_t data_length; + uint32_t data[64]; + }; + constexpr uint32_t Packet<CartographyData>::STATIC_HEADER = GAME_SMSG_CARTOGRAPHY_DATA; + + struct AgentScale : Packet<AgentScale> { + uint32_t agent_id; + uint32_t scale; + }; + constexpr uint32_t Packet<AgentScale>::STATIC_HEADER = GAME_SMSG_AGENT_UPDATE_SCALE; + + struct AgentName : Packet<AgentName> { + uint32_t agent_id; + wchar_t name_enc[40]; + }; + constexpr uint32_t Packet<AgentName>::STATIC_HEADER = GAME_SMSG_AGENT_UPDATE_NPC_NAME; + + struct DisplayDialogue : Packet<DisplayDialogue> { + uint32_t agent_id; + wchar_t name[32]; + uint32_t type; + wchar_t message[122]; + }; + constexpr uint32_t Packet<DisplayDialogue>::STATIC_HEADER = GAME_SMSG_AGENT_DISPLAY_DIALOG; + + // agent animation lock (and probably something else) + struct GenericValue : Packet<GenericValue> { + uint32_t value_id; + uint32_t agent_id; + uint32_t value; + }; + constexpr uint32_t Packet<GenericValue>::STATIC_HEADER = GAME_SMSG_AGENT_ATTR_UPDATE_INT; + + // Update Target Generic Value + struct GenericValueTarget : Packet<GenericValueTarget> { + uint32_t Value_id; + uint32_t target; // agent id + uint32_t caster; // agent id + uint32_t value; + }; + constexpr uint32_t Packet<GenericValueTarget>::STATIC_HEADER = GAME_SMSG_AGENT_ATTR_UPDATE_INT_TARGET; + + // Update Target Generic Value + struct PlayEffect : Packet<PlayEffect> { + Vec2f coords; + uint32_t plane; + uint32_t agent_id; + uint32_t effect_id; + uint32_t data5; + uint32_t data6; + }; + constexpr uint32_t Packet<PlayEffect>::STATIC_HEADER = GAME_SMSG_AGENT_ATTR_PLAY_EFFECT; + + // Update Target Generic Value + struct GenericFloat : Packet<GenericFloat> { + uint32_t type; + uint32_t agent_id; + float value; + }; + constexpr uint32_t Packet<GenericFloat>::STATIC_HEADER = GAME_SMSG_AGENT_ATTR_UPDATE_FLOAT; + + // damage or healing done packet, but also has other purposes. + // to be investigated further. + // all types have their value in the float field 'value'. + // in all types the value is in percentage, unless otherwise specified. + // the value can be negative (e.g. damage, sacrifice) + // or positive (e.g. heal, lifesteal). + struct GenericModifier : Packet<GenericModifier> { + uint32_t type; // type as specified above in P156_Type + uint32_t target_id; // agent id of who is affected by the change + uint32_t cause_id; // agent id of who caused the change + float value; // value, often in percentage (e.g. %hp) + }; + constexpr uint32_t Packet<GenericModifier>::STATIC_HEADER = GAME_SMSG_AGENT_ATTR_UPDATE_FLOAT_TARGET; + + // Projectile launched from an agent + // Can be from a martial weapon (spear, bow), or projectile-launching skill + // also acts as an attack_finished packet for ranged weapons, if `is_attack == 1` + struct AgentProjectileLaunched : Packet<AgentProjectileLaunched> { + uint32_t agent_id; + Vec2f destination; + uint32_t unk1; // word : 0 ? + uint32_t unk2; // dword: changes with projectile animation model + uint32_t unk3; // dword: value (143) for all martial weapons (?), n values for n skills (?) + uint32_t unk4; // dword: 1 ? + uint32_t is_attack; // byte + }; + constexpr uint32_t Packet<AgentProjectileLaunched>::STATIC_HEADER = GAME_SMSG_AGENT_PROJECTILE_LAUNCHED; + + // agent text above head + struct SpeechBubble : Packet<SpeechBubble> { + uint32_t agent_id; + wchar_t message[122]; + }; + constexpr uint32_t Packet<SpeechBubble>::STATIC_HEADER = GAME_SMSG_SPEECH_BUBBLE; + + struct PartyAllyAdd : Packet<PartyAllyAdd> { // When an NPC is added as an ally to your party. + uint32_t agent_id; + uint32_t allegiance_bits; + uint32_t agent_type; // Bitwise field. 0x20000000 = NPC | PlayerNumber, 0x30000000 = Player | PlayerNumber, 0x00000000 = Signpost + }; + constexpr uint32_t Packet<PartyAllyAdd>::STATIC_HEADER = GAME_SMSG_AGENT_CREATE_NPC; + + // agent change model + struct AgentModel : Packet<AgentModel> { + uint32_t agent_id; + uint32_t model_id; + }; + constexpr uint32_t Packet<AgentModel>::STATIC_HEADER = GAME_SMSG_UPDATE_AGENT_MODEL; + + // Changes the number above the player's head when leading a party + struct PartyUpdateSize : Packet<PartyUpdateSize> { + uint32_t player_id; + uint32_t size; + }; + constexpr uint32_t Packet<PartyUpdateSize>::STATIC_HEADER = GAME_SMSG_UPDATE_AGENT_PARTYSIZE; + + struct ObjectiveAdd : Packet<ObjectiveAdd> { + uint32_t objective_id; + uint32_t type; + wchar_t name[128]; + }; + constexpr uint32_t Packet<ObjectiveAdd>::STATIC_HEADER = GAME_SMSG_MISSION_OBJECTIVE_ADD; + + struct ObjectiveDone : Packet<ObjectiveDone> { + uint32_t objective_id; + }; + constexpr uint32_t Packet<ObjectiveDone>::STATIC_HEADER = GAME_SMSG_MISSION_OBJECTIVE_COMPLETE; + + struct ObjectiveUpdateName : Packet<ObjectiveUpdateName> { + uint32_t objective_id; + wchar_t objective_name[128]; + }; + constexpr uint32_t Packet<ObjectiveUpdateName>::STATIC_HEADER = GAME_SMSG_MISSION_OBJECTIVE_UPDATE_STRING; + + struct OpenMerchantWindow : Packet<OpenMerchantWindow> { + uint32_t type; + uint32_t unk; + }; + constexpr uint32_t Packet<OpenMerchantWindow>::STATIC_HEADER = GAME_SMSG_WINDOW_MERCHANT; + + struct WindowOwner : Packet<WindowOwner> { + uint32_t agent_id; + }; + constexpr uint32_t Packet<WindowOwner>::STATIC_HEADER = GAME_SMSG_WINDOW_OWNER; + + struct TransactionDone : Packet<TransactionDone> { + uint32_t unk1; + }; + constexpr uint32_t Packet<TransactionDone>::STATIC_HEADER = GAME_SMSG_TRANSACTION_DONE; + struct UpdateSkillbarSkill : Packet<UpdateSkillbarSkill> { + uint32_t agent_id; + uint32_t skill_slot; + uint32_t skill_id; + }; + constexpr uint32_t Packet<UpdateSkillbarSkill>::STATIC_HEADER = GAME_SMSG_SKILLBAR_UPDATE_SKILL; + + // Used to duplicate skills in skill window i.e. more than 1 signet of capture. Packet is received after map is loaded + struct UpdateSkillCountAfterMapLoad : Packet<UpdateSkillCountAfterMapLoad> { + uint32_t skill_id; + uint32_t count; + }; + constexpr uint32_t Packet<UpdateSkillCountAfterMapLoad>::STATIC_HEADER = GAME_SMSG_SKILL_UPDATE_SKILL_COUNT_1; + + // Used to duplicate skills in skill window i.e. more than 1 signet of capture. Packet is received during initial character load + struct UpdateSkillCountPreMapLoad : Packet<UpdateSkillCountPreMapLoad> { + uint32_t skill_id; + uint32_t count; + }; + constexpr uint32_t Packet<UpdateSkillCountPreMapLoad>::STATIC_HEADER = GAME_SMSG_SKILL_UPDATE_SKILL_COUNT_2; + + // Skill Activate (begin casting) + struct SkillActivate : Packet<SkillActivate> { + uint32_t agent_id; + uint32_t skill_id; + uint32_t skill_instance; + }; + constexpr uint32_t Packet<SkillActivate>::STATIC_HEADER = GAME_SMSG_SKILL_ACTIVATE; + + struct SkillRecharge : Packet<SkillRecharge> { + uint32_t agent_id; + uint32_t skill_id; + uint32_t skill_instance; + uint32_t recharge; + }; + constexpr uint32_t Packet<SkillRecharge>::STATIC_HEADER = GAME_SMSG_SKILL_RECHARGE; + + // update agent state + struct AgentState : Packet<AgentState> { + uint32_t agent_id; + uint32_t state; // bitmap of agent states (0 neutral, 2 condition, 16 dead, 128 enchanted, 1024 degen?, 2048 hexed, 8192 sitting, etc) + }; + constexpr uint32_t Packet<AgentState>::STATIC_HEADER = GAME_SMSG_AGENT_UPDATE_EFFECTS; + + struct MapLoaded : Packet<MapLoaded> { + // uint32_t + }; + constexpr uint32_t Packet<MapLoaded>::STATIC_HEADER = GAME_SMSG_INSTANCE_LOADED; + + struct QuotedItemPrice : Packet<QuotedItemPrice> { + uint32_t itemid; + uint32_t price; + }; + constexpr uint32_t Packet<QuotedItemPrice>::STATIC_HEADER = GAME_SMSG_ITEM_PRICE_QUOTE; + + struct WindowPrices : Packet<WindowPrices> { + uint32_t count; + uint32_t item_ids[16]; + }; + constexpr uint32_t Packet<WindowPrices>::STATIC_HEADER = GAME_SMSG_ITEM_PRICES; + + struct VanquishProgress : Packet<VanquishProgress> { + uint32_t foes_killed; + uint32_t foes_remaining; + }; + constexpr uint32_t Packet<VanquishProgress>::STATIC_HEADER = GAME_SMSG_VANQUISH_PROGRESS; + + struct VanquishComplete : Packet<VanquishComplete> { + uint32_t map_id; + uint32_t experience; + uint32_t gold; + }; + constexpr uint32_t Packet<VanquishComplete>::STATIC_HEADER = GAME_SMSG_VANQUISH_COMPLETE; + + struct CinematicPlay : Packet<CinematicPlay> { + uint32_t play; + }; + constexpr uint32_t Packet<CinematicPlay>::STATIC_HEADER = GAME_SMSG_CINEMATIC_START; + + // e.g. map doors start opening or closing. AKA "update object animation" + struct ManipulateMapObject : Packet<ManipulateMapObject> { + uint32_t object_id; // Door ID + uint32_t animation_type; // (3 = door closing, 9 = ???, 16 = door opening) + uint32_t animation_stage; // (2 = start, 3 = stop) + }; + constexpr uint32_t Packet<ManipulateMapObject>::STATIC_HEADER = GAME_SMSG_MANIPULATE_MAP_OBJECT; + + // e.g. map doors stop opening or closing. "update object state" + struct ManipulateMapObject2 : Packet<ManipulateMapObject2> { + uint32_t object_id; // Door ID + uint32_t unk1; // + uint32_t state; // Open = 1, Closed = 0 + }; + constexpr uint32_t Packet<ManipulateMapObject2>::STATIC_HEADER = GAME_SMSG_MANIPULATE_MAP_OBJECT2; + + struct TownAllianceObject : Packet<TownAllianceObject> { + uint32_t map_id; + uint32_t rank; + uint32_t allegiance; + uint32_t faction; + wchar_t name[32]; + wchar_t tag[5]; + uint32_t cape_bg_color; + uint32_t cape_detail_color; + uint32_t cape_emblem_color; + uint32_t cape_shape; + uint32_t cape_detail; + uint32_t cape_emblem; + uint32_t cape_trim; + }; + constexpr uint32_t Packet<TownAllianceObject>::STATIC_HEADER = GAME_SMSG_TOWN_ALLIANCE_OBJECT; + + // Info about any guilds applicable to current outpost. + // NOTE: When entering a guild hall, that guild will always be the first added (local_id = 1). + struct GuildGeneral : Packet<GuildGeneral> { + uint32_t local_id; + uint32_t ghkey[4]; // blob[16] + wchar_t name[32]; + wchar_t tag[5]; + uint32_t cape_bg_color; + uint32_t cape_detail_color; + uint32_t cape_emblem_color; + uint32_t cape_shape; + uint32_t cape_detail; + uint32_t cape_emblem; + uint32_t cape_trim; + uint32_t unk1; // Word + uint32_t unk2; // byte + uint32_t unk3; // byte + uint32_t faction; + uint32_t unk4; // dword + uint32_t rank; + uint32_t allegiance; + uint32_t unk5; // byte + }; + constexpr uint32_t Packet<GuildGeneral>::STATIC_HEADER = GAME_SMSG_GUILD_GENERAL_INFO; + + struct GuildPlayerInfo : Packet<GuildPlayerInfo> { + wchar_t invited_name[20]; + wchar_t current_name[20]; + wchar_t invited_by[20]; + wchar_t context_info[64]; + uint32_t unk; // Something to do with promoted date? + uint32_t minutes_since_login; + uint32_t join_date; // This is seconds, but since when? 1471089600 ? + uint32_t status; + uint32_t member_type; + }; + constexpr uint32_t Packet<GuildPlayerInfo>::STATIC_HEADER = GAME_SMSG_GUILD_PLAYER_INFO; + + struct ItemUpdateOwner : Packet<ItemUpdateOwner> { + GW::ItemID item_id; + GW::AgentID owner_agent_id; + float seconds_reserved; + }; + constexpr uint32_t Packet<ItemUpdateOwner>::STATIC_HEADER = GAME_SMSG_ITEM_UPDATE_OWNER; + + struct ItemCustomisedForPlayer : Packet<ItemCustomisedForPlayer> { + uint32_t item_id; + wchar_t player_name[32]; + }; + constexpr uint32_t Packet<ItemCustomisedForPlayer>::STATIC_HEADER = GAME_SMSG_ITEM_UPDATE_NAME; + + // Gold added to inventory + struct CharacterAddGold : Packet<CharacterAddGold> { + uint32_t unk; + uint32_t gold; + }; + constexpr uint32_t Packet<CharacterAddGold>::STATIC_HEADER = GAME_SMSG_GOLD_CHARACTER_ADD; + + struct SalvageConsumeItem : Packet<SalvageConsumeItem> { + uint32_t salvage_session_id; + uint32_t item_id; + }; + constexpr uint32_t Packet<SalvageConsumeItem>::STATIC_HEADER = GAME_SMSG_ITEM_REMOVE; + + // Gold removed from inventory + struct CharacterRemoveGold : Packet<CharacterRemoveGold> { + uint32_t unk; // some kind of id? but neither agentid nor playerid + uint32_t gold; + }; + constexpr uint32_t Packet<CharacterRemoveGold>::STATIC_HEADER = GAME_SMSG_GOLD_CHARACTER_REMOVE; + + struct ItemGeneral : Packet<ItemGeneral> { + uint32_t item_id; + uint32_t model_file_id; + uint32_t type; + uint32_t unk1; + uint32_t extra_id; // Dye color + uint32_t materials; + uint32_t unk2; + uint32_t interaction; // Flags + uint32_t price; + uint32_t model_id; + uint32_t quantity; + wchar_t* enc_name; + uint32_t mod_struct_size; + uint32_t* mod_struct; + }; + constexpr uint32_t Packet<ItemGeneral>::STATIC_HEADER = GAME_SMSG_ITEM_GENERAL_INFO; + + struct SalvageSession : Packet<SalvageSession> { + uint32_t salvage_session_id; + uint32_t salvage_item_id; + uint32_t salvagable_count; + uint32_t salvagable_item_ids[3]; + }; + constexpr uint32_t Packet<SalvageSession>::STATIC_HEADER = GAME_SMSG_ITEM_SALVAGE_SESSION_START; + + struct SalvageSessionCancel : Packet<SalvageSessionCancel> { + }; + constexpr uint32_t Packet<SalvageSessionCancel>::STATIC_HEADER = GAME_SMSG_ITEM_SALVAGE_SESSION_CANCEL; + + struct SalvageSessionDone : Packet<SalvageSessionDone> { + }; + constexpr uint32_t Packet<SalvageSessionDone>::STATIC_HEADER = GAME_SMSG_ITEM_SALVAGE_SESSION_DONE; + + struct SalvageSessionItemKept : Packet<SalvageSessionItemKept> { + }; + constexpr uint32_t Packet<SalvageSessionItemKept>::STATIC_HEADER = GAME_SMSG_ITEM_SALVAGE_SESSION_ITEM_KEPT; + + struct SalvageSessionSuccess : Packet<SalvageSessionSuccess> { + }; + constexpr uint32_t Packet<SalvageSessionSuccess>::STATIC_HEADER = GAME_SMSG_ITEM_SALVAGE_SESSION_SUCCESS; + + // JumboMessage represents a message strewn across the center of the screen in big red or green characters. + // Things like moral boosts, flag captures, victory, defeat... + struct JumboMessage : GW::Packet::StoC::Packet<JumboMessage> { + uint8_t type; // JumboMessageType + uint32_t value; // JumboMessageValue + }; + const uint32_t GW::Packet::StoC::Packet<JumboMessage>::STATIC_HEADER = GAME_SMSG_JUMBO_MESSAGE; + + struct InstanceLoadFile : Packet<InstanceLoadFile> { + uint32_t map_fileID; + Vec2f spawn_point; + uint16_t spawn_plane; + uint8_t unk1; + uint8_t unk2; + uint8_t unk3[8]; + }; + constexpr uint32_t Packet<InstanceLoadFile>::STATIC_HEADER = GAME_SMSG_INSTANCE_LOAD_SPAWN_POINT; + + struct InstanceLoadInfo : Packet<InstanceLoadInfo> { + uint32_t agent_id; + uint32_t map_id; + uint32_t is_explorable; + uint32_t district; + uint32_t language; + uint32_t is_observer; + }; + constexpr uint32_t Packet<InstanceLoadInfo>::STATIC_HEADER = GAME_SMSG_INSTANCE_LOAD_INFO; + + struct CreateMissionProgress : Packet<CreateMissionProgress> { + uint8_t id; + wchar_t unk1[122]; + wchar_t unk2[122]; + uint8_t unk3; + int32_t pips; // probably only signed char used + float regeneration; // 0 ... 1 + float filled; // 0 ... 1 + uint8_t color[4]; // RGBA, not including border + }; + constexpr uint32_t Packet<CreateMissionProgress>::STATIC_HEADER = GAME_SMSG_CREATE_MISSION_PROGRESS; + + struct UpdateMissionProgress : Packet<UpdateMissionProgress> { + uint8_t id; + uint8_t unk1; + int32_t pips; // only signed char used + float regeneration; // 0 ... 1 + float filled; // 0 ... 1 + uint8_t color[4]; // RGBA, not including border + }; + constexpr uint32_t Packet<UpdateMissionProgress>::STATIC_HEADER = GAME_SMSG_UPDATE_MISSION_PROGRESS; + + struct GameSrvTransfer : Packet<GameSrvTransfer> { + uint8_t host[24]; // ip of the game server + uint32_t token1; // world id + uint32_t region; // uint8_t + uint32_t map_id; // uint8_t + uint32_t is_explorable; // uint8_t + uint32_t token2; // player id + }; + constexpr uint32_t Packet<GameSrvTransfer>::STATIC_HEADER = GAME_SMSG_TRANSFER_GAME_SERVER_INFO; + + struct DoACompleteZone : Packet<DoACompleteZone> { + wchar_t message[122]; + }; + constexpr uint32_t Packet<DoACompleteZone>::STATIC_HEADER = GAME_SMSG_DOA_COMPLETE_ZONE; + + struct ErrorMessage : Packet<ErrorMessage> { + uint32_t message_id; + }; + constexpr uint32_t Packet<ErrorMessage>::STATIC_HEADER = GAME_SMSG_INSTANCE_TRAVEL_TIMER; + + /* Party Invites */ + struct PartyHenchmanAdd : Packet<PartyHenchmanAdd> { + uint32_t party_id; + uint32_t agent_id; + wchar_t name_enc[8]; + uint32_t profession; + uint32_t level; + }; + constexpr uint32_t Packet<PartyHenchmanAdd>::STATIC_HEADER = GAME_SMSG_PARTY_HENCHMAN_ADD; + + struct PartyHenchmanRemove : Packet<PartyHenchmanRemove> { + uint32_t party_id; + uint32_t agent_id; + }; + constexpr uint32_t Packet<PartyHenchmanRemove>::STATIC_HEADER = GAME_SMSG_PARTY_HENCHMAN_REMOVE; + + struct PartyHeroAdd : Packet<PartyHeroAdd> { + uint32_t party_id; + uint32_t owner_player_number; + uint32_t agent_id; + uint32_t hero_id; + uint32_t level; + }; + constexpr uint32_t Packet<PartyHeroAdd>::STATIC_HEADER = GAME_SMSG_PARTY_HERO_ADD; + + struct PartyHeroRemove : Packet<PartyHeroRemove> { + uint32_t party_id; + uint32_t owner_player_number; + uint32_t agent_id; + }; + constexpr uint32_t Packet<PartyHeroRemove>::STATIC_HEADER = GAME_SMSG_PARTY_HERO_REMOVE; + + + // Invite sent to another party + struct PartyInviteSent_Create : Packet<PartyInviteSent_Create> { + uint32_t target_party_id; + }; + constexpr uint32_t Packet<PartyInviteSent_Create>::STATIC_HEADER = GAME_SMSG_PARTY_INVITE_ADD; + // Invite received from another party + struct PartyInviteReceived_Create : Packet<PartyInviteReceived_Create> { + uint32_t target_party_id; // word + }; + constexpr uint32_t Packet<PartyInviteReceived_Create>::STATIC_HEADER = GAME_SMSG_PARTY_JOIN_REQUEST; + + // Remove a sent party invite. Invitation has been cancelled. + struct PartyInviteSent_Cancel : Packet<PartyInviteSent_Cancel> { + uint32_t target_party_id; // word + }; + constexpr uint32_t Packet<PartyInviteSent_Cancel>::STATIC_HEADER = GAME_SMSG_PARTY_INVITE_CANCEL; + + // Remove a received party invite. Invitation has been cancelled. + struct PartyInviteReceived_Cancel : Packet<PartyInviteReceived_Cancel> { + uint32_t target_party_id; // word + }; + constexpr uint32_t Packet<PartyInviteReceived_Cancel>::STATIC_HEADER = GAME_SMSG_PARTY_REQUEST_CANCEL; + + // Remove a received party invite. Invitation has been either accepted or rejected (we dont know atm) + struct PartyInviteSent_Response : Packet<PartyInviteSent_Response> { + uint32_t target_party_id; // word + }; + constexpr uint32_t Packet<PartyInviteSent_Response>::STATIC_HEADER = GAME_SMSG_PARTY_REQUEST_RESPONSE; + + // Remove a sent party invite. Invitation has been either accepted or rejected (we dont know atm) + struct PartyInviteReceived_Response : Packet<PartyInviteReceived_Response> { + uint32_t target_party_id; // word + }; + constexpr uint32_t Packet<PartyInviteReceived_Response>::STATIC_HEADER = GAME_SMSG_PARTY_INVITE_RESPONSE; + + // A player in a party has been updated or added. Not necessarily yours. + struct PartyPlayerAdd : Packet<PartyPlayerAdd> { + uint32_t party_id; + uint32_t player_id; + uint32_t state; // 3 = Invited + }; + constexpr uint32_t Packet<PartyPlayerAdd>::STATIC_HEADER = GAME_SMSG_PARTY_PLAYER_ADD; + // Player has left party. Not necessarily yours. + struct PartyPlayerRemove : Packet<PartyPlayerRemove> { + uint32_t party_id; + uint32_t player_id; + }; + constexpr uint32_t Packet<PartyPlayerRemove>::STATIC_HEADER = GAME_SMSG_PARTY_PLAYER_REMOVE; + // Player in party has toggled ready. Not necessarily yours. + struct PartyPlayerReady : Packet<PartyPlayerReady> { + uint32_t party_id; + uint32_t player_id; + uint32_t is_ready; + }; + constexpr uint32_t Packet<PartyPlayerReady>::STATIC_HEADER = GAME_SMSG_PARTY_PLAYER_READY; + + // When a new party is created: + // 1. PartyPlayerStreamStart packet is sent + // 2. PartyPlayerAdd packet per member + // PartyHeroAdd packet per hero + // PartyHenchmanAdd packer per henchman + // 3. PartyPlayerStreamEnd packet is sent + struct PartyPlayerStreamStart : Packet<PartyPlayerStreamStart> { + uint32_t party_id; // word + }; + constexpr uint32_t Packet<PartyPlayerStreamStart>::STATIC_HEADER = GAME_SMSG_PARTY_CREATE; + struct PartyPlayerStreamEnd : Packet<PartyPlayerStreamEnd> { + uint32_t party_id; // word + }; + constexpr uint32_t Packet<PartyPlayerStreamEnd>::STATIC_HEADER = GAME_SMSG_PARTY_MEMBER_STREAM_END; + + struct PartyDefeated : Packet<PartyDefeated> { + }; + constexpr uint32_t Packet<PartyDefeated>::STATIC_HEADER = GAME_SMSG_PARTY_DEFEATED; + + struct PartyLock : Packet<PartyLock> { // Sent when party window is locked/unlocked e.g. pending mission entry + uint32_t unk1; // 2 = locked? + uint32_t unk2; // 1 = locked? + wchar_t unk3[8]; + }; + constexpr uint32_t Packet<PartyLock>::STATIC_HEADER = GAME_SMSG_PARTY_LOCK; + + struct CapeVisibility : Packet<CapeVisibility> { + uint32_t agent_id; + uint32_t visible; // 0 or 1 + }; + constexpr uint32_t Packet<CapeVisibility>::STATIC_HEADER = GAME_SMSG_AGENT_DISPLAY_CAPE; + + struct InstanceLoadStart : Packet<InstanceLoadStart> { + uint32_t unk1; + uint32_t unk2; + uint32_t unk3; + uint32_t unk4; + }; + constexpr uint32_t Packet<InstanceLoadStart>::STATIC_HEADER = GAME_SMSG_INSTANCE_LOAD_HEAD; + + struct ItemGeneral_FirstID : Packet<ItemGeneral_FirstID> { + uint32_t item_id; + uint32_t model_file_id; + uint32_t type; + uint32_t unk1; + uint32_t extra_id; + uint32_t materials; + uint32_t unk2; + uint32_t interaction; + uint32_t price; + uint32_t model_id; + uint32_t quantity; + wchar_t enc_name[64]; + uint32_t mod_struct_size; + uint32_t mod_struct[64]; + }; + constexpr uint32_t Packet<ItemGeneral_FirstID>::STATIC_HEADER = GAME_SMSG_ITEM_GENERAL_INFO; + + struct ItemGeneral_ReuseID : ItemGeneral_FirstID {}; + constexpr uint32_t Packet<ItemGeneral_ReuseID>::STATIC_HEADER = GAME_SMSG_ITEM_REUSE_ID; + + struct PlayerIsPartyLeader : Packet<PlayerIsPartyLeader> { + uint32_t is_leader; // bool + }; + constexpr uint32_t Packet<PlayerIsPartyLeader>::STATIC_HEADER = GAME_SMSG_PARTY_YOU_ARE_LEADER; + + struct RemoveEffect : Packet<RemoveEffect> { + GW::AgentID agent_id; + unsigned effect_id; // not GW::SkillID + }; + constexpr uint32_t Packet<RemoveEffect>::STATIC_HEADER = GAME_SMSG_EFFECT_REMOVED; + + struct SkillRecharged : Packet<SkillRecharged> { + uint32_t agent_id; + uint32_t skill_id; + uint32_t skill_instance; + }; + constexpr uint32_t Packet<SkillRecharged>::STATIC_HEADER = GAME_SMSG_SKILL_RECHARGED; + + // Corrected version of GuildGeneral + struct UpdateGuildInfo : Packet<UpdateGuildInfo> { + uint32_t guild_id; + uint32_t gh_key[4]; + wchar_t guild_name[32]; + wchar_t guild_tag[6]; // client accepts only 4 + \0 + uint32_t guild_features; + uint32_t territory; + uint32_t cape_background_color; // & 0xF0 = hue, & 0x0F = brightness + uint32_t cape_detail_color; // & 0xF0 = hue, & 0x0F = brightness + uint32_t cape_emblem_color; // & 0xF0 = hue, & 0x0F = brightness + uint32_t cape_shape; // 0 - 8 + uint32_t cape_detail; // 0 - 31 + uint32_t cape_emblem; // 0 - 173 + uint32_t cape_trim; // 0 - 13 + uint32_t faction; + uint32_t factions_count; + uint32_t qualifier_points; + uint32_t rating; + uint32_t rank; + uint32_t unk; + }; + constexpr uint32_t Packet<UpdateGuildInfo>::STATIC_HEADER = GAME_SMSG_GUILD_GENERAL_INFO; + + struct UpdateTitle : Packet<UpdateTitle> { + uint32_t title_id; + uint32_t new_value; + }; + constexpr uint32_t Packet<UpdateTitle>::STATIC_HEADER = GAME_SMSG_TITLE_UPDATE; + + struct TitleInfo : Packet<TitleInfo> { + uint32_t title_id; + uint32_t unk_flags; + uint32_t value; + uint32_t h000c; // Maybe an id for current rank + uint32_t current_rank_minimum_value; + uint32_t h0014; // Maybe an id for next rank + uint32_t next_rank_minimum_value; + uint32_t num_ranks; + uint32_t h0020; // Maybe an id for e.g. base rank? Matches h000c for wisdom on my r1 wisdom alt acc + wchar_t progress_display_enc_string[8]; + wchar_t mouseover_hint_enc_string[8]; + }; + constexpr uint32_t Packet<TitleInfo>::STATIC_HEADER = GAME_SMSG_TITLE_TRACK_INFO; + + enum class PlayerAttrId { + Experience = 0, + Kurzick_Faction, + Kurzick_Faction_Total, + Luxon_Faction, + Luxon_Faction_Total, + Imperial_Faction, + Imperial_Faction_Total, + Hero_Skill_Points, + Hero_Skill_Points_Total, + Level, + Morale_Percent, + Balthazar_Faction, + Balthazar_Faction_Total, + Skill_Points, + Skill_Points_Total + }; + + struct PlayerAttrUpdate : Packet<PlayerAttrUpdate> { + uint32_t attr_id; + int32_t modifier; + }; + constexpr uint32_t Packet<PlayerAttrUpdate>::STATIC_HEADER = GAME_SMSG_PLAYER_ATTR_UPDATE; + + struct PlayerAttrSet : Packet<PlayerAttrSet> { + uint32_t experience; + uint32_t kurzick_faction; + uint32_t kurzick_faction_total; + uint32_t luxon_faction; + uint32_t luxon_faction_total; + uint32_t imperial_faction; + uint32_t imperial_faction_total; + uint32_t hero_skill_points; + uint32_t hero_skill_points_total; + uint32_t level; + uint32_t morale_percent; // Percentage of health/energy available due to morale/death penalty. Ranges from 40 to 110. + uint32_t balthazar_faction; + uint32_t balthazar_faction_total; + uint32_t skill_points; + uint32_t skill_points_total; + }; + constexpr uint32_t Packet<PlayerAttrSet>::STATIC_HEADER = GAME_SMSG_PLAYER_ATTR_SET; + } + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Debug.h b/Dependencies/GWCA/Include/GWCA/Utilities/Debug.h new file mode 100644 index 00000000..093fc2ad --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Debug.h @@ -0,0 +1,71 @@ +#pragma once +#define GWCA_ASSERT(expr) ((void)(!!(expr) || (GW::FatalAssert(#expr, __FILE__, (unsigned)__LINE__, __FUNCTION__), 0))) +#ifdef _DEBUG + #define GWCA_TRACE(fmt, ...) GW::LogMessage(GW::LEVEL_TRACE, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) + #define GWCA_DEBUG(fmt, ...) GW::LogMessage(GW::LEVEL_DEBUG, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) + #define GWCA_INFO(fmt, ...) GW::LogMessage(GW::LEVEL_INFO, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) + #define GWCA_WARN(fmt, ...) GW::LogMessage(GW::LEVEL_WARN, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) + #define GWCA_ERR(fmt, ...) GW::LogMessage(GW::LEVEL_ERR, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) + #define GWCA_CRITICAL(fmt, ...) GW::LogMessage(GW::LEVEL_CRITICAL, __FILE__, (unsigned)__LINE__, __FUNCTION__, fmt, __VA_ARGS__) +#else + + #define GWCA_TRACE(fmt, ...) + #define GWCA_DEBUG(fmt, ...) + #define GWCA_INFO(fmt, ...) + #define GWCA_WARN(fmt, ...) + #define GWCA_ERR(fmt, ...) + #define GWCA_CRITICAL(fmt, ...) +#endif + +#include <GWCA/Utilities/Export.h> + +namespace GW +{ + enum LogLevel { + LEVEL_TRACE, + LEVEL_DEBUG, + LEVEL_INFO, + LEVEL_WARN, + LEVEL_ERR, + LEVEL_CRITICAL, + }; + + typedef void (*LogHandler)( + void *context, + LogLevel level, + const char *msg, + const char *file, + unsigned int line, + const char *function); + GWCA_API void RegisterLogHandler(LogHandler handler, void *context); + + typedef void (*PanicHandler)( + void *context, + const char *expr, + const char *file, + unsigned int line, + const char *function); + GWCA_API void RegisterPanicHandler(PanicHandler handler, void *context); + + GWCA_API void FatalAssert( + const char *expr, + const char *file, + unsigned int line, + const char *function); + + GWCA_API void __cdecl LogMessage( + LogLevel level, + const char *file, + unsigned int line, + const char *function, + const char *fmt, + ...); + + void __cdecl LogMessageV( + LogLevel level, + const char *file, + unsigned int line, + const char *function, + const char *fmt, + va_list args); +} diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Export.h b/Dependencies/GWCA/Include/GWCA/Utilities/Export.h new file mode 100644 index 00000000..7bc4324f --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Export.h @@ -0,0 +1,20 @@ +#pragma once + +#if defined(__clang__) || defined(__GNUC__) +# define DllExport __attribute__((dllexport)) +# define DllImport __attribute__((dllimport)) +#elif defined(_MSC_VER) +# define DllExport __declspec(dllexport) +# define DllImport __declspec(dllimport) +#endif +#ifndef GWCA_API +#ifdef GWCA_BUILD_EXPORTS +# define GWCA_API DllExport +#else +#ifdef GWCA_IMPORT +# define GWCA_API DllImport +#else +# define GWCA_API +#endif +#endif +#endif diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/FileScanner.h b/Dependencies/GWCA/Include/GWCA/Utilities/FileScanner.h new file mode 100644 index 00000000..be1dca05 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/FileScanner.h @@ -0,0 +1,27 @@ +#pragma once + +#include <Windows.h> +#include <stdint.h> +#include <GWCA\Utilities\Scanner.h> + +class FileScanner +{ +public: + static bool CreateFromPath(const wchar_t *path, FileScanner *result); + + FileScanner(); + FileScanner(const void *FileMapping, uintptr_t ImageBase, PIMAGE_SECTION_HEADER Sections, size_t Count); + FileScanner& operator=(FileScanner&& other) noexcept; + FileScanner& operator=(const FileScanner& other) noexcept; + ~FileScanner(); + + void GetSectionAddressRange(GW::ScannerSection section, uintptr_t* start, uintptr_t* end) const; + uintptr_t FindAssertion(const char* assertion_file, const char* assertion_msg, uint32_t line_number, int offset); + uintptr_t FindInRange(const char* pattern, const char* mask, int offset, uint32_t start, uint32_t end); + uintptr_t Find(const char* pattern, const char* mask, int offset, GW::ScannerSection section = GW::ScannerSection::Section_TEXT); + + GW::ScannerSectionOffset sections[GW::ScannerSection::Section_Count] = {}; +private: + const void *FileMapping = nullptr; + uintptr_t ImageBase = 0; +}; diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Hook.h b/Dependencies/GWCA/Include/GWCA/Utilities/Hook.h new file mode 100644 index 00000000..31c39467 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Hook.h @@ -0,0 +1,31 @@ +#pragma once + +#include <functional> + +namespace GW +{ + struct HookEntry {}; + + struct HookStatus { + bool blocked = false; + unsigned int altitude = 0; + }; + + template <typename... Ts> + using HookCallback = std::function<void (HookStatus* status, Ts...)>; +} // namespace GW + + +// Usage: bind_member(this, &Class::member_function) +template <class C, typename Ret, typename... Ts> +std::function<Ret(Ts...)> bind_member(C* c, Ret (C::*m)(Ts...)) +{ + return [=]<typename... Args>(Args&&... args) { return (c->*m)(std::forward<Args>(args)...); }; +} + +// Usage: bind_member(this, &Class::member_function) +template <class C, typename Ret, typename... Ts> +std::function<Ret(Ts...)> bind_member(const C* c, Ret (C::*m)(Ts...) const) +{ + return [=]<typename... Args>(Args&&... args) { return (c->*m)(std::forward<Args>(args)...); }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Hooker.h b/Dependencies/GWCA/Include/GWCA/Utilities/Hooker.h new file mode 100644 index 00000000..6e620540 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Hooker.h @@ -0,0 +1,23 @@ +#pragma once + +#include <GWCA/Utilities/Export.h> + +namespace GW { + namespace Hook { + GWCA_API void Initialize(); + GWCA_API void Deinitialize(); + + // static void EnqueueHook(HookBase* base); + // static void RemoveHook(HookBase* base); + + GWCA_API void EnableHooks(void* target = NULL); + GWCA_API void DisableHooks(void* target = NULL); + + GWCA_API int CreateHook(void** target, void* detour, void** trampoline); + GWCA_API void RemoveHook(void* target); + + GWCA_API void EnterHook(); + GWCA_API void LeaveHook(); + GWCA_API int GetInHookCount(); + } +} diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Macros.h b/Dependencies/GWCA/Include/GWCA/Utilities/Macros.h new file mode 100644 index 00000000..de4e8872 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Macros.h @@ -0,0 +1,3 @@ +#pragma once + +#define Verify(expr) (expr) diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/MemoryPatcher.h b/Dependencies/GWCA/Include/GWCA/Utilities/MemoryPatcher.h new file mode 100644 index 00000000..bdfe5a3b --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/MemoryPatcher.h @@ -0,0 +1,41 @@ +#pragma once + +namespace GW { + + class MemoryPatcher { + public: + MemoryPatcher() = default; + MemoryPatcher(const MemoryPatcher&) = delete; + ~MemoryPatcher() { + if (GetIsActive()) + Reset(); + }; + + GWCA_API void Reset(); + bool IsValid() { return m_addr != nullptr; } + GWCA_API void SetPatch(uintptr_t addr, const char* patch, size_t size); + + const void* GetAddress() { return m_addr; } + + // Use to redirect a CALL or JMP instruction to call a different function instead. + GWCA_API bool SetRedirect(uintptr_t call_instruction_address, void* redirect_func); + + GWCA_API bool TogglePatch(bool flag); + bool TogglePatch() { return TogglePatch(!m_active); }; + + bool GetIsActive() { return m_active; }; + + // Disconnect all patches from memory, restoring original values if applicable + GWCA_API static void DisableHooks(); + // Connect any applicable patches that have been disconnected. + GWCA_API static void EnableHooks(); + private: + void *m_addr = nullptr; + uint8_t *m_patch = nullptr; + uint8_t *m_backup = nullptr; + size_t m_size = 0; + bool m_active = false; + + void PatchActual(bool patch); + }; +} diff --git a/Dependencies/GWCA/Include/GWCA/Utilities/Scanner.h b/Dependencies/GWCA/Include/GWCA/Utilities/Scanner.h new file mode 100644 index 00000000..dc1b8888 --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/Utilities/Scanner.h @@ -0,0 +1,53 @@ +#pragma once + +#include "Export.h" + +namespace GW { + enum ScannerSection : uint8_t { + Section_TEXT = 0, + Section_RDATA = 1, + Section_DATA = 2, + Section_Count = 3 + }; + struct ScannerSectionOffset { + uintptr_t start = 0; + uintptr_t end = 0; + }; + // class PatternScanner + // 32 bit pattern scanner for x86 programs. + // Credits to Zat & Midi12 @ unknowncheats.me for the functionality of this class. + namespace Scanner { + // Initializer to determine scan range. + GWCA_API void Initialize(const char* moduleName = NULL); + GWCA_API void Initialize(HMODULE hModule); + + GWCA_API DWORD GetGameTlsIndex(); + + // Find reference in GW memory to a specific assertion message + GWCA_API uintptr_t FindAssertion(const char* assertion_file, const char* assertion_msg, uint32_t line_number, int offset); + + // Pattern find between a start and end address. If end is less than start, will scan backward. + GWCA_API uintptr_t FindInRange(const char* pattern, const char* mask, int offset, DWORD start, DWORD end); + + GWCA_API uintptr_t FindUseOfString(const char* str, int offset = 0, ScannerSection section = ScannerSection::Section_TEXT); + + GWCA_API uintptr_t FindNthUseOfString(const char* str, size_t nth, int offset = 0, ScannerSection section = ScannerSection::Section_TEXT); + + GWCA_API uintptr_t FindUseOfString(const wchar_t* str, int offset = 0, ScannerSection section = ScannerSection::Section_TEXT); + + GWCA_API uintptr_t FindNthUseOfString(const wchar_t* str, size_t nth, int offset = 0, ScannerSection section = ScannerSection::Section_TEXT); + + // Actual pattern finder. + GWCA_API uintptr_t Find(const char* pattern, const char* mask = 0, int offset = 0, ScannerSection section = ScannerSection::Section_TEXT); + + GWCA_API void GetSectionAddressRange(ScannerSection section, uintptr_t* start = nullptr, uintptr_t* end = nullptr); + + // Check if current address is a valid pointer (usually to a data variable in DATA) + GWCA_API bool IsValidPtr(uintptr_t address, ScannerSection section = ScannerSection::Section_DATA); + + // Returns actual address of a function call given via CALL <near call> instruction e.g. *call_instruction_address = 0xE8 ?? ?? ?? 0xFF + GWCA_API uintptr_t FunctionFromNearCall(uintptr_t call_instruction_address, bool check_valid_ptr = true); + + GWCA_API uintptr_t ToFunctionStart(uintptr_t call_instruction_address, uint32_t scan_range = 0xff); + } +} diff --git a/Dependencies/GWCA/Include/GWCA/stdafx.h b/Dependencies/GWCA/Include/GWCA/stdafx.h new file mode 100644 index 00000000..1688d35f --- /dev/null +++ b/Dependencies/GWCA/Include/GWCA/stdafx.h @@ -0,0 +1,74 @@ +#pragma once + +#pragma warning(disable: 4619) // there is no warning number 'number' + +#pragma warning(push) +#pragma warning(disable: 4061) // enumerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label +#pragma warning(disable: 4365) // 'action' : conversion from 'type_1' to 'type_2', signed/unsigned mismatch +#pragma warning(disable: 4514) // 'function' : unreferenced inline function has been removed +#pragma warning(disable: 4530) // C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc +#pragma warning(disable: 4577) // 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc +#pragma warning(disable: 4623) // 'derived class' : default constructor was implicitly defined as deleted because a base class default constructor is inaccessible or deleted +#pragma warning(disable: 4625) // 'derived class' : copy constructor was implicitly defined as deleted because a base class copy constructor is inaccessible or deleted +#pragma warning(disable: 4626) // 'derived class' : assignment operator was implicitly defined as deleted because a base class assignment operator is inaccessible or deleted +#pragma warning(disable: 4668) // 'symbol' is not defined as a preprocessor macro, replacing with '0' for 'directives' +#pragma warning(disable: 4710) // 'function' : function not inlined +#pragma warning(disable: 4711) // function 'function' selected for inline expansion +#pragma warning(disable: 4820) // 'bytes' bytes padding added after construct 'member_name' +#pragma warning(disable: 4917) // 'declarator' : a GUID can only be associated with a class, interface or namespace +#pragma warning(disable: 5026) // 'type': move constructor was implicitly defined as deleted +#pragma warning(disable: 5027) // 'type': move assignment operator was implicitly defined as deleted +#pragma warning(disable: 5039) // 'function': pointer or reference to potentially throwing function passed to extern C function under -EHc. Undefined behavior may occur if this function throws an exception. +#pragma warning(disable: 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified + +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS 1 +#endif + +#include <cmath> +#include <cstdio> +#include <cstdint> +#include <cstring> + +#include <map> +#include <atomic> +#include <string> +#include <vector> +#include <sstream> +#include <array> +#include <algorithm> +#include <functional> +#include <unordered_map> +#include <utility> + +#ifndef NOMINMAX +# define NOMINMAX +#endif + +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#include <Windows.h> +#include <ShellApi.h> + +#pragma warning(pop) + + +#pragma warning(disable: 4061) // enumerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label +#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +#pragma warning(disable: 4514) // 'function' : unreferenced inline function has been removed +#pragma warning(disable: 4505) // 'function' : unreferenced local function has been removed +#pragma warning(disable: 4530) // C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc +#pragma warning(disable: 4577) // 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc +#pragma warning(disable: 4623) // 'derived class' : default constructor was implicitly defined as deleted because a base class default constructor is inaccessible or deleted +#pragma warning(disable: 4625) // 'derived class' : copy constructor was implicitly defined as deleted because a base class copy constructor is inaccessible or deleted +#pragma warning(disable: 4626) // 'derived class' : assignment operator was implicitly defined as deleted because a base class assignment operator is inaccessible or deleted +#pragma warning(disable: 4710) // 'function' : function not inlined +#pragma warning(disable: 4711) // function 'function' selected for inline expansion +#pragma warning(disable: 4774) // 'swprintf' : format string expected in argument 3 is not a string literal +#pragma warning(disable: 4820) // 'bytes' bytes padding added after construct 'member_name' +#pragma warning(disable: 5026) // 'type': move constructor was implicitly defined as deleted +#pragma warning(disable: 5027) // 'type': move assignment operator was implicitly defined as deleted +#pragma warning(disable: 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified +#pragma warning(disable: 28159) // Consider using 'GetTickCount64' instead of 'GetTickCount'. diff --git a/Dependencies/GWCA/gwca.dll b/Dependencies/GWCA/gwca.dll index 00079e86..b20ecd6e 100644 Binary files a/Dependencies/GWCA/gwca.dll and b/Dependencies/GWCA/gwca.dll differ diff --git a/Dependencies/GWCA/gwca.exp b/Dependencies/GWCA/gwca.exp index 6556f445..423b0912 100644 Binary files a/Dependencies/GWCA/gwca.exp and b/Dependencies/GWCA/gwca.exp differ diff --git a/Dependencies/GWCA/gwca.lib b/Dependencies/GWCA/gwca.lib index 11395015..5aeb424b 100644 Binary files a/Dependencies/GWCA/gwca.lib and b/Dependencies/GWCA/gwca.lib differ diff --git a/Directory.Build.props b/Directory.Build.props index 6e334d22..de3e6096 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ <PropertyGroup> <NoWarn>$(NoWarn);IL2104;IL3053;IL3000;IL3002;NU1701;CS0108</NoWarn> - <Version>0.9.10.3</Version> + <Version>0.9.10.4</Version> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings>