Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cCharInfo.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. #pragma once
  2. #include "cThread.h"
  3. #include "cMessage.h"
  4. #define MAX_SKILLS 41
  5. const DWORD PrimStatArray[] = { 0, 110,277,501,784,1125,1527,1988,2511,3097,3746,4459,5238,6084,6998,7982,9038,10167,11372,12654,14015,15459,16988,18604,20311,22113,24012,26014,28122,30341,32676,35132,37716,40434,43293,46301,49465,52795,56300,59991,63878,67975,72295,76851,81659,86737,92102,97775,103775,110128,116858,123991,131559,139591,148124,157194,166843,177113,188053,199715,212153,225429,239609,254762,270967,288306,306870,326756,348070,370928,395453,421779,450054,480434,513091,548210,585992,626654,670432,717582,768378,823122,882136,945773,1014414,1088469,1168386,1254649,1347781,1448351,1556972,1674311,1801089,1938088,2086155,2246205,2419233,2606314,2808613,3027394,3264023,3519983,3796877,4096444,4420567,4771285,5150808,5561528,6006039,6487148,7007896,7571580,8181768,8842327,9557443,10331656,11169877,12077431,13060084,14124082,15276190,16523738,17874666,19337572,20921773,22637359,24495261,26507320,28686361,31046278,33602120,36370190,39368147,42615120,46131828,49940719,54066105,58534323,63373901,68615745,74293328,80442912,87103777,94318471,102133083,110597540,119765922,129696811,140453665,152105222,164725942,178396483,193204214,209243776,226617688,245437001,265822007,287903011,311821164,337729361,365793227,396192167,429120520,464788799,503425038,545276249,590610001,639716134,692908610,750527522,812941268,880548904,953782704,1033110914,1119040753,1212121655,1312948783,1422166831,1540474151,1668627219,1807445467,1957816530,2120701915,2297143157,2488268472,2695299977,2919561502,3162487055,3425629996,3710672964,4019438644 };
  6. const DWORD SecondaryStatArray[] = { 0, 73,183,331,517,743,1008,1312,1658,2044,2472,2943,3457,4015,4619,5268,5965,6711,7505,8352,9250,10203,11212,12279,13406,14595,15848,17169,18561,20025,21566,23187,24893,26687,28574,30559,32647,34845,37158,39594,42160,44864,47715,50722,53895,57247,60788,64531,68492,72685,77126,81834,86829,92130,97762,103748,110116,116895,124115,131812,140021,148784,158142,168143,178838,190282,202534,215659,229726,244812,260999,278375,297036,317087,338640,361819,386755,413592,442486,473604,507130,543260,582210,624211,669513,718390,771135,828069,889536,955912,1027602,1105046,1188719,1279139,1376862,1482495,1596694,1720167,1853685,1998080,2154256,2323189,2505939,2703654,2917575,3149049,3399533,3670609,3963986,4281518,4625212,4997243,5399967,5835936,6307913,6818893,7372119,7971105,8619656,9321894,10082286,10905668,11797280,12762798,13808370,14940657,16166873,17494831,18932998,20490543,22177399,24004326,25982977,28125979,30447007,32960875,35683629,38632653,41826775,45286392,49033597,53092322,57488493,62250191,67407835,72994377,79045509,85599896,92699419,100389447,108719122,117741679,127514781,138100892,149567674,161988421,175442525,190015988,205801968,222901379,241423530,261486830,283219543,306760608,332260525,359882324,389802601,422212649,457319683,495348165,536541237,581162277,629496585,681853203,738566897,800000293,866546197,938630108,1016712940,1101293965,1192914009,1292158910,1399663264,1516114484,1642257192,1778897985,1926910591,2087241457,2260915797,2449044157,2652829505,2873574933,3112691986,3371709687,3652284316,3956210003,4285430197 };
  7. enum eTrainingType
  8. {
  9. eTrainUnusable = 0,
  10. eTrainUntrained = 1,
  11. eTrainTrained = 2,
  12. eTrainSpecialized = 3
  13. };
  14. enum eAttributeID
  15. {
  16. eAttrStrength = 1,
  17. eAttrEndurance = 2,
  18. eAttrQuickness = 3,
  19. eAttrCoordination = 4,
  20. eAttrFocus = 5,
  21. eAttrSelf = 6,
  22. eAttrNULL = 255
  23. };
  24. enum eVitalID
  25. {
  26. eVitalHealth = 2,
  27. eVitalStamina = 4,
  28. eVitalMana = 6
  29. };
  30. struct stInternalSpell
  31. {
  32. DWORD dwSpellID;
  33. std::string szName;
  34. std::string szDesc;
  35. DWORD dwSchool;
  36. DWORD dwIcon;
  37. DWORD dwEffect;
  38. DWORD dwFlags;
  39. DWORD dwManaCost;
  40. float fRangeBase;
  41. float fRangeModifier;
  42. DWORD dwDifficulty;
  43. float fEconomy;
  44. DWORD dwVersion;
  45. float fSpeed;
  46. DWORD dwType;
  47. DWORD dwID2;
  48. double dDuration;
  49. DWORD dwUnk2;
  50. DWORD dwUnk3;
  51. DWORD pdwComps[8];
  52. DWORD dwEffectOnCaster;
  53. DWORD dwEffectOnTarget;
  54. DWORD pdwMisc[4];
  55. DWORD dwSortOrder;
  56. DWORD dwTargetMask;
  57. DWORD dwUnk6;
  58. bool Researchable;
  59. int ComponentCount;
  60. int iLevel;
  61. };
  62. struct stInternalSkill
  63. {
  64. DWORD dwID;
  65. std::string szDescription;
  66. std::string szName;
  67. DWORD dwIcon;
  68. DWORD dwTrainCost;
  69. DWORD dwSpecCost;
  70. DWORD dwType;
  71. DWORD dwUnk1;
  72. bool bUsableUntrained;
  73. DWORD dwUnk0;
  74. DWORD dwAttribDivisor;
  75. eAttributeID dwAttrib1;
  76. eAttributeID dwAttrib2;
  77. double dXPTimerLimit;
  78. double dXPTimerStart;
  79. double dUnk1;
  80. DWORD dwInc;
  81. eTrainingType dwTrained;
  82. DWORD dwXP;
  83. DWORD dwBonus;
  84. DWORD dwBase;
  85. DWORD dwBuffed;
  86. };
  87. struct stStatInfo {
  88. DWORD dwID;
  89. DWORD dwIcon;
  90. std::string szDescription;
  91. std::string szName;
  92. DWORD dwInc;
  93. DWORD dwInitial;
  94. DWORD dwXP;
  95. DWORD dwBase;
  96. DWORD dwBuffed;
  97. };
  98. struct stSecStatInfo {
  99. DWORD dwID;
  100. DWORD dwIcon;
  101. std::string szDescription;
  102. std::string szName;
  103. DWORD dwAttribDivisor;
  104. eAttributeID dwAttrib;
  105. DWORD dwInc;
  106. DWORD dwUnknown;
  107. DWORD dwXP;
  108. DWORD dwBase;
  109. DWORD dwCurrent;
  110. DWORD dwBuffed;
  111. };
  112. class cEnchantment {
  113. public:
  114. cEnchantment()
  115. {
  116. }
  117. ~cEnchantment()
  118. {
  119. }
  120. void Unpack(cByteStream * BS)
  121. {
  122. wSpellID = BS->ReadWORD(); //2
  123. wLayer = BS->ReadWORD(); //4
  124. dwFamily = BS->ReadDWORD(); //8
  125. dwDifficulty = BS->ReadDWORD(); //12
  126. dTimeElapsed = BS->ReadDouble(); //20
  127. dDuration = BS->ReadDouble(); //28
  128. dwCaster = BS->ReadDWORD(); //32
  129. dwUnknown1 = BS->ReadDWORD(); //36
  130. dwUnknown2 = BS->ReadDWORD(); //40
  131. dStartTime = BS->ReadDouble(); //48
  132. dwAffectMask = BS->ReadDWORD(); //52
  133. dwAffected = BS->ReadDWORD(); //56
  134. fAdjustment = BS->ReadFloat(); //60
  135. dwUnknown3 = BS->ReadDWORD(); //64
  136. }
  137. WORD wSpellID; //2
  138. WORD wLayer; //4
  139. DWORD dwFamily; //8
  140. DWORD dwDifficulty; //12
  141. double dTimeElapsed; //20
  142. double dDuration; //28
  143. DWORD dwCaster; //32
  144. DWORD dwUnknown1; //36
  145. DWORD dwUnknown2; //40
  146. double dStartTime; //48
  147. DWORD dwAffectMask; //52
  148. DWORD dwAffected; //56
  149. float fAdjustment; //60
  150. DWORD dwUnknown3; //64?
  151. DWORD dwExpireTime;
  152. private:
  153. };
  154. struct stAllegianceInfo {
  155. DWORD dwParent;
  156. DWORD dwGUID;
  157. DWORD dwPendingXP;
  158. QWORD qwXP;
  159. BYTE bGender;
  160. BYTE bRace;
  161. BYTE bRank;
  162. bool bOnline;
  163. WORD wLoyalty;
  164. WORD wLeadership;
  165. double dUnknown;
  166. std::string szName;
  167. };
  168. struct stSquelchedUser {
  169. DWORD dwGUID;
  170. std::string szName;
  171. };
  172. class cPropertyType {
  173. public:
  174. cPropertyType()
  175. {
  176. }
  177. ~cPropertyType()
  178. {
  179. }
  180. void Unpack(cByteStream *Msg)
  181. {
  182. DWORD PropType = Msg->ReadDWORD();
  183. switch (PropType)
  184. {
  185. case 0x1000007F:
  186. {
  187. //chat window display mask
  188. DWORD unknown = Msg->ReadDWORD();
  189. QWORD ChatDisplayMask = Msg->ReadQWORD();
  190. }
  191. break;
  192. case 0x10000080:
  193. {
  194. DWORD unknown = Msg->ReadDWORD();
  195. float inactiveOpacity = Msg->ReadFloat();
  196. }
  197. break;
  198. case 0x10000081:
  199. {
  200. DWORD unknown = Msg->ReadDWORD();
  201. float activeOpacity = Msg->ReadFloat();
  202. }
  203. break;
  204. case 0x10000086:
  205. {
  206. //chat window position (x)
  207. DWORD unknown = Msg->ReadDWORD();
  208. DWORD value = Msg->ReadDWORD();
  209. }
  210. break;
  211. case 0x10000087:
  212. {
  213. //chat window position (y)
  214. DWORD unknown = Msg->ReadDWORD();
  215. DWORD value = Msg->ReadDWORD();
  216. }
  217. break;
  218. case 0x10000088:
  219. {
  220. //chat window size (x)
  221. DWORD unknown = Msg->ReadDWORD();
  222. DWORD value = Msg->ReadDWORD();
  223. }
  224. break;
  225. case 0x10000089:
  226. {
  227. //chat window size (y)
  228. DWORD unknown = Msg->ReadDWORD();
  229. DWORD value = Msg->ReadDWORD();
  230. }
  231. break;
  232. case 0x1000008A:
  233. {
  234. //chat window enabled
  235. DWORD unknown = Msg->ReadDWORD();
  236. BYTE value = Msg->ReadByte();
  237. }
  238. break;
  239. case 0x1000008B:
  240. {
  241. BYTE unknown = Msg->ReadByte();
  242. BYTE propCount = Msg->ReadByte();
  243. for (int i=0; i<propCount; i++)
  244. {
  245. cPropertyType cPT;
  246. cPT.Unpack(Msg);
  247. }
  248. }
  249. break;
  250. case 0x1000008C:
  251. {
  252. DWORD unknown = Msg->ReadDWORD();
  253. DWORD windowCount = Msg->ReadDWORD();
  254. for (int i=0; i<(int)windowCount; i++)
  255. {
  256. cPropertyType cPT;
  257. cPT.Unpack(Msg);
  258. }
  259. }
  260. break;
  261. case 0x1000008D:
  262. {
  263. DWORD unknown = Msg->ReadDWORD();
  264. BYTE titleSource = Msg->ReadByte();
  265. if (titleSource == 0)
  266. {
  267. DWORD stringID = Msg->ReadDWORD();
  268. DWORD fileID = Msg->ReadDWORD();
  269. }
  270. else if (titleSource == 1)
  271. {
  272. wchar_t * value = Msg->ReadWString();
  273. delete []value;
  274. }
  275. DWORD unknown_1b = Msg->ReadDWORD();
  276. DWORD unknown_1c = Msg->ReadDWORD();
  277. }
  278. break;
  279. }
  280. }
  281. };
  282. class cCharInfo : public cLockable {
  283. public:
  284. cCharInfo();
  285. ~cCharInfo();
  286. void SetGUID(DWORD dwGUID);
  287. void ParseLogin(cMessage *Msg);
  288. void ParseAllegiance(cMessage *Msg);
  289. void ParseSquelches(cMessage *Msg);
  290. void ParseFriendsUpdate(cMessage *Msg);
  291. void ParseTitleList(cMessage *Msg);
  292. void UpdateStatisticBool(DWORD Property, bool Value);
  293. void UpdateStatisticDW(DWORD Statistic, DWORD Value);
  294. void UpdateStatisticQW(DWORD Statistic, QWORD Value);
  295. void UpdateAttribute(DWORD Attribute, DWORD Increment, DWORD Initial, DWORD XP);
  296. void UpdateSecondaryAttribute(DWORD Attribute, DWORD Increment, DWORD XP);
  297. void UpdateVital(DWORD Vital, DWORD Value);
  298. void UpdateSkill(DWORD Skill, DWORD Inc, DWORD Trained, DWORD XP, DWORD Bonus);
  299. void UpdateSkillTrain(DWORD Skill, DWORD Trained);
  300. float GetVitae();
  301. void AddCorpse(stLocation Loc);
  302. void AddSpellToBook(DWORD Spell);
  303. void RemoveSpellFromBook(DWORD Spell);
  304. void AddEnchantment(cEnchantment *Enchantment);
  305. void RemoveEnchantment(WORD spell, WORD layer);
  306. void RemoveAllEnchantments();
  307. //Spelldatabase
  308. std::list<DWORD> * GetSpellBar(int iBar);
  309. int GetSpellBarCount(int iBar);
  310. stInternalSpell * GetSpellInfo(DWORD SpellID);
  311. //Skilldatabase
  312. DWORD GetMaxSkill();
  313. int GetSkillCount();
  314. bool GetSkillValid(DWORD dwSkill);
  315. stInternalSkill * GetSkillInfo(DWORD dwSkill);
  316. //Stats
  317. stStatInfo * GetStat(DWORD dwStat);
  318. stSecStatInfo * GetSecStat(DWORD dwSecStat);
  319. private:
  320. void RecalcStats();
  321. void RecalcStat(int Stat);
  322. void RecalcSecStats();
  323. void RecalcSecStat(int SecStat);
  324. void RecalcSkills();
  325. void RecalcSkill(int Skill);
  326. void LoadSpellsTable();
  327. void LoadSkillsTable();
  328. void LoadStatsTable();
  329. void LoadSecStatsTable();
  330. DWORD m_dwGUID,
  331. m_dwTotalBurden,
  332. m_dwTotalPyreal,
  333. m_dwUnassignedCredits,
  334. m_dwLevel,
  335. m_dwRank,
  336. m_dwDeaths,
  337. m_dwBirth,
  338. m_dwAge;
  339. QWORD m_qwTotalXP,
  340. m_qwUnassignedXP;
  341. bool m_bMovementDisabled;
  342. std::string m_sName, m_sGender, m_sRace, m_sClass;
  343. std::list<stLocation> m_lCorpses;
  344. DWORD m_dwPatron, m_dwMonarch;
  345. std::unordered_set<DWORD> m_lSpellbook;
  346. std::list<DWORD> m_lSpellBar[7];
  347. std::list<std::pair<DWORD,DWORD> > m_lCompBuyer;
  348. DWORD m_dwOptions;
  349. DWORD m_dwShortcut[10];
  350. std::list<cEnchantment *> m_lEnchantments;
  351. std::map<DWORD, stStatInfo> m_mStat;
  352. std::map<DWORD, stSecStatInfo> m_mSecStat;
  353. std::map<DWORD, stInternalSpell> m_mSpell;
  354. std::map<DWORD, stInternalSkill> m_mSkill;
  355. DWORD m_dwMaxSkill;
  356. float m_fVitae;
  357. stAllegianceInfo *m_aiMonarch, *m_aiPatron, *m_aiChar;
  358. std::vector<stAllegianceInfo *> m_vVassals;
  359. std::vector<stSquelchedUser> m_vSquelchedUsers;
  360. };