Clone of PhatAC @ https://github.com/floaterxk/PhatAC

Player.cpp 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. #include "StdAfx.h"
  2. #include "PhysicsObj.h"
  3. #include "Monster.h"
  4. #include "Player.h"
  5. //Network access.
  6. #include "Client.h"
  7. #include "ClientEvents.h"
  8. #include "BinaryWriter.h"
  9. #include "ObjectMsgs.h"
  10. //Database access.
  11. #include "Database.h"
  12. #include "Database2.h"
  13. #include "CharacterDatabase.h"
  14. //World access.
  15. #include "World.h"
  16. #include "ClientCommands.h"
  17. CBasePlayer::CBasePlayer(CClient *pClient, DWORD dwGUID)
  18. {
  19. m_pClient = pClient;
  20. m_dwGUID = dwGUID;
  21. m_WeenieBitfield |= BF_PLAYER|BF_PLAYER_KILLER;
  22. m_dwStats[eTotalBurden] = 1;
  23. m_dwStats[eTotalPyreal] = 100000;
  24. m_dwStats[eTotalXP] = -1;
  25. m_dwStats[eUnassignedXP] = 2000000000;
  26. m_dwStats[eLevel] = 240;
  27. m_dwStats[eRank] = 10;
  28. m_dwStats[eFrozen] = TRUE;
  29. m_dwStats[eDeathCount] = 0;
  30. m_dwStats[eUnknown2] = 0;
  31. m_dwStats[eBirth] = DWORD(time(NULL));
  32. m_dwStats[eAge] = 0;
  33. m_dwStats[eExpTillVitaeRegain] = 0;
  34. m_dwStats[eUnknown4] = 0;
  35. m_bStatSequence = 0;
  36. m_PhysicsState = PhysicsState::HIDDEN_PS | PhysicsState::IGNORE_COLLISIONS_PS | PhysicsState::EDGE_SLIDE_PS | PhysicsState::GRAVITY_PS;
  37. // Human Female by Default
  38. m_dwAnimationSet = 0x09000001;
  39. m_dwModel = 0x0200004E;
  40. m_dwSoundSet = 0x20000002;
  41. m_dwEffectSet = 0x34000004;
  42. m_fScale = 1.0f;
  43. m_BlipColor = 5; // 3=NPK, 5=PK
  44. if (pClient->GetAccessLevel() >= ADMIN_ACCESS)
  45. m_BlipColor = 3; // BLUE
  46. #if FALSE
  47. if (m_dwGUID == 0x000004D2) //Pea
  48. {
  49. //060000090A0000201E0000340B0A0002
  50. m_pAnimator->m_dwAnimSet = 0x09000006;
  51. m_dwSoundSet = 0x2000000A;
  52. m_dwEffectSet = 0x3400001E;
  53. m_dwModel = 0x02000A0B;
  54. m_fScale = 0.4f;
  55. }
  56. else if (m_dwGUID == 0x000004DB) //Lane
  57. {
  58. m_pAnimator->m_dwAnimSet = 0x09000062;
  59. m_dwSoundSet = 0x2000003D;
  60. m_dwEffectSet = 0x3400002D;
  61. m_dwModel = 0x0200047B;
  62. m_fScale = 1.0f;
  63. }
  64. else if (m_dwGUID == 0x000004E3)
  65. {
  66. //270000093200002019000034FF020002
  67. m_pAnimator->m_dwAnimSet = 0x09000027;
  68. m_dwSoundSet = 0x20000032;
  69. m_dwEffectSet = 0x34000019;
  70. m_dwModel = 0x020002FF;
  71. m_fScale = 9.0f;
  72. }
  73. #endif
  74. // Moon location... loc_t( 0xEFEA0001, 0, 0, 0 );
  75. if (!g_pGameDatabase->LoadedPortals())
  76. {
  77. // Aerfalle's Keep is default if the server wasn't configured with portals.
  78. m_Origin = loc_t(0x01f50229, 50.0f, -179.0f, 0.0);
  79. m_Angles = heading_t(1.0, 0, 0, 0);
  80. }
  81. else
  82. {
  83. // Otherwise outside Abandoned Mines
  84. // m_Origin = loc_t(0xC3AA0028, 111.904579f, 188.143036f, 116.005005f);
  85. // m_Angles = heading_t(0.998854f, 0.000000, 0.000000, 0.047870f);
  86. // Arena
  87. m_Origin = loc_t(0x02E20152, 54.991661f, -95.483475f, 12.004999f);
  88. m_Angles = heading_t(0.999982f, 0.000000f, 0.000000f, 0.005921f);
  89. // Cathedral waterfall
  90. // m_Origin = loc_t(0xF4180034, 146.588699f, 90.489342f, 159.554993f);
  91. // m_Angles = heading_t(0.994240f, 0.000000f, 0.000000f, -0.107177f);
  92. }
  93. SetThink(&CBasePlayer::PlayerThink);
  94. #if 0
  95. FILE *tmp = g_pDB->DataFileCreate("class\\smalllugian", "wb");
  96. if (tmp)
  97. {
  98. /*fread( &m_dwModel, sizeof(DWORD), 1, pClassData );
  99. fread( &m_dwAnimationSet, sizeof(DWORD), 1, pClassData );
  100. fread( &m_dwSoundSet, sizeof(DWORD), 1, pClassData );
  101. fread( &m_dwEffectSet, sizeof(DWORD), 1, pClassData );
  102. fread( &m_fScale, sizeof(float), 1, pClassData );*/
  103. DWORD dwModel = 0x02000A0B;
  104. DWORD dwSoundSet = 0x2000000A;
  105. DWORD dwAnimSet = 0x09000006;
  106. DWORD dwEffectSet = 0x3400001E;
  107. float fScale = 0.4f;
  108. fwrite(&dwModel, sizeof(DWORD), 1, tmp);
  109. fwrite(&dwAnimSet, sizeof(DWORD), 1, tmp);
  110. fwrite(&dwSoundSet, sizeof(DWORD), 1, tmp);
  111. fwrite(&dwEffectSet, sizeof(DWORD), 1, tmp);
  112. fwrite(&fScale, sizeof(float), 1, tmp);
  113. fclose(tmp);
  114. }
  115. #endif
  116. m_LastAssessed = 0;
  117. }
  118. CBasePlayer::~CBasePlayer()
  119. {
  120. CClientEvents* pEvents;
  121. if (m_pClient && (pEvents = m_pClient->GetEvents()))
  122. {
  123. pEvents->DetachPlayer();
  124. }
  125. }
  126. void CBasePlayer::Precache()
  127. {
  128. m_miBaseModel.dwBasePalette = 0x7E;
  129. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x4A7, 0x00, 0x18));
  130. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x2F2, 0x18, 0x08));
  131. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x2BD, 0x20, 0x08));
  132. _CHARDESC desc;
  133. if (g_pDB->CharDB()->GetCharacterDesc(m_dwGUID, &desc))
  134. {
  135. m_strName = desc.szName;
  136. m_wInstance = (WORD)g_pDB->CharDB()->IncCharacterInstance(m_dwGUID, desc.dwInstances);
  137. if ((*desc.szWorldClass) != 0)
  138. {
  139. FILE* pClassData = g_pDB->DataFileOpen(csprintf("class\\%s", desc.szWorldClass), "rb");
  140. if (pClassData)
  141. {
  142. fread(&m_dwModel, sizeof(DWORD), 1, pClassData);
  143. fread(&m_dwAnimationSet, sizeof(DWORD), 1, pClassData);
  144. fread(&m_dwSoundSet, sizeof(DWORD), 1, pClassData);
  145. fread(&m_dwEffectSet, sizeof(DWORD), 1, pClassData);
  146. fread(&m_fScale, sizeof(float), 1, pClassData);
  147. fclose(pClassData);
  148. }
  149. if (!stricmp("human-male", desc.szWorldClass))
  150. {
  151. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x98, 0x10B7));
  152. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x24C, 0x110B));
  153. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x2F5, 0x1162));
  154. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x25C, 0x11CB));
  155. m_miBaseModel.lModels.push_back(ModelRpl(0x00, 0x4E));
  156. m_miBaseModel.lModels.push_back(ModelRpl(0x01, 0x4F));
  157. m_miBaseModel.lModels.push_back(ModelRpl(0x02, 0x4D));
  158. m_miBaseModel.lModels.push_back(ModelRpl(0x03, 0x4C));
  159. m_miBaseModel.lModels.push_back(ModelRpl(0x04, 0x4B));
  160. m_miBaseModel.lModels.push_back(ModelRpl(0x05, 0x53));
  161. m_miBaseModel.lModels.push_back(ModelRpl(0x06, 0x51));
  162. m_miBaseModel.lModels.push_back(ModelRpl(0x07, 0x50));
  163. m_miBaseModel.lModels.push_back(ModelRpl(0x08, 0x42));
  164. m_miBaseModel.lModels.push_back(ModelRpl(0x09, 0x54));
  165. m_miBaseModel.lModels.push_back(ModelRpl(0x0A, 0x497));
  166. m_miBaseModel.lModels.push_back(ModelRpl(0x0B, 0x495));
  167. m_miBaseModel.lModels.push_back(ModelRpl(0x0C, 0x76));
  168. m_miBaseModel.lModels.push_back(ModelRpl(0x0D, 0x4AD));
  169. m_miBaseModel.lModels.push_back(ModelRpl(0x0E, 0x496));
  170. m_miBaseModel.lModels.push_back(ModelRpl(0x0F, 0x77));
  171. m_miBaseModel.lModels.push_back(ModelRpl(0x10, 0x5A));
  172. }
  173. if (!stricmp("human-envoy", desc.szWorldClass))
  174. {
  175. m_miBaseModel.dwBasePalette = 0x7E;
  176. m_miBaseModel.lPalettes.clear();
  177. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x2BA, 0x00, 0x18));
  178. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x2E3, 0x18, 0x08));
  179. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x4AE, 0x20, 0x08));
  180. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x179C, 0x28, 0xC8));
  181. m_miBaseModel.lPalettes.push_back(PaletteRpl(0x17A6, 0xF0, 0x10));
  182. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x98, 0x11FD));
  183. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x24C, 0x1113));
  184. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x2F5, 0x117D));
  185. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x25C, 0x11CF));
  186. m_miBaseModel.lTextures.push_back(TextureRpl(0x00, 0x1879, 0x22FF));
  187. m_miBaseModel.lTextures.push_back(TextureRpl(0x00, 0x1878, 0x2302));
  188. m_miBaseModel.lTextures.push_back(TextureRpl(0x01, 0x1880, 0x2307));
  189. m_miBaseModel.lTextures.push_back(TextureRpl(0x02, 0x187F, 0x2308));
  190. m_miBaseModel.lTextures.push_back(TextureRpl(0x05, 0x1880, 0x2307));
  191. m_miBaseModel.lTextures.push_back(TextureRpl(0x06, 0x187F, 0x2308));
  192. m_miBaseModel.lTextures.push_back(TextureRpl(0x09, 0x3D5, 0x2305));
  193. m_miBaseModel.lTextures.push_back(TextureRpl(0x09, 0x3D4, 0x2303));
  194. m_miBaseModel.lTextures.push_back(TextureRpl(0x0A, 0x187B, 0x2304));
  195. m_miBaseModel.lTextures.push_back(TextureRpl(0x0B, 0x187A, 0x2300));
  196. m_miBaseModel.lTextures.push_back(TextureRpl(0x0D, 0x187B, 0x2306));
  197. m_miBaseModel.lTextures.push_back(TextureRpl(0x0E, 0x187A, 0x2301));
  198. m_miBaseModel.lModels.push_back(ModelRpl(0x0C, 0x0076));
  199. m_miBaseModel.lModels.push_back(ModelRpl(0x0F, 0x0077));
  200. m_miBaseModel.lModels.push_back(ModelRpl(0x00, 0x1A16));
  201. m_miBaseModel.lModels.push_back(ModelRpl(0x01, 0x1A0D));
  202. m_miBaseModel.lModels.push_back(ModelRpl(0x02, 0x1A06));
  203. m_miBaseModel.lModels.push_back(ModelRpl(0x03, 0x01EC));
  204. m_miBaseModel.lModels.push_back(ModelRpl(0x04, 0x01EC));
  205. m_miBaseModel.lModels.push_back(ModelRpl(0x05, 0x1A11));
  206. m_miBaseModel.lModels.push_back(ModelRpl(0x06, 0x1A09));
  207. m_miBaseModel.lModels.push_back(ModelRpl(0x07, 0x01EC));
  208. m_miBaseModel.lModels.push_back(ModelRpl(0x08, 0x01EC));
  209. m_miBaseModel.lModels.push_back(ModelRpl(0x09, 0x120D));
  210. m_miBaseModel.lModels.push_back(ModelRpl(0x0A, 0x19F7));
  211. m_miBaseModel.lModels.push_back(ModelRpl(0x0B, 0x19EF));
  212. m_miBaseModel.lModels.push_back(ModelRpl(0x0D, 0x19FF));
  213. m_miBaseModel.lModels.push_back(ModelRpl(0x0E, 0x19EF));
  214. m_miBaseModel.lModels.push_back(ModelRpl(0x10, 0x3148));
  215. }
  216. if (!stricmp("human-admin", desc.szWorldClass))
  217. {
  218. m_miBaseModel.dwBasePalette = 0x7E;
  219. m_miBaseModel.lPalettes.clear();
  220. m_miBaseModel.lPalettes.push_back(PaletteRpl(0xEB6, 0x00, 0x18));
  221. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x98, 0x10B8));
  222. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x24C, 0x1067));
  223. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x2F5, 0x108A));
  224. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0x25C, 0x10A3));
  225. m_miBaseModel.lTextures.push_back(TextureRpl(0x00, 0x0CBE, 0x1701));
  226. m_miBaseModel.lTextures.push_back(TextureRpl(0x00, 0xBB0, 0x1701));
  227. m_miBaseModel.lTextures.push_back(TextureRpl(0x01, 0x1707, 0x1707));
  228. m_miBaseModel.lTextures.push_back(TextureRpl(0x01, 0x1844, 0x1844));
  229. m_miBaseModel.lTextures.push_back(TextureRpl(0x02, 0x1708, 0x1708));
  230. m_miBaseModel.lTextures.push_back(TextureRpl(0x02, 0x1844, 0x1844));
  231. m_miBaseModel.lTextures.push_back(TextureRpl(0x05, 0x1707, 0x1707));
  232. m_miBaseModel.lTextures.push_back(TextureRpl(0x05, 0x1844, 0x1844));
  233. m_miBaseModel.lTextures.push_back(TextureRpl(0x06, 0x1708, 0x1708));
  234. m_miBaseModel.lTextures.push_back(TextureRpl(0x06, 0x1844, 0x1844));
  235. m_miBaseModel.lTextures.push_back(TextureRpl(0x09, 0x3DE, 0x1830));
  236. m_miBaseModel.lTextures.push_back(TextureRpl(0x09, 0x3D6, 0x182F));
  237. m_miBaseModel.lTextures.push_back(TextureRpl(0x0A, 0x16FF, 0x182E));
  238. m_miBaseModel.lTextures.push_back(TextureRpl(0x0B, 0x16FE, 0x174E));
  239. m_miBaseModel.lTextures.push_back(TextureRpl(0x0C, 0x3D3, 0x3D3));
  240. m_miBaseModel.lTextures.push_back(TextureRpl(0x0D, 0x16FF, 0x182E));
  241. m_miBaseModel.lTextures.push_back(TextureRpl(0x0E, 0x16FE, 0x174E));
  242. m_miBaseModel.lTextures.push_back(TextureRpl(0x0F, 0x3D3, 0x3D3));
  243. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0xEC4, 0x1832));
  244. m_miBaseModel.lTextures.push_back(TextureRpl(0x10, 0xEC3, 0x16FD));
  245. m_miBaseModel.lModels.push_back(ModelRpl(0x00, 0x0477));
  246. m_miBaseModel.lModels.push_back(ModelRpl(0x01, 0x16EE));
  247. m_miBaseModel.lModels.push_back(ModelRpl(0x02, 0x16EC));
  248. m_miBaseModel.lModels.push_back(ModelRpl(0x03, 0x1EC));
  249. m_miBaseModel.lModels.push_back(ModelRpl(0x04, 0x1EC));
  250. m_miBaseModel.lModels.push_back(ModelRpl(0x05, 0x16E9));
  251. m_miBaseModel.lModels.push_back(ModelRpl(0x06, 0x16ED));
  252. m_miBaseModel.lModels.push_back(ModelRpl(0x07, 0x1EC));
  253. m_miBaseModel.lModels.push_back(ModelRpl(0x08, 0x1EC));
  254. m_miBaseModel.lModels.push_back(ModelRpl(0x09, 0x4B9));
  255. m_miBaseModel.lModels.push_back(ModelRpl(0x0A, 0x16E7));
  256. m_miBaseModel.lModels.push_back(ModelRpl(0x0B, 0x16E5));
  257. m_miBaseModel.lModels.push_back(ModelRpl(0x0C, 0x76));
  258. m_miBaseModel.lModels.push_back(ModelRpl(0x0D, 0x16E4));
  259. m_miBaseModel.lModels.push_back(ModelRpl(0x0E, 0x16E6));
  260. m_miBaseModel.lModels.push_back(ModelRpl(0x0F, 0x77));
  261. m_miBaseModel.lModels.push_back(ModelRpl(0x10, 0x193D));
  262. }
  263. }
  264. LOG(Temp, Normal, "Loaded player %s (%u)\n", m_strName.c_str(), m_wInstance);
  265. }
  266. Container_InitContents(MAX_PLAYER_EQUIPMENT, MAX_PLAYER_INVENTORY, MAX_PLAYER_CONTAINERS);
  267. // L337 stats?
  268. #if FALSE
  269. GetAttributeData(eStrength)->data.base = 100;
  270. GetAttributeData(eStrength)->data.raises = 190;
  271. GetAttributeData(eQuickness)->data.base = 10;
  272. GetAttributeData(eQuickness)->data.raises = 190;
  273. GetSkillData(eRun)->data.training = eTrained;
  274. GetSkillData(eRun)->data.raises = 208;
  275. GetSkillData(eRun)->data.exp = 4203819496;
  276. GetSkillData(eRun)->data.bonus = 1000;
  277. #else
  278. GetAttributeData(eStrength)->data.base = 100;
  279. GetAttributeData(eStrength)->data.raises = 190;
  280. GetAttributeData(eEndurance)->data.base = 10;
  281. GetAttributeData(eEndurance)->data.raises = 190;
  282. GetAttributeData(eCoordination)->data.base = 10;
  283. GetAttributeData(eCoordination)->data.raises = 190;
  284. GetAttributeData(eQuickness)->data.base = 10;
  285. GetAttributeData(eQuickness)->data.raises = 190;
  286. GetAttributeData(eFocus)->data.base = 100;
  287. GetAttributeData(eFocus)->data.raises = 190;
  288. GetAttributeData(eSelf)->data.base = 100;
  289. GetAttributeData(eSelf)->data.raises = 190;
  290. GetSkillData(eLifeMagic)->data.training = eSpecialized;
  291. GetSkillData(eLifeMagic)->data.raises = 226;
  292. GetSkillData(eLifeMagic)->data.exp = 4113151665;
  293. GetSkillData(eLifeMagic)->data.bonus = 10;
  294. GetSkillData(eWarMagic)->data.training = eSpecialized;
  295. GetSkillData(eWarMagic)->data.raises = 226;
  296. GetSkillData(eWarMagic)->data.exp = 4113151665;
  297. GetSkillData(eWarMagic)->data.bonus = 10;
  298. GetSkillData(eArcaneLore)->data.training = eTrained;
  299. GetSkillData(eArcaneLore)->data.raises = 208;
  300. GetSkillData(eArcaneLore)->data.exp = 4203819496;
  301. GetSkillData(eArcaneLore)->data.bonus = 5;
  302. GetSkillData(eCreatureEnchantment)->data.training = eTrained;
  303. GetSkillData(eCreatureEnchantment)->data.raises = 208;
  304. GetSkillData(eCreatureEnchantment)->data.exp = 4203819496;
  305. GetSkillData(eCreatureEnchantment)->data.bonus = 5;
  306. GetSkillData(eHealing)->data.training = eTrained;
  307. GetSkillData(eHealing)->data.raises = 208;
  308. GetSkillData(eHealing)->data.exp = 4203819496;
  309. GetSkillData(eHealing)->data.bonus = 5;
  310. GetSkillData(eItemEnchantment)->data.training = eTrained;
  311. GetSkillData(eItemEnchantment)->data.raises = 208;
  312. GetSkillData(eItemEnchantment)->data.exp = 4203819496;
  313. GetSkillData(eItemEnchantment)->data.bonus = 5;
  314. GetSkillData(eAppraiseItem)->data.training = eTrained;
  315. GetSkillData(eAppraiseItem)->data.raises = 208;
  316. GetSkillData(eAppraiseItem)->data.exp = 4203819496;
  317. GetSkillData(eAppraiseItem)->data.bonus = 5;
  318. GetSkillData(eJump)->data.training = eTrained;
  319. GetSkillData(eJump)->data.raises = 208;
  320. GetSkillData(eJump)->data.exp = 4203819496;
  321. GetSkillData(eJump)->data.bonus = 2000000;//5;
  322. GetSkillData(eLockpick)->data.training = eTrained;
  323. GetSkillData(eLockpick)->data.raises = 208;
  324. GetSkillData(eLockpick)->data.exp = 4203819496;
  325. GetSkillData(eLockpick)->data.bonus = 5;
  326. GetSkillData(eLoyalty)->data.training = eTrained;
  327. GetSkillData(eLoyalty)->data.raises = 208;
  328. GetSkillData(eLoyalty)->data.exp = 4203819496;
  329. GetSkillData(eLoyalty)->data.bonus = 5;
  330. GetSkillData(eMagicDefense)->data.training = eTrained;
  331. GetSkillData(eMagicDefense)->data.raises = 208;
  332. GetSkillData(eMagicDefense)->data.exp = 4203819496;
  333. GetSkillData(eMagicDefense)->data.bonus = 5;
  334. GetSkillData(eManaConversion)->data.training = eTrained;
  335. GetSkillData(eManaConversion)->data.raises = 208;
  336. GetSkillData(eManaConversion)->data.exp = 4203819496;
  337. GetSkillData(eManaConversion)->data.bonus = 5;
  338. GetSkillData(eRun)->data.training = eTrained;
  339. GetSkillData(eRun)->data.raises = 208;
  340. GetSkillData(eRun)->data.exp = 4203819496;
  341. GetSkillData(eRun)->data.bonus = 2000;//5;
  342. GetSkillData(eUnarmedCombat)->data.training = eTrained;
  343. GetSkillData(eUnarmedCombat)->data.raises = 208;
  344. GetSkillData(eUnarmedCombat)->data.exp = 4203819496;
  345. GetSkillData(eUnarmedCombat)->data.bonus = 5;
  346. #endif
  347. CBaseMonster::Precache();
  348. }
  349. void CBasePlayer::EmitSoundUI(DWORD dwIndex, float fSpeed)
  350. {
  351. BinaryWriter SoundMsg;
  352. SoundMsg.WriteDWORD(0xF750);
  353. SoundMsg.WriteDWORD(m_dwGUID);
  354. SoundMsg.WriteDWORD(dwIndex);
  355. SoundMsg.WriteFloat(fSpeed);
  356. SendNetMessage(&SoundMsg, OBJECT_MSG, FALSE, FALSE);
  357. }
  358. DWORD CBasePlayer::GiveAttributeXP(eAttribute index, DWORD dwXP)
  359. {
  360. ATTRIBUTE* pAttrib = GetAttributeData(index);
  361. if (!pAttrib) return 0;
  362. DWORD dwRaises = CBaseMonster::GiveAttributeXP(index, dwXP);
  363. if (dwRaises)
  364. {
  365. //Your base Strength is now 41! color: 0xD
  366. EmitSoundUI(0x76, 1.0);
  367. const char* szAttribName = GetAttributeName(index);
  368. const char* szNotice = csprintf("Your base %s is now %lu!", szAttribName, pAttrib->data.base + pAttrib->data.raises);
  369. SendText(szNotice, 13);
  370. }
  371. BinaryWriter UpdateAttribute;
  372. UpdateAttribute.WriteDWORD(0x241);
  373. UpdateAttribute.WriteWORD(index);
  374. UpdateAttribute.WriteBYTE(0);
  375. UpdateAttribute.WriteBYTE(++m_bStatSequence);
  376. UpdateAttribute.WriteDWORD(pAttrib->data.raises);
  377. UpdateAttribute.WriteDWORD(pAttrib->data.base);
  378. UpdateAttribute.WriteDWORD(pAttrib->data.exp);
  379. SendNetMessage(&UpdateAttribute, PRIVATE_MSG, FALSE, FALSE);
  380. return dwRaises;
  381. }
  382. DWORD CBasePlayer::GiveVitalXP(eVital index, DWORD dwXP)
  383. {
  384. VITAL* pVital = GetVitalData(index);
  385. if (!pVital) return 0;
  386. DWORD dwRaises = CBaseMonster::GiveVitalXP(index, dwXP);
  387. if (dwRaises)
  388. {
  389. //Your base Strength is now 41! color: 0xD
  390. EmitSoundUI(0x76, 1.0);
  391. const char* szVitalName = GetVitalName(index);
  392. const char* szNotice = csprintf("Your base %s is now %lu!", szVitalName, pVital->data.raises);
  393. SendText(szNotice, 13);
  394. }
  395. BinaryWriter UpdateVital;
  396. UpdateVital.WriteDWORD(0x243);
  397. UpdateVital.WriteWORD(index);
  398. UpdateVital.WriteBYTE(0);
  399. UpdateVital.WriteBYTE(++m_bStatSequence);
  400. UpdateVital.WriteDWORD(pVital->data.raises);
  401. UpdateVital.WriteDWORD(0);
  402. UpdateVital.WriteDWORD(pVital->data.exp);
  403. UpdateVital.WriteDWORD(pVital->data.raises);
  404. SendNetMessage(&UpdateVital, PRIVATE_MSG, FALSE, FALSE);
  405. return dwRaises;
  406. }
  407. DWORD CBasePlayer::GiveSkillXP(eSkill index, DWORD dwXP)
  408. {
  409. SKILL* pSkill = GetSkillData(index);
  410. if (!pSkill) return 0;
  411. DWORD dwRaises = CBaseMonster::GiveSkillXP(index, dwXP);
  412. if (dwRaises)
  413. {
  414. //Your base Strength is now 41! color: 0xD
  415. EmitSoundUI(0x76, 1.0);
  416. const char* szSkillName = GetSkillName(index);
  417. const char* szNotice = csprintf("Your base %s is now %lu!", szSkillName, pSkill->data.raises);
  418. SendText(szNotice, 13);
  419. }
  420. BinaryWriter UpdateSkill;
  421. UpdateSkill.WriteDWORD(0x23E);
  422. UpdateSkill.WriteWORD(index);
  423. UpdateSkill.WriteBYTE(0);
  424. UpdateSkill.WriteBYTE(++m_bStatSequence);
  425. UpdateSkill.WriteWORD(pSkill->data.raises);
  426. UpdateSkill.WriteWORD(1);
  427. UpdateSkill.WriteDWORD(pSkill->data.training);
  428. UpdateSkill.WriteDWORD(pSkill->data.exp);
  429. UpdateSkill.WriteDWORD(pSkill->data.bonus);
  430. UpdateSkill.WriteFloat(1.0f);
  431. UpdateSkill.WriteDWORD(0);
  432. UpdateSkill.WriteDWORD(0);
  433. SendNetMessage(&UpdateSkill, PRIVATE_MSG, FALSE, FALSE);
  434. return dwRaises;
  435. }
  436. void CBasePlayer::SendNetMessage(void *_data, DWORD _len, WORD _group, BOOL _event)
  437. {
  438. if (m_pClient)
  439. m_pClient->SendNetMessage(_data, _len, _group, _event);
  440. }
  441. void CBasePlayer::SendNetMessage(BinaryWriter *_food, WORD _group, BOOL _event, BOOL del)
  442. {
  443. if (m_pClient)
  444. m_pClient->SendNetMessage(_food, _group, _event, del);
  445. }
  446. void CBasePlayer::SendText(const char* szText, long lColor)
  447. {
  448. if (m_pClient)
  449. {
  450. CClientEvents *pEvents = m_pClient->GetEvents();
  451. if (pEvents)
  452. pEvents->SendText(szText, lColor);
  453. }
  454. }
  455. BinaryWriter* CBasePlayer::GetModelData()
  456. {
  457. //if ( !IsHuman() )
  458. {
  459. return CBaseMonster::GetModelData();
  460. }
  461. BinaryWriter *MD = new BinaryWriter;
  462. //Fake Zyrca:
  463. MD->WriteBYTE(0x11);
  464. MD->WriteBYTE(0x01);
  465. MD->WriteBYTE(0x18);
  466. MD->WriteBYTE(0x11);
  467. //Palettes
  468. MD->WriteWORD(0x007E);
  469. MD->WriteWORD(0x0EB6); MD->WriteBYTE(0x00); MD->WriteBYTE(0x00);
  470. //Textures
  471. unsigned char TextureData[] =
  472. {
  473. 0x10, 0x98, 0x00, 0xB8, 0x10,
  474. 0x10, 0x4C, 0x02, 0x67, 0x10,
  475. 0x10, 0xF5, 0x02, 0x8A, 0x10,
  476. 0x10, 0x5C, 0x02, 0xA3, 0x10,//4
  477. 0x00, 0xBE, 0x0C, 0x01, 0x17,
  478. 0x00, 0xB0, 0x0B, 0x01, 0x17,
  479. 0x01, 0x07, 0x17, 0x07, 0x17,
  480. 0x01, 0x44, 0x18, 0x44, 0x18,//8
  481. 0x02, 0x08, 0x17, 0x08, 0x17,
  482. 0x02, 0x44, 0x18, 0x44, 0x18,
  483. 0x05, 0x07, 0x17, 0x07, 0x17,
  484. 0x05, 0x44, 0x18, 0x44, 0x18,//C
  485. 0x06, 0x08, 0x17, 0x08, 0x17,
  486. 0x06, 0x44, 0x18, 0x44, 0x18,
  487. 0x09, 0xDE, 0x03, 0x30, 0x18,
  488. 0x09, 0xD6, 0x03, 0x2F, 0x18,//10
  489. 0x0A, 0xFF, 0x16, 0x2E, 0x18,
  490. 0x0B, 0xFE, 0x16, 0x4E, 0x17,
  491. 0x0C, 0xD3, 0x03, 0xD3, 0x03,
  492. 0x0D, 0xFF, 0x16, 0x2E, 0x18,//14
  493. 0x0E, 0xFE, 0x16, 0x4E, 0x17,
  494. 0x0F, 0xD3, 0x03, 0xD3, 0x03,
  495. 0x10, 0xC4, 0x0E, 0x32, 0x18,
  496. 0x10, 0xC3, 0x0E, 0xFD, 0x16,//18
  497. };
  498. MD->AppendData(TextureData, sizeof(TextureData));
  499. //Models
  500. MD->WriteBYTE(0x00); MD->WriteWORD(0x0477);
  501. MD->WriteBYTE(0x01); MD->WriteWORD(0x16EE);
  502. MD->WriteBYTE(0x02); MD->WriteWORD(0x16EC);
  503. MD->WriteBYTE(0x03); MD->WriteWORD(0x1EC);
  504. MD->WriteBYTE(0x04); MD->WriteWORD(0x1EC);
  505. MD->WriteBYTE(0x05); MD->WriteWORD(0x16E9);
  506. MD->WriteBYTE(0x06); MD->WriteWORD(0x16ED);
  507. MD->WriteBYTE(0x07); MD->WriteWORD(0x01EC);
  508. MD->WriteBYTE(0x08); MD->WriteWORD(0x01EC);
  509. MD->WriteBYTE(0x09); MD->WriteWORD(0x04B9);
  510. MD->WriteBYTE(0x0A); MD->WriteWORD(0x16E7);
  511. MD->WriteBYTE(0x0B); MD->WriteWORD(0x16E5);
  512. MD->WriteBYTE(0x0C); MD->WriteWORD(0x0076);
  513. MD->WriteBYTE(0x0D); MD->WriteWORD(0x16E4);
  514. MD->WriteBYTE(0x0E); MD->WriteWORD(0x16E6);
  515. MD->WriteBYTE(0x0F); MD->WriteWORD(0x0077);
  516. MD->WriteBYTE(0x10); MD->WriteWORD(0x193D);
  517. MD->Align();
  518. return MD;
  519. }
  520. void CBasePlayer::Save()
  521. {
  522. }
  523. void CBasePlayer::ChangeVIS(DWORD dwFlags)
  524. {
  525. CBaseMonster::ChangeVIS(dwFlags | PhysicsState::GRAVITY_PS);
  526. }
  527. void CBasePlayer::AddSpellByID(DWORD id)
  528. {
  529. BinaryWriter AddSpellToSpellbook;
  530. AddSpellToSpellbook.WriteDWORD(0x02C1);
  531. AddSpellToSpellbook.WriteDWORD(id);
  532. AddSpellToSpellbook.WriteDWORD(0x0);
  533. SendNetMessage(AddSpellToSpellbook.GetData(), AddSpellToSpellbook.GetSize(), EVENT_MSG,true);
  534. }
  535. void CBasePlayer::EnterPortal()
  536. {
  537. ChangeVIS(PhysicsState::HIDDEN_PS | PhysicsState::IGNORE_COLLISIONS_PS | PhysicsState::EDGE_SLIDE_PS);
  538. BinaryWriter EnterPortal;
  539. EnterPortal.WriteDWORD(0xF751);
  540. EnterPortal.WriteDWORD(m_wNumPortals);
  541. SendNetMessage(EnterPortal.GetData(), EnterPortal.GetSize(), OBJECT_MSG);
  542. }
  543. void CBasePlayer::SpawnCows()
  544. {
  545. if (!Animation_IsActive())
  546. {
  547. SpeakLocal("Zojak Quamoo", 0x11);
  548. Animation_PlaySimpleAnimation(304, 1.0f, 3.0f, ANIM_SPELLCAST, 2366);
  549. Animation_PlaySimpleAnimation(313, 3.0f, 1.0f);
  550. Animation_PlaySimpleAnimation(0, 0);
  551. }
  552. }
  553. BOOL CBasePlayer::PlayerThink()
  554. {
  555. CBaseMonster::MonsterThink();
  556. return TRUE;
  557. }
  558. const char* CBasePlayer::GetGenderString()
  559. {
  560. return "Male";
  561. }
  562. const char* CBasePlayer::GetRaceString()
  563. {
  564. return "Human";
  565. }
  566. const char* CBasePlayer::GetTitleString()
  567. {
  568. return "God";
  569. }
  570. void CBasePlayer::MakeAware(CPhysicsObj *pEntity)
  571. {
  572. BinaryWriter *CM = pEntity->CreateMessage();
  573. if (CM)
  574. SendNetMessage(CM, 10);
  575. ItemVector vItems;
  576. pEntity->Container_GetWieldedItems(&vItems);
  577. ItemVector::iterator iit = vItems.begin();
  578. ItemVector::iterator iend = vItems.end();
  579. while (iit != iend)
  580. {
  581. BinaryWriter *CM = ((CPhysicsObj *)(*iit))->CreateMessage();
  582. if (CM)
  583. SendNetMessage(CM, 10);
  584. iit++;
  585. }
  586. }
  587. void CBasePlayer::LoginCharacter(void)
  588. {
  589. DWORD SC[2];
  590. SC[0] = 0xF746;
  591. SC[1] = m_dwGUID;
  592. SendNetMessage(SC, sizeof(SC), 10);
  593. BinaryWriter *LC = ::LoginCharacter(this);
  594. SendNetMessage(LC->GetData(), LC->GetSize(), PRIVATE_MSG, TRUE);
  595. delete LC;
  596. }
  597. void CBasePlayer::ExitPortal()
  598. {
  599. ChangeVIS(REPORT_COLLISIONS_PS | PhysicsState::EDGE_SLIDE_PS);
  600. }
  601. void CBasePlayer::UpdateEntity(CPhysicsObj *pEntity)
  602. {
  603. BinaryWriter *CO = pEntity->UpdateMessage();
  604. if (CO)
  605. {
  606. g_pWorld->BroadcastPVS(GetLandcell(), CO->GetData(), CO->GetSize(), OBJECT_MSG, 0);
  607. delete CO;
  608. }
  609. }
  610. BOOL CBasePlayer::IsHuman()
  611. {
  612. return (m_dwAnimationSet == 0x09000001) ? TRUE : FALSE;
  613. }
  614. DWORD CBasePlayer::GetObjectStat(eObjectStat index)
  615. {
  616. return CPhysicsObj::GetObjectStat(index);
  617. }
  618. DWORD CBasePlayer::SetObjectStat(eObjectStat index, DWORD value)
  619. {
  620. if (index >= 0x100)
  621. return NULL;
  622. BinaryWriter UpdateStatistic;
  623. UpdateStatistic.WriteDWORD(0x237);
  624. UpdateStatistic.WriteBYTE(++m_bStatSequence);
  625. UpdateStatistic.WriteDWORD(index);
  626. UpdateStatistic.WriteDWORD(value);
  627. SendNetMessage(&UpdateStatistic, PRIVATE_MSG, FALSE, FALSE);
  628. return CPhysicsObj::SetObjectStat(index, value);
  629. }
  630. void CBasePlayer::SetLastAssessed(DWORD guid)
  631. {
  632. m_LastAssessed = guid;
  633. }
  634. std::string CBasePlayer::RemoveLastAssessed()
  635. {
  636. if (m_LastAssessed != 0)
  637. {
  638. CPhysicsObj *pObject = g_pWorld->FindWithinPVS(this, m_LastAssessed);
  639. if (pObject != NULL && !pObject->IsPlayer() && !pObject->m_bDontClear) {
  640. std::string name = pObject->GetName();
  641. CLandBlock *pBlock = GetBlock();
  642. pObject->RemoveMe();
  643. pBlock->Destroy(pObject);
  644. m_LastAssessed = 0;
  645. return name;
  646. }
  647. }
  648. return "";
  649. }