-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathEQClasses.h
1988 lines (1740 loc) · 56 KB
/
EQClasses.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* MacroQuest: The extension platform for EverQuest
* Copyright (C) 2002-present MacroQuest Authors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
#include "Common.h"
#include "EverQuest.h"
#include "Items.h"
#include "KeyCombo.h"
#include "PcClient.h"
#include "PlayerClient.h"
#include "SerializeBuffer.h"
#include "Spells.h"
#include "UI.h"
#include <limits>
#undef FindWindow
#undef InsertMenuItem
namespace eqlib {
class CMemoryStream;
class CVector3;
//============================================================================
// Aggro Meter
enum AggroDataTypes
{
AD_Player,
AD_Secondary,
AD_Group1,
AD_Group2,
AD_Group3,
AD_Group4,
AD_Group5,
AD_xTarget1,
AD_xTarget2,
AD_xTarget3,
AD_xTarget4,
AD_xTarget5,
AD_xTarget6,
AD_xTarget7,
AD_xTarget8,
AD_xTarget9,
AD_xTarget10,
AD_xTarget11,
AD_xTarget12,
AD_xTarget13,
AD_xTarget14,
AD_xTarget15,
AD_xTarget16,
AD_xTarget17,
AD_xTarget18,
AD_xTarget19,
AD_xTarget20,
};
struct AggroMeterListEntry
{
virtual void Reset() {}
uint16_t AggroPct;
};
using PAggroMeterListEntry DEPRECATE("Use AggroMeterListEntry* instead of PAggroMeterListEntry") = AggroMeterListEntry*;
using AGGRODATA DEPRECATE("Use AggroMeterListEntry instead of AGGRODATA") = AggroMeterListEntry;
using PAGGRODATA DEPRECATE("Use AggroMeterListEntry* instead of PAGGRODATA") = AggroMeterListEntry*;
constexpr int MAX_AGGRO_METER_SIZE = 30;
class [[offsetcomments]] AggroMeterManagerClient
{
public:
static EQLIB_OBJECT AggroMeterManagerClient& Instance();
/*0x000*/ AggroMeterListEntry aggroData[MAX_AGGRO_METER_SIZE];
/*0x1e0*/ uint32_t AggroLockID; // this can be 0, I dont know what it is...
/*0x1e4*/ uint32_t AggroTargetID; // this is id of whoever we are fighting
/*0x1e8*/ uint32_t AggroSecondaryID; // this is id of whoever the npc is fighting
/*0x1ec*/
};
using AGGROINFO DEPRECATE("Use AggroMeterManagerClient instead of AGGROINFO") = AggroMeterManagerClient;
using PAGGROINFO DEPRECATE("Use AggroMeterManagerClient* instead of PAGGROINFO") = AggroMeterManagerClient*;
// This is actually part of the LabelCache.
struct [[offsetcomments]] LabelCache_AggroData
{
FORCE_SYMBOLS
/*0x000*/ int AggroMostHatedName[64];
/*0x100*/ int AggroHatePct[MAX_AGGRO_METER_SIZE];
/*0x178*/ int AggroMyHatePct;
/*0x17c*/ };
struct [[offsetcomments]] LabelCache
{
/*0x000*/ char Name[64];
/*0x040*/ char LastName[64];
/*0x080*/ int Level;
/*0x084*/ char Class[64];
/*0x0c4*/ char Title[64];
/*0x104*/ int Deity;
/*0x108*/ int Str;
/*0x10c*/ int Sta;
/*0x110*/ int Dex;
/*0x114*/ int Agi;
/*0x118*/ int Wis;
/*0x11c*/ int Int;
/*0x120*/ int Cha;
/*0x124*/ int ResistPoison;
/*0x128*/ int ResistDisease;
/*0x12c*/ int ResistCorruption;
/*0x130*/ int ResistFire;
/*0x134*/ int ResistCold;
/*0x138*/ int ResistMagic;
/*0x13c*/ int BaseStr;
/*0x140*/ int BaseSta;
/*0x144*/ int BaseDex;
/*0x148*/ int BaseAgi;
/*0x14c*/ int BaseWis;
/*0x150*/ int BaseInt;
/*0x154*/ int BaseCha;
/*0x158*/ int BaseResistPoison;
/*0x15c*/ int BaseResistDisease;
/*0x160*/ int BaseResistCorruption;
/*0x164*/ int BaseResistFire;
/*0x168*/ int BaseResistCold;
/*0x16c*/ int BaseResistMagic;
/*0x170*/ int HeroicStr;
/*0x174*/ int HeroicSta;
/*0x178*/ int HeroicDex;
/*0x17c*/ int HeroicAgi;
/*0x180*/ int HeroicWis;
/*0x184*/ int HeroicInt;
/*0x188*/ int HeroicCha;
/*0x18c*/ int MaxStr;
/*0x190*/ int MaxSta;
/*0x194*/ int MaxDex;
/*0x198*/ int MaxAgi;
/*0x19c*/ int MaxWis;
/*0x1a0*/ int MaxInt;
/*0x1a4*/ int MaxCha;
/*0x1a8*/ int MaxResistPoison;
/*0x1ac*/ int MaxResistDisease;
/*0x1b0*/ int MaxResistCorruption;
/*0x1b4*/ int MaxResistFire;
/*0x1b8*/ int MaxResistCold;
/*0x1bc*/ int MaxResistMagic;
/*0x1c0*/ int HP;
/*0x1c4*/ int MaxHP;
/*0x1c8*/ float HPPct;
/*0x1cc*/ int Mana;
/*0x1d0*/ int MaxMana;
/*0x1d4*/ float ManaPct;
/*0x1d8*/ int Endurance;
/*0x1dc*/ int MaxEndurance;
/*0x1e0*/ float EndurancePct;
/*0x1e4*/ int Mitigation;
/*0x1e8*/ int Evasion;
/*0x1ec*/ int Attack;
/*0x1f0*/ int Accuracy;
/*0x1f4*/ int Weight;
/*0x1f8*/ int MaxWeight;
/*0x1fc*/ float ExpPct;
/*0x200*/ float AAExpPct;
/*0x204*/ int AAPoints;
/*0x208*/ int AASiphon;
/*0x20c*/ int Haste;
/*0x210*/ int HPRegen;
/*0x214*/ int ManaRegen;
/*0x218*/ int EnduranceRegen;
/*0x21c*/ int SpellShield;
/*0x220*/ int CombatEfficiency;
/*0x224*/ int Shielding;
/*0x228*/ int DmgShielding;
/*0x22c*/ int DoTShielding;
/*0x230*/ int DmgShieldMitigation;
/*0x234*/ int Avoidance;
/*0x238*/ int AccuracyBonus;
/*0x23c*/ int StunResist;
/*0x240*/ int StrikeThrough;
/*0x244*/ int HealAmount;
/*0x248*/ int SpellDamage;
/*0x24c*/ int Clairvoyance;
/*0x250*/ int SkillDmgBash;
/*0x254*/ int SkillDmgBackstab;
/*0x258*/ int SkillDmgDragonPunch;
/*0x25c*/ int SkillDmgEagleStrike;
/*0x260*/ int SkillDmgFlyingKick;
/*0x264*/ int SkillDmgKick;
/*0x268*/ int SkillDmgRoundKick;
/*0x26c*/ int SkillDmgTigerClaw;
/*0x270*/ int SkillDmgFrenzy;
/*0x274*/ int Unused1;
/*0x278*/ int LoyaltyTokens;
/*0x27c*/ int ParcelCount;
/*0x280*/ int CurrentLoyaltyVelocity;
/*0x284*/ int OverflowCount;
/*0x288*/ int Luck;
/*0x28c*/ char TargetName[256];
/*0x38c*/ int TargetHPPct;
/*0x390*/ char PetName[128];
/*0x410*/ int PetHPPct;
/*0x414*/ int PetTargetHPPct;
/*0x418*/ char GroupName[MAX_GROUP_SIZE - 1][64];
/*0x558*/ int GroupHPPct[MAX_GROUP_SIZE - 1];
/*0x56c*/ int GroupPetHPPct[MAX_GROUP_SIZE - 1];
/*0x580*/ int GroupManaPct[MAX_GROUP_SIZE - 1];
/*0x594*/ int GroupSTAPct[MAX_GROUP_SIZE - 1];
/*0x5a8*/ int Buff[15];
/*0x5e4*/ int BardBuff[6];
/*0x5fc*/ int PetBuff[30];
/*0x674*/ int Spell[10];
/*0x69c*/ char SongTitle[512]; // mp3 player
/*0x89c*/ int SongDurationMin;
/*0x8a0*/ int SongDurationSec;
/*0x8a4*/ int SongCurrentMin;
/*0x8a8*/ int SongCurrentSec;
/*0x8ac*/ int GroupLeaderExpPct; // no longer used
/*0x8b0*/ int RaidLeaderExPct; // no longer used
/*0x8b4*/ char TargetOfTargetName[64];
/*0x8f4*/ int ExtendedTargetHPPct[MAX_EXTENDED_TARGET_SIZE];
/*0x950*/ int ExtendedTargetManaPct[MAX_EXTENDED_TARGET_SIZE];
/*0x9ac*/ int ExtendedTargetEndurancePct[MAX_EXTENDED_TARGET_SIZE];
/*0xa08*/ char AggroTargetName[64];
/*0xa48*/ char AggroMostHatedName[64];
/*0xa88*/ char AggroMostHatedNameNoLock[64];
/*0xac8*/ int AggroHatePct[MAX_AGGRO_METER_SIZE];
/*0xb40*/ int AggroMyHatePct;
/*0xb44*/ int AggroMostHatedPct;
/*0xb48*/ float MercenaryAAExperiencePct;
/*0xb4c*/ int MercenaryAAPoints;
/*0xb50*/ int MercenaryAAPointsSpent;
/*0xb54*/ int MercenaryHP;
/*0xb58*/ int MercenaryMaxHP;
/*0xb5c*/ int MercenaryMana;
/*0xb60*/ int MercenaryMaxMana;
/*0xb64*/ int MercenaryEndurance;
/*0xb68*/ int MercenaryMaxEndurance;
/*0xb6c*/ int MercenaryMitigation;
/*0xb70*/ int MercenaryEvasion;
/*0xb74*/ int MercenaryAttack;
/*0xb78*/ int MercenaryAccuracy;
/*0xb7c*/ int MercenaryHaste;
/*0xb80*/ int MercenaryStr;
/*0xb84*/ int MercenarySta;
/*0xb88*/ int MercenaryInt;
/*0xb8c*/ int MercenaryWis;
/*0xb90*/ int MercenaryAgi;
/*0xb94*/ int MercenaryDex;
/*0xb98*/ int MercenaryCha;
/*0xb9c*/ int MercenaryHeroicStr;
/*0xba0*/ int MercenaryHeroicSta;
/*0xba4*/ int MercenaryHeroicInt;
/*0xba8*/ int MercenaryHeroicWis;
/*0xbac*/ int MercenaryHeroicAgi;
/*0xbb0*/ int MercenaryHeroicDex;
/*0xbb4*/ int MercenaryHeroicCha;
/*0xbb8*/ int MercenaryCombatHPRegen;
/*0xbbc*/ int MercenaryCombatManaRegen;
/*0xbc0*/ int MercenaryCombatEnduranceRegen;
/*0xbc4*/ int MercenaryHealAmount;
/*0xbc8*/ int MercenarySpellDamage;
/*0xbcc*/ char PowerSourcePercent[8];
/*0xbd4*/ bool HasMercenary;
/*0xbd8*/
};
//============================================================================
//============================================================================
constexpr size_t EQGroundItem_size = 0xA0; // @sizeof(EQGroundItem) :: 2025-01-09 (live) @ 0x1401EEDEB
class [[offsetcomments]] EQGroundItem
{
public:
/*0x00*/ EQGroundItem* pPrev;
/*0x08*/ EQGroundItem* pNext;
/*0x10*/ ItemPtr Item;
/*0x20*/ int DropID; // unique id
/*0x24*/ DWORD ZoneID;
/*0x28*/ DWORD DropSubID; // zonefile id
/*0x30*/ CActorInterface* pActor;
/*0x38*/ char Name[EQ_MAX_NAME];
/*0x78*/ long Expires;
/*0x7c*/ float Heading;
/*0x80*/ float Pitch;
/*0x84*/ float Roll;
/*0x88*/ float Scale;
/*0x8c*/ float Y;
/*0x90*/ float X;
/*0x94*/ float Z;
/*0x98*/ int Weight; // -1 means it can't be picked up
/*0x9c*/
DEPRECATE("Use Item instead of ID/pContents") inline ItemPtr get_ID() const { return Item; }
DEPRECATE("Use Item instead of ID/pContents") inline void set_ID(ItemPtr ptr) { Item = ptr; }
__declspec(property(get = get_ID, put = set_ID)) ItemPtr ID;
__declspec(property(get = get_ID, put = set_ID)) ItemPtr pContents;
ALT_MEMBER_GETTER_DEPRECATED(CActorInterface*, pActor, pSwitch, "Use pActor instead of pSwitch");
};
using GROUNDITEM = EQGroundItem;
using PGROUNDITEM = EQGroundItem*;
SIZE_CHECK(EQGroundItem, EQGroundItem_size);
class EQGroundItemListManager
{
public:
EQGroundItem* Top;
static EQLIB_OBJECT EQGroundItemListManager& Instance();
};
class [[offsetcomments]] CBroadcast
{
public:
static EQLIB_OBJECT CBroadcast* Get();
//EQLIB_OBJECT void BroadcastString(const CXStr cxStr, int TextColor, int Priority, int MaxAlpha, UINT FadeInTime, UINT FadeOutTime, UINT DisplayTime);
//EQLIB_OBJECT void BroadcastString(const char* Str, int TextColor, int Priority, int MaxAlpha, UINT FadeInTime, UINT FadeOutTime, UINT DisplayTime);
//EQLIB_OBJECT void EndBroadcast(UINT FadeOutTime);
//EQLIB_OBJECT void Draw();
EQLIB_OBJECT void DisplayText(const char* Str, int TextColor, int Priority, int MaxAlpha, UINT FadeInTime, UINT FadeOutTime, UINT DisplayTime);
/*0x00*/ CTextObjectInterface* TextObject;
/*0x08*/ bool bBroadcastActive;
/*0x09*/ bool bFadingOut;
/*0x0a*/ bool bFadingIn;
/*0x0c*/ UINT StartTime;
/*0x10*/ UINT FadeInTime;
/*0x14*/ UINT EndTime;
/*0x18*/ UINT FadeOutTime;
/*0x1c*/ UINT DisplayTime;
/*0x20*/ int BroadcastColor;
/*0x24*/ int CurrentPriority;
/*0x28*/ int MaxAlpha;
/*0x2c*/
};
inline namespace deprecated {
using CTextOverlay DEPRECATE("Use CBroadcast instead of CTextOverlay") = CBroadcast;
}
class ChatManagerClient
{
public:
static EQLIB_OBJECT ChatManagerClient& Instance();
};
class CDistillerInfo
{
public:
static EQLIB_OBJECT CDistillerInfo& Instance();
EQLIB_OBJECT int GetIDFromRecordNum(int ID, bool bWhat);
};
class JournalCategory;
class ConversationJournal
{
public:
EQLIB_OBJECT ~ConversationJournal();
EQLIB_OBJECT ConversationJournal();
EQLIB_OBJECT JournalNPC* FindNPCByNameZone(char*, int);
EQLIB_OBJECT JournalNPC* GetNPC(int);
EQLIB_OBJECT int AddEntry(char*, int, long, float, float, float, char*, int);
EQLIB_OBJECT int DeleteNPC(char*, int);
EQLIB_OBJECT int Load(char*);
EQLIB_OBJECT int Save(char*);
EQLIB_OBJECT JournalCategory** GetCategoryList();
EQLIB_OBJECT JournalCategory* AddCategory(char*, char*, int);
EQLIB_OBJECT JournalCategory* AddCategory(int);
EQLIB_OBJECT JournalCategory* GetCategory(char*);
EQLIB_OBJECT JournalCategory* GetCategory(int);
EQLIB_OBJECT void Clean();
EQLIB_OBJECT void DeleteCategory(int);
// protected
EQLIB_OBJECT int FindFreeID();
// private
EQLIB_OBJECT JournalNPC* AddNPC(char*, int);
EQLIB_OBJECT JournalNPC* ReadNPC(FILE*);
EQLIB_OBJECT void AllocateCatArray();
EQLIB_OBJECT void AllocateNPCArray();
EQLIB_OBJECT void ReadCategory(FILE*);
};
struct ResolutionUpdateData
{
int Width;
int Height;
int BitsPerPixel;
int RefreshRate;
bool bFullscreen;
void Set(int width, int height, int bitsPerPixel, int refreshRate, bool bfullscreen = false)
{
Width = width;
Height = height;
BitsPerPixel = bitsPerPixel;
RefreshRate = refreshRate;
bFullscreen = bfullscreen;
}
};
struct SDeviceInfo
{
char Name[0x80];
};
class CResolutionHandlerBase
{
public:
EQLIB_OBJECT static bool IsFullscreenAvailable();
EQLIB_OBJECT static int GetDesktopBitsPerPixel();
EQLIB_OBJECT static int GetDesktopHeight();
EQLIB_OBJECT static int GetDesktopRefreshRate();
EQLIB_OBJECT static int GetDesktopWidth();
EQLIB_OBJECT static int GetHeight();
EQLIB_OBJECT static int GetWidth();
EQLIB_OBJECT static int Init();
EQLIB_OBJECT static void ChangeToResolution(int, int, int, int, int);
EQLIB_OBJECT static void SaveSettings();
EQLIB_OBJECT static void Shutdown();
EQLIB_OBJECT static void ToggleScreenMode();
EQLIB_OBJECT static void UpdateWindowPosition();
DWORD vfTable;
bool bIsFullscreen;
int FullscreenBitsPerPixel;
int FullscreenRefreshRate;
int FullscreenWidth;
int FullscreenHeight;
int WindowedWidth;
int WindowedHeight;
int WindowOffsetX;
int WindowOffsetY;
int RestoredWidth;
int RestoredHeight;
int RestoredOffsetX;
int RestoredOffsetY;
SDeviceInfo DeviceTable[0x10];
int DeviceCount;
long DeviceIndex;
bool bUseD3DTextureCompression;
bool bResizable;
bool bMaximized;
bool bAlwaysOnTop;
bool bActive;
UINT ActiveThreadID;
HWND ActiveWnd;
bool bChangingScreenResolutions;
};
class CResolutionHandler : public CResolutionHandlerBase
{
public:
EQLIB_OBJECT void UpdateResolution(ResolutionUpdateData& data);
EQLIB_OBJECT DWORD GetWindowedStyle() const;
};
enum TaskType
{
cTaskTypeUnknown = -1,
cTaskTypeNone = 0,
cTaskTypeDeliver,
cTaskTypeKill,
cTaskTypeLoot,
cTaskTypeHail,
cTaskTypeExplore,
cTaskTypeTradeskill,
cTaskTypeFishing,
cTaskTypeForaging,
cTaskTypeCast,
cTaskTypeUseSkill,
cTaskTypeDZSwitch,
cTaskTypeDestroyObject,
cTaskTypeCollect,
cTaskTypeDialogue,
cTaskTypeCount,
};
enum TaskGroupType
{
cTaskGroupTypeSolo,
cTaskGroupTypeGroup,
cTaskGroupTypeRaid,
};
enum TaskSystemType
{
cTaskSystemTypeTask,
cTaskSystemTypeSharedQuest,
cTaskSystemTypeSoloQuest
};
struct [[offsetcomments]] CTaskElement
{
/*0x000*/ TaskType Type;
/*0x004*/ char TargetName[0x40];
/*0x044*/ char ZoneID[0x40];
/*0x084*/ char TargetZoneID[0x40];
/*0x0c4*/ int RequiredCount;
/*0x0c8*/ bool bOptional;
/*0x0cc*/ TaskGroupType ElementGroup;
/*0x0d0*/ int DZSwitchID;
/*0x0d4*/ char ElementDescriptionOverride[0x80];
/*0x158*/ CXStr ItemNameList;
/*0x160*/ CXStr SkillIDList;
/*0x168*/ CXStr SpellIDList;
/*0x170*/ CXStr TaskTitle;
/*0x178*/
};
const int MAX_TASK_ELEMENTS = 20;
constexpr size_t CTaskEntry_size = 0x3D70; // @sizeof(CTaskEntry) :: 2025-01-09 (live) @ 0x1404FB816
struct [[offsetcomments]] CTaskEntry
{
/*0x0000*/ int TaskID;
/*0x0004*/ float RewardAdjustment;
/*0x0008*/ char TaskTitle[0x40];
/*0x0048*/ int DurationSeconds;
/*0x004c*/ char StartText[0xFa0];
/*0x0fec*/ bool bShowReward;
/*0x0ff0*/ int RewardCash;
/*0x0ff4*/ int RewardExp;
/*0x0ff8*/ int RewardPoints;
/*0x0ffc*/ int RewardFactionID;
/*0x1000*/ int RewardFactionAmount;
/*0x1008*/ CXStr RewardItemTag;
/*0x1010*/ CTaskElement Elements[MAX_TASK_ELEMENTS];
/*0x2d70*/ TaskSystemType TaskSystem;
/*0x2d74*/ int PointType;
/*0x2d78*/ bool StartTextCompiled;
/*0x2d79*/ char RawStartText[0xFa0];
/*0x3d19*/ bool bElementsReceived;
/*0x3d20*/ eqtime_t TimeCompleted;
/*0x3d28*/ ArrayClass<MonsterMissionTemplate> MonsterTemplates;
/*0x3d40*/ bool bTemplateSelectionLocked;
/*0x3d41*/ bool bHasRewardSet;
/*0x3d48*/ SoeUtil::String UnknownString;
/*0x3d60*/ int MinPlayers;
/*0x3d64*/ int MaxPlayers;
/*0x3d68*/ int MinLevel;
/*0x3d6c*/ int MaxLevel;
/*0x3d70*/
};
SIZE_CHECK(CTaskEntry, CTaskEntry_size);
enum SharedTaskPlayerRole
{
STPR_None,
STPR_Leader
};
struct SharedTaskClientPlayerInfo
{
char Name[0x40];
int TemplateID;
SharedTaskPlayerRole m_role;
SharedTaskClientPlayerInfo* pNext;
};
constexpr int MAX_TASK_ENTRIES = 1;
constexpr int MAX_QUEST_ENTRIES = 29;
constexpr int MAX_SHARED_TASK_ENTRIES = 1;
constexpr int MAX_QUEST_HISTORY_ENTRIES = 50;
class [[offsetcomments]] CTaskManager : public PopDialogHandler
{
public:
/*0x000008*/ CTaskEntry TaskEntries[MAX_TASK_ENTRIES];
/*0x003d78*/ CTaskEntry QuestEntries[MAX_QUEST_ENTRIES];
/*0x073328*/ CTaskEntry SharedTaskEntries[MAX_SHARED_TASK_ENTRIES];
/*0x077098*/ CTaskEntry QuestHistoryEntries[MAX_QUEST_HISTORY_ENTRIES];
/*0x137078*/ int AddPlayerID;
/*0x13707c*/ bool bAddPlayerIsSwap;
/*0x13707d*/ char AddPlayerSwapeeName[0x40];
/*0x1370c0*/ SharedTaskClientPlayerInfo* pFirstMember;
/*0x1370c8*/
EQLIB_OBJECT CTaskManager(CXWnd*);
// virtual
EQLIB_OBJECT ~CTaskManager();
EQLIB_OBJECT CTaskEntry* GetEntry(int Index, int System, bool bCheckEmpty = true);
EQLIB_OBJECT PCTaskStatus* GetTaskStatus(PcClient* pMe, int Index, TaskSystemType System);
EQLIB_OBJECT void GetElementDescription(const CTaskElement* pElement, char* Out);
};
class EmitterManager
{
public:
EQLIB_OBJECT ~EmitterManager();
EQLIB_OBJECT EmitterManager(SoundManager*);
EQLIB_OBJECT float GetEffectsLevel();
EQLIB_OBJECT float GetVolumeLevel();
EQLIB_OBJECT void Add(SoundEmitter*);
EQLIB_OBJECT void GetListenerLocation(float*, float*, float*, float*);
EQLIB_OBJECT void GiveTime();
EQLIB_OBJECT void Remove(SoundEmitter*);
EQLIB_OBJECT void SetEffectsLevel(float);
EQLIB_OBJECT void SetVolumeLevel(float);
};
class EQ_AltAbility
{
public:
EQLIB_OBJECT EQ_AltAbility(int);
};
class CEQItemLocation;
class EQ_Container
{
public:
EQLIB_OBJECT ~EQ_Container();
EQLIB_OBJECT EQ_Container();
EQLIB_OBJECT unsigned char Close();
EQLIB_OBJECT unsigned char IsOpen();
EQLIB_OBJECT unsigned char Open();
};
class EQ_Equipment
{
public:
EQLIB_OBJECT EQ_Equipment();
EQLIB_OBJECT int IsInstrument();
EQLIB_OBJECT int IsWeapon();
EQLIB_OBJECT void SendTextRequestMsg();
};
enum eAugFitRet
{
AF_FITS,
AF_RACE_MISMATCH,
AF_CLASS_MISMATCH,
AF_DEITY_MISMATCH,
AF_LOC_MISMATCH,
AF_SLOTFULL,
AF_INVALIDSLOT,
AF_AUG_MISMATCH,
AF_SKIN_MISMATCH,
AF_AUGCLASS,
AF_ERR_DUPLICATE,
AF_NOTRANSFER,
AF_ITEMRANK_MISMATCH,
AF_APPEARANCE_MISMATCH,
AF_ERR_STACKABLE,
AF_ERR_NOTANAUG,
AF_ERR_NOEQUIPPEDLOC,
};
class EQ_LoadingS
{
public:
EQLIB_OBJECT ~EQ_LoadingS();
EQLIB_OBJECT EQ_LoadingS();
EQLIB_OBJECT void draw();
EQLIB_OBJECT void DrawBackground();
EQLIB_OBJECT void SetProgressBar(int, const char*);
EQLIB_OBJECT void WriteTextHD(char*, int, int, int);
// virtual
EQLIB_OBJECT void Activate();
EQLIB_OBJECT void Deactivate();
EQLIB_OBJECT void DefineImages();
};
class EQ_Note
{
public:
EQLIB_OBJECT ~EQ_Note();
EQLIB_OBJECT EQ_Note();
EQLIB_OBJECT void SendTextRequestMsg();
};
class EQAnimation
{
public:
EQLIB_OBJECT EQAnimation();
EQLIB_OBJECT ~EQAnimation();
};
class EQEffect
{
public:
static EQEffect* top;
EQLIB_OBJECT ~EQEffect();
EQLIB_OBJECT EQEffect(EQEffect*, char*, int, EQLOC*, PlayerZoneClient*, EQMissile*, EQRGB*, float, int, int, float, float);
};
class EqEmitterData
{
public:
EQLIB_OBJECT EqEmitterData();
EQLIB_OBJECT void SetLoadString(char*);
};
class EQItemList
{
public:
static class EQItemList* top;
EQLIB_OBJECT ~EQItemList();
EQLIB_OBJECT EQItemList();
EQLIB_OBJECT EQItemList* get_item(long);
EQLIB_OBJECT EQItemList* is_item_actor(CActorInterface*);
};
class EQMissile
{
public:
static EQMissile* top;
EQLIB_OBJECT ~EQMissile();
EQLIB_OBJECT EQMissile(EQ_Equipment*, PlayerZoneClient*, EQMissile*, char*, unsigned char, unsigned int);
EQLIB_OBJECT EQMissile* is_missile_actor(CActorInterface*);
EQLIB_OBJECT void CleanUpMyEffects();
EQLIB_OBJECT void HitActor(CActorInterface*, bool);
EQLIB_OBJECT void LeaveTrail();
EQLIB_OBJECT void MissileAI();
EQLIB_OBJECT void ProcessMissile();
};
class EqMobileEmitter
{
public:
EQLIB_OBJECT ~EqMobileEmitter();
EQLIB_OBJECT EqMobileEmitter(EqSoundManager*);
EQLIB_OBJECT void Move(float, float, float);
EQLIB_OBJECT void SetNpcHeight(float);
EQLIB_OBJECT void SetWave(int, char*);
};
class EQMoneyList
{
public:
EQLIB_OBJECT EQMoneyList();
EQLIB_OBJECT ~EQMoneyList();
EQLIB_OBJECT EQMoneyList* get_money(long);
static EQMoneyList* top;
};
class EQObject
{
public:
EQLIB_OBJECT EQObject(EQObject*, PlayerZoneClient*, char*, char*);
EQLIB_OBJECT ~EQObject();
static EQObject* top;
};
enum ePlacementType
{
PLACEMENT_TYPE_FLOOR,
PLACEMENT_TYPE_WALL,
PLACEMENT_TYPE_CEILING,
};
class [[offsetcomments]] EQPlacedItem : public CActorApplicationData
{
public:
/*0x08*/ EQPlacedItem* pPrev;
/*0x10*/ EQPlacedItem* pNext;
/*0x18*/ int RecordNum;
/*0x1c*/ EqItemGuid ItemGuid;
/*0x30*/ int RealEstateID;
/*0x34*/ int RealEstateItemID;
/*0x38*/ bool bIsNPC;
/*0x3c*/ unsigned int PlacingItemNpcID;
/*0x40*/ CLightInterface* pLight;
/*0x48*/ CActorInterface* pActor;
/*0x50*/ char Name[EQ_ACTOR_TAG];
/*0x90*/ int Unknown0x7c;
/*0x94*/ int Unknown0x80;
/*0x98*/ float Scale;
/*0x9c*/ float Heading;
/*0xa0*/ float Angle;
/*0xa4*/ float Roll;
/*0xa8*/ float Y;
/*0xac*/ float X;
/*0xb0*/ float Z;
/*0xb4*/ bool bIgnoreCollisions;
/*0xb5*/ bool bDisablePlacementRotation;
/*0xb6*/ bool bDisableFreePlacement;
/*0xb8*/ ePlacementType PlacementType;
/*0xbc*/ float ScaleRangeMin;
/*0xc0*/ float ScaleRangeMax;
/*0xc4*/ float DefaultScale;
/*0xc8*/ float DefaultHeading;
/*0xcc*/ float DefaultAngle;
/*0xd0*/ float DefaultRoll;
/*0xd4*/ int LightType;
/*0xd8*/ float NPCHeight;
/*0xdc*/
};
class EQPlacedItemManager
{
public:
EQLIB_OBJECT static EQPlacedItemManager& Instance();
EQLIB_OBJECT EQPlacedItem* GetItemByGuid(const EqItemGuid& ItemGuid);
EQLIB_OBJECT EQPlacedItem* GetItemByRealEstateAndRealEstateItemIds(int RealEstateID, int RealEstateItemID);
EQPlacedItem* Top;
};
//============================================================================
#if HAS_FACTION_WINDOW
class [[offsetcomments]] FactionManagerClient
{
public:
/*0x00*/ void* vftable;
/*0x08*/ // todo: map it
EQLIB_OBJECT static FactionManagerClient& Instance();
EQLIB_OBJECT void HandleFactionMessage(UINT MessageID, char* pData, unsigned int DataLength);
};
#endif
EQLIB_OBJECT char* build_token_string_PARAM(char* pBuffer, int token,
const char* param0 = nullptr,
const char* param1 = nullptr,
const char* param2 = nullptr,
const char* param3 = nullptr,
const char* param4 = nullptr,
const char* param5 = nullptr,
const char* param6 = nullptr,
const char* param7 = nullptr,
const char* param8 = nullptr);
class EQPMInfo
{
public:
EQLIB_OBJECT ~EQPMInfo();
EQLIB_OBJECT EQPMInfo(char*);
EQLIB_OBJECT void SetApplyGravity(bool);
};
enum SpeakerType
{
SpeakerTypeNormal = 0, // AIL_3D_2_SPEAKER
SpeakerTypeHeadphone = 1, // AIL_3D_HEADPHONE
SpeakerTypeSurround = 2, // AIL_3D_SURROUND
SpeakerTypeFour = 3, // AIL_3D_4_SPEAKER
SpeakerTypeDolby51 = 4, // AIL_3D_51_SPEAKER
SpeakerTypeDolby71 = 5, // AIL_3D_71_SPEAKER
};
class [[offsetcomments]] EqSoundManager
{
public:
EQLIB_OBJECT ~EqSoundManager();
EQLIB_OBJECT EqSoundManager(bool, bool, SpeakerType);
EQLIB_OBJECT bool EmitterLoad(char*);
EQLIB_OBJECT bool WaveIsPlaying(int);
EQLIB_OBJECT SoundAsset* EqWaveGet(int);
EQLIB_OBJECT EnvironmentType GetListenerEnvironment();
EQLIB_OBJECT void EmitterAdd(EqEmitterData*);
EQLIB_OBJECT void EmitterSetIndoors(bool);
EQLIB_OBJECT void EmitterSetNight(bool);
EQLIB_OBJECT void EmitterSetRaining(bool);
EQLIB_OBJECT void EmitterSetUserDisabled(bool);
EQLIB_OBJECT void EmitterSetWind(bool);
EQLIB_OBJECT void GiveTime();
EQLIB_OBJECT void SetCurrentZone(char*);
EQLIB_OBJECT void SetEffectsLevel(float);
EQLIB_OBJECT void SetListenerEnvironment(EnvironmentType);
EQLIB_OBJECT void SetListenerEnvironmentHigh();
EQLIB_OBJECT void SetListenerEnvironmentLow();
EQLIB_OBJECT void SetListenerEnvironmentOutside();
EQLIB_OBJECT void SetListenerLocation(float, float, float, float);
EQLIB_OBJECT void SetMixAhead(int);
EQLIB_OBJECT void SetMusicSelection(int, bool);
EQLIB_OBJECT void SetMusicVolume(float);
EQLIB_OBJECT void SetWaveVolume(float);
EQLIB_OBJECT void WaveLoad(char*, int, bool);
EQLIB_OBJECT void WavePlay(int, SoundControl*);
EQLIB_OBJECT void WaveStop(int);
// private
EQLIB_OBJECT SoundAsset* GetAsset(char*);
EQLIB_OBJECT SoundAsset* OldMp3GetSelection(int);
EQLIB_OBJECT SoundEmitter* CreateOldEmitter(int, float, float, float, int, int, int, float, int, int, int);
EQLIB_OBJECT int GetMusicId();
EQLIB_OBJECT void LoadGlobalEmitters();
EQLIB_OBJECT void LoadGlobalMusic();
EQLIB_OBJECT void LoadGlobalWaves();
EQLIB_OBJECT void LoadListOfWaveFiles(char**, int);
EQLIB_OBJECT void LoadOldEmitters();
EQLIB_OBJECT void OldMp3ClearSelections();
EQLIB_OBJECT void OldMp3Init();
EQLIB_OBJECT void OldMp3Terminate();
EQLIB_OBJECT void PlayScriptMp3(char* Name, float Vol = 1.00f);
EQLIB_OBJECT void ReleaseZoneSpecificEmitters();
EQLIB_OBJECT void ReleaseZoneSpecificMidi();
EQLIB_OBJECT void ReleaseZoneSpecificWaves();
EQLIB_OBJECT void UpdateEmitterStates();
/*0x0000*/ Mp3Manager* pMp3Manager;
/*0x0008*/ SoundManager* pSoundManager;
/*0x0010*/ EmitterManager* pEmitterManager;
/*0x0018*/ MusicManager* pMusicManager;
/*0x0020*/ SoundAsset* pGlobalMidiAsset;
/*0x0028*/ SoundAsset* pOpenerMidiAsset;
/*0x0030*/ SoundAsset* pOpenerMp3Asset;
/*0x0038*/ SoundAsset* pDeathMp3Asset;
/*0x0040*/ SoundAsset* pCombatMp3Asset;
/*0x0048*/ SoundAsset* pMerchantMp3Asset;
/*0x0050*/ SoundAsset* pZoneMidiAsset;
/*0x0058*/ SoundAsset* pScriptMp3Asset;
/*0x0060*/ bool bDisabled;
/*0x0064*/ int NextMusicID;
/*0x0068*/ SoundEmitter* pEmitters[1000];
/*0x1fa8*/ int EmittersCount;
/*0x1fb0*/ SoundEmitter* pRainEmitter;
/*0x1fb8*/ SoundEmitter* pWindEmitter;
/*0x1fc0*/ int EnvironmentHigh;
/*0x1fc4*/ int EnvironmentLow;
/*0x1fc8*/ int EnvironmentOutside;
/*0x1fcc*/ float fEffectsLevel;
/*0x1fd0*/ float fWaveVolumeLevel;
/*0x1fd4*/ // more here but i only need volume for now so...
};
class [[offsetcomments]] EQSwitch : public CActorApplicationData
{
public:
EQLIB_OBJECT float GetCustomMoveDistance();
EQLIB_OBJECT float TopSpeed(float*);
EQLIB_OBJECT int GetSwitchDamage();
EQLIB_OBJECT unsigned char SwitchIsNotUsable(int);
EQLIB_OBJECT unsigned char SwitchWasOpened(int, int, PlayerClient*, bool*);
EQLIB_OBJECT unsigned char SwitchWasOpenedActual(int, int, PlayerClient*, bool*);
EQLIB_OBJECT unsigned int RepopFrequency();
EQLIB_OBJECT void ChangeState(unsigned char, PlayerClient*, bool);
EQLIB_OBJECT void LoadSwitchSounds(int);
EQLIB_OBJECT void PostInit();
EQLIB_OBJECT void PreInit();
EQLIB_OBJECT void RepopSwitch();
EQLIB_OBJECT void ResetSwitchState(unsigned char);
EQLIB_OBJECT void UseSwitch(UINT SpawnID, int KeyID, int PickSkill, const CVector3* hitloc = 0);
/*0x08*/ BYTE ID;
/*0x09*/ char Name[0x20];
/*0x29*/ BYTE Type;
/*0x2a*/ BYTE State; // 0 = closed, 1 = open, 2 = opening, 3 = closing
/*0x2c*/ float DefaultY;
/*0x30*/ float DefaultX;
/*0x34*/ float DefaultZ;
/*0x38*/ float DefaultHeading;
/*0x3c*/ float DefaultDoorAngle;
/*0x40*/ float TopSpeed1;
/*0x44*/ float TopSpeed2;
/*0x48*/ float Y;
/*0x4c*/ float X;
/*0x50*/ float Z;
/*0x54*/ float Heading;
/*0x58*/ float DoorAngle;
/*0x5c*/ BYTE DefaultState;
/*0x5d*/ BYTE SelfActivated;
/*0x5e*/ BYTE Dependent;
/*0x5f*/ bool bTemplate;
/*0x60*/ BYTE Difficulty; // pick/disarm...
/*0x61*/ BYTE AffectSlots[5];
/*0x66*/ BYTE CurrentCombination[5];
/*0x6b*/ BYTE ReqCombination[5];
/*0x70*/ BYTE RandomCombo;
/*0x74*/ int Key;
/*0x78*/ SHORT ScaleFactor; // divide by 100 to get scale multiplier
/*0x7c*/ int SpellID;
/*0x80*/ BYTE TargetID[0x5];