Advertisement
Guest User

Untitled

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