Guest User

newpet

a guest
Jul 28th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.51 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "utils.h"
  3. #include "vector.h"
  4. #include "char.h"
  5. #include "sectree_manager.h"
  6. #include "char_manager.h"
  7. #include "mob_manager.h"
  8. #include "New_PetSystem.h"
  9. #include "../../common/VnumHelper.h"
  10. #include "packet.h"
  11. #include "item_manager.h"
  12. #include "item.h"
  13. #include "db.h"
  14.  
  15. extern int passes_per_sec;
  16. EVENTINFO(newpetsystem_event_info)
  17. {
  18. CNewPetSystem* pPetSystem;
  19. };
  20.  
  21. EVENTINFO(newpetsystem_event_infoe)
  22. {
  23. CNewPetSystem* pPetSystem;
  24. };
  25.  
  26. EVENTFUNC(newpetsystem_update_event)
  27. {
  28. newpetsystem_event_info* info = dynamic_cast<newpetsystem_event_info*>( event->info );
  29. if ( info == NULL )
  30. {
  31. sys_err( "check_speedhack_event> <Factor> Null pointer" );
  32. return 0;
  33. }
  34.  
  35. CNewPetSystem* pPetSystem = info->pPetSystem;
  36.  
  37. if (NULL == pPetSystem)
  38. return 0;
  39.  
  40. pPetSystem->Update(0);
  41. return PASSES_PER_SEC(1) / 4;
  42. }
  43.  
  44. EVENTFUNC(newpetsystem_expire_event)
  45. {
  46. newpetsystem_event_infoe* info = dynamic_cast<newpetsystem_event_infoe*>(event->info);
  47. if (info == NULL)
  48. {
  49. sys_err("check_speedhack_event> <Factor> Null pointer");
  50. return 0;
  51. }
  52.  
  53. CNewPetSystem* pPetSystem = info->pPetSystem;
  54.  
  55. if (NULL == pPetSystem)
  56. return 0;
  57.  
  58.  
  59. pPetSystem->UpdateTime();
  60. // 0.25초마다 갱신.
  61. return PASSES_PER_SEC(1);
  62. }
  63.  
  64. const float PET_COUNT_LIMIT = 3;
  65.  
  66. CNewPetActor::CNewPetActor(LPCHARACTER owner, DWORD vnum, DWORD options)
  67. {
  68. m_dwVnum = vnum;
  69. m_dwVID = 0;
  70. m_dwlevel = 1;
  71. m_dwlevelstep = 0;
  72. m_dwExpFromMob = 0;
  73. m_dwExpFromItem = 0;
  74. m_dwexp = 0;
  75. m_dwexpitem = 0;
  76. m_dwOptions = options;
  77. m_dwLastActionTime = 0;
  78.  
  79. m_pkChar = 0;
  80. m_pkOwner = owner;
  81.  
  82. m_originalMoveSpeed = 0;
  83.  
  84. m_dwSummonItemVID = 0;
  85. m_dwSummonItemID = 0;
  86. m_dwSummonItemVnum = 0;
  87.  
  88. m_dwevolution = 0;
  89. m_dwduration = 0;
  90. m_dwtduration = 0;
  91.  
  92. m_dwdurationYas = 0;
  93.  
  94. m_dwTimePet = 0;
  95. m_dwslotimm = 0;
  96. m_dwImmTime = 0;
  97.  
  98. m_dwskill[0] = 0;
  99. m_dwskill[1] = 0;
  100. m_dwskill[2] = 0;
  101.  
  102. for (int s = 0; s < 9; ++s) {
  103. m_dwpetslotitem[s] = -1;
  104. }
  105.  
  106. m_dwskillslot[0] = -1;
  107. m_dwskillslot[0] = -1;
  108. m_dwskillslot[0] = -1;
  109.  
  110. for (int x = 0; x < 3; ++x)
  111. {
  112. int btype[3] = { 1, 54, 53};
  113. m_dwbonuspet[x][0] = btype[x];
  114. m_dwbonuspet[x][1] = 0;
  115. }
  116.  
  117. m_dwPetType = 0;
  118. }
  119.  
  120. CNewPetActor::~CNewPetActor()
  121. {
  122. this->Unsummon();
  123.  
  124. m_pkOwner = 0;
  125. }
  126.  
  127. void CNewPetActor::SetName(const char* name)
  128. {
  129. std::string petName = "";
  130.  
  131. if (0 != m_pkOwner &&
  132. 0 == name &&
  133. 0 != m_pkOwner->GetName())
  134. {
  135. petName += "'s Pet";
  136. }
  137. else
  138. petName += name;
  139.  
  140. if (true == IsSummoned())
  141. m_pkChar->SetName(petName);
  142.  
  143. m_name = petName;
  144. }
  145.  
  146. void CNewPetActor::SetItemCube(int pos, int invpos) {
  147. if (m_dwpetslotitem[pos] != -1)
  148. return;
  149. if (pos > 180 || pos < 0)
  150. return;
  151.  
  152. m_dwpetslotitem[pos] = invpos;
  153. }
  154.  
  155. void CNewPetActor::ItemCubeFeed(int type)
  156. {
  157. for (int i = 0; i < 9; ++i) {
  158. if(GetLevel() >= m_pkOwner->GetLevel())
  159. {
  160. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Pet ile ayni seviye oldugundan item yediremezsin."));
  161. return;
  162. }
  163. if (m_dwpetslotitem[i] != -1) {
  164. LPITEM itemxp = m_pkOwner->GetInventoryItem(m_dwpetslotitem[i]);
  165. if (!itemxp)
  166. return;
  167. if (itemxp->GetID() == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetID() || m_pkOwner->GetExchange() || m_pkOwner->GetMyShop() || m_pkOwner->GetShopOwner() || m_pkOwner->IsOpenSafebox() || m_pkOwner->IsCubeOpen())
  168. return;
  169. if (itemxp->isLocked())
  170. return;
  171. if (itemxp->IsBind())
  172. return;
  173. if (itemxp->IsUntilBind())
  174. return;
  175. if(type == 1)
  176. {
  177. if (itemxp->GetVnum() >= 55401 && itemxp->GetVnum() <= 55411 || itemxp->GetVnum() >= 55701 && itemxp->GetVnum() <= 55711 || itemxp->GetVnum() == 55001) {
  178. if(itemxp->GetVnum() == 55001)
  179. {
  180. int tmp_dur = m_dwtduration/2;
  181. if (m_dwduration+tmp_dur > m_dwtduration)
  182. m_dwduration = m_dwtduration;
  183. else
  184. m_dwduration += tmp_dur;
  185. }
  186. else
  187. {
  188. int tmp_dur = m_dwtduration * 3 / 100;
  189. if (m_dwduration+tmp_dur > m_dwtduration)
  190. m_dwduration = m_dwtduration;
  191. else
  192. m_dwduration += tmp_dur;
  193. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetDuration %d %d", m_dwduration, m_dwtduration);
  194. }
  195. ITEM_MANAGER::instance().RemoveItem(itemxp);
  196. }
  197. }
  198. else if(type == 3)
  199. {
  200. if(itemxp->GetType() == 1 || itemxp->GetType() == 2)
  201. {
  202. if (GetNextExpFromItem() - GetExpI() > 0)
  203. {
  204. SetExp(itemxp->GetShopBuyPrice() / 2, 1);
  205. ITEM_MANAGER::instance().RemoveItem(itemxp);
  206. }
  207. else
  208. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_exp_max"));
  209. }
  210. }
  211. }
  212. }
  213. for (int s = 0; s < 9; ++s) {
  214. m_dwpetslotitem[s] = -1;
  215. }
  216. }
  217.  
  218. bool CNewPetActor::ResetSkill(int skill) {
  219. if (m_dwskillslot[skill] > 0)
  220. {
  221. m_dwskillslot[skill] = 0;
  222. m_dwskill[skill] = 0;
  223. return true;
  224. }
  225. return false;
  226. }
  227.  
  228. bool CNewPetActor::IncreasePetSkill(int skill) {
  229. if (GetLevel() < 80 && m_dwevolution < 3)
  230. return false;
  231. for (int i = 0; i < 3; ++i) {
  232. if (m_dwskillslot[i] == skill) {
  233. if (m_dwskill[i] < 20) {
  234. m_dwskill[i] += 1;
  235. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_beceri_ulasti"), m_dwskill[i]);
  236. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", i, m_dwskillslot[i], m_dwskill[i]);
  237. return true;
  238. }
  239. else {
  240. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_beceri_max"));
  241. return false;
  242. }
  243. }
  244. }
  245.  
  246. for (int i = 0; i < 3; ++i) {
  247. if (m_dwskillslot[i] == 0) {
  248. m_dwskillslot[i] = skill;
  249. m_dwskill[i] = 1;
  250. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_beceri_yeni"));
  251. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", i, m_dwskillslot[i], m_dwskill[i]);
  252. return true;
  253. }
  254. }
  255. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_beceri_yeni_yok"));
  256. return false;
  257. }
  258.  
  259. bool CNewPetActor::IncreasePetEvolution() {
  260. if (m_dwevolution < 3) {
  261. if (GetLevel() == 40 && m_dwevolution < 1 || GetLevel() == 60 && m_dwevolution < 2 || GetLevel() == 80 && m_dwevolution < 3) {
  262. m_dwevolution += 1;
  263. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetEvolution %d", m_dwevolution);
  264. if (m_dwevolution == 3) {
  265. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 2, m_dwskillslot[2], m_dwskill[2]);
  266. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 2, m_dwskillslot[2], m_dwskill[2]);
  267. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 2, m_dwskillslot[2], m_dwskill[2]);
  268. }
  269. }
  270. else
  271. return false;
  272. }
  273. else {
  274. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_evrim_yok"));
  275. return false;
  276. }
  277. return true;
  278. }
  279.  
  280. void CNewPetActor::IncreasePetBonus() {
  281. int tmplevel = GetLevel();
  282. if (m_dwPetType == 0)
  283. {
  284. int lvbonus = 0;
  285. if (tmplevel >= 60)
  286. lvbonus = 1;
  287. if (tmplevel % 5 == 0)
  288. {
  289. m_dwbonuspet[0][1] += number(1+lvbonus, 5+lvbonus);
  290. m_dwbonuspet[2][1] += number(1+lvbonus, 5+lvbonus);
  291. }
  292.  
  293. if (tmplevel % 7 == 0)
  294. {
  295. m_dwbonuspet[1][1] += number(1+lvbonus, 5+lvbonus);
  296. }
  297. }
  298. else if (m_dwPetType == 1) // sabit
  299. {
  300. int lvbonus = 0;
  301. if (m_dwdurationYas >= 60)
  302. lvbonus = 1;
  303. if (tmplevel % 5 == 0)
  304. {
  305. m_dwbonuspet[0][1] += number(2+lvbonus, 3+lvbonus);
  306. m_dwbonuspet[2][1] += number(2+lvbonus, 3+lvbonus);
  307. }
  308.  
  309. if (tmplevel % 7 == 0)
  310. {
  311. m_dwbonuspet[1][1] += number(2+lvbonus, 3+lvbonus);
  312. }
  313. }
  314. else if (m_dwPetType == 2)
  315. {
  316. int lvbonus = 0;
  317. if (tmplevel >= 60)
  318. lvbonus = 1;
  319. if (tmplevel % 5 == 0)
  320. {
  321. m_dwbonuspet[0][1] += number(1+lvbonus, 7+lvbonus);
  322. m_dwbonuspet[2][1] += number(1+lvbonus, 7+lvbonus);
  323. }
  324.  
  325. if (tmplevel % 7 == 0)
  326. {
  327. m_dwbonuspet[1][1] += number(1+lvbonus, 7+lvbonus);
  328. }
  329. }
  330. else if (m_dwPetType == 3) // sabit
  331. {
  332. int lvbonus = 0;
  333. if (m_dwdurationYas >= 60)
  334. lvbonus = 1;
  335. if (tmplevel % 5 == 0)
  336. {
  337. m_dwbonuspet[0][1] += number(3+lvbonus, 4+lvbonus);
  338. m_dwbonuspet[2][1] += number(3+lvbonus, 4+lvbonus);
  339. }
  340.  
  341. if (tmplevel % 7 == 0)
  342. {
  343. m_dwbonuspet[1][1] += number(3+lvbonus, 4+lvbonus);
  344. }
  345. }
  346. else if (m_dwPetType == 4)
  347. {
  348. int lvbonus = 0;
  349. if (tmplevel >= 60)
  350. lvbonus = 1;
  351. if (tmplevel % 5 == 0)
  352. {
  353. m_dwbonuspet[0][1] += number(1+lvbonus, 9+lvbonus);
  354. m_dwbonuspet[2][1] += number(1+lvbonus, 9+lvbonus);
  355. }
  356.  
  357. if (tmplevel % 7 == 0)
  358. {
  359. m_dwbonuspet[1][1] += number(1+lvbonus, 9+lvbonus);
  360. }
  361. }
  362. else if (m_dwPetType == 5) // sabit
  363. {
  364. int lvbonus = 0;
  365. if (m_dwdurationYas >= 60)
  366. lvbonus = 1;
  367. if (tmplevel % 5 == 0)
  368. {
  369. m_dwbonuspet[0][1] += number(5+lvbonus, 6+lvbonus);
  370. m_dwbonuspet[2][1] += number(5+lvbonus, 6+lvbonus);
  371. }
  372.  
  373. if (tmplevel % 7 == 0)
  374. {
  375. m_dwbonuspet[1][1] += number(5+lvbonus, 6+lvbonus);
  376. }
  377. }
  378. else if (m_dwPetType == 6) // sabit
  379. {
  380. int lvbonus = 0;
  381. if (m_dwdurationYas >= 60)
  382. lvbonus = 1;
  383. if (tmplevel % 5 == 0)
  384. {
  385. m_dwbonuspet[0][1] += number(6+lvbonus, 8+lvbonus);
  386. m_dwbonuspet[2][1] += number(6+lvbonus, 8+lvbonus);
  387. }
  388.  
  389. if (tmplevel % 7 == 0)
  390. {
  391. m_dwbonuspet[1][1] += number(6+lvbonus, 8+lvbonus);
  392. }
  393. }
  394. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetBonus %d %d %d", m_dwbonuspet[0][1], m_dwbonuspet[1][1], m_dwbonuspet[2][1]);
  395. LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID());
  396. if (pSummonItem != NULL){
  397. for (int b = 0; b < 3; b++){
  398. pSummonItem->SetForceAttribute(b, 1, m_dwbonuspet[b][1]);
  399. }
  400. pSummonItem->SetSocket(1,tmplevel);
  401. }
  402. }
  403.  
  404. void CNewPetActor::SetNextExp(int nextExp)
  405. {
  406. m_dwExpFromMob = (nextExp/10)* 9;
  407. m_dwExpFromItem = nextExp - m_dwExpFromMob;
  408.  
  409. }
  410.  
  411. void CNewPetActor::SetLevel(DWORD level)
  412. {
  413. m_pkChar->SetLevel(static_cast<char>(level));
  414. m_dwlevel = level;
  415. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetLevel %d", m_dwlevel);
  416. SetNextExp(m_pkChar->PetGetNextExp());
  417. }
  418.  
  419. void CNewPetActor::SetEvolution(int lv) {
  420. if (lv == 40)
  421. m_dwevolution = 1;
  422. else if (lv == 60)
  423. m_dwevolution = 2;
  424. else if (lv == 80)
  425. m_dwevolution = 3;
  426. }
  427.  
  428. void CNewPetActor::SetExp(DWORD exp, int mode)
  429. {
  430. if(GetLevel() >= m_pkOwner->GetLevel()) {return;}
  431. if (exp < 0)
  432. exp = MAX(m_dwexp - exp, 0);
  433. if(mode == 0){
  434. if(GetExp() + exp >= GetNextExpFromMob() && GetExpI() >= GetNextExpFromItem())
  435. {
  436. if(GetEvolution() == 0 && GetLevel() == 40)
  437. return;
  438. else if(GetEvolution() == 1 && GetLevel() == 60)
  439. return;
  440. else if(GetEvolution() == 2 && GetLevel() == 80)
  441. return;
  442. }
  443. }else if(mode == 1)
  444. {
  445. if(GetExpI() + exp >= GetNextExpFromItem() && GetExp() >= GetNextExpFromMob())
  446. {
  447. if(GetEvolution() == 0 && GetLevel() == 40)
  448. return;
  449. else if(GetEvolution() == 1 && GetLevel() == 60)
  450. return;
  451. else if(GetEvolution() == 2 && GetLevel() == 80)
  452. return;
  453. }
  454. }
  455.  
  456. if (mode == 0) {
  457. if (GetExp() + exp >= GetNextExpFromMob()) {
  458. if (GetExpI() >= GetNextExpFromItem()){
  459. SetLevel(GetLevel() + 1);
  460. m_pkChar->UpdatePacket();
  461. m_pkChar->SendPetLevelUpEffect(m_pkChar->GetVID(), 1, GetLevel(), 1);
  462. IncreasePetBonus();
  463. m_dwlevelstep = 0;
  464. m_dwexp = 0;
  465. m_dwexpitem = 0;
  466. m_pkChar->SetExp(0);
  467. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  468. return;
  469. }else {
  470.  
  471. m_dwlevelstep = 4;
  472. exp = GetNextExpFromMob() - GetExp();
  473. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  474. }
  475. }
  476. m_dwexp += exp;
  477. m_pkChar->SetExp(m_dwexp);
  478. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  479. if (GetLevelStep() < 4) {
  480. if (GetExp() >= GetNextExpFromMob() / 4 * 3 && m_dwlevelstep != 3) {
  481. m_dwlevelstep = 3;
  482. }else if (GetExp() >= GetNextExpFromMob() / 4 * 2 && m_dwlevelstep != 2) {
  483. m_dwlevelstep = 2;
  484. }else if (GetExp() >= GetNextExpFromMob() / 4 && m_dwlevelstep != 1) {
  485. m_dwlevelstep = 1;
  486. }
  487. }
  488. }else if(mode == 1) {
  489. if (GetExpI() + exp >= GetNextExpFromItem()) {
  490. if (GetExp() >= GetNextExpFromMob()) {
  491. m_dwexpitem = GetExpI() + exp - GetNextExpFromItem();
  492. m_dwexp = 0;
  493. m_pkChar->SetExp(0);
  494. m_dwlevelstep = 0;
  495. SetLevel(GetLevel() + 1);
  496. m_pkChar->UpdatePacket();
  497. m_pkChar->SendPetLevelUpEffect(m_pkChar->GetVID(), 1, GetLevel(), 1);
  498. IncreasePetBonus();
  499. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  500. //SetEvolution(GetLevel());
  501. return;
  502. if (GetExpI() > GetNextExpFromItem()) {
  503. m_dwexpitem = GetNextExpFromItem();
  504. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  505. }
  506. }else {
  507. exp = GetNextExpFromItem() - GetExpI();
  508. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  509. }
  510. }
  511. m_dwexpitem += exp;
  512. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  513. }
  514.  
  515. }
  516.  
  517. bool CNewPetActor::Mount()
  518. {
  519. if (0 == m_pkOwner)
  520. return false;
  521.  
  522. if (true == HasOption(EPetOption_Mountable))
  523. m_pkOwner->MountVnum(m_dwVnum);
  524.  
  525. return m_pkOwner->GetMountVnum() == m_dwVnum;;
  526. }
  527.  
  528. void CNewPetActor::UpdateTime()
  529. {
  530. m_dwTimePet += 1;
  531. if (m_dwTimePet >= 60)
  532. {
  533. m_dwduration -= 1;
  534. m_dwTimePet = 0;
  535. //m_dwdurationYas += 1;
  536. LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID());
  537. if (pSummonItem != NULL){
  538. pSummonItem->SetForceAttribute(3, 1, m_dwduration);
  539. pSummonItem->SetForceAttribute(4, 1, m_dwtduration);
  540. //pSummonItem->SetForceAttribute(5, 1, m_dwdurationYas);
  541. }
  542. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetDuration %d %d", m_dwduration, m_dwtduration);
  543. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetDurationYas %d", m_dwdurationYas);
  544. }
  545. }
  546.  
  547. void CNewPetActor::Unmount()
  548. {
  549. if (0 == m_pkOwner)
  550. return;
  551.  
  552. if (m_pkOwner->IsHorseRiding())
  553. m_pkOwner->StopRiding();
  554. }
  555.  
  556. void CNewPetActor::Unsummon()
  557. {
  558. if (true == this->IsSummoned())
  559. {
  560. DBManager::instance().DirectQuery("UPDATE new_petsystem SET level = %d, evolution=%d, exp=%d, expi=%d, bonus0=%d, bonus1=%d, bonus2=%d, skill0=%d, skill0lv= %d, skill1=%d, skill1lv= %d, skill2=%d, skill2lv= %d, duration=%d, tduration=%d, Petin_yasi=%d WHERE id = %lu ", this->GetLevel(), this->m_dwevolution, this->GetExp(), this->GetExpI(), this->m_dwbonuspet[0][1], this->m_dwbonuspet[1][1], this->m_dwbonuspet[2][1], this->m_dwskillslot[0], this->m_dwskill[0], this->m_dwskillslot[1], this->m_dwskill[1], this->m_dwskillslot[2], this->m_dwskill[2], this->m_dwduration, this->m_dwtduration, this->m_dwdurationYas, ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetID());
  561. this->ClearBuff();
  562.  
  563. LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID());
  564. if (pSummonItem != NULL){
  565. for (int b = 0; b < 3; b++){
  566. pSummonItem->SetForceAttribute(b, 1, m_dwbonuspet[b][1]);
  567. }
  568. pSummonItem->SetForceAttribute(3, 1, m_dwduration);
  569. pSummonItem->SetForceAttribute(4, 1, m_dwtduration);
  570. pSummonItem->SetForceAttribute(5, 1, m_dwdurationYas);
  571. pSummonItem->SetForceAttribute(6, 1, GetSkillCount());
  572. pSummonItem->SetSocket(1,m_dwlevel);
  573. pSummonItem->SetSocket(0, false);
  574. pSummonItem->Lock(false);
  575. }
  576. this->SetSummonItem(NULL);
  577. if (NULL != m_pkOwner)
  578. m_pkOwner->ComputePoints();
  579.  
  580. if (NULL != m_pkChar)
  581. M2_DESTROY_CHARACTER(m_pkChar);
  582.  
  583. m_pkChar = 0;
  584. m_dwVID = 0;
  585. m_dwlevel = 1;
  586. m_dwlevelstep = 0;
  587. m_dwExpFromMob = 0;
  588. m_dwExpFromItem = 0;
  589. m_dwexp = 0;
  590. m_dwexpitem = 0;
  591. m_dwTimePet = 0;
  592. m_dwImmTime = 0;
  593. m_dwslotimm = 0;
  594.  
  595. for (int s = 0; s < 9; ++s) {
  596. m_dwpetslotitem[s] = -1;
  597. }
  598. ClearBuff();
  599. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetUnsummon");
  600. #ifdef ENABLE_NEW_PET_IMMORTAL_FIX
  601. m_pkOwner->SetImmortal(0);
  602. #endif
  603. }
  604. }
  605.  
  606. DWORD CNewPetActor::Summon(const char* petName, LPITEM pSummonItem, bool bSpawnFar)
  607. {
  608. long x = m_pkOwner->GetX();
  609. long y = m_pkOwner->GetY();
  610. long z = m_pkOwner->GetZ();
  611.  
  612. if (true == bSpawnFar)
  613. {
  614. x += (number(0, 1) * 2 - 1) * number(2000, 2500);
  615. y += (number(0, 1) * 2 - 1) * number(2000, 2500);
  616. }
  617. else
  618. {
  619. x += number(-100, 100);
  620. y += number(-100, 100);
  621. }
  622.  
  623. if (0 != m_pkChar)
  624. {
  625. m_pkChar->Show (m_pkOwner->GetMapIndex(), x, y);
  626. m_dwVID = m_pkChar->GetVID();
  627.  
  628. return m_dwVID;
  629. }
  630.  
  631. m_pkChar = CHARACTER_MANAGER::instance().SpawnMob(
  632. m_dwVnum,
  633. m_pkOwner->GetMapIndex(),
  634. x, y, z,
  635. false, (int)(m_pkOwner->GetRotation()+180), false);
  636.  
  637. if (0 == m_pkChar)
  638. {
  639. sys_err("[CPetSystem::Summon] Failed to summon the pet. (vnum: %d)", m_dwVnum);
  640. return 0;
  641. }
  642.  
  643. m_pkChar->SetNewPet();
  644.  
  645. m_pkChar->SetEmpire(m_pkOwner->GetEmpire());
  646.  
  647. m_dwVID = m_pkChar->GetVID();
  648.  
  649. char szQuery1[1024];
  650. snprintf(szQuery1, sizeof(szQuery1), "SELECT name,level,exp,expi,bonus0,bonus1,bonus2,skill0,skill0lv,skill1,skill1lv,skill2,skill2lv,duration,tduration,evolution,Petin_yasi,pet_type FROM new_petsystem WHERE id = %d ", pSummonItem->GetID());
  651. std::unique_ptr<SQLMsg> pmsg2(DBManager::instance().DirectQuery(szQuery1));
  652. if (pmsg2->Get()->uiNumRows > 0) {
  653. MYSQL_ROW row = mysql_fetch_row(pmsg2->Get()->pSQLResult);
  654. this->SetName(row[0]);
  655. this->SetLevel(atoi(row[1]));
  656. this->SetExp(atoi(row[2]), 0);
  657. this->SetExp(atoi(row[3]), 1);
  658. this->m_dwbonuspet[0][1] = atoi(row[4]);
  659. this->m_dwbonuspet[1][1] = atoi(row[5]);
  660. this->m_dwbonuspet[2][1] = atoi(row[6]);
  661. this->m_dwskillslot[0] = atoi(row[7]);
  662. this->m_dwskill[0] = atoi(row[8]);
  663. this->m_dwskillslot[1] = atoi(row[9]);
  664. this->m_dwskill[1] = atoi(row[10]);
  665. this->m_dwskillslot[2] = atoi(row[11]);
  666. this->m_dwskill[2] = atoi(row[12]);
  667. this->m_dwduration = atoi(row[13]);
  668. this->m_dwtduration = atoi(row[14]);
  669. this->m_dwevolution = atoi(row[15]);
  670. this->m_dwdurationYas = atoi(row[16]);
  671. this->m_dwPetType = atoi(row[17]);
  672.  
  673. }else
  674. this->SetName(petName);
  675.  
  676. this->SetSummonItem(pSummonItem);
  677.  
  678. m_pkOwner->ComputePoints();
  679. m_pkChar->Show(m_pkOwner->GetMapIndex(), x, y, z);
  680.  
  681. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetIcon %d", m_dwSummonItemVnum);
  682. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetEvolution %d", m_dwevolution);
  683. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetName %s", m_name.c_str());
  684. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetLevel %d", m_dwlevel);
  685. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetDuration %d %d", m_dwduration, m_dwtduration);
  686. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetDurationYas %d", m_dwdurationYas);
  687. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetBonus %d %d %d", m_dwbonuspet[0][1], m_dwbonuspet[1][1], m_dwbonuspet[2][1]);
  688. if (GetLevel() >= 80 && m_dwevolution == 3 ){
  689. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 0, m_dwskillslot[0], m_dwskill[0]);
  690. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 1, m_dwskillslot[1], m_dwskill[1]);
  691. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 2, m_dwskillslot[2], m_dwskill[2]);
  692. }
  693. else {
  694. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 0, -1, m_dwskill[0]);
  695. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 1, -1, m_dwskill[1]);
  696. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetSkill %d %d %d", 2, -1, m_dwskill[2]);
  697. }
  698. m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetExp %d %d %d", m_dwexp, m_dwexpitem, m_pkChar->PetGetNextExp());
  699. this->GiveBuff();
  700.  
  701. for (int b = 0; b < 3; b++){
  702. pSummonItem->SetForceAttribute(b, 1, m_dwbonuspet[b][1]);
  703. }
  704. pSummonItem->SetForceAttribute(3, 1, m_dwduration);
  705. pSummonItem->SetForceAttribute(4, 1, m_dwtduration);
  706. pSummonItem->SetForceAttribute(5, 1, m_dwdurationYas);
  707. pSummonItem->SetForceAttribute(6, 1, GetSkillCount());
  708. pSummonItem->SetSocket(1,m_dwlevel);
  709. pSummonItem->SetSocket(2, 1, m_dwPetType);
  710. pSummonItem->SetSocket(0,true);
  711. pSummonItem->Lock(true);
  712. return m_dwVID;
  713. }
  714.  
  715. bool CNewPetActor::_UpdatAloneActionAI(float fMinDist, float fMaxDist)
  716. {
  717. float fDist = number(fMinDist, fMaxDist);
  718. float r = (float)number (0, 359);
  719. float dest_x = GetOwner()->GetX() + fDist * cos(r);
  720. float dest_y = GetOwner()->GetY() + fDist * sin(r);
  721.  
  722. m_pkChar->SetNowWalking(true);
  723.  
  724. if (!m_pkChar->IsStateMove() && m_pkChar->Goto(dest_x, dest_y))
  725. m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0);
  726.  
  727. m_dwLastActionTime = get_dword_time();
  728.  
  729. return true;
  730. }
  731.  
  732. bool CNewPetActor::_UpdateFollowAI()
  733. {
  734. if (0 == m_pkChar->m_pkMobData)
  735. {
  736. return false;
  737. }
  738.  
  739. if (0 == m_originalMoveSpeed)
  740. {
  741. const CMob* mobData = CMobManager::Instance().Get(m_dwVnum);
  742.  
  743. if (0 != mobData)
  744. m_originalMoveSpeed = mobData->m_table.sMovingSpeed;
  745. }
  746. float START_FOLLOW_DISTANCE = 300.0f;
  747. float START_RUN_DISTANCE = 900.0f;
  748.  
  749. float RESPAWN_DISTANCE = 4500.f;
  750. int APPROACH = 290;
  751.  
  752. bool bDoMoveAlone = true;
  753. bool bRun = false;
  754.  
  755. DWORD currentTime = get_dword_time();
  756.  
  757. long ownerX = m_pkOwner->GetX(); long ownerY = m_pkOwner->GetY();
  758. long charX = m_pkChar->GetX(); long charY = m_pkChar->GetY();
  759.  
  760. float fDist = DISTANCE_APPROX(charX - ownerX, charY - ownerY);
  761.  
  762. if (fDist >= RESPAWN_DISTANCE)
  763. {
  764. float fOwnerRot = m_pkOwner->GetRotation() * 3.141592f / 180.f;
  765. float fx = -APPROACH * cos(fOwnerRot);
  766. float fy = -APPROACH * sin(fOwnerRot);
  767. if (m_pkChar->Show(m_pkOwner->GetMapIndex(), ownerX + fx, ownerY + fy))
  768. {
  769. return true;
  770. }
  771. }
  772.  
  773. if (fDist >= START_FOLLOW_DISTANCE)
  774. {
  775. if( fDist >= START_RUN_DISTANCE)
  776. {
  777. bRun = true;
  778. }
  779.  
  780. m_pkChar->SetNowWalking(!bRun);
  781.  
  782. Follow(APPROACH);
  783.  
  784. m_pkChar->SetLastAttacked(currentTime);
  785. m_dwLastActionTime = currentTime;
  786. }
  787.  
  788. else
  789. m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0);
  790.  
  791. return true;
  792. }
  793.  
  794. bool CNewPetActor::Update(DWORD deltaTime)
  795. {
  796. bool bResult = true;
  797.  
  798. if (IsSummoned()) {
  799. if (m_pkOwner->IsImmortal() && Pet_Skill_Table[16][2 + m_dwskill[m_dwslotimm]] <= (get_global_time() - m_dwImmTime)*10) {
  800. m_dwImmTime = 0;
  801. m_pkOwner->SetImmortal(0);
  802. }
  803. }
  804. if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || (IsSummoned() && (m_pkOwner->GetExchange() || m_pkOwner->GetMyShop() || m_pkOwner->GetShopOwner() || m_pkOwner->IsOpenSafebox() || m_pkOwner->IsCubeOpen() || m_dwduration <= 0))
  805. || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())
  806. || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner()
  807. )
  808. {
  809. this->Unsummon();
  810. return true;
  811. }
  812.  
  813. if (this->IsSummoned() && HasOption(EPetOption_Followable))
  814. bResult = bResult && this->_UpdateFollowAI();
  815.  
  816. return bResult;
  817. }
  818.  
  819. bool CNewPetActor::Follow(float fMinDistance)
  820. {
  821. if( !m_pkOwner || !m_pkChar)
  822. return false;
  823.  
  824. float fOwnerX = m_pkOwner->GetX();
  825. float fOwnerY = m_pkOwner->GetY();
  826.  
  827. float fPetX = m_pkChar->GetX();
  828. float fPetY = m_pkChar->GetY();
  829.  
  830. float fDist = DISTANCE_SQRT(fOwnerX - fPetX, fOwnerY - fPetY);
  831. if (fDist <= fMinDistance)
  832. return false;
  833.  
  834. m_pkChar->SetRotationToXY(fOwnerX, fOwnerY);
  835.  
  836. float fx, fy;
  837.  
  838. float fDistToGo = fDist - fMinDistance;
  839. GetDeltaByDegree(m_pkChar->GetRotation(), fDistToGo, &fx, &fy);
  840.  
  841. if (!m_pkChar->Goto((int)(fPetX+fx+0.5f), (int)(fPetY+fy+0.5f)) )
  842. return false;
  843.  
  844. m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0);
  845.  
  846. return true;
  847. }
  848.  
  849. void CNewPetActor::SetSummonItem (LPITEM pItem)
  850. {
  851. if (NULL == pItem)
  852. {
  853. m_dwSummonItemVID = 0;
  854. m_dwSummonItemID = 0;
  855. m_dwSummonItemVnum = 0;
  856. return;
  857. }
  858.  
  859. m_dwSummonItemVID = pItem->GetVID();
  860. m_dwSummonItemID = pItem->GetID();
  861. m_dwSummonItemVnum = pItem->GetVnum();
  862. }
  863.  
  864. void CNewPetActor::GiveBuff()
  865. {
  866. int cbonus[3] = { m_pkOwner->GetMaxHP(), m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetPoint(POINT_ATT_GRADE) };
  867. for (int i = 0; i < 3; ++i) {
  868. m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[m_dwbonuspet[i][0]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0, 60 * 60 * 24 * 365, 0, false);
  869. }
  870. if (GetLevel() > 81 && m_dwevolution == 3) {
  871. for (int s = 0; s < 3; s++) {
  872. switch (m_dwskillslot[s]) {
  873. case 1: //Resistenza Guerriero 78 Punti
  874. case 2: //Resistenza Sura 80
  875. case 3: //Resistenza Ninja 79
  876. case 4: //Resistenza Shamani 81
  877. case 5: //Resistenza Lycan 93
  878. case 6: //Valore Attacco 53 Punti
  879. case 7: //Antimagia 97
  880. case 8: //Velocit?Magia %
  881. case 9: //Perforazione 16 Punti
  882. case 11: //Sotto Hp Avv Punti
  883. case 12: //Sotto MP Avv Punti
  884. case 13: // Blocco corp 27 Punti
  885. case 14: // Riflessione 28 Punti
  886. case 15: // Drop Yang 44 Punti
  887. case 16: // Portata Arco 172 Punti
  888. m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[Pet_Skill_Table[m_dwskillslot[s] - 1][0]].bPointType, Pet_Skill_Table[m_dwskillslot[s] - 1][2 + m_dwskill[s]], 0, 60 * 60 * 24 * 365, 0, false);
  889. break;
  890. default:
  891. return;
  892. }
  893. }
  894. }
  895. }
  896.  
  897. void CNewPetActor::ClearBuff()
  898. {
  899. m_pkOwner->RemoveAffect(AFFECT_NEW_PET);
  900. return ;
  901. }
  902.  
  903. void CNewPetActor::DoPetSkill(int skillslot) {
  904. if (GetLevel() < 82 || m_dwevolution < 3)
  905. return;
  906. switch (m_dwskillslot[skillslot]) {
  907. case 10:
  908. {
  909. if (get_global_time() - m_pkOwner->GetNewPetSkillCD(0) <= 480) {
  910. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_yetenek_bekle"), 480 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(0)));
  911. return;
  912. }
  913. if (m_pkOwner->GetHPPct() > 20) {
  914. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_yetenek_bu"));
  915. return;
  916. }
  917. m_pkOwner->SetNewPetSkillCD(0, get_global_time());
  918. int riphp = MIN(m_pkOwner->GetHP() + (int)Pet_Skill_Table[9][2 + m_dwskill[skillslot]], m_pkOwner->GetMaxHP());
  919. m_pkOwner->PointChange(POINT_HP, riphp);
  920. m_pkOwner->EffectPacket(SE_HPUP_RED);
  921. }
  922. break;
  923.  
  924. case 17:
  925. {
  926. if (get_global_time() - m_pkOwner->GetNewPetSkillCD(1) <= 600) {
  927. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_yetenek_yeniden"), 600 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(1)));
  928. return;
  929. }
  930. m_pkOwner->SetNewPetSkillCD(1, get_global_time());
  931. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_olumsuz"));
  932. m_pkOwner->SetImmortal(1);
  933. m_dwslotimm = skillslot;
  934. m_dwImmTime = get_global_time();
  935. }
  936. break;
  937. case 18:
  938. {
  939. if (get_global_time() - m_pkOwner->GetNewPetSkillCD(2) <= 480) {
  940. m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pet_yetenek_yeniden"), 480 -(get_global_time() - m_pkOwner->GetNewPetSkillCD(2)));
  941. return;
  942. }
  943. m_pkOwner->SetNewPetSkillCD(2, get_global_time());
  944. m_pkOwner->RemoveBadAffect();
  945. }
  946. break;
  947.  
  948. default:
  949. return;
  950. }
  951. }
  952.  
  953. CNewPetSystem::CNewPetSystem(LPCHARACTER owner)
  954. {
  955.  
  956. m_pkOwner = owner;
  957. m_dwUpdatePeriod = 400;
  958.  
  959. m_dwLastUpdateTime = 0;
  960. }
  961.  
  962. CNewPetSystem::~CNewPetSystem()
  963. {
  964. Destroy();
  965. }
  966.  
  967. bool CNewPetSystem::IncreasePetSkill(int skill) {
  968. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  969. {
  970. CNewPetActor* petActor = iter->second;
  971. if (petActor != 0)
  972. {
  973. if (petActor->IsSummoned()) {
  974. return petActor->IncreasePetSkill(skill);
  975. }
  976. }
  977. }
  978. return false;
  979. }
  980.  
  981. bool CNewPetSystem::ResetSkill(int skill) {
  982. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  983. {
  984. CNewPetActor* petActor = iter->second;
  985. if (petActor != 0)
  986. {
  987. if (petActor->IsSummoned()) {
  988. return petActor->ResetSkill(skill);
  989. }
  990. }
  991. }
  992. return false;
  993. }
  994.  
  995. bool CNewPetSystem::IncreasePetEvolution() {
  996. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  997. {
  998. CNewPetActor* petActor = iter->second;
  999. if (petActor != 0)
  1000. {
  1001. if (petActor->IsSummoned()) {
  1002. return petActor->IncreasePetEvolution();
  1003. }
  1004. }
  1005. }
  1006. return false;
  1007. }
  1008.  
  1009. void CNewPetSystem::Destroy()
  1010. {
  1011. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1012. {
  1013. CNewPetActor* petActor = iter->second;
  1014.  
  1015. if (0 != petActor)
  1016. {
  1017. delete petActor;
  1018. }
  1019. }
  1020. event_cancel(&m_pkNewPetSystemUpdateEvent);
  1021. event_cancel(&m_pkNewPetSystemExpireEvent);
  1022. m_petActorMap.clear();
  1023. }
  1024.  
  1025. void CNewPetSystem::UpdateTime()
  1026. {
  1027. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1028. {
  1029. CNewPetActor* petActor = iter->second;
  1030.  
  1031. if (0 != petActor && petActor->IsSummoned())
  1032. {
  1033. petActor->UpdateTime();
  1034. }
  1035. }
  1036. }
  1037.  
  1038. bool CNewPetSystem::Update(DWORD deltaTime)
  1039. {
  1040. bool bResult = true;
  1041.  
  1042. DWORD currentTime = get_dword_time();
  1043.  
  1044. if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime)
  1045. return true;
  1046.  
  1047. std::vector <CNewPetActor*> v_garbageActor;
  1048.  
  1049. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1050. {
  1051. CNewPetActor* petActor = iter->second;
  1052.  
  1053. if (0 != petActor && petActor->IsSummoned())
  1054. {
  1055. LPCHARACTER pPet = petActor->GetCharacter();
  1056.  
  1057. if (NULL == CHARACTER_MANAGER::instance().Find(pPet->GetVID()))
  1058. {
  1059. v_garbageActor.push_back(petActor);
  1060. }
  1061. else
  1062. {
  1063. bResult = bResult && petActor->Update(deltaTime);
  1064. }
  1065. }
  1066. }
  1067. for (std::vector<CNewPetActor*>::iterator it = v_garbageActor.begin(); it != v_garbageActor.end(); it++)
  1068. DeletePet(*it);
  1069.  
  1070. m_dwLastUpdateTime = currentTime;
  1071.  
  1072. return bResult;
  1073. }
  1074.  
  1075. void CNewPetSystem::DeletePet(DWORD mobVnum)
  1076. {
  1077. TNewPetActorMap::iterator iter = m_petActorMap.find(mobVnum);
  1078.  
  1079. if (m_petActorMap.end() == iter)
  1080. {
  1081. sys_err("[CPetSystem::DeletePet] Can't find pet on my list (VNUM: %d)", mobVnum);
  1082. return;
  1083. }
  1084.  
  1085. CNewPetActor* petActor = iter->second;
  1086.  
  1087. if (0 == petActor)
  1088. sys_err("[CPetSystem::DeletePet] Null Pointer (petActor)");
  1089. else
  1090. delete petActor;
  1091.  
  1092. m_petActorMap.erase(iter);
  1093. }
  1094.  
  1095. void CNewPetSystem::DeletePet(CNewPetActor* petActor)
  1096. {
  1097. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1098. {
  1099. if (iter->second == petActor)
  1100. {
  1101. delete petActor;
  1102. m_petActorMap.erase(iter);
  1103.  
  1104. return;
  1105. }
  1106. }
  1107.  
  1108. sys_err("[CPetSystem::DeletePet] Can't find petActor(0x%x) on my list(size: %d) ", petActor, m_petActorMap.size());
  1109. }
  1110.  
  1111. void CNewPetSystem::Unsummon(DWORD vnum, bool bDeleteFromList)
  1112. {
  1113. CNewPetActor* actor = this->GetByVnum(vnum);
  1114.  
  1115. if (0 == actor)
  1116. {
  1117. sys_err("[CPetSystem::GetByVnum(%d)] Null Pointer (petActor)", vnum);
  1118. return;
  1119. }
  1120. actor->Unsummon();
  1121.  
  1122. if (true == bDeleteFromList)
  1123. this->DeletePet(actor);
  1124.  
  1125. bool bActive = false;
  1126. for (TNewPetActorMap::iterator it = m_petActorMap.begin(); it != m_petActorMap.end(); it++)
  1127. {
  1128. bActive |= it->second->IsSummoned();
  1129. }
  1130. if (false == bActive)
  1131. {
  1132. event_cancel(&m_pkNewPetSystemUpdateEvent);
  1133. event_cancel(&m_pkNewPetSystemExpireEvent);
  1134. m_pkNewPetSystemUpdateEvent = NULL;
  1135. m_pkNewPetSystemExpireEvent = NULL;
  1136. }
  1137. }
  1138.  
  1139. DWORD CNewPetSystem::GetNewPetITemID()
  1140. {
  1141. DWORD itemid = 0;
  1142. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1143. {
  1144. CNewPetActor* petActor = iter->second;
  1145. if (petActor != 0)
  1146. {
  1147. if (petActor->IsSummoned()) {
  1148. itemid = petActor->GetSummonItemID();
  1149. break;
  1150. }
  1151. }
  1152. }
  1153. return itemid;
  1154.  
  1155. }
  1156.  
  1157. bool CNewPetSystem::IsActivePet()
  1158. {
  1159. bool state = false;
  1160. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1161. {
  1162. CNewPetActor* petActor = iter->second;
  1163. if (petActor != 0)
  1164. {
  1165. if (petActor->IsSummoned()) {
  1166. state = true;
  1167. break;
  1168. }
  1169. }
  1170. }
  1171. return state;
  1172.  
  1173. }
  1174.  
  1175. int CNewPetSystem::GetLevelStep()
  1176. {
  1177. int step = 4;
  1178. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1179. {
  1180. CNewPetActor* petActor = iter->second;
  1181. if (petActor != 0)
  1182. {
  1183. if (petActor->IsSummoned()) {
  1184. step = petActor->GetLevelStep();
  1185. break;
  1186. }
  1187. }
  1188. }
  1189. return step;
  1190. }
  1191.  
  1192. void CNewPetSystem::SetExp(int iExp, int mode)
  1193. {
  1194. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1195. {
  1196. CNewPetActor* petActor = iter->second;
  1197. if (petActor != 0)
  1198. {
  1199. if (petActor->IsSummoned()) {
  1200. petActor->SetExp(iExp, mode);
  1201. break;
  1202. }
  1203. }
  1204. }
  1205. }
  1206.  
  1207. int CNewPetSystem::GetEvolution()
  1208. {
  1209. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1210. {
  1211. CNewPetActor* petActor = iter->second;
  1212. if (petActor != 0)
  1213. {
  1214. if (petActor->IsSummoned()) {
  1215. return petActor->GetEvolution();
  1216. }
  1217. }
  1218. }
  1219. return -1;
  1220. }
  1221.  
  1222. int CNewPetSystem::GetLevel()
  1223. {
  1224. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1225. {
  1226. CNewPetActor* petActor = iter->second;
  1227. if (petActor != 0)
  1228. {
  1229. if (petActor->IsSummoned()) {
  1230. return petActor->GetLevel();
  1231. }
  1232. }
  1233. }
  1234. return -1;
  1235. }
  1236.  
  1237. int CNewPetSystem::GetExp()
  1238. {
  1239. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1240. {
  1241. CNewPetActor* petActor = iter->second;
  1242. if (petActor != 0)
  1243. {
  1244. if (petActor->IsSummoned()) {
  1245. return petActor->GetExp();
  1246. }
  1247. }
  1248. }
  1249. return 0;
  1250. }
  1251.  
  1252. int CNewPetActor::GetSkillCount() {
  1253. int skillCount = 0;
  1254.  
  1255. for (int i = 0; i < 3; i++) {
  1256. if (m_dwskillslot[i] >= 0)
  1257. ++skillCount;
  1258. }
  1259. return skillCount;
  1260. }
  1261.  
  1262. int CNewPetSystem::GetPetType()
  1263. {
  1264. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1265. {
  1266. CNewPetActor* petActor = iter->second;
  1267. if (petActor != 0)
  1268. {
  1269. if (petActor->IsSummoned())
  1270. {
  1271. return petActor->GetPetType();
  1272. }
  1273. }
  1274. }
  1275. return -1;
  1276. }
  1277.  
  1278. void CNewPetSystem::SetItemCube(int pos, int invpos) {
  1279. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1280. {
  1281. CNewPetActor* petActor = iter->second;
  1282. if (petActor != 0)
  1283. {
  1284. if (petActor->IsSummoned()) {
  1285. return petActor->SetItemCube(pos, invpos);
  1286. }
  1287. }
  1288. }
  1289. }
  1290.  
  1291. void CNewPetSystem::ItemCubeFeed(int type) {
  1292. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1293. {
  1294. CNewPetActor* petActor = iter->second;
  1295. if (petActor != 0)
  1296. {
  1297. if (petActor->IsSummoned()) {
  1298. return petActor->ItemCubeFeed(type);
  1299. }
  1300. }
  1301. }
  1302. }
  1303.  
  1304. void CNewPetSystem::DoPetSkill(int skillslot) {
  1305. for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1306. {
  1307. CNewPetActor* petActor = iter->second;
  1308. if (petActor != 0)
  1309. {
  1310. if (petActor->IsSummoned()) {
  1311. return petActor->DoPetSkill(skillslot);
  1312. }
  1313. }
  1314. }
  1315. }
  1316.  
  1317. CNewPetActor* CNewPetSystem::Summon(DWORD mobVnum, LPITEM pSummonItem, const char* petName, bool bSpawnFar, DWORD options)
  1318. {
  1319. CNewPetActor* petActor = this->GetByVnum(mobVnum);
  1320.  
  1321. if (0 == petActor)
  1322. {
  1323. petActor = M2_NEW CNewPetActor(m_pkOwner, mobVnum, options);
  1324. m_petActorMap.insert(std::make_pair(mobVnum, petActor));
  1325. }
  1326.  
  1327. DWORD petVID = petActor->Summon(petName, pSummonItem, bSpawnFar);
  1328.  
  1329. if (NULL == m_pkNewPetSystemUpdateEvent)
  1330. {
  1331. newpetsystem_event_info* info = AllocEventInfo<newpetsystem_event_info>();
  1332.  
  1333. info->pPetSystem = this;
  1334.  
  1335. m_pkNewPetSystemUpdateEvent = event_create(newpetsystem_update_event, info, PASSES_PER_SEC(1) / 4); // 0.25초
  1336. }
  1337.  
  1338. if (NULL == m_pkNewPetSystemExpireEvent)
  1339. {
  1340. newpetsystem_event_infoe* infoe = AllocEventInfo<newpetsystem_event_infoe>();
  1341.  
  1342. infoe->pPetSystem = this;
  1343.  
  1344. m_pkNewPetSystemExpireEvent = event_create(newpetsystem_expire_event, infoe, PASSES_PER_SEC(1) ); // 1 volata per sec
  1345. }
  1346.  
  1347. return petActor;
  1348. }
  1349.  
  1350. CNewPetActor* CNewPetSystem::GetByVID(DWORD vid) const
  1351. {
  1352. CNewPetActor* petActor = 0;
  1353.  
  1354. bool bFound = false;
  1355.  
  1356. for (TNewPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1357. {
  1358. petActor = iter->second;
  1359.  
  1360. if (0 == petActor)
  1361. {
  1362. sys_err("[CPetSystem::GetByVID(%d)] Null Pointer (petActor)", vid);
  1363. continue;
  1364. }
  1365.  
  1366. bFound = petActor->GetVID() == vid;
  1367.  
  1368. if (true == bFound)
  1369. break;
  1370. }
  1371.  
  1372. return bFound ? petActor : 0;
  1373. }
  1374.  
  1375. CNewPetActor* CNewPetSystem::GetByVnum(DWORD vnum) const
  1376. {
  1377. CNewPetActor* petActor = 0;
  1378.  
  1379. TNewPetActorMap::const_iterator iter = m_petActorMap.find(vnum);
  1380.  
  1381. if (m_petActorMap.end() != iter)
  1382. petActor = iter->second;
  1383.  
  1384. return petActor;
  1385. }
  1386.  
  1387. size_t CNewPetSystem::CountSummoned() const
  1388. {
  1389. size_t count = 0;
  1390.  
  1391. for (TNewPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1392. {
  1393. CNewPetActor* petActor = iter->second;
  1394.  
  1395. if (0 != petActor)
  1396. {
  1397. if (petActor->IsSummoned())
  1398. ++count;
  1399. }
  1400. }
  1401.  
  1402. return count;
  1403. }
  1404.  
  1405. void CNewPetSystem::RefreshBuff()
  1406. {
  1407. for (TNewPetActorMap::const_iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
  1408. {
  1409. CNewPetActor* petActor = iter->second;
  1410.  
  1411. if (0 != petActor)
  1412. {
  1413. if (petActor->IsSummoned())
  1414. {
  1415. petActor->ClearBuff();
  1416. petActor->GiveBuff();
  1417. }
  1418. }
  1419. }
  1420. }
Advertisement
Add Comment
Please, Sign In to add comment