Advertisement
Guest User

Untitled

a guest
Sep 17th, 2015
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 219.94 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include <stack>
  4.  
  5. #include "utils.h"
  6. #include "config.h"
  7. #include "char.h"
  8. #include "char_manager.h"
  9. #include "item_manager.h"
  10. #include "desc.h"
  11. #include "desc_client.h"
  12. #include "desc_manager.h"
  13. #include "packet.h"
  14. #include "affect.h"
  15. #include "skill.h"
  16. #include "start_position.h"
  17. #include "mob_manager.h"
  18. #include "db.h"
  19. #include "log.h"
  20. #include "vector.h"
  21. #include "buffer_manager.h"
  22. #include "questmanager.h"
  23. #include "fishing.h"
  24. #include "party.h"
  25. #include "dungeon.h"
  26. #include "refine.h"
  27. #include "unique_item.h"
  28. #include "war_map.h"
  29. #include "xmas_event.h"
  30. #include "marriage.h"
  31. #include "monarch.h"
  32. #include "polymorph.h"
  33. #include "blend_item.h"
  34. #include "castle.h"
  35. #include "BattleArena.h"
  36. #include "arena.h"
  37. #include "dev_log.h"
  38. #include "pcbang.h"
  39. #include "threeway_war.h"
  40.  
  41. #include "safebox.h"
  42. #include "shop.h"
  43.  
  44. #include "../../common/VnumHelper.h"
  45. #include "DragonSoul.h"
  46. #include "buff_on_attributes.h"
  47. #include "belt_inventory_helper.h"
  48. #include "../../common/CommonDefines.h"
  49.  
  50. //auction_temp
  51. #ifdef __AUCTION__
  52. #include "auction_manager.h"
  53. #endif
  54. const int ITEM_BROKEN_METIN_VNUM = 28960;
  55. #define ENABLE_EFFECT_EXTRAPOT
  56. #define ENABLE_BOOKS_STACKFIX
  57.  
  58. // CHANGE_ITEM_ATTRIBUTES
  59. const DWORD CHARACTER::msc_dwDefaultChangeItemAttrCycle = 10;
  60. const char CHARACTER::msc_szLastChangeItemAttrFlag[] = "Item.LastChangeItemAttr";
  61. const char CHARACTER::msc_szChangeItemAttrCycleFlag[] = "change_itemattr_cycle";
  62. // END_OF_CHANGE_ITEM_ATTRIBUTES
  63. const BYTE g_aBuffOnAttrPoints[] = { POINT_ENERGY, POINT_COSTUME_ATTR_BONUS };
  64.  
  65. struct FFindStone
  66. {
  67. std::map<DWORD, LPCHARACTER> m_mapStone;
  68.  
  69. void operator()(LPENTITY pEnt)
  70. {
  71. if (pEnt->IsType(ENTITY_CHARACTER) == true)
  72. {
  73. LPCHARACTER pChar = (LPCHARACTER)pEnt;
  74.  
  75. if (pChar->IsStone() == true)
  76. {
  77. m_mapStone[(DWORD)pChar->GetVID()] = pChar;
  78. }
  79. }
  80. }
  81. };
  82.  
  83.  
  84. //±حب¯؛خ, ±حب¯±â¾ï؛خ, °لب¥¹فءِ
  85. static bool IS_SUMMON_ITEM(int vnum)
  86. {
  87. switch (vnum)
  88. {
  89. case 22000:
  90. case 22010:
  91. case 22011:
  92. case 22020:
  93. case ITEM_MARRIAGE_RING:
  94. return true;
  95. }
  96.  
  97. return false;
  98. }
  99.  
  100. static bool IS_MONKEY_DUNGEON(int map_index)
  101. {
  102. switch (map_index)
  103. {
  104. case 5:
  105. case 25:
  106. case 45:
  107. case 108:
  108. case 109:
  109. return true;;
  110. }
  111.  
  112. return false;
  113. }
  114.  
  115. bool IS_SUMMONABLE_ZONE(int map_index)
  116. {
  117. // ¸ùإ°´ّہü
  118. if (IS_MONKEY_DUNGEON(map_index))
  119. return false;
  120. // ¼؛
  121. if (IS_CASTLE_MAP(map_index))
  122. return false;
  123.  
  124. switch (map_index)
  125. {
  126. case 66 : // »ç±حإ¸؟ِ
  127. case 71 : // °إ¹ج ´ّہü 2أ‏
  128. case 72 : // أµہا µ؟±¼
  129. case 73 : // أµہا µ؟±¼ 2أ‏
  130. case 193 : // °إ¹ج ´ّہü 2-1أ‏
  131. #if 0
  132. case 184 : // أµہا µ؟±¼(½إ¼ِ)
  133. case 185 : // أµہا µ؟±¼ 2أ‏(½إ¼ِ)
  134. case 186 : // أµہا µ؟±¼(أµء¶)
  135. case 187 : // أµہا µ؟±¼ 2أ‏(أµء¶)
  136. case 188 : // أµہا µ؟±¼(ءّ³ë)
  137. case 189 : // أµہا µ؟±¼ 2أ‏(ءّ³ë)
  138. #endif
  139. // case 206 : // ¾ئ±حµ؟±¼
  140. case 216 : // ¾ئ±حµ؟±¼
  141. case 217 : // °إ¹ج ´ّہü 3أ‏
  142. case 208 : // أµہا µ؟±¼ (؟ë¹و)
  143.  
  144. case 113 : // OX Event ¸ت
  145. return false;
  146. }
  147.  
  148. if (CBattleArena::IsBattleArenaMap(map_index)) return false;
  149.  
  150. // ¸ًµç private ¸تہ¸·ذ ؟ِاء ؛ز°،´ة
  151. if (map_index > 10000) return false;
  152.  
  153. return true;
  154. }
  155.  
  156. bool IS_BOTARYABLE_ZONE(int nMapIndex)
  157. {
  158. if (!g_bEnableBootaryCheck) return true;
  159.  
  160. switch (nMapIndex)
  161. {
  162. case 1 :
  163. case 3 :
  164. case 21 :
  165. case 23 :
  166. case 41 :
  167. case 43 :
  168. return true;
  169. }
  170.  
  171. return false;
  172. }
  173.  
  174. // item socket ہج اء·خإنإ¸ہش°ْ °°ہ؛ءِ أ¼إ© -- by mhh
  175. static bool FN_check_item_socket(LPITEM item)
  176. {
  177. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  178. {
  179. if (item->GetSocket(i) != item->GetProto()->alSockets[i])
  180. return false;
  181. }
  182.  
  183. return true;
  184. }
  185.  
  186. // item socket ؛¹»ç -- by mhh
  187. static void FN_copy_item_socket(LPITEM dest, LPITEM src)
  188. {
  189. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  190. {
  191. dest->SetSocket(i, src->GetSocket(i));
  192. }
  193. }
  194. static bool FN_check_item_sex(LPCHARACTER ch, LPITEM item)
  195. {
  196. // ³²ہع ±فءِ
  197. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_MALE))
  198. {
  199. if (SEX_MALE==GET_SEX(ch))
  200. return false;
  201. }
  202. // ؟©ہع±فءِ
  203. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_FEMALE))
  204. {
  205. if (SEX_FEMALE==GET_SEX(ch))
  206. return false;
  207. }
  208.  
  209. return true;
  210. }
  211.  
  212.  
  213. /////////////////////////////////////////////////////////////////////////////
  214. // ITEM HANDLING
  215. /////////////////////////////////////////////////////////////////////////////
  216. bool CHARACTER::CanHandleItem(bool bSkipCheckRefine, bool bSkipObserver)
  217. {
  218. if (!bSkipObserver)
  219. if (m_bIsObserver)
  220. return false;
  221.  
  222. if (GetMyShop())
  223. return false;
  224.  
  225. if (!bSkipCheckRefine)
  226. if (m_bUnderRefine)
  227. return false;
  228.  
  229. if (IsCubeOpen() || NULL != DragonSoul_RefineWindow_GetOpener())
  230. return false;
  231.  
  232. if (IsWarping())
  233. return false;
  234.  
  235. return true;
  236. }
  237.  
  238. LPITEM CHARACTER::GetInventoryItem(WORD wCell) const
  239. {
  240. return GetItem(TItemPos(INVENTORY, wCell));
  241. }
  242. LPITEM CHARACTER::GetItem(TItemPos Cell) const
  243. {
  244. if (!IsValidItemPosition(Cell))
  245. return NULL;
  246. WORD wCell = Cell.cell;
  247. BYTE window_type = Cell.window_type;
  248. switch (window_type)
  249. {
  250. case INVENTORY:
  251. case EQUIPMENT:
  252. if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
  253. {
  254. sys_err("CHARACTER::GetInventoryItem: invalid item cell %d", wCell);
  255. return NULL;
  256. }
  257. return m_pointsInstant.pItems[wCell];
  258. case DRAGON_SOUL_INVENTORY:
  259. if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  260. {
  261. sys_err("CHARACTER::GetInventoryItem: invalid DS item cell %d", wCell);
  262. return NULL;
  263. }
  264. return m_pointsInstant.pDSItems[wCell];
  265.  
  266. default:
  267. return NULL;
  268. }
  269. return NULL;
  270. }
  271.  
  272. void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
  273. {
  274. WORD wCell = Cell.cell;
  275. BYTE window_type = Cell.window_type;
  276. if ((unsigned long)((CItem*)pItem) == 0xff || (unsigned long)((CItem*)pItem) == 0xffffffff)
  277. {
  278. sys_err("!!! FATAL ERROR !!! item == 0xff (char: %s cell: %u)", GetName(), wCell);
  279. core_dump();
  280. return;
  281. }
  282.  
  283. if (pItem && pItem->GetOwner())
  284. {
  285. assert(!"GetOwner exist");
  286. return;
  287. }
  288. // ±â؛» ہخ؛¥إن¸®
  289. switch(window_type)
  290. {
  291. case INVENTORY:
  292. case EQUIPMENT:
  293. {
  294. if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
  295. {
  296. sys_err("CHARACTER::SetItem: invalid item cell %d", wCell);
  297. return;
  298. }
  299.  
  300. LPITEM pOld = m_pointsInstant.pItems[wCell];
  301.  
  302. if (pOld)
  303. {
  304. if (wCell < INVENTORY_MAX_NUM)
  305. {
  306. for (int i = 0; i < pOld->GetSize(); ++i)
  307. {
  308. int p = wCell + (i * 5);
  309.  
  310. if (p >= INVENTORY_MAX_NUM)
  311. continue;
  312.  
  313. if (m_pointsInstant.pItems[p] && m_pointsInstant.pItems[p] != pOld)
  314. continue;
  315.  
  316. m_pointsInstant.bItemGrid[p] = 0;
  317. }
  318. }
  319. else
  320. m_pointsInstant.bItemGrid[wCell] = 0;
  321. }
  322.  
  323. if (pItem)
  324. {
  325. if (wCell < INVENTORY_MAX_NUM)
  326. {
  327. for (int i = 0; i < pItem->GetSize(); ++i)
  328. {
  329. int p = wCell + (i * 5);
  330.  
  331. if (p >= INVENTORY_MAX_NUM)
  332. continue;
  333.  
  334. // wCell + 1 ·خ اد´آ °حہ؛ ؛َ°÷ہ» أ¼إ©از ¶§ °°ہ؛
  335. // ¾ئہجإغہ؛ ؟¹؟ـأ³¸®اد±â ہ§اش
  336. m_pointsInstant.bItemGrid[p] = wCell + 1;
  337. }
  338. }
  339. else
  340. m_pointsInstant.bItemGrid[wCell] = wCell + 1;
  341. }
  342.  
  343. m_pointsInstant.pItems[wCell] = pItem;
  344. }
  345. break;
  346. // ؟ëب¥¼® ہخ؛¥إن¸®
  347. case DRAGON_SOUL_INVENTORY:
  348. {
  349. LPITEM pOld = m_pointsInstant.pDSItems[wCell];
  350.  
  351. if (pOld)
  352. {
  353. if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
  354. {
  355. for (int i = 0; i < pOld->GetSize(); ++i)
  356. {
  357. int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);
  358.  
  359. if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  360. continue;
  361.  
  362. if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld)
  363. continue;
  364.  
  365. m_pointsInstant.wDSItemGrid[p] = 0;
  366. }
  367. }
  368. else
  369. m_pointsInstant.wDSItemGrid[wCell] = 0;
  370. }
  371.  
  372. if (pItem)
  373. {
  374. if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  375. {
  376. sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell);
  377. return;
  378. }
  379.  
  380. if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
  381. {
  382. for (int i = 0; i < pItem->GetSize(); ++i)
  383. {
  384. int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);
  385.  
  386. if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  387. continue;
  388.  
  389. // wCell + 1 ·خ اد´آ °حہ؛ ؛َ°÷ہ» أ¼إ©از ¶§ °°ہ؛
  390. // ¾ئہجإغہ؛ ؟¹؟ـأ³¸®اد±â ہ§اش
  391. m_pointsInstant.wDSItemGrid[p] = wCell + 1;
  392. }
  393. }
  394. else
  395. m_pointsInstant.wDSItemGrid[wCell] = wCell + 1;
  396. }
  397.  
  398. m_pointsInstant.pDSItems[wCell] = pItem;
  399. }
  400. break;
  401. default:
  402. sys_err ("Invalid Inventory type %d", window_type);
  403. return;
  404. }
  405.  
  406. if (GetDesc())
  407. {
  408. // ب®ہه ¾ئہجإغ: ¼­¹ِ؟،¼­ ¾ئہجإغ اأ·،±× ء¤؛¸¸¦ ؛¸³½´ظ
  409. if (pItem)
  410. {
  411. TPacketGCItemSet pack;
  412. pack.header = HEADER_GC_ITEM_SET;
  413. pack.Cell = Cell;
  414.  
  415. pack.count = pItem->GetCount();
  416. pack.vnum = pItem->GetVnum();
  417. pack.flags = pItem->GetFlag();
  418. pack.anti_flags = pItem->GetAntiFlag();
  419. pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
  420.  
  421. thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
  422. thecore_memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));
  423.  
  424. GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));
  425. }
  426. else
  427. {
  428. TPacketGCItemDelDeprecated pack;
  429. pack.header = HEADER_GC_ITEM_DEL;
  430. pack.Cell = Cell;
  431. pack.count = 0;
  432. pack.vnum = 0;
  433. memset(pack.alSockets, 0, sizeof(pack.alSockets));
  434. memset(pack.aAttr, 0, sizeof(pack.aAttr));
  435.  
  436. GetDesc()->Packet(&pack, sizeof(TPacketGCItemDelDeprecated));
  437. }
  438. }
  439.  
  440. if (pItem)
  441. {
  442. pItem->SetCell(this, wCell);
  443. switch (window_type)
  444. {
  445. case INVENTORY:
  446. case EQUIPMENT:
  447. if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell))
  448. pItem->SetWindow(INVENTORY);
  449. else
  450. pItem->SetWindow(EQUIPMENT);
  451. break;
  452. case DRAGON_SOUL_INVENTORY:
  453. pItem->SetWindow(DRAGON_SOUL_INVENTORY);
  454. break;
  455. }
  456. }
  457. }
  458.  
  459. LPITEM CHARACTER::GetWear(BYTE bCell) const
  460. {
  461. // > WEAR_MAX_NUM : ؟ëب¥¼® ½½·شµé.
  462. if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
  463. {
  464. sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
  465. return NULL;
  466. }
  467.  
  468. return m_pointsInstant.pItems[INVENTORY_MAX_NUM + bCell];
  469. }
  470.  
  471. void CHARACTER::SetWear(BYTE bCell, LPITEM item)
  472. {
  473. // > WEAR_MAX_NUM : ؟ëب¥¼® ½½·شµé.
  474. if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
  475. {
  476. sys_err("CHARACTER::SetItem: invalid item cell %d", bCell);
  477. return;
  478. }
  479.  
  480. SetItem(TItemPos (INVENTORY, INVENTORY_MAX_NUM + bCell), item);
  481.  
  482. if (!item && bCell == WEAR_WEAPON)
  483. {
  484. // ±ح°ث »ç؟ë ½أ ¹‏´آ °حہج¶َ¸é ب؟°ْ¸¦ ¾ّ¾ض¾ك ار´ظ.
  485. if (IsAffectFlag(AFF_GWIGUM))
  486. RemoveAffect(SKILL_GWIGEOM);
  487.  
  488. if (IsAffectFlag(AFF_GEOMGYEONG))
  489. RemoveAffect(SKILL_GEOMKYUNG);
  490. }
  491. }
  492.  
  493. void CHARACTER::ClearItem()
  494. {
  495. int i;
  496. LPITEM item;
  497.  
  498. for (i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
  499. {
  500. if ((item = GetInventoryItem(i)))
  501. {
  502. item->SetSkipSave(true);
  503. ITEM_MANAGER::instance().FlushDelayedSave(item);
  504.  
  505. item->RemoveFromCharacter();
  506. M2_DESTROY_ITEM(item);
  507.  
  508. SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
  509. }
  510. }
  511. for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
  512. {
  513. if ((item = GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i))))
  514. {
  515. item->SetSkipSave(true);
  516. ITEM_MANAGER::instance().FlushDelayedSave(item);
  517.  
  518. item->RemoveFromCharacter();
  519. M2_DESTROY_ITEM(item);
  520. }
  521. }
  522. }
  523.  
  524. bool CHARACTER::IsEmptyItemGrid(TItemPos Cell, BYTE bSize, int iExceptionCell) const
  525. {
  526. switch (Cell.window_type)
  527. {
  528. case INVENTORY:
  529. {
  530. BYTE bCell = Cell.cell;
  531.  
  532. // bItemCellہ؛ 0ہج falseہسہ» ³ھإ¸³»±â ہ§اط + 1 اط¼­ أ³¸®ار´ظ.
  533. // µû¶َ¼­ iExceptionCell؟، 1ہ» ´ُاط ؛ٌ±³ار´ظ.
  534. ++iExceptionCell;
  535.  
  536. if (Cell.IsBeltInventoryPosition())
  537. {
  538. LPITEM beltItem = GetWear(WEAR_BELT);
  539.  
  540. if (NULL == beltItem)
  541. return false;
  542.  
  543. if (false == CBeltInventoryHelper::IsAvailableCell(bCell - BELT_INVENTORY_SLOT_START, beltItem->GetValue(0)))
  544. return false;
  545.  
  546. if (m_pointsInstant.bItemGrid[bCell])
  547. {
  548. if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
  549. return true;
  550.  
  551. return false;
  552. }
  553.  
  554. if (bSize == 1)
  555. return true;
  556.  
  557. }
  558. else if (bCell >= INVENTORY_MAX_NUM)
  559. return false;
  560.  
  561. if (m_pointsInstant.bItemGrid[bCell])
  562. {
  563. if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
  564. {
  565. if (bSize == 1)
  566. return true;
  567.  
  568. int j = 1;
  569. BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);
  570.  
  571. do
  572. {
  573. BYTE p = bCell + (5 * j);
  574.  
  575. if (p >= INVENTORY_MAX_NUM)
  576. return false;
  577.  
  578. if (p / (INVENTORY_MAX_NUM / 2) != bPage)
  579. return false;
  580.  
  581. if (m_pointsInstant.bItemGrid[p])
  582. if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
  583. return false;
  584. }
  585. while (++j < bSize);
  586.  
  587. return true;
  588. }
  589. else
  590. return false;
  591. }
  592.  
  593. // إ©±â°، 1ہج¸é ارؤ­ہ» آ÷ءِاد´آ °حہج¹ا·خ ±×³ة ¸®إد
  594. if (1 == bSize)
  595. return true;
  596. else
  597. {
  598. int j = 1;
  599. BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);
  600.  
  601. do
  602. {
  603. BYTE p = bCell + (5 * j);
  604.  
  605. if (p >= INVENTORY_MAX_NUM)
  606. return false;
  607.  
  608. if (p / (INVENTORY_MAX_NUM / 2) != bPage)
  609. return false;
  610.  
  611. if (m_pointsInstant.bItemGrid[p])
  612. if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
  613. return false;
  614. }
  615. while (++j < bSize);
  616.  
  617. return true;
  618. }
  619. }
  620. break;
  621. case DRAGON_SOUL_INVENTORY:
  622. {
  623. WORD wCell = Cell.cell;
  624. if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  625. return false;
  626.  
  627. // bItemCellہ؛ 0ہج falseہسہ» ³ھإ¸³»±â ہ§اط + 1 اط¼­ أ³¸®ار´ظ.
  628. // µû¶َ¼­ iExceptionCell؟، 1ہ» ´ُاط ؛ٌ±³ار´ظ.
  629. iExceptionCell++;
  630.  
  631. if (m_pointsInstant.wDSItemGrid[wCell])
  632. {
  633. if (m_pointsInstant.wDSItemGrid[wCell] == iExceptionCell)
  634. {
  635. if (bSize == 1)
  636. return true;
  637.  
  638. int j = 1;
  639.  
  640. do
  641. {
  642. int p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);
  643.  
  644. if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  645. return false;
  646.  
  647. if (m_pointsInstant.wDSItemGrid[p])
  648. if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
  649. return false;
  650. }
  651. while (++j < bSize);
  652.  
  653. return true;
  654. }
  655. else
  656. return false;
  657. }
  658.  
  659. // إ©±â°، 1ہج¸é ارؤ­ہ» آ÷ءِاد´آ °حہج¹ا·خ ±×³ة ¸®إد
  660. if (1 == bSize)
  661. return true;
  662. else
  663. {
  664. int j = 1;
  665.  
  666. do
  667. {
  668. int p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);
  669.  
  670. if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  671. return false;
  672.  
  673. if (m_pointsInstant.bItemGrid[p])
  674. if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
  675. return false;
  676. }
  677. while (++j < bSize);
  678.  
  679. return true;
  680. }
  681. }
  682. }
  683. return false;
  684. }
  685.  
  686. int CHARACTER::GetEmptyInventory(BYTE size) const
  687. {
  688. // NOTE: اِہç ہج اش¼ِ´آ ¾ئہجإغ ءِ±ق, ب¹µو µîہا اàہ§¸¦ از ¶§ ہخ؛¥إن¸®ہا ؛َ ؤ­ہ» أ£±â ہ§اط »ç؟ëµا°ي ہض´آµ¥,
  689. // ؛§ئ® ہخ؛¥إن¸®´آ ئ¯¼ِ ہخ؛¥إن¸®ہج¹ا·خ °ث»çادءِ ¾تµµ·د ار´ظ. (±â؛» ہخ؛¥إن¸®: INVENTORY_MAX_NUM ±îءِ¸¸ °ث»ç)
  690. for ( int i = 0; i < INVENTORY_MAX_NUM; ++i)
  691. if (IsEmptyItemGrid(TItemPos (INVENTORY, i), size))
  692. return i;
  693. return -1;
  694. }
  695.  
  696. int CHARACTER::GetEmptyDragonSoulInventory(LPITEM pItem) const
  697. {
  698. if (NULL == pItem || !pItem->IsDragonSoul())
  699. return -1;
  700. if (!DragonSoul_IsQualified())
  701. {
  702. return -1;
  703. }
  704. BYTE bSize = pItem->GetSize();
  705. WORD wBaseCell = DSManager::instance().GetBasePosition(pItem);
  706.  
  707. if (WORD_MAX == wBaseCell)
  708. return -1;
  709.  
  710. for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; ++i)
  711. if (IsEmptyItemGrid(TItemPos(DRAGON_SOUL_INVENTORY, i + wBaseCell), bSize))
  712. return i + wBaseCell;
  713.  
  714. return -1;
  715. }
  716.  
  717. void CHARACTER::CopyDragonSoulItemGrid(std::vector<WORD>& vDragonSoulItemGrid) const
  718. {
  719. vDragonSoulItemGrid.resize(DRAGON_SOUL_INVENTORY_MAX_NUM);
  720.  
  721. std::copy(m_pointsInstant.wDSItemGrid, m_pointsInstant.wDSItemGrid + DRAGON_SOUL_INVENTORY_MAX_NUM, vDragonSoulItemGrid.begin());
  722. }
  723.  
  724. int CHARACTER::CountEmptyInventory() const
  725. {
  726. int count = 0;
  727.  
  728. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  729. if (GetInventoryItem(i))
  730. count += GetInventoryItem(i)->GetSize();
  731.  
  732. return (INVENTORY_MAX_NUM - count);
  733. }
  734.  
  735. void TransformRefineItem(LPITEM pkOldItem, LPITEM pkNewItem)
  736. {
  737. // ACCESSORY_REFINE
  738. if (pkOldItem->IsAccessoryForSocket())
  739. {
  740. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  741. {
  742. pkNewItem->SetSocket(i, pkOldItem->GetSocket(i));
  743. }
  744. //pkNewItem->StartAccessorySocketExpireEvent();
  745. }
  746. // END_OF_ACCESSORY_REFINE
  747. else
  748. {
  749. // ؟©±â¼­ ±ْءّ¼®ہج ہعµ؟ہûہ¸·خ أ»¼ز µت
  750. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  751. {
  752. if (!pkOldItem->GetSocket(i))
  753. break;
  754. else
  755. pkNewItem->SetSocket(i, 1);
  756. }
  757.  
  758. // ¼زؤد ¼³ء¤
  759. int slot = 0;
  760.  
  761. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  762. {
  763. long socket = pkOldItem->GetSocket(i);
  764.  
  765. if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM)
  766. pkNewItem->SetSocket(slot++, socket);
  767. }
  768.  
  769. }
  770.  
  771. // ¸إء÷ ¾ئہجإغ ¼³ء¤
  772. pkOldItem->CopyAttributeTo(pkNewItem);
  773. }
  774.  
  775. void NotifyRefineSuccess(LPCHARACTER ch, LPITEM item, const char* way)
  776. {
  777. if (NULL != ch && item != NULL)
  778. {
  779. ch->ChatPacket(CHAT_TYPE_COMMAND, "RefineSuceeded");
  780.  
  781. LogManager::instance().RefineLog(ch->GetPlayerID(), item->GetName(), item->GetID(), item->GetRefineLevel(), 1, way);
  782. }
  783. }
  784.  
  785. void NotifyRefineFail(LPCHARACTER ch, LPITEM item, const char* way, int success = 0)
  786. {
  787. if (NULL != ch && NULL != item)
  788. {
  789. ch->ChatPacket(CHAT_TYPE_COMMAND, "RefineFailed");
  790.  
  791. LogManager::instance().RefineLog(ch->GetPlayerID(), item->GetName(), item->GetID(), item->GetRefineLevel(), success, way);
  792. }
  793. }
  794.  
  795. void CHARACTER::SetRefineNPC(LPCHARACTER ch)
  796. {
  797. if ( ch != NULL )
  798. {
  799. m_dwRefineNPCVID = ch->GetVID();
  800. }
  801. else
  802. {
  803. m_dwRefineNPCVID = 0;
  804. }
  805. }
  806.  
  807. bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly)
  808. {
  809. if (!CanHandleItem(true))
  810. {
  811. ClearRefineMode();
  812. return false;
  813. }
  814.  
  815. //°³·® ½أ°£ء¦ار : upgrade_refine_scroll.quest ؟،¼­ °³·®بؤ 5؛ذہج³»؟، ہد¹ف °³·®ہ»
  816. //ءّاàاز¼ِ ¾ّہ½
  817. if (quest::CQuestManager::instance().GetEventFlag("update_refine_time") != 0)
  818. {
  819. if (get_global_time() < quest::CQuestManager::instance().GetEventFlag("update_refine_time") + (60 * 5))
  820. {
  821. sys_log(0, "can't refine %d %s", GetPlayerID(), GetName());
  822. return false;
  823. }
  824. }
  825.  
  826. const TRefineTable * prt = CRefineManager::instance().GetRefineRecipe(item->GetRefineSet());
  827.  
  828. if (!prt)
  829. return false;
  830.  
  831. DWORD result_vnum = item->GetRefinedVnum();
  832.  
  833. // REFINE_COST
  834. int cost = ComputeRefineFee(prt->cost);
  835.  
  836. int RefineChance = GetQuestFlag("main_quest_lv7.refine_chance");
  837.  
  838. if (RefineChance > 0)
  839. {
  840. if (!item->CheckItemUseLevel(20) || item->GetType() != ITEM_WEAPON)
  841. {
  842. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹«·ل °³·® ±âب¸´آ 20 ہجادہا ¹«±â¸¸ °،´ةاص´د´ظ"));
  843. return false;
  844. }
  845.  
  846. cost = 0;
  847. SetQuestFlag("main_quest_lv7.refine_chance", RefineChance - 1);
  848. }
  849. // END_OF_REFINE_COST
  850.  
  851. if (result_vnum == 0)
  852. {
  853. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  854. return false;
  855. }
  856.  
  857. if (item->GetType() == ITEM_USE && item->GetSubType() == USE_TUNING)
  858. return false;
  859.  
  860. TItemTable * pProto = ITEM_MANAGER::instance().GetTable(item->GetRefinedVnum());
  861.  
  862. if (!pProto)
  863. {
  864. sys_err("DoRefine NOT GET ITEM PROTO %d", item->GetRefinedVnum());
  865. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  866. return false;
  867. }
  868.  
  869. // REFINE_COST
  870. if (GetGold() < cost)
  871. {
  872. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®ہ» اد±â ہ§ار µ·ہج ؛خء·اص´د´ظ."));
  873. return false;
  874. }
  875.  
  876. if (!bMoneyOnly && !RefineChance)
  877. {
  878. for (int i = 0; i < prt->material_count; ++i)
  879. {
  880. if (CountSpecifyItem(prt->materials[i].vnum) < prt->materials[i].count)
  881. {
  882. if (test_server)
  883. {
  884. ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count);
  885. }
  886. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®ہ» اد±â ہ§ار ہç·ل°، ؛خء·اص´د´ظ."));
  887. return false;
  888. }
  889. }
  890.  
  891. for (int i = 0; i < prt->material_count; ++i)
  892. RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count);
  893. }
  894.  
  895. int prob = number(1, 100);
  896.  
  897. if (IsRefineThroughGuild() || bMoneyOnly)
  898. prob -= 10;
  899.  
  900. // END_OF_REFINE_COST
  901.  
  902. if (prob <= prt->prob)
  903. {
  904. // ¼؛°ّ! ¸ًµç ¾ئہجإغہج »ç¶َءِ°ي, °°ہ؛ ¼س¼؛ہا ´ظ¸¥ ¾ئہجإغ ب¹µو
  905. LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
  906.  
  907. if (pkNewItem)
  908. {
  909. ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
  910. LogManager::instance().ItemLog(this, pkNewItem, "REFINE SUCCESS", pkNewItem->GetName());
  911.  
  912. BYTE bCell = item->GetCell();
  913.  
  914. // DETAIL_REFINE_LOG
  915. NotifyRefineSuccess(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
  916. DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -cost);
  917. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
  918. // END_OF_DETAIL_REFINE_LOG
  919.  
  920. pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
  921. ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
  922.  
  923. sys_log(0, "Refine Success %d", cost);
  924. pkNewItem->AttrLog();
  925. //PointChange(POINT_GOLD, -cost);
  926. sys_log(0, "PayPee %d", cost);
  927. PayRefineFee(cost);
  928. sys_log(0, "PayPee End %d", cost);
  929. }
  930. else
  931. {
  932. // DETAIL_REFINE_LOG
  933. // ¾ئہجإغ »‎¼؛؟، ½ائذ -> °³·® ½ائذ·خ °£ءض
  934. sys_err("cannot create item %u", result_vnum);
  935. NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
  936. // END_OF_DETAIL_REFINE_LOG
  937. }
  938. }
  939. else
  940. {
  941. // ½ائذ! ¸ًµç ¾ئہجإغہج »ç¶َءü.
  942. DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -cost);
  943. NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
  944. item->AttrLog();
  945. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
  946.  
  947. //PointChange(POINT_GOLD, -cost);
  948. PayRefineFee(cost);
  949. }
  950.  
  951. return true;
  952. }
  953.  
  954. enum enum_RefineScrolls
  955. {
  956. CHUKBOK_SCROLL = 0,
  957. HYUNIRON_CHN = 1, // ءك±¹؟،¼­¸¸ »ç؟ë
  958. YONGSIN_SCROLL = 2,
  959. MUSIN_SCROLL = 3,
  960. YAGONG_SCROLL = 4,
  961. MEMO_SCROLL = 5,
  962. BDRAGON_SCROLL = 6,
  963. };
  964.  
  965. bool CHARACTER::DoRefineWithScroll(LPITEM item)
  966. {
  967. if (!CanHandleItem(true))
  968. {
  969. ClearRefineMode();
  970. return false;
  971. }
  972.  
  973. ClearRefineMode();
  974.  
  975. //°³·® ½أ°£ء¦ار : upgrade_refine_scroll.quest ؟،¼­ °³·®بؤ 5؛ذہج³»؟، ہد¹ف °³·®ہ»
  976. //ءّاàاز¼ِ ¾ّہ½
  977. if (quest::CQuestManager::instance().GetEventFlag("update_refine_time") != 0)
  978. {
  979. if (get_global_time() < quest::CQuestManager::instance().GetEventFlag("update_refine_time") + (60 * 5))
  980. {
  981. sys_log(0, "can't refine %d %s", GetPlayerID(), GetName());
  982. return false;
  983. }
  984. }
  985.  
  986. const TRefineTable * prt = CRefineManager::instance().GetRefineRecipe(item->GetRefineSet());
  987.  
  988. if (!prt)
  989. return false;
  990.  
  991. LPITEM pkItemScroll;
  992.  
  993. // °³·®¼­ أ¼إ©
  994. if (m_iRefineAdditionalCell < 0)
  995. return false;
  996.  
  997. pkItemScroll = GetInventoryItem(m_iRefineAdditionalCell);
  998.  
  999. if (!pkItemScroll)
  1000. return false;
  1001.  
  1002. if (!(pkItemScroll->GetType() == ITEM_USE && pkItemScroll->GetSubType() == USE_TUNING))
  1003. return false;
  1004.  
  1005. if (pkItemScroll->GetVnum() == item->GetVnum())
  1006. return false;
  1007.  
  1008. DWORD result_vnum = item->GetRefinedVnum();
  1009. DWORD result_fail_vnum = item->GetRefineFromVnum();
  1010.  
  1011. if (result_vnum == 0)
  1012. {
  1013. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1014. return false;
  1015. }
  1016.  
  1017. // MUSIN_SCROLL
  1018. if (pkItemScroll->GetValue(0) == MUSIN_SCROLL)
  1019. {
  1020. if (item->GetRefineLevel() >= 4)
  1021. {
  1022. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج °³·®¼­·خ ´ُ ہج»َ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1023. return false;
  1024. }
  1025. }
  1026. // END_OF_MUSIC_SCROLL
  1027.  
  1028. else if (pkItemScroll->GetValue(0) == MEMO_SCROLL)
  1029. {
  1030. if (item->GetRefineLevel() != pkItemScroll->GetValue(1))
  1031. {
  1032. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج °³·®¼­·خ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1033. return false;
  1034. }
  1035. }
  1036. else if (pkItemScroll->GetValue(0) == BDRAGON_SCROLL)
  1037. {
  1038. if (item->GetType() != ITEM_METIN || item->GetRefineLevel() != 4)
  1039. {
  1040. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ¸·خ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1041. return false;
  1042. }
  1043. }
  1044.  
  1045. TItemTable * pProto = ITEM_MANAGER::instance().GetTable(item->GetRefinedVnum());
  1046.  
  1047. if (!pProto)
  1048. {
  1049. sys_err("DoRefineWithScroll NOT GET ITEM PROTO %d", item->GetRefinedVnum());
  1050. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1051. return false;
  1052. }
  1053.  
  1054. if (GetGold() < prt->cost)
  1055. {
  1056. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®ہ» اد±â ہ§ار µ·ہج ؛خء·اص´د´ظ."));
  1057. return false;
  1058. }
  1059.  
  1060. for (int i = 0; i < prt->material_count; ++i)
  1061. {
  1062. if (CountSpecifyItem(prt->materials[i].vnum) < prt->materials[i].count)
  1063. {
  1064. if (test_server)
  1065. {
  1066. ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count);
  1067. }
  1068. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®ہ» اد±â ہ§ار ہç·ل°، ؛خء·اص´د´ظ."));
  1069. return false;
  1070. }
  1071. }
  1072.  
  1073. for (int i = 0; i < prt->material_count; ++i)
  1074. RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count);
  1075.  
  1076. int prob = number(1, 100);
  1077. int success_prob = prt->prob;
  1078. bool bDestroyWhenFail = false;
  1079.  
  1080. const char* szRefineType = "SCROLL";
  1081.  
  1082. if (pkItemScroll->GetValue(0) == HYUNIRON_CHN ||
  1083. pkItemScroll->GetValue(0) == YONGSIN_SCROLL ||
  1084. pkItemScroll->GetValue(0) == YAGONG_SCROLL) // اِأ¶, ؟ë½إہا أà؛¹¼­, ¾ك°ّہا ؛ٌہü¼­ أ³¸®
  1085. {
  1086. const char hyuniron_prob[9] = { 100, 75, 65, 55, 45, 40, 35, 25, 20 };
  1087. const char yagong_prob[9] = { 100, 100, 90, 80, 70, 60, 50, 30, 20 };
  1088.  
  1089. if (pkItemScroll->GetValue(0) == YONGSIN_SCROLL)
  1090. {
  1091. success_prob = hyuniron_prob[MINMAX(0, item->GetRefineLevel(), 8)];
  1092. }
  1093. else if (pkItemScroll->GetValue(0) == YAGONG_SCROLL)
  1094. {
  1095. success_prob = yagong_prob[MINMAX(0, item->GetRefineLevel(), 8)];
  1096. }
  1097. else if (pkItemScroll->GetValue(0) == HYUNIRON_CHN) {} // @fixme121
  1098. else
  1099. {
  1100. sys_err("REFINE : Unknown refine scroll item. Value0: %d", pkItemScroll->GetValue(0));
  1101. }
  1102.  
  1103. if (test_server)
  1104. {
  1105. ChatPacket(CHAT_TYPE_INFO, "[Only Test] Success_Prob %d, RefineLevel %d ", success_prob, item->GetRefineLevel());
  1106. }
  1107. if (pkItemScroll->GetValue(0) == HYUNIRON_CHN) // اِأ¶ہ؛ ¾ئہجإغہج ؛خ¼­ء®¾ك ار´ظ.
  1108. bDestroyWhenFail = true;
  1109.  
  1110. // DETAIL_REFINE_LOG
  1111. if (pkItemScroll->GetValue(0) == HYUNIRON_CHN)
  1112. {
  1113. szRefineType = "HYUNIRON";
  1114. }
  1115. else if (pkItemScroll->GetValue(0) == YONGSIN_SCROLL)
  1116. {
  1117. szRefineType = "GOD_SCROLL";
  1118. }
  1119. else if (pkItemScroll->GetValue(0) == YAGONG_SCROLL)
  1120. {
  1121. szRefineType = "YAGONG_SCROLL";
  1122. }
  1123. // END_OF_DETAIL_REFINE_LOG
  1124. }
  1125.  
  1126. // DETAIL_REFINE_LOG
  1127. if (pkItemScroll->GetValue(0) == MUSIN_SCROLL) // ¹«½إہا أà؛¹¼­´آ 100% ¼؛°ّ (+4±îءِ¸¸)
  1128. {
  1129. success_prob = 100;
  1130.  
  1131. szRefineType = "MUSIN_SCROLL";
  1132. }
  1133. // END_OF_DETAIL_REFINE_LOG
  1134. else if (pkItemScroll->GetValue(0) == MEMO_SCROLL)
  1135. {
  1136. success_prob = 100;
  1137. szRefineType = "MEMO_SCROLL";
  1138. }
  1139. else if (pkItemScroll->GetValue(0) == BDRAGON_SCROLL)
  1140. {
  1141. success_prob = 80;
  1142. szRefineType = "BDRAGON_SCROLL";
  1143. }
  1144.  
  1145. pkItemScroll->SetCount(pkItemScroll->GetCount() - 1);
  1146.  
  1147. if (prob <= success_prob)
  1148. {
  1149. // ¼؛°ّ! ¸ًµç ¾ئہجإغہج »ç¶َءِ°ي, °°ہ؛ ¼س¼؛ہا ´ظ¸¥ ¾ئہجإغ ب¹µو
  1150. LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
  1151.  
  1152. if (pkNewItem)
  1153. {
  1154. ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
  1155. LogManager::instance().ItemLog(this, pkNewItem, "REFINE SUCCESS", pkNewItem->GetName());
  1156.  
  1157. BYTE bCell = item->GetCell();
  1158.  
  1159. NotifyRefineSuccess(this, item, szRefineType);
  1160. DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -prt->cost);
  1161. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
  1162.  
  1163. pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
  1164. ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
  1165. pkNewItem->AttrLog();
  1166. //PointChange(POINT_GOLD, -prt->cost);
  1167. PayRefineFee(prt->cost);
  1168. }
  1169. else
  1170. {
  1171. // ¾ئہجإغ »‎¼؛؟، ½ائذ -> °³·® ½ائذ·خ °£ءض
  1172. sys_err("cannot create item %u", result_vnum);
  1173. NotifyRefineFail(this, item, szRefineType);
  1174. }
  1175. }
  1176. else if (!bDestroyWhenFail && result_fail_vnum)
  1177. {
  1178. // ½ائذ! ¸ًµç ¾ئہجإغہج »ç¶َءِ°ي, °°ہ؛ ¼س¼؛ہا ³·ہ؛ µî±قہا ¾ئہجإغ ب¹µو
  1179. LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_fail_vnum, 1, 0, false);
  1180.  
  1181. if (pkNewItem)
  1182. {
  1183. ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
  1184. LogManager::instance().ItemLog(this, pkNewItem, "REFINE FAIL", pkNewItem->GetName());
  1185.  
  1186. BYTE bCell = item->GetCell();
  1187.  
  1188. DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -prt->cost);
  1189. NotifyRefineFail(this, item, szRefineType, -1);
  1190. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
  1191.  
  1192. pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
  1193. ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
  1194.  
  1195. pkNewItem->AttrLog();
  1196.  
  1197. //PointChange(POINT_GOLD, -prt->cost);
  1198. PayRefineFee(prt->cost);
  1199. }
  1200. else
  1201. {
  1202. // ¾ئہجإغ »‎¼؛؟، ½ائذ -> °³·® ½ائذ·خ °£ءض
  1203. sys_err("cannot create item %u", result_fail_vnum);
  1204. NotifyRefineFail(this, item, szRefineType);
  1205. }
  1206. }
  1207. else
  1208. {
  1209. NotifyRefineFail(this, item, szRefineType); // °³·®½أ ¾ئہجإغ »ç¶َءِءِ ¾تہ½
  1210.  
  1211. PayRefineFee(prt->cost);
  1212. }
  1213.  
  1214. return true;
  1215. }
  1216.  
  1217. bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell)
  1218. {
  1219. if (bCell > INVENTORY_MAX_NUM)
  1220. return false;
  1221.  
  1222. LPITEM item = GetInventoryItem(bCell);
  1223.  
  1224. if (!item)
  1225. return false;
  1226.  
  1227. // REFINE_COST
  1228. if (bType == REFINE_TYPE_MONEY_ONLY && !GetQuestFlag("deviltower_zone.can_refine"))
  1229. {
  1230. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç±ح إ¸؟ِ ؟د·ل ؛¸»َہ؛ ار¹ّ±îءِ »ç؟ë°،´ةاص´د´ظ."));
  1231. return false;
  1232. }
  1233. // END_OF_REFINE_COST
  1234.  
  1235. TPacketGCRefineInformation p;
  1236.  
  1237. p.header = HEADER_GC_REFINE_INFORMATION;
  1238. p.pos = bCell;
  1239. p.src_vnum = item->GetVnum();
  1240. p.result_vnum = item->GetRefinedVnum();
  1241. p.type = bType;
  1242.  
  1243. if (p.result_vnum == 0)
  1244. {
  1245. sys_err("RefineInformation p.result_vnum == 0");
  1246. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1247. return false;
  1248. }
  1249.  
  1250. if (item->GetType() == ITEM_USE && item->GetSubType() == USE_TUNING)
  1251. {
  1252. if (bType == 0)
  1253. {
  1254. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ ہج ¹و½ؤہ¸·خ´آ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1255. return false;
  1256. }
  1257. else
  1258. {
  1259. LPITEM itemScroll = GetInventoryItem(iAdditionalCell);
  1260. if (!itemScroll || item->GetVnum() == itemScroll->GetVnum())
  1261. {
  1262. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°°ہ؛ °³·®¼­¸¦ اصؤ¥ ¼ِ´آ ¾ّ½ہ´د´ظ."));
  1263. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أà؛¹ہا ¼­؟ح اِأ¶ہ» اصؤ¥ ¼ِ ہض½ہ´د´ظ."));
  1264. return false;
  1265. }
  1266. }
  1267. }
  1268.  
  1269. CRefineManager & rm = CRefineManager::instance();
  1270.  
  1271. const TRefineTable* prt = rm.GetRefineRecipe(item->GetRefineSet());
  1272.  
  1273. if (!prt)
  1274. {
  1275. sys_err("RefineInformation NOT GET REFINE SET %d", item->GetRefineSet());
  1276. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  1277. return false;
  1278. }
  1279.  
  1280. // REFINE_COST
  1281.  
  1282. //MAIN_QUEST_LV7
  1283. if (GetQuestFlag("main_quest_lv7.refine_chance") > 0)
  1284. {
  1285. // ہد؛»ہ؛ ء¦؟ـ
  1286. if (!item->CheckItemUseLevel(20) || item->GetType() != ITEM_WEAPON)
  1287. {
  1288. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹«·ل °³·® ±âب¸´آ 20 ہجادہا ¹«±â¸¸ °،´ةاص´د´ظ"));
  1289. return false;
  1290. }
  1291. p.cost = 0;
  1292. }
  1293. else
  1294. p.cost = ComputeRefineFee(prt->cost);
  1295.  
  1296. //END_MAIN_QUEST_LV7
  1297. p.prob = prt->prob;
  1298. if (bType == REFINE_TYPE_MONEY_ONLY)
  1299. {
  1300. p.material_count = 0;
  1301. memset(p.materials, 0, sizeof(p.materials));
  1302. }
  1303. else
  1304. {
  1305. p.material_count = prt->material_count;
  1306. thecore_memcpy(&p.materials, prt->materials, sizeof(prt->materials));
  1307. }
  1308. // END_OF_REFINE_COST
  1309.  
  1310. GetDesc()->Packet(&p, sizeof(TPacketGCRefineInformation));
  1311.  
  1312. SetRefineMode(iAdditionalCell);
  1313. return true;
  1314. }
  1315.  
  1316. bool CHARACTER::RefineItem(LPITEM pkItem, LPITEM pkTarget)
  1317. {
  1318. if (!CanHandleItem())
  1319. return false;
  1320.  
  1321. if (pkItem->GetSubType() == USE_TUNING)
  1322. {
  1323. // XXX ¼؛´ة, ¼زؤد °³·®¼­´آ »ç¶َء³½ہ´د´ظ...
  1324. // XXX ¼؛´ة°³·®¼­´آ أà؛¹ہا ¼­°، µا¾ْ´ظ!
  1325. // MUSIN_SCROLL
  1326. if (pkItem->GetValue(0) == MUSIN_SCROLL)
  1327. RefineInformation(pkTarget->GetCell(), REFINE_TYPE_MUSIN, pkItem->GetCell());
  1328. // END_OF_MUSIN_SCROLL
  1329. else if (pkItem->GetValue(0) == HYUNIRON_CHN)
  1330. RefineInformation(pkTarget->GetCell(), REFINE_TYPE_HYUNIRON, pkItem->GetCell());
  1331. else if (pkItem->GetValue(0) == BDRAGON_SCROLL)
  1332. {
  1333. if (pkTarget->GetRefineSet() != 702) return false;
  1334. RefineInformation(pkTarget->GetCell(), REFINE_TYPE_BDRAGON, pkItem->GetCell());
  1335. }
  1336. else
  1337. {
  1338. if (pkTarget->GetRefineSet() == 501) return false;
  1339. RefineInformation(pkTarget->GetCell(), REFINE_TYPE_SCROLL, pkItem->GetCell());
  1340. }
  1341. }
  1342. else if (pkItem->GetSubType() == USE_DETACHMENT && IS_SET(pkTarget->GetFlag(), ITEM_FLAG_REFINEABLE))
  1343. {
  1344. LogManager::instance().ItemLog(this, pkTarget, "USE_DETACHMENT", pkTarget->GetName());
  1345.  
  1346. bool bHasMetinStone = false;
  1347.  
  1348. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
  1349. {
  1350. long socket = pkTarget->GetSocket(i);
  1351. if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM)
  1352. {
  1353. bHasMetinStone = true;
  1354. break;
  1355. }
  1356. }
  1357.  
  1358. if (bHasMetinStone)
  1359. {
  1360. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  1361. {
  1362. long socket = pkTarget->GetSocket(i);
  1363. if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM)
  1364. {
  1365. AutoGiveItem(socket);
  1366. //TItemTable* pTable = ITEM_MANAGER::instance().GetTable(pkTarget->GetSocket(i));
  1367. //pkTarget->SetSocket(i, pTable->alValues[2]);
  1368. // ±ْءّµ¹·خ ´ëأ¼اطءط´ظ
  1369. pkTarget->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
  1370. }
  1371. }
  1372. pkItem->SetCount(pkItem->GetCount() - 1);
  1373. return true;
  1374. }
  1375. else
  1376. {
  1377. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»©³¾ ¼ِ ہض´آ ¸قئ¾¼®ہج ¾ّ½ہ´د´ظ."));
  1378. return false;
  1379. }
  1380. }
  1381.  
  1382. return false;
  1383. }
  1384.  
  1385. EVENTFUNC(kill_campfire_event)
  1386. {
  1387. char_event_info* info = dynamic_cast<char_event_info*>( event->info );
  1388.  
  1389. if ( info == NULL )
  1390. {
  1391. sys_err( "kill_campfire_event> <Factor> Null pointer" );
  1392. return 0;
  1393. }
  1394.  
  1395. LPCHARACTER ch = info->ch;
  1396.  
  1397. if (ch == NULL) { // <Factor>
  1398. return 0;
  1399. }
  1400. ch->m_pkMiningEvent = NULL;
  1401. M2_DESTROY_CHARACTER(ch);
  1402. return 0;
  1403. }
  1404.  
  1405. bool CHARACTER::GiveRecallItem(LPITEM item)
  1406. {
  1407. int idx = GetMapIndex();
  1408. int iEmpireByMapIndex = -1;
  1409.  
  1410. if (idx < 20)
  1411. iEmpireByMapIndex = 1;
  1412. else if (idx < 40)
  1413. iEmpireByMapIndex = 2;
  1414. else if (idx < 60)
  1415. iEmpireByMapIndex = 3;
  1416. else if (idx < 10000)
  1417. iEmpireByMapIndex = 0;
  1418.  
  1419. switch (idx)
  1420. {
  1421. case 66:
  1422. case 216:
  1423. iEmpireByMapIndex = -1;
  1424. break;
  1425. }
  1426.  
  1427. if (iEmpireByMapIndex && GetEmpire() != iEmpireByMapIndex)
  1428. {
  1429. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±â¾ïاط µر ¼ِ ¾ّ´آ ہ§ؤ، ہش´د´ظ."));
  1430. return false;
  1431. }
  1432.  
  1433. int pos;
  1434.  
  1435. if (item->GetCount() == 1) // ¾ئہجإغہج اد³ھ¶َ¸é ±×³ة ¼آئأ.
  1436. {
  1437. item->SetSocket(0, GetX());
  1438. item->SetSocket(1, GetY());
  1439. }
  1440. else if ((pos = GetEmptyInventory(item->GetSize())) != -1) // ±×·¸ءِ ¾ت´ظ¸é ´ظ¸¥ ہخ؛¥إن¸® ½½·شہ» أ£´آ´ظ.
  1441. {
  1442. LPITEM item2 = ITEM_MANAGER::instance().CreateItem(item->GetVnum(), 1);
  1443.  
  1444. if (NULL != item2)
  1445. {
  1446. item2->SetSocket(0, GetX());
  1447. item2->SetSocket(1, GetY());
  1448. item2->AddToCharacter(this, TItemPos(INVENTORY, pos));
  1449.  
  1450. item->SetCount(item->GetCount() - 1);
  1451. }
  1452. }
  1453. else
  1454. {
  1455. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِا°؟، ؛َ °ّ°£ہج ¾ّ½ہ´د´ظ."));
  1456. return false;
  1457. }
  1458.  
  1459. return true;
  1460. }
  1461.  
  1462. void CHARACTER::ProcessRecallItem(LPITEM item)
  1463. {
  1464. int idx;
  1465.  
  1466. if ((idx = SECTREE_MANAGER::instance().GetMapIndex(item->GetSocket(0), item->GetSocket(1))) == 0)
  1467. return;
  1468.  
  1469. int iEmpireByMapIndex = -1;
  1470.  
  1471. if (idx < 20)
  1472. iEmpireByMapIndex = 1;
  1473. else if (idx < 40)
  1474. iEmpireByMapIndex = 2;
  1475. else if (idx < 60)
  1476. iEmpireByMapIndex = 3;
  1477. else if (idx < 10000)
  1478. iEmpireByMapIndex = 0;
  1479.  
  1480. switch (idx)
  1481. {
  1482. case 66:
  1483. case 216:
  1484. iEmpireByMapIndex = -1;
  1485. break;
  1486. // ¾ا·و±؛µµ ہد¶§
  1487. case 301:
  1488. case 302:
  1489. case 303:
  1490. case 304:
  1491. if( GetLevel() < 90 )
  1492. {
  1493. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغہا ·¹؛§ ء¦ار؛¸´ظ ·¹؛§ہج ³·½ہ´د´ظ."));
  1494. return;
  1495. }
  1496. else
  1497. break;
  1498. }
  1499.  
  1500. if (iEmpireByMapIndex && GetEmpire() != iEmpireByMapIndex)
  1501. {
  1502. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±â¾ïµب ہ§ؤ،°، إ¸ء¦±¹؟، ¼ساط ہض¾î¼­ ±حب¯از ¼ِ ¾ّ½ہ´د´ظ."));
  1503. item->SetSocket(0, 0);
  1504. item->SetSocket(1, 0);
  1505. }
  1506. else
  1507. {
  1508. sys_log(1, "Recall: %s %d %d -> %d %d", GetName(), GetX(), GetY(), item->GetSocket(0), item->GetSocket(1));
  1509. WarpSet(item->GetSocket(0), item->GetSocket(1));
  1510. item->SetCount(item->GetCount() - 1);
  1511. }
  1512. }
  1513.  
  1514. void CHARACTER::__OpenPrivateShop()
  1515. {
  1516. unsigned bodyPart = GetPart(PART_MAIN);
  1517. switch (bodyPart)
  1518. {
  1519. case 0:
  1520. case 1:
  1521. case 2:
  1522. ChatPacket(CHAT_TYPE_COMMAND, "OpenPrivateShop");
  1523. break;
  1524. default:
  1525. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°©؟تہ» ¹‏¾î¾ك °³ہخ »َء،ہ» ؟­ ¼ِ ہض½ہ´د´ظ."));
  1526. break;
  1527. }
  1528. }
  1529.  
  1530. // MYSHOP_PRICE_LIST
  1531. void CHARACTER::SendMyShopPriceListCmd(DWORD dwItemVnum, DWORD dwItemPrice)
  1532. {
  1533. char szLine[256];
  1534. snprintf(szLine, sizeof(szLine), "MyShopPriceList %u %u", dwItemVnum, dwItemPrice);
  1535. ChatPacket(CHAT_TYPE_COMMAND, szLine);
  1536. sys_log(0, szLine);
  1537. }
  1538.  
  1539. //
  1540. // DB ؤ³½أ·خ ؛خإح ¹قہ؛ ¸®½؛ئ®¸¦ User ؟،°ش ہü¼غاد°ي »َء،ہ» ؟­¶َ´آ ؤ؟¸اµه¸¦ ؛¸³½´ظ.
  1541. //
  1542. void CHARACTER::UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p)
  1543. {
  1544. const TItemPriceInfo* pInfo = (const TItemPriceInfo*)(p + 1);
  1545.  
  1546. if (!p->byCount)
  1547. // °،°ف ¸®½؛ئ®°، ¾ّ´ظ. dummy µ¥ہجإح¸¦ ³ضہ؛ ؤ؟¸اµه¸¦ ؛¸³»ءط´ظ.
  1548. SendMyShopPriceListCmd(1, 0);
  1549. else {
  1550. for (int idx = 0; idx < p->byCount; idx++)
  1551. SendMyShopPriceListCmd(pInfo[ idx ].dwVnum, pInfo[ idx ].dwPrice);
  1552. }
  1553.  
  1554. __OpenPrivateShop();
  1555. }
  1556.  
  1557. //
  1558. // ہج¹ّ ء¢¼س بؤ أ³ہ½ »َء،ہ» Open اد´آ °و؟ى ¸®½؛ئ®¸¦ Load اد±â ہ§اط DB ؤ³½أ؟، °،°فء¤؛¸ ¸®½؛ئ® ؟نأ» ئذإ¶ہ» ؛¸³½´ظ.
  1559. // ہجبؤ؛خإح´آ ¹ظ·خ »َء،ہ» ؟­¶َ´آ ہہ´نہ» ؛¸³½´ظ.
  1560. //
  1561. void CHARACTER::UseSilkBotary(void)
  1562. {
  1563. if (m_bNoOpenedShop) {
  1564. DWORD dwPlayerID = GetPlayerID();
  1565. db_clientdesc->DBPacket(HEADER_GD_MYSHOP_PRICELIST_REQ, GetDesc()->GetHandle(), &dwPlayerID, sizeof(DWORD));
  1566. m_bNoOpenedShop = false;
  1567. } else {
  1568. __OpenPrivateShop();
  1569. }
  1570. }
  1571. // END_OF_MYSHOP_PRICE_LIST
  1572.  
  1573.  
  1574. int CalculateConsume(LPCHARACTER ch)
  1575. {
  1576. static const int WARP_NEED_LIFE_PERCENT = 30;
  1577. static const int WARP_MIN_LIFE_PERCENT = 10;
  1578. // CONSUME_LIFE_WHEN_USE_WARP_ITEM
  1579. int consumeLife = 0;
  1580. {
  1581. // CheckNeedLifeForWarp
  1582. const int curLife = ch->GetHP();
  1583. const int needPercent = WARP_NEED_LIFE_PERCENT;
  1584. const int needLife = ch->GetMaxHP() * needPercent / 100;
  1585. if (curLife < needLife)
  1586. {
  1587. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³²ہ؛ »‎¸ي·آ ¾çہج ¸ًہع¶َ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  1588. return -1;
  1589. }
  1590.  
  1591. consumeLife = needLife;
  1592.  
  1593.  
  1594. // CheckMinLifeForWarp: µ¶؟، ہااط¼­ ء×ہ¸¸é ¾بµا¹ا·خ »‎¸ي·آ أض¼ز·®´آ ³²°ـءط´ظ
  1595. const int minPercent = WARP_MIN_LIFE_PERCENT;
  1596. const int minLife = ch->GetMaxHP() * minPercent / 100;
  1597. if (curLife - needLife < minLife)
  1598. consumeLife = curLife - minLife;
  1599.  
  1600. if (consumeLife < 0)
  1601. consumeLife = 0;
  1602. }
  1603. // END_OF_CONSUME_LIFE_WHEN_USE_WARP_ITEM
  1604. return consumeLife;
  1605. }
  1606.  
  1607. int CalculateConsumeSP(LPCHARACTER lpChar)
  1608. {
  1609. static const int NEED_WARP_SP_PERCENT = 30;
  1610.  
  1611. const int curSP = lpChar->GetSP();
  1612. const int needSP = lpChar->GetMaxSP() * NEED_WARP_SP_PERCENT / 100;
  1613.  
  1614. if (curSP < needSP)
  1615. {
  1616. lpChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³²ہ؛ ء¤½إ·آ ¾çہج ¸ًہع¶َ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  1617. return -1;
  1618. }
  1619.  
  1620. return needSP;
  1621. }
  1622.  
  1623. // #define ENABLE_FIREWORK_STUN
  1624. #define ENABLE_ADDSTONE_FAILURE
  1625. bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
  1626. {
  1627. int iLimitRealtimeStartFirstUseFlagIndex = -1;
  1628. //int iLimitTimerBasedOnWearFlagIndex = -1;
  1629.  
  1630. WORD wDestCell = DestCell.cell;
  1631. BYTE bDestInven = DestCell.window_type;
  1632. for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  1633. {
  1634. long limitValue = item->GetProto()->aLimits[i].lValue;
  1635.  
  1636. switch (item->GetProto()->aLimits[i].bType)
  1637. {
  1638. case LIMIT_LEVEL:
  1639. if (GetLevel() < limitValue)
  1640. {
  1641. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغہا ·¹؛§ ء¦ار؛¸´ظ ·¹؛§ہج ³·½ہ´د´ظ."));
  1642. return false;
  1643. }
  1644. break;
  1645.  
  1646. case LIMIT_REAL_TIME_START_FIRST_USE:
  1647. iLimitRealtimeStartFirstUseFlagIndex = i;
  1648. break;
  1649.  
  1650. case LIMIT_TIMER_BASED_ON_WEAR:
  1651. //iLimitTimerBasedOnWearFlagIndex = i;
  1652. break;
  1653. }
  1654. }
  1655.  
  1656. if (test_server)
  1657. {
  1658. sys_log(0, "USE_ITEM %s, Inven %d, Cell %d, ItemType %d, SubType %d", item->GetName(), bDestInven, wDestCell, item->GetType(), item->GetSubType());
  1659. }
  1660.  
  1661. if ( CArenaManager::instance().IsLimitedItem( GetMapIndex(), item->GetVnum() ) == true )
  1662. {
  1663. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  1664. return false;
  1665. }
  1666.  
  1667. // @fixme402 (IsLoadedAffect to block affect hacking)
  1668. if (!IsLoadedAffect())
  1669. {
  1670. ChatPacket(CHAT_TYPE_INFO, "Affects are not loaded yet!");
  1671. return false;
  1672. }
  1673.  
  1674. // ¾ئہجإغ أضأت »ç؟ë ہجبؤ؛خإح´آ »ç؟ëادءِ ¾ت¾ئµµ ½أ°£ہج آ÷°¨µا´آ ¹و½ؤ أ³¸®.
  1675. if (-1 != iLimitRealtimeStartFirstUseFlagIndex)
  1676. {
  1677. // ار ¹ّہج¶َµµ »ç؟ëار ¾ئہجإغہخءِ ؟©؛خ´آ Socket1ہ» ؛¸°ي ئا´ـار´ظ. (Socket1؟، »ç؟ëب½¼ِ ±â·د)
  1678. if (0 == item->GetSocket(1))
  1679. {
  1680. // »ç؟ë°،´ة½أ°£ہ؛ Default °ھہ¸·خ Limit Value °ھہ» »ç؟ëادµا, Socket0؟، °ھہج ہضہ¸¸é ±× °ھہ» »ç؟ëادµµ·د ار´ظ. (´ـہ§´آ أت)
  1681. long duration = (0 != item->GetSocket(0)) ? item->GetSocket(0) : item->GetProto()->aLimits[iLimitRealtimeStartFirstUseFlagIndex].lValue;
  1682.  
  1683. if (0 == duration)
  1684. duration = 60 * 60 * 24 * 7;
  1685.  
  1686. item->SetSocket(0, time(0) + duration);
  1687. item->StartRealTimeExpireEvent();
  1688. }
  1689.  
  1690. if (false == item->IsEquipped())
  1691. item->SetSocket(1, item->GetSocket(1) + 1);
  1692. }
  1693.  
  1694. switch (item->GetType())
  1695. {
  1696. case ITEM_HAIR:
  1697. return ItemProcess_Hair(item, wDestCell);
  1698.  
  1699. case ITEM_POLYMORPH:
  1700. return ItemProcess_Polymorph(item);
  1701.  
  1702. case ITEM_QUEST:
  1703. if (GetArena() != NULL || IsObserverMode() == true)
  1704. {
  1705. if (item->GetVnum() == 50051 || item->GetVnum() == 50052 || item->GetVnum() == 50053)
  1706. {
  1707. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  1708. return false;
  1709. }
  1710. }
  1711.  
  1712. if (!IS_SET(item->GetFlag(), ITEM_FLAG_QUEST_USE | ITEM_FLAG_QUEST_USE_MULTIPLE))
  1713. {
  1714. if (item->GetSIGVnum() == 0)
  1715. {
  1716. quest::CQuestManager::instance().UseItem(GetPlayerID(), item, false);
  1717. }
  1718. else
  1719. {
  1720. quest::CQuestManager::instance().SIGUse(GetPlayerID(), item->GetSIGVnum(), item, false);
  1721. }
  1722. }
  1723. break;
  1724.  
  1725. case ITEM_CAMPFIRE:
  1726. {
  1727. float fx, fy;
  1728. GetDeltaByDegree(GetRotation(), 100.0f, &fx, &fy);
  1729.  
  1730. LPSECTREE tree = SECTREE_MANAGER::instance().Get(GetMapIndex(), (long)(GetX()+fx), (long)(GetY()+fy));
  1731.  
  1732. if (!tree)
  1733. {
  1734. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸ً´ع؛زہ» اا؟ï ¼ِ ¾ّ´آ ءِء،ہش´د´ظ."));
  1735. return false;
  1736. }
  1737.  
  1738. if (tree->IsAttr((long)(GetX()+fx), (long)(GetY()+fy), ATTR_WATER))
  1739. {
  1740. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹° ¼س؟، ¸ً´ع؛زہ» اا؟ï ¼ِ ¾ّ½ہ´د´ظ."));
  1741. return false;
  1742. }
  1743.  
  1744. LPCHARACTER campfire = CHARACTER_MANAGER::instance().SpawnMob(fishing::CAMPFIRE_MOB, GetMapIndex(), (long)(GetX()+fx), (long)(GetY()+fy), 0, false, number(0, 359));
  1745.  
  1746. char_event_info* info = AllocEventInfo<char_event_info>();
  1747.  
  1748. info->ch = campfire;
  1749.  
  1750. campfire->m_pkMiningEvent = event_create(kill_campfire_event, info, PASSES_PER_SEC(40));
  1751.  
  1752. item->SetCount(item->GetCount() - 1);
  1753. }
  1754. break;
  1755.  
  1756. case ITEM_UNIQUE:
  1757. {
  1758. switch (item->GetSubType())
  1759. {
  1760. case USE_ABILITY_UP:
  1761. {
  1762. switch (item->GetValue(0))
  1763. {
  1764. case APPLY_MOV_SPEED:
  1765. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_MOV_SPEED, item->GetValue(2), AFF_MOV_SPEED_POTION, item->GetValue(1), 0, true, true);
  1766. break;
  1767.  
  1768. case APPLY_ATT_SPEED:
  1769. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_ATT_SPEED, item->GetValue(2), AFF_ATT_SPEED_POTION, item->GetValue(1), 0, true, true);
  1770. break;
  1771.  
  1772. case APPLY_STR:
  1773. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_ST, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1774. break;
  1775.  
  1776. case APPLY_DEX:
  1777. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_DX, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1778. break;
  1779.  
  1780. case APPLY_CON:
  1781. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_HT, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1782. break;
  1783.  
  1784. case APPLY_INT:
  1785. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_IQ, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1786. break;
  1787.  
  1788. case APPLY_CAST_SPEED:
  1789. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_CASTING_SPEED, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1790. break;
  1791.  
  1792. case APPLY_RESIST_MAGIC:
  1793. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_RESIST_MAGIC, item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1794. break;
  1795.  
  1796. case APPLY_ATT_GRADE_BONUS:
  1797. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_ATT_GRADE_BONUS,
  1798. item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1799. break;
  1800.  
  1801. case APPLY_DEF_GRADE_BONUS:
  1802. AddAffect(AFFECT_UNIQUE_ABILITY, POINT_DEF_GRADE_BONUS,
  1803. item->GetValue(2), 0, item->GetValue(1), 0, true, true);
  1804. break;
  1805. }
  1806. }
  1807.  
  1808. if (GetDungeon())
  1809. GetDungeon()->UsePotion(this);
  1810.  
  1811. if (GetWarMap())
  1812. GetWarMap()->UsePotion(this, item);
  1813.  
  1814. item->SetCount(item->GetCount() - 1);
  1815. break;
  1816.  
  1817. default:
  1818. {
  1819. if (item->GetSubType() == USE_SPECIAL)
  1820. {
  1821. sys_log(0, "ITEM_UNIQUE: USE_SPECIAL %u", item->GetVnum());
  1822.  
  1823. switch (item->GetVnum())
  1824. {
  1825. case 71049: // ؛ٌ´ـ؛¸µû¸®
  1826. if (g_bEnableBootaryCheck)
  1827. {
  1828. if (IS_BOTARYABLE_ZONE(GetMapIndex()) == true)
  1829. {
  1830. UseSilkBotary();
  1831. }
  1832. else
  1833. {
  1834. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³ہخ »َء،ہ» ؟­ ¼ِ ¾ّ´آ ءِ؟ھہش´د´ظ"));
  1835. }
  1836. }
  1837. else
  1838. {
  1839. UseSilkBotary();
  1840. }
  1841. break;
  1842. }
  1843. }
  1844. else
  1845. {
  1846. if (!item->IsEquipped())
  1847. EquipItem(item);
  1848. else
  1849. UnequipItem(item);
  1850. }
  1851. }
  1852. break;
  1853. }
  1854. }
  1855. break;
  1856.  
  1857. case ITEM_COSTUME:
  1858. case ITEM_WEAPON:
  1859. case ITEM_ARMOR:
  1860. case ITEM_ROD:
  1861. case ITEM_RING: // ½إ±ش ¹فءِ ¾ئہجإغ
  1862. case ITEM_BELT: // ½إ±ش ؛§ئ® ¾ئہجإغ
  1863. // MINING
  1864. case ITEM_PICK:
  1865. // END_OF_MINING
  1866. if (!item->IsEquipped())
  1867. EquipItem(item);
  1868. else
  1869. UnequipItem(item);
  1870. break;
  1871. // آّ؟ëادءِ ¾تہ؛ ؟ëب¥¼®ہ؛ »ç؟ëاز ¼ِ ¾ّ´ظ.
  1872. // ء¤»َہûہخ إ¬¶َ¶َ¸é, ؟ëب¥¼®؟، °üاد؟© item use ئذإ¶ہ» ؛¸³¾ ¼ِ ¾ّ´ظ.
  1873. // ؟ëب¥¼® آّ؟ëہ؛ item move ئذإ¶ہ¸·خ ار´ظ.
  1874. // آّ؟ëار ؟ëب¥¼®ہ؛ أكأâار´ظ.
  1875. case ITEM_DS:
  1876. {
  1877. if (!item->IsEquipped())
  1878. return false;
  1879. return DSManager::instance().PullOut(this, NPOS, item);
  1880. break;
  1881. }
  1882. case ITEM_SPECIAL_DS:
  1883. if (!item->IsEquipped())
  1884. EquipItem(item);
  1885. else
  1886. UnequipItem(item);
  1887. break;
  1888.  
  1889. case ITEM_FISH:
  1890. {
  1891. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  1892. {
  1893. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  1894. return false;
  1895. }
  1896.  
  1897. if (item->GetSubType() == FISH_ALIVE)
  1898. fishing::UseFish(this, item);
  1899. }
  1900. break;
  1901.  
  1902. case ITEM_TREASURE_BOX:
  1903. {
  1904. return false;
  1905. //ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("؟­¼è·خ ہل°ـ ہض¾î¼­ ؟­¸®ءِ ¾ت´آ°ح °°´ظ. ؟­¼è¸¦ ±¸اط؛¸ہع."));
  1906. }
  1907. break;
  1908.  
  1909. case ITEM_TREASURE_KEY:
  1910. {
  1911. LPITEM item2;
  1912.  
  1913. if (!GetItem(DestCell) || !(item2 = GetItem(DestCell)))
  1914. return false;
  1915.  
  1916. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  1917. return false;
  1918.  
  1919. if (item2->GetType() != ITEM_TREASURE_BOX)
  1920. {
  1921. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("؟­¼è·خ ؟©´آ ¹°°اہج ¾ئ´ر°ح °°´ظ."));
  1922. return false;
  1923. }
  1924.  
  1925. if (item->GetValue(0) == item2->GetValue(0))
  1926. {
  1927. //ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("؟­¼è´آ ¸آہ¸³ھ ¾ئہجإغ ءض´آ ؛خ؛ذ ±¸اِہج ¾بµا¾ْ½ہ´د´ظ."));
  1928. DWORD dwBoxVnum = item2->GetVnum();
  1929. std::vector <DWORD> dwVnums;
  1930. std::vector <DWORD> dwCounts;
  1931. std::vector <LPITEM> item_gets(0);
  1932. int count = 0;
  1933.  
  1934. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  1935. {
  1936. ITEM_MANAGER::instance().RemoveItem(item);
  1937. ITEM_MANAGER::instance().RemoveItem(item2);
  1938.  
  1939. for (int i = 0; i < count; i++){
  1940. switch (dwVnums[i])
  1941. {
  1942. case CSpecialItemGroup::GOLD:
  1943. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %d ³ةہ» ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  1944. break;
  1945. case CSpecialItemGroup::EXP:
  1946. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ؛خإح ½إ؛ٌار ؛ûہج ³ھ؟ة´د´ظ."));
  1947. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dہا °واèؤ،¸¦ ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  1948. break;
  1949. case CSpecialItemGroup::MOB:
  1950. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  1951. break;
  1952. case CSpecialItemGroup::SLOW:
  1953. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ »،°£ ؟¬±â¸¦ µéہج¸¶½أہع ؟ٍء÷ہج´آ ¼سµµ°، ´ہ·ءء³½ہ´د´ظ!"));
  1954. break;
  1955. case CSpecialItemGroup::DRAIN_HP:
  1956. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع°، °©ہع±â ئّ¹كاد؟´½ہ´د´ظ! »‎¸ي·آہج °¨¼زاك½ہ´د´ظ."));
  1957. break;
  1958. case CSpecialItemGroup::POISON:
  1959. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  1960. break;
  1961. #ifdef ENABLE_WOLFMAN_CHARACTER
  1962. case CSpecialItemGroup::BLEEDING:
  1963. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  1964. break;
  1965. #endif
  1966. case CSpecialItemGroup::MOB_GROUP:
  1967. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  1968. break;
  1969. default:
  1970. if (item_gets[i])
  1971. {
  1972. if (dwCounts[i] > 1)
  1973. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، %d °³ ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName(), dwCounts[i]);
  1974. else
  1975. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName());
  1976.  
  1977. }
  1978. }
  1979. }
  1980. }
  1981. else
  1982. {
  1983. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("؟­¼è°، ¸آءِ ¾ت´آ °ح °°´ظ."));
  1984. return false;
  1985. }
  1986. }
  1987. else
  1988. {
  1989. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("؟­¼è°، ¸آءِ ¾ت´آ °ح °°´ظ."));
  1990. return false;
  1991. }
  1992. }
  1993. break;
  1994.  
  1995. case ITEM_GIFTBOX:
  1996. {
  1997. #ifdef ENABLE_NEWSTUFF
  1998. if (0 != g_BoxUseTimeLimitValue)
  1999. {
  2000. if (get_dword_time() < m_dwLastBoxUseTime+g_BoxUseTimeLimitValue)
  2001. {
  2002. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ °ٌµه¸¦ ¹ِ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  2003. return false;
  2004. }
  2005. }
  2006.  
  2007. m_dwLastBoxUseTime = get_dword_time();
  2008. #endif
  2009. DWORD dwBoxVnum = item->GetVnum();
  2010. std::vector <DWORD> dwVnums;
  2011. std::vector <DWORD> dwCounts;
  2012. std::vector <LPITEM> item_gets(0);
  2013. int count = 0;
  2014.  
  2015. if( dwBoxVnum > 51500 && dwBoxVnum < 52000 ) // ؟ëب¥؟ّ¼®µé
  2016. {
  2017. if( !(this->DragonSoul_IsQualified()) )
  2018. {
  2019. ChatPacket(CHAT_TYPE_INFO,LC_TEXT("¸صہْ ؟ëب¥¼® ؤù½؛ئ®¸¦ ؟د·لاد¼إ¾ك اص´د´ظ."));
  2020. return false;
  2021. }
  2022. }
  2023.  
  2024. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  2025. {
  2026. item->SetCount(item->GetCount()-1);
  2027.  
  2028. for (int i = 0; i < count; i++){
  2029. switch (dwVnums[i])
  2030. {
  2031. case CSpecialItemGroup::GOLD:
  2032. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %d ³ةہ» ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  2033. break;
  2034. case CSpecialItemGroup::EXP:
  2035. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ؛خإح ½إ؛ٌار ؛ûہج ³ھ؟ة´د´ظ."));
  2036. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dہا °واèؤ،¸¦ ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  2037. break;
  2038. case CSpecialItemGroup::MOB:
  2039. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  2040. break;
  2041. case CSpecialItemGroup::SLOW:
  2042. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ »،°£ ؟¬±â¸¦ µéہج¸¶½أہع ؟ٍء÷ہج´آ ¼سµµ°، ´ہ·ءء³½ہ´د´ظ!"));
  2043. break;
  2044. case CSpecialItemGroup::DRAIN_HP:
  2045. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع°، °©ہع±â ئّ¹كاد؟´½ہ´د´ظ! »‎¸ي·آہج °¨¼زاك½ہ´د´ظ."));
  2046. break;
  2047. case CSpecialItemGroup::POISON:
  2048. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  2049. break;
  2050. #ifdef ENABLE_WOLFMAN_CHARACTER
  2051. case CSpecialItemGroup::BLEEDING:
  2052. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  2053. break;
  2054. #endif
  2055. case CSpecialItemGroup::MOB_GROUP:
  2056. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  2057. break;
  2058. default:
  2059. if (item_gets[i])
  2060. {
  2061. if (dwCounts[i] > 1)
  2062. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، %d °³ ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName(), dwCounts[i]);
  2063. else
  2064. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName());
  2065. }
  2066. }
  2067. }
  2068. }
  2069. else
  2070. {
  2071. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("¾ئ¹«°حµµ ¾ٍہ» ¼ِ ¾ّ¾ْ½ہ´د´ظ."));
  2072. return false;
  2073. }
  2074. }
  2075. break;
  2076.  
  2077. case ITEM_SKILLFORGET:
  2078. {
  2079. if (!item->GetSocket(0))
  2080. {
  2081. ITEM_MANAGER::instance().RemoveItem(item);
  2082. return false;
  2083. }
  2084.  
  2085. DWORD dwVnum = item->GetSocket(0);
  2086.  
  2087. if (SkillLevelDown(dwVnum))
  2088. {
  2089. ITEM_MANAGER::instance().RemoveItem(item);
  2090. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("½؛إ³ ·¹؛§ہ» ³»¸®´آµ¥ ¼؛°ّاد؟´½ہ´د´ظ."));
  2091. }
  2092. else
  2093. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("½؛إ³ ·¹؛§ہ» ³»¸± ¼ِ ¾ّ½ہ´د´ظ."));
  2094. }
  2095. break;
  2096.  
  2097. case ITEM_SKILLBOOK:
  2098. {
  2099. if (IsPolymorphed())
  2100. {
  2101. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  2102. return false;
  2103. }
  2104.  
  2105. DWORD dwVnum = 0;
  2106.  
  2107. if (item->GetVnum() == 50300)
  2108. {
  2109. dwVnum = item->GetSocket(0);
  2110. }
  2111. else
  2112. {
  2113. // »ُ·خ؟î ¼ِ·أ¼­´آ value 0 ؟، ½؛إ³ ¹ّب£°، ہضہ¸¹ا·خ ±×°حہ» »ç؟ë.
  2114. dwVnum = item->GetValue(0);
  2115. }
  2116.  
  2117. if (0 == dwVnum)
  2118. {
  2119. ITEM_MANAGER::instance().RemoveItem(item);
  2120.  
  2121. return false;
  2122. }
  2123.  
  2124. if (true == LearnSkillByBook(dwVnum))
  2125. {
  2126. #ifdef ENABLE_BOOKS_STACKFIX
  2127. item->SetCount(item->GetCount() - 1);
  2128. #else
  2129. ITEM_MANAGER::instance().RemoveItem(item);
  2130. #endif
  2131.  
  2132. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  2133.  
  2134. if (distribution_test_server)
  2135. iReadDelay /= 3;
  2136.  
  2137. SetSkillNextReadTime(dwVnum, get_global_time() + iReadDelay);
  2138. }
  2139. }
  2140. break;
  2141.  
  2142. case ITEM_USE:
  2143. {
  2144. if (item->GetVnum() > 50800 && item->GetVnum() <= 50820)
  2145. {
  2146. if (test_server)
  2147. sys_log (0, "ADD addtional effect : vnum(%d) subtype(%d)", item->GetOriginalVnum(), item->GetSubType());
  2148.  
  2149. int affect_type = AFFECT_EXP_BONUS_EURO_FREE;
  2150. int apply_type = aApplyInfo[item->GetValue(0)].bPointType;
  2151. int apply_value = item->GetValue(2);
  2152. int apply_duration = item->GetValue(1);
  2153.  
  2154. switch (item->GetSubType())
  2155. {
  2156. case USE_ABILITY_UP:
  2157. if (FindAffect(affect_type, apply_type))
  2158. {
  2159. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  2160. return false;
  2161. }
  2162.  
  2163. {
  2164. switch (item->GetValue(0))
  2165. {
  2166. case APPLY_MOV_SPEED:
  2167. AddAffect(affect_type, apply_type, apply_value, AFF_MOV_SPEED_POTION, apply_duration, 0, true, true);
  2168. break;
  2169.  
  2170. case APPLY_ATT_SPEED:
  2171. AddAffect(affect_type, apply_type, apply_value, AFF_ATT_SPEED_POTION, apply_duration, 0, true, true);
  2172. break;
  2173.  
  2174. case APPLY_STR:
  2175. case APPLY_DEX:
  2176. case APPLY_CON:
  2177. case APPLY_INT:
  2178. case APPLY_CAST_SPEED:
  2179. case APPLY_RESIST_MAGIC:
  2180. case APPLY_ATT_GRADE_BONUS:
  2181. case APPLY_DEF_GRADE_BONUS:
  2182. AddAffect(affect_type, apply_type, apply_value, 0, apply_duration, 0, true, true);
  2183. break;
  2184. }
  2185. }
  2186.  
  2187. if (GetDungeon())
  2188. GetDungeon()->UsePotion(this);
  2189.  
  2190. if (GetWarMap())
  2191. GetWarMap()->UsePotion(this, item);
  2192.  
  2193. item->SetCount(item->GetCount() - 1);
  2194. break;
  2195.  
  2196. case USE_AFFECT :
  2197. {
  2198. if (FindAffect(AFFECT_EXP_BONUS_EURO_FREE, aApplyInfo[item->GetValue(1)].bPointType))
  2199. {
  2200. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  2201. }
  2202. else
  2203. {
  2204. // PC_BANG_ITEM_ADD
  2205. if (item->IsPCBangItem() == true)
  2206. {
  2207. // PC¹وہخءِ أ¼إ©اط¼­ أ³¸®
  2208. if (CPCBangManager::instance().IsPCBangIP(GetDesc()->GetHostName()) == false)
  2209. {
  2210. // PC¹وہج ¾ئ´ش!
  2211. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ PC¹و؟،¼­¸¸ »ç؟ëاز ¼ِ ہض½ہ´د´ظ."));
  2212. return false;
  2213. }
  2214. }
  2215. // END_PC_BANG_ITEM_ADD
  2216.  
  2217. AddAffect(AFFECT_EXP_BONUS_EURO_FREE, aApplyInfo[item->GetValue(1)].bPointType, item->GetValue(2), 0, item->GetValue(3), 0, false, true);
  2218. item->SetCount(item->GetCount() - 1);
  2219. }
  2220. }
  2221. break;
  2222.  
  2223. case USE_POTION_NODELAY:
  2224. {
  2225. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  2226. {
  2227. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit") > 0)
  2228. {
  2229. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  2230. return false;
  2231. }
  2232.  
  2233. switch (item->GetVnum())
  2234. {
  2235. case 70020 :
  2236. case 71018 :
  2237. case 71019 :
  2238. case 71020 :
  2239. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit_count") < 10000)
  2240. {
  2241. if (m_nPotionLimit <= 0)
  2242. {
  2243. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç؟ë ء¦ار·®ہ» أت°ْاد؟´½ہ´د´ظ."));
  2244. return false;
  2245. }
  2246. }
  2247. break;
  2248.  
  2249. default :
  2250. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  2251. return false;
  2252. break;
  2253. }
  2254. }
  2255.  
  2256. bool used = false;
  2257.  
  2258. if (item->GetValue(0) != 0) // HP ہ‎´ë°ھ ب¸؛¹
  2259. {
  2260. if (GetHP() < GetMaxHP())
  2261. {
  2262. PointChange(POINT_HP, item->GetValue(0) * (100 + GetPoint(POINT_POTION_BONUS)) / 100);
  2263. EffectPacket(SE_HPUP_RED);
  2264. used = TRUE;
  2265. }
  2266. }
  2267.  
  2268. if (item->GetValue(1) != 0) // SP ہ‎´ë°ھ ب¸؛¹
  2269. {
  2270. if (GetSP() < GetMaxSP())
  2271. {
  2272. PointChange(POINT_SP, item->GetValue(1) * (100 + GetPoint(POINT_POTION_BONUS)) / 100);
  2273. EffectPacket(SE_SPUP_BLUE);
  2274. used = TRUE;
  2275. }
  2276. }
  2277.  
  2278. if (item->GetValue(3) != 0) // HP % ب¸؛¹
  2279. {
  2280. if (GetHP() < GetMaxHP())
  2281. {
  2282. PointChange(POINT_HP, item->GetValue(3) * GetMaxHP() / 100);
  2283. EffectPacket(SE_HPUP_RED);
  2284. used = TRUE;
  2285. }
  2286. }
  2287.  
  2288. if (item->GetValue(4) != 0) // SP % ب¸؛¹
  2289. {
  2290. if (GetSP() < GetMaxSP())
  2291. {
  2292. PointChange(POINT_SP, item->GetValue(4) * GetMaxSP() / 100);
  2293. EffectPacket(SE_SPUP_BLUE);
  2294. used = TRUE;
  2295. }
  2296. }
  2297.  
  2298. if (used)
  2299. {
  2300. if (item->GetVnum() == 50085 || item->GetVnum() == 50086)
  2301. {
  2302. if (test_server)
  2303. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؟ù؛´ ¶ا´آ ء¾ہع ¸¦ »ç؟ëاد؟´½ہ´د´ظ"));
  2304. SetUseSeedOrMoonBottleTime();
  2305. }
  2306. if (GetDungeon())
  2307. GetDungeon()->UsePotion(this);
  2308.  
  2309. if (GetWarMap())
  2310. GetWarMap()->UsePotion(this, item);
  2311.  
  2312. m_nPotionLimit--;
  2313.  
  2314. //RESTRICT_USE_SEED_OR_MOONBOTTLE
  2315. item->SetCount(item->GetCount() - 1);
  2316. //END_RESTRICT_USE_SEED_OR_MOONBOTTLE
  2317. }
  2318. }
  2319. break;
  2320. }
  2321.  
  2322. return true;
  2323. }
  2324.  
  2325.  
  2326. if (item->GetVnum() >= 27863 && item->GetVnum() <= 27883)
  2327. {
  2328. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  2329. {
  2330. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  2331. return false;
  2332. }
  2333. }
  2334.  
  2335. if (test_server)
  2336. {
  2337. sys_log (0, "USE_ITEM %s Type %d SubType %d vnum %d", item->GetName(), item->GetType(), item->GetSubType(), item->GetOriginalVnum());
  2338. }
  2339.  
  2340. switch (item->GetSubType())
  2341. {
  2342. case USE_TIME_CHARGE_PER:
  2343. {
  2344. LPITEM pDestItem = GetItem(DestCell);
  2345. if (NULL == pDestItem)
  2346. {
  2347. return false;
  2348. }
  2349. // ؟ى¼± ؟ëب¥¼®؟، °üاط¼­¸¸ ادµµ·د ار´ظ.
  2350. if (pDestItem->IsDragonSoul())
  2351. {
  2352. int ret;
  2353. char buf[128];
  2354. if (item->GetVnum() == DRAGON_HEART_VNUM)
  2355. {
  2356. ret = pDestItem->GiveMoreTime_Per((float)item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
  2357. }
  2358. else
  2359. {
  2360. ret = pDestItem->GiveMoreTime_Per((float)item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2361. }
  2362. if (ret > 0)
  2363. {
  2364. if (item->GetVnum() == DRAGON_HEART_VNUM)
  2365. {
  2366. sprintf(buf, "Inc %ds by item{VN:%d SOC%d:%ld}", ret, item->GetVnum(), ITEM_SOCKET_CHARGING_AMOUNT_IDX, item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
  2367. }
  2368. else
  2369. {
  2370. sprintf(buf, "Inc %ds by item{VN:%d VAL%d:%ld}", ret, item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2371. }
  2372.  
  2373. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dأت ¸¸إ­ أوہüµا¾ْ½ہ´د´ظ."), ret);
  2374. item->SetCount(item->GetCount() - 1);
  2375. LogManager::instance().ItemLog(this, item, "DS_CHARGING_SUCCESS", buf);
  2376. return true;
  2377. }
  2378. else
  2379. {
  2380. if (item->GetVnum() == DRAGON_HEART_VNUM)
  2381. {
  2382. sprintf(buf, "No change by item{VN:%d SOC%d:%ld}", item->GetVnum(), ITEM_SOCKET_CHARGING_AMOUNT_IDX, item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
  2383. }
  2384. else
  2385. {
  2386. sprintf(buf, "No change by item{VN:%d VAL%d:%ld}", item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2387. }
  2388.  
  2389. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أوہüاز ¼ِ ¾ّ½ہ´د´ظ."));
  2390. LogManager::instance().ItemLog(this, item, "DS_CHARGING_FAILED", buf);
  2391. return false;
  2392. }
  2393. }
  2394. else
  2395. return false;
  2396. }
  2397. break;
  2398. case USE_TIME_CHARGE_FIX:
  2399. {
  2400. LPITEM pDestItem = GetItem(DestCell);
  2401. if (NULL == pDestItem)
  2402. {
  2403. return false;
  2404. }
  2405. // ؟ى¼± ؟ëب¥¼®؟، °üاط¼­¸¸ ادµµ·د ار´ظ.
  2406. if (pDestItem->IsDragonSoul())
  2407. {
  2408. int ret = pDestItem->GiveMoreTime_Fix(item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2409. char buf[128];
  2410. if (ret)
  2411. {
  2412. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dأت ¸¸إ­ أوہüµا¾ْ½ہ´د´ظ."), ret);
  2413. sprintf(buf, "Increase %ds by item{VN:%d VAL%d:%ld}", ret, item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2414. LogManager::instance().ItemLog(this, item, "DS_CHARGING_SUCCESS", buf);
  2415. item->SetCount(item->GetCount() - 1);
  2416. return true;
  2417. }
  2418. else
  2419. {
  2420. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أوہüاز ¼ِ ¾ّ½ہ´د´ظ."));
  2421. sprintf(buf, "No change by item{VN:%d VAL%d:%ld}", item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
  2422. LogManager::instance().ItemLog(this, item, "DS_CHARGING_FAILED", buf);
  2423. return false;
  2424. }
  2425. }
  2426. else
  2427. return false;
  2428. }
  2429. break;
  2430. case USE_SPECIAL:
  2431.  
  2432. switch (item->GetVnum())
  2433. {
  2434. //إ©¸®½؛¸¶½؛ ¶ُءض
  2435. case ITEM_NOG_POCKET:
  2436. {
  2437. /*
  2438. ¶ُءض´ة·آؤ، : item_proto value ہا¹ج
  2439. ہجµ؟¼سµµ value 1
  2440. °ّ°ف·آ value 2
  2441. °واèؤ، value 3
  2442. ءِ¼س½أ°£ value 0 (´ـہ§ أت)
  2443.  
  2444. */
  2445. if (FindAffect(AFFECT_NOG_ABILITY))
  2446. {
  2447. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  2448. return false;
  2449. }
  2450. long time = item->GetValue(0);
  2451. long moveSpeedPer = item->GetValue(1);
  2452. long attPer = item->GetValue(2);
  2453. long expPer = item->GetValue(3);
  2454. AddAffect(AFFECT_NOG_ABILITY, POINT_MOV_SPEED, moveSpeedPer, AFF_MOV_SPEED_POTION, time, 0, true, true);
  2455. AddAffect(AFFECT_NOG_ABILITY, POINT_MALL_ATTBONUS, attPer, AFF_NONE, time, 0, true, true);
  2456. AddAffect(AFFECT_NOG_ABILITY, POINT_MALL_EXPBONUS, expPer, AFF_NONE, time, 0, true, true);
  2457. item->SetCount(item->GetCount() - 1);
  2458. }
  2459. break;
  2460.  
  2461. //¶َ¸¶´ـ؟ë »çإء
  2462. case ITEM_RAMADAN_CANDY:
  2463. {
  2464. /*
  2465. »çإء´ة·آؤ، : item_proto value ہا¹ج
  2466. ہجµ؟¼سµµ value 1
  2467. °ّ°ف·آ value 2
  2468. °واèؤ، value 3
  2469. ءِ¼س½أ°£ value 0 (´ـہ§ أت)
  2470.  
  2471. */
  2472. long time = item->GetValue(0);
  2473. long moveSpeedPer = item->GetValue(1);
  2474. long attPer = item->GetValue(2);
  2475. long expPer = item->GetValue(3);
  2476. AddAffect(AFFECT_RAMADAN_ABILITY, POINT_MOV_SPEED, moveSpeedPer, AFF_MOV_SPEED_POTION, time, 0, true, true);
  2477. AddAffect(AFFECT_RAMADAN_ABILITY, POINT_MALL_ATTBONUS, attPer, AFF_NONE, time, 0, true, true);
  2478. AddAffect(AFFECT_RAMADAN_ABILITY, POINT_MALL_EXPBONUS, expPer, AFF_NONE, time, 0, true, true);
  2479. item->SetCount(item->GetCount() - 1);
  2480. }
  2481. break;
  2482. case ITEM_MARRIAGE_RING:
  2483. {
  2484. marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(GetPlayerID());
  2485. if (pMarriage)
  2486. {
  2487. if (pMarriage->ch1 != NULL)
  2488. {
  2489. if (CArenaManager::instance().IsArenaMap(pMarriage->ch1->GetMapIndex()) == true)
  2490. {
  2491. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  2492. break;
  2493. }
  2494. }
  2495.  
  2496. if (pMarriage->ch2 != NULL)
  2497. {
  2498. if (CArenaManager::instance().IsArenaMap(pMarriage->ch2->GetMapIndex()) == true)
  2499. {
  2500. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  2501. break;
  2502. }
  2503. }
  2504.  
  2505. int consumeSP = CalculateConsumeSP(this);
  2506.  
  2507. if (consumeSP < 0)
  2508. return false;
  2509.  
  2510. PointChange(POINT_SP, -consumeSP, false);
  2511.  
  2512. WarpToPID(pMarriage->GetOther(GetPlayerID()));
  2513. }
  2514. else
  2515. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°لب¥ »َإآ°، ¾ئ´د¸é °لب¥¹فءِ¸¦ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  2516. }
  2517. break;
  2518.  
  2519. //±âء¸ ؟ë±âہا ¸ءإن
  2520. case UNIQUE_ITEM_CAPE_OF_COURAGE:
  2521. //¶َ¸¶´ـ ؛¸»َ؟ë ؟ë±âہا ¸ءإن
  2522. case 70057:
  2523. case REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE:
  2524. AggregateMonster();
  2525. item->SetCount(item->GetCount()-1);
  2526. break;
  2527.  
  2528. case UNIQUE_ITEM_WHITE_FLAG:
  2529. ForgetMyAttacker();
  2530. item->SetCount(item->GetCount()-1);
  2531. break;
  2532.  
  2533. case UNIQUE_ITEM_TREASURE_BOX:
  2534. break;
  2535.  
  2536. case 30093:
  2537. case 30094:
  2538. case 30095:
  2539. case 30096:
  2540. // ؛¹ءض¸س´د
  2541. {
  2542. const int MAX_BAG_INFO = 26;
  2543. static struct LuckyBagInfo
  2544. {
  2545. DWORD count;
  2546. int prob;
  2547. DWORD vnum;
  2548. } b1[MAX_BAG_INFO] =
  2549. {
  2550. { 1000, 302, 1 },
  2551. { 10, 150, 27002 },
  2552. { 10, 75, 27003 },
  2553. { 10, 100, 27005 },
  2554. { 10, 50, 27006 },
  2555. { 10, 80, 27001 },
  2556. { 10, 50, 27002 },
  2557. { 10, 80, 27004 },
  2558. { 10, 50, 27005 },
  2559. { 1, 10, 50300 },
  2560. { 1, 6, 92 },
  2561. { 1, 2, 132 },
  2562. { 1, 6, 1052 },
  2563. { 1, 2, 1092 },
  2564. { 1, 6, 2082 },
  2565. { 1, 2, 2122 },
  2566. { 1, 6, 3082 },
  2567. { 1, 2, 3122 },
  2568. { 1, 6, 5052 },
  2569. { 1, 2, 5082 },
  2570. { 1, 6, 7082 },
  2571. { 1, 2, 7122 },
  2572. { 1, 1, 11282 },
  2573. { 1, 1, 11482 },
  2574. { 1, 1, 11682 },
  2575. { 1, 1, 11882 },
  2576. };
  2577.  
  2578. LuckyBagInfo * bi = NULL;
  2579. bi = b1;
  2580.  
  2581. int pct = number(1, 1000);
  2582.  
  2583. int i;
  2584. for (i=0;i<MAX_BAG_INFO;i++)
  2585. {
  2586. if (pct <= bi[i].prob)
  2587. break;
  2588. pct -= bi[i].prob;
  2589. }
  2590. if (i>=MAX_BAG_INFO)
  2591. return false;
  2592.  
  2593. if (bi[i].vnum == 50300)
  2594. {
  2595. // ½؛إ³¼ِ·أ¼­´آ ئ¯¼ِاد°ش ءط´ظ.
  2596. GiveRandomSkillBook();
  2597. }
  2598. else if (bi[i].vnum == 1)
  2599. {
  2600. PointChange(POINT_GOLD, 1000, true);
  2601. }
  2602. else
  2603. {
  2604. AutoGiveItem(bi[i].vnum, bi[i].count);
  2605. }
  2606. ITEM_MANAGER::instance().RemoveItem(item);
  2607. }
  2608. break;
  2609.  
  2610. case 50004: // ہج؛¥ئ®؟ë °¨ءِ±â
  2611. {
  2612. if (item->GetSocket(0))
  2613. {
  2614. item->SetSocket(0, item->GetSocket(0) + 1);
  2615. }
  2616. else
  2617. {
  2618. // أ³ہ½ »ç؟ë½أ
  2619. int iMapIndex = GetMapIndex();
  2620.  
  2621. PIXEL_POSITION pos;
  2622.  
  2623. if (SECTREE_MANAGER::instance().GetRandomLocation(iMapIndex, pos, 700))
  2624. {
  2625. item->SetSocket(0, 1);
  2626. item->SetSocket(1, pos.x);
  2627. item->SetSocket(2, pos.y);
  2628. }
  2629. else
  2630. {
  2631. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج °÷؟،¼± ہج؛¥ئ®؟ë °¨ءِ±â°، µ؟ہغادءِ ¾ت´آ°ح °°½ہ´د´ظ."));
  2632. return false;
  2633. }
  2634. }
  2635.  
  2636. int dist = 0;
  2637. float distance = (DISTANCE_SQRT(GetX()-item->GetSocket(1), GetY()-item->GetSocket(2)));
  2638.  
  2639. if (distance < 1000.0f)
  2640. {
  2641. // ¹ك°ك!
  2642. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج؛¥ئ®؟ë °¨ءِ±â°، ½إ؛ٌ·خ؟î ؛ûہ» ³»¸ç »ç¶َء‎´د´ظ."));
  2643.  
  2644. // »ç؟ëب½¼ِ؟، µû¶َ ءض´آ ¾ئہجإغہ» ´ظ¸£°ش ار´ظ.
  2645. struct TEventStoneInfo
  2646. {
  2647. DWORD dwVnum;
  2648. int count;
  2649. int prob;
  2650. };
  2651. const int EVENT_STONE_MAX_INFO = 15;
  2652. TEventStoneInfo info_10[EVENT_STONE_MAX_INFO] =
  2653. {
  2654. { 27001, 10, 8 },
  2655. { 27004, 10, 6 },
  2656. { 27002, 10, 12 },
  2657. { 27005, 10, 12 },
  2658. { 27100, 1, 9 },
  2659. { 27103, 1, 9 },
  2660. { 27101, 1, 10 },
  2661. { 27104, 1, 10 },
  2662. { 27999, 1, 12 },
  2663.  
  2664. { 25040, 1, 4 },
  2665.  
  2666. { 27410, 1, 0 },
  2667. { 27600, 1, 0 },
  2668. { 25100, 1, 0 },
  2669.  
  2670. { 50001, 1, 0 },
  2671. { 50003, 1, 1 },
  2672. };
  2673. TEventStoneInfo info_7[EVENT_STONE_MAX_INFO] =
  2674. {
  2675. { 27001, 10, 1 },
  2676. { 27004, 10, 1 },
  2677. { 27004, 10, 9 },
  2678. { 27005, 10, 9 },
  2679. { 27100, 1, 5 },
  2680. { 27103, 1, 5 },
  2681. { 27101, 1, 10 },
  2682. { 27104, 1, 10 },
  2683. { 27999, 1, 14 },
  2684.  
  2685. { 25040, 1, 5 },
  2686.  
  2687. { 27410, 1, 5 },
  2688. { 27600, 1, 5 },
  2689. { 25100, 1, 5 },
  2690.  
  2691. { 50001, 1, 0 },
  2692. { 50003, 1, 5 },
  2693.  
  2694. };
  2695. TEventStoneInfo info_4[EVENT_STONE_MAX_INFO] =
  2696. {
  2697. { 27001, 10, 0 },
  2698. { 27004, 10, 0 },
  2699. { 27002, 10, 0 },
  2700. { 27005, 10, 0 },
  2701. { 27100, 1, 0 },
  2702. { 27103, 1, 0 },
  2703. { 27101, 1, 0 },
  2704. { 27104, 1, 0 },
  2705. { 27999, 1, 25 },
  2706.  
  2707. { 25040, 1, 0 },
  2708.  
  2709. { 27410, 1, 0 },
  2710. { 27600, 1, 0 },
  2711. { 25100, 1, 15 },
  2712.  
  2713. { 50001, 1, 10 },
  2714. { 50003, 1, 50 },
  2715.  
  2716. };
  2717.  
  2718. {
  2719. TEventStoneInfo* info;
  2720. if (item->GetSocket(0) <= 4)
  2721. info = info_4;
  2722. else if (item->GetSocket(0) <= 7)
  2723. info = info_7;
  2724. else
  2725. info = info_10;
  2726.  
  2727. int prob = number(1, 100);
  2728.  
  2729. for (int i = 0; i < EVENT_STONE_MAX_INFO; ++i)
  2730. {
  2731. if (!info[i].prob)
  2732. continue;
  2733.  
  2734. if (prob <= info[i].prob)
  2735. {
  2736. if (info[i].dwVnum == 50001)
  2737. {
  2738. DWORD * pdw = M2_NEW DWORD[2];
  2739.  
  2740. pdw[0] = info[i].dwVnum;
  2741. pdw[1] = info[i].count;
  2742.  
  2743. // أكأ·¼­´آ ¼زؤدہ» ¼³ء¤ار´ظ
  2744. DBManager::instance().ReturnQuery(QID_LOTTO, GetPlayerID(), pdw,
  2745. "INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
  2746. get_table_postfix(), GetPlayerID());
  2747. }
  2748. else
  2749. AutoGiveItem(info[i].dwVnum, info[i].count);
  2750.  
  2751. break;
  2752. }
  2753. prob -= info[i].prob;
  2754. }
  2755. }
  2756.  
  2757. char chatbuf[CHAT_MAX_LEN + 1];
  2758. int len = snprintf(chatbuf, sizeof(chatbuf), "StoneDetect %u 0 0", (DWORD)GetVID());
  2759.  
  2760. if (len < 0 || len >= (int) sizeof(chatbuf))
  2761. len = sizeof(chatbuf) - 1;
  2762.  
  2763. ++len; // \0 ¹®ہع±îءِ ؛¸³»±â
  2764.  
  2765. TPacketGCChat pack_chat;
  2766. pack_chat.header = HEADER_GC_CHAT;
  2767. pack_chat.size = sizeof(TPacketGCChat) + len;
  2768. pack_chat.type = CHAT_TYPE_COMMAND;
  2769. pack_chat.id = 0;
  2770. pack_chat.bEmpire = GetDesc()->GetEmpire();
  2771. //pack_chat.id = vid;
  2772.  
  2773. TEMP_BUFFER buf;
  2774. buf.write(&pack_chat, sizeof(TPacketGCChat));
  2775. buf.write(chatbuf, len);
  2776.  
  2777. PacketAround(buf.read_peek(), buf.size());
  2778.  
  2779. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (DETECT_EVENT_STONE) 1");
  2780. return true;
  2781. }
  2782. else if (distance < 20000)
  2783. dist = 1;
  2784. else if (distance < 70000)
  2785. dist = 2;
  2786. else
  2787. dist = 3;
  2788.  
  2789. // ¸¹ہج »ç؟ëاكہ¸¸é »ç¶َءّ´ظ.
  2790. const int STONE_DETECT_MAX_TRY = 10;
  2791. if (item->GetSocket(0) >= STONE_DETECT_MAX_TRY)
  2792. {
  2793. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج؛¥ئ®؟ë °¨ءِ±â°، بçہûµµ ¾ّہج »ç¶َء‎´د´ظ."));
  2794. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (DETECT_EVENT_STONE) 0");
  2795. AutoGiveItem(27002);
  2796. return true;
  2797. }
  2798.  
  2799. if (dist)
  2800. {
  2801. char chatbuf[CHAT_MAX_LEN + 1];
  2802. int len = snprintf(chatbuf, sizeof(chatbuf),
  2803. "StoneDetect %u %d %d",
  2804. (DWORD)GetVID(), dist, (int)GetDegreeFromPositionXY(GetX(), item->GetSocket(2), item->GetSocket(1), GetY()));
  2805.  
  2806. if (len < 0 || len >= (int) sizeof(chatbuf))
  2807. len = sizeof(chatbuf) - 1;
  2808.  
  2809. ++len; // \0 ¹®ہع±îءِ ؛¸³»±â
  2810.  
  2811. TPacketGCChat pack_chat;
  2812. pack_chat.header = HEADER_GC_CHAT;
  2813. pack_chat.size = sizeof(TPacketGCChat) + len;
  2814. pack_chat.type = CHAT_TYPE_COMMAND;
  2815. pack_chat.id = 0;
  2816. pack_chat.bEmpire = GetDesc()->GetEmpire();
  2817. //pack_chat.id = vid;
  2818.  
  2819. TEMP_BUFFER buf;
  2820. buf.write(&pack_chat, sizeof(TPacketGCChat));
  2821. buf.write(chatbuf, len);
  2822.  
  2823. PacketAround(buf.read_peek(), buf.size());
  2824. }
  2825.  
  2826. }
  2827. break;
  2828.  
  2829. case 27989: // ؟µ¼®°¨ءِ±â
  2830. case 76006: // ¼±¹°؟ë ؟µ¼®°¨ءِ±â
  2831. {
  2832. LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());
  2833.  
  2834. if (pMap != NULL)
  2835. {
  2836. item->SetSocket(0, item->GetSocket(0) + 1);
  2837.  
  2838. FFindStone f;
  2839.  
  2840. // <Factor> SECTREE::for_each -> SECTREE::for_each_entity
  2841. pMap->for_each(f);
  2842.  
  2843. if (f.m_mapStone.size() > 0)
  2844. {
  2845. std::map<DWORD, LPCHARACTER>::iterator stone = f.m_mapStone.begin();
  2846.  
  2847. DWORD max = UINT_MAX;
  2848. LPCHARACTER pTarget = stone->second;
  2849.  
  2850. while (stone != f.m_mapStone.end())
  2851. {
  2852. DWORD dist = (DWORD)DISTANCE_SQRT(GetX()-stone->second->GetX(), GetY()-stone->second->GetY());
  2853.  
  2854. if (dist != 0 && max > dist)
  2855. {
  2856. max = dist;
  2857. pTarget = stone->second;
  2858. }
  2859. stone++;
  2860. }
  2861.  
  2862. if (pTarget != NULL)
  2863. {
  2864. int val = 3;
  2865.  
  2866. if (max < 10000) val = 2;
  2867. else if (max < 70000) val = 1;
  2868.  
  2869. ChatPacket(CHAT_TYPE_COMMAND, "StoneDetect %u %d %d", (DWORD)GetVID(), val,
  2870. (int)GetDegreeFromPositionXY(GetX(), pTarget->GetY(), pTarget->GetX(), GetY()));
  2871. }
  2872. else
  2873. {
  2874. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°¨ءِ±â¸¦ ہغ؟ëاد؟´ہ¸³ھ °¨ءِµا´آ ؟µ¼®ہج ¾ّ½ہ´د´ظ."));
  2875. }
  2876. }
  2877. else
  2878. {
  2879. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°¨ءِ±â¸¦ ہغ؟ëاد؟´ہ¸³ھ °¨ءِµا´آ ؟µ¼®ہج ¾ّ½ہ´د´ظ."));
  2880. }
  2881.  
  2882. if (item->GetSocket(0) >= 6)
  2883. {
  2884. ChatPacket(CHAT_TYPE_COMMAND, "StoneDetect %u 0 0", (DWORD)GetVID());
  2885. ITEM_MANAGER::instance().RemoveItem(item);
  2886. }
  2887. }
  2888. break;
  2889. }
  2890. break;
  2891.  
  2892. case 27996: // µ¶؛´
  2893. item->SetCount(item->GetCount() - 1);
  2894. AttackedByPoison(NULL); // @warme008
  2895. break;
  2896.  
  2897. case 27987: // ء¶°³
  2898. // 50 µ¹ء¶°¢ 47990
  2899. // 30 ²خ
  2900. // 10 ¹éءّءض 47992
  2901. // 7 أ»ءّءض 47993
  2902. // 3 ااءّءض 47994
  2903. {
  2904. item->SetCount(item->GetCount() - 1);
  2905.  
  2906. int r = number(1, 100);
  2907.  
  2908. if (r <= 50)
  2909. {
  2910. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء¶°³؟،¼­ µ¹ء¶°¢ہج ³ھ؟ش½ہ´د´ظ."));
  2911. AutoGiveItem(27990);
  2912. }
  2913. else
  2914. {
  2915. const int prob_table_gb2312[] =
  2916. {
  2917. 95, 97, 99
  2918. };
  2919.  
  2920. const int * prob_table = prob_table_gb2312;
  2921.  
  2922. if (r <= prob_table[0])
  2923. {
  2924. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء¶°³°، بçہûµµ ¾ّہج »ç¶َء‎´د´ظ."));
  2925. }
  2926. else if (r <= prob_table[1])
  2927. {
  2928. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء¶°³؟،¼­ ¹éءّءض°، ³ھ؟ش½ہ´د´ظ."));
  2929. AutoGiveItem(27992);
  2930. }
  2931. else if (r <= prob_table[2])
  2932. {
  2933. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء¶°³؟،¼­ أ»ءّءض°، ³ھ؟ش½ہ´د´ظ."));
  2934. AutoGiveItem(27993);
  2935. }
  2936. else
  2937. {
  2938. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء¶°³؟،¼­ ااءّءض°، ³ھ؟ش½ہ´د´ظ."));
  2939. AutoGiveItem(27994);
  2940. }
  2941. }
  2942. }
  2943. break;
  2944.  
  2945. case 71013: // أàء¦؟ëئّء×
  2946. CreateFly(number(FLY_FIREWORK1, FLY_FIREWORK6), this);
  2947. item->SetCount(item->GetCount() - 1);
  2948. break;
  2949.  
  2950. case 50100: // ئّء×
  2951. case 50101:
  2952. case 50102:
  2953. case 50103:
  2954. case 50104:
  2955. case 50105:
  2956. case 50106:
  2957. CreateFly(item->GetVnum() - 50100 + FLY_FIREWORK1, this);
  2958. item->SetCount(item->GetCount() - 1);
  2959. break;
  2960.  
  2961. case 50200: // ؛¸µû¸®
  2962. if (g_bEnableBootaryCheck)
  2963. {
  2964. if (IS_BOTARYABLE_ZONE(GetMapIndex()) == true)
  2965. {
  2966. __OpenPrivateShop();
  2967. }
  2968. else
  2969. {
  2970. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³ہخ »َء،ہ» ؟­ ¼ِ ¾ّ´آ ءِ؟ھہش´د´ظ"));
  2971. }
  2972. }
  2973. else
  2974. {
  2975. __OpenPrivateShop();
  2976. }
  2977. break;
  2978.  
  2979. case fishing::FISH_MIND_PILL_VNUM:
  2980. AddAffect(AFFECT_FISH_MIND_PILL, POINT_NONE, 0, AFF_FISH_MIND, 20*60, 0, true);
  2981. item->SetCount(item->GetCount() - 1);
  2982. break;
  2983.  
  2984. case 50301: // إë¼ض·آ ¼ِ·أ¼­
  2985. case 50302:
  2986. case 50303:
  2987. {
  2988. if (IsPolymorphed() == true)
  2989. {
  2990. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µذ°© ءك؟،´آ ´ة·آہ» ؟أ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  2991. return false;
  2992. }
  2993.  
  2994. int lv = GetSkillLevel(SKILL_LEADERSHIP);
  2995.  
  2996. if (lv < item->GetValue(0))
  2997. {
  2998. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج أ¥ہ؛ ³ت¹« ¾î·ء؟ِ ہجاطاد±â°، بûµى´د´ظ."));
  2999. return false;
  3000. }
  3001.  
  3002. if (lv >= item->GetValue(1))
  3003. {
  3004. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج أ¥ہ؛ ¾ئ¹«¸® ؛ءµµ µµ؟ٍہج µة °ح °°ءِ ¾ت½ہ´د´ظ."));
  3005. return false;
  3006. }
  3007.  
  3008. if (LearnSkillByBook(SKILL_LEADERSHIP))
  3009. {
  3010. #ifdef ENABLE_BOOKS_STACKFIX
  3011. item->SetCount(item->GetCount() - 1);
  3012. #else
  3013. ITEM_MANAGER::instance().RemoveItem(item);
  3014. #endif
  3015.  
  3016. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3017. if (distribution_test_server) iReadDelay /= 3;
  3018.  
  3019. SetSkillNextReadTime(SKILL_LEADERSHIP, get_global_time() + iReadDelay);
  3020. }
  3021. }
  3022. break;
  3023.  
  3024. case 50304: // ؟¬°è±â ¼ِ·أ¼­
  3025. case 50305:
  3026. case 50306:
  3027. {
  3028. if (IsPolymorphed())
  3029. {
  3030. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3031. return false;
  3032.  
  3033. }
  3034. if (GetSkillLevel(SKILL_COMBO) == 0 && GetLevel() < 30)
  3035. {
  3036. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·¹؛§ 30ہج µا±â ہü؟،´آ ½ہµواز ¼ِ ہضہ» °ح °°ءِ ¾ت½ہ´د´ظ."));
  3037. return false;
  3038. }
  3039.  
  3040. if (GetSkillLevel(SKILL_COMBO) == 1 && GetLevel() < 50)
  3041. {
  3042. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·¹؛§ 50ہج µا±â ہü؟،´آ ½ہµواز ¼ِ ہضہ» °ح °°ءِ ¾ت½ہ´د´ظ."));
  3043. return false;
  3044. }
  3045.  
  3046. if (GetSkillLevel(SKILL_COMBO) >= 2)
  3047. {
  3048. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؟¬°è±â´آ ´ُہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3049. return false;
  3050. }
  3051.  
  3052. int iPct = item->GetValue(0);
  3053.  
  3054. if (LearnSkillByBook(SKILL_COMBO, iPct))
  3055. {
  3056. #ifdef ENABLE_BOOKS_STACKFIX
  3057. item->SetCount(item->GetCount() - 1);
  3058. #else
  3059. ITEM_MANAGER::instance().RemoveItem(item);
  3060. #endif
  3061.  
  3062. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3063. if (distribution_test_server) iReadDelay /= 3;
  3064.  
  3065. SetSkillNextReadTime(SKILL_COMBO, get_global_time() + iReadDelay);
  3066. }
  3067. }
  3068. break;
  3069. case 50311: // ¾ً¾î ¼ِ·أ¼­
  3070. case 50312:
  3071. case 50313:
  3072. {
  3073. if (IsPolymorphed())
  3074. {
  3075. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3076. return false;
  3077.  
  3078. }
  3079. DWORD dwSkillVnum = item->GetValue(0);
  3080. int iPct = MINMAX(0, item->GetValue(1), 100);
  3081. if (GetSkillLevel(dwSkillVnum)>=20 || dwSkillVnum-SKILL_LANGUAGE1+1 == GetEmpire())
  3082. {
  3083. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ؟د؛®اد°ش ¾ث¾ئµéہ» ¼ِ ہض´آ ¾ً¾îہج´ظ."));
  3084. return false;
  3085. }
  3086.  
  3087. if (LearnSkillByBook(dwSkillVnum, iPct))
  3088. {
  3089. #ifdef ENABLE_BOOKS_STACKFIX
  3090. item->SetCount(item->GetCount() - 1);
  3091. #else
  3092. ITEM_MANAGER::instance().RemoveItem(item);
  3093. #endif
  3094.  
  3095. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3096. if (distribution_test_server) iReadDelay /= 3;
  3097.  
  3098. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3099. }
  3100. }
  3101. break;
  3102.  
  3103. case 50061 : // ہد؛» ¸» ¼زب¯ ½؛إ³ ¼ِ·أ¼­
  3104. {
  3105. if (IsPolymorphed())
  3106. {
  3107. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3108. return false;
  3109.  
  3110. }
  3111. DWORD dwSkillVnum = item->GetValue(0);
  3112. int iPct = MINMAX(0, item->GetValue(1), 100);
  3113.  
  3114. if (GetSkillLevel(dwSkillVnum) >= 10)
  3115. {
  3116. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3117. return false;
  3118. }
  3119.  
  3120. if (LearnSkillByBook(dwSkillVnum, iPct))
  3121. {
  3122. #ifdef ENABLE_BOOKS_STACKFIX
  3123. item->SetCount(item->GetCount() - 1);
  3124. #else
  3125. ITEM_MANAGER::instance().RemoveItem(item);
  3126. #endif
  3127.  
  3128. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3129. if (distribution_test_server) iReadDelay /= 3;
  3130.  
  3131. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3132. }
  3133. }
  3134. break;
  3135.  
  3136. case 50314: case 50315: case 50316: // ؛¯½إ ¼ِ·أ¼­
  3137. case 50323: case 50324: // ءُا÷ ¼ِ·أ¼­
  3138. case 50325: case 50326: // أ¶إë ¼ِ·أ¼­
  3139. {
  3140. if (IsPolymorphed() == true)
  3141. {
  3142. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µذ°© ءك؟،´آ ´ة·آہ» ؟أ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  3143. return false;
  3144. }
  3145.  
  3146. int iSkillLevelLowLimit = item->GetValue(0);
  3147. int iSkillLevelHighLimit = item->GetValue(1);
  3148. int iPct = MINMAX(0, item->GetValue(2), 100);
  3149. int iLevelLimit = item->GetValue(3);
  3150. DWORD dwSkillVnum = 0;
  3151.  
  3152. switch (item->GetVnum())
  3153. {
  3154. case 50314: case 50315: case 50316:
  3155. dwSkillVnum = SKILL_POLYMORPH;
  3156. break;
  3157.  
  3158. case 50323: case 50324:
  3159. dwSkillVnum = SKILL_ADD_HP;
  3160. break;
  3161.  
  3162. case 50325: case 50326:
  3163. dwSkillVnum = SKILL_RESIST_PENETRATE;
  3164. break;
  3165.  
  3166. default:
  3167. return false;
  3168. }
  3169.  
  3170. if (0 == dwSkillVnum)
  3171. return false;
  3172.  
  3173. if (GetLevel() < iLevelLimit)
  3174. {
  3175. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج أ¥ہ» ہذہ¸·ء¸é ·¹؛§ہ» ´ُ ؟أ·ء¾ك اص´د´ظ."));
  3176. return false;
  3177. }
  3178.  
  3179. if (GetSkillLevel(dwSkillVnum) >= 40)
  3180. {
  3181. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3182. return false;
  3183. }
  3184.  
  3185. if (GetSkillLevel(dwSkillVnum) < iSkillLevelLowLimit)
  3186. {
  3187. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج أ¥ہ؛ ³ت¹« ¾î·ء؟ِ ہجاطاد±â°، بûµى´د´ظ."));
  3188. return false;
  3189. }
  3190.  
  3191. if (GetSkillLevel(dwSkillVnum) >= iSkillLevelHighLimit)
  3192. {
  3193. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج أ¥ہ¸·خ´آ ´ُ ہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3194. return false;
  3195. }
  3196.  
  3197. if (LearnSkillByBook(dwSkillVnum, iPct))
  3198. {
  3199. #ifdef ENABLE_BOOKS_STACKFIX
  3200. item->SetCount(item->GetCount() - 1);
  3201. #else
  3202. ITEM_MANAGER::instance().RemoveItem(item);
  3203. #endif
  3204.  
  3205. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3206. if (distribution_test_server) iReadDelay /= 3;
  3207.  
  3208. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3209. }
  3210. }
  3211. break;
  3212.  
  3213. case 50902:
  3214. case 50903:
  3215. case 50904:
  3216. {
  3217. if (IsPolymorphed())
  3218. {
  3219. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3220. return false;
  3221.  
  3222. }
  3223. DWORD dwSkillVnum = SKILL_CREATE;
  3224. int iPct = MINMAX(0, item->GetValue(1), 100);
  3225.  
  3226. if (GetSkillLevel(dwSkillVnum)>=40)
  3227. {
  3228. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3229. return false;
  3230. }
  3231.  
  3232. if (LearnSkillByBook(dwSkillVnum, iPct))
  3233. {
  3234. #ifdef ENABLE_BOOKS_STACKFIX
  3235. item->SetCount(item->GetCount() - 1);
  3236. #else
  3237. ITEM_MANAGER::instance().RemoveItem(item);
  3238. #endif
  3239.  
  3240. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3241. if (distribution_test_server) iReadDelay /= 3;
  3242.  
  3243. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3244.  
  3245. if (test_server)
  3246. {
  3247. ChatPacket(CHAT_TYPE_INFO, "[TEST_SERVER] Success to learn skill ");
  3248. }
  3249. }
  3250. else
  3251. {
  3252. if (test_server)
  3253. {
  3254. ChatPacket(CHAT_TYPE_INFO, "[TEST_SERVER] Failed to learn skill ");
  3255. }
  3256. }
  3257. }
  3258. break;
  3259.  
  3260. // MINING
  3261. case ITEM_MINING_SKILL_TRAIN_BOOK:
  3262. {
  3263. if (IsPolymorphed())
  3264. {
  3265. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3266. return false;
  3267.  
  3268. }
  3269. DWORD dwSkillVnum = SKILL_MINING;
  3270. int iPct = MINMAX(0, item->GetValue(1), 100);
  3271.  
  3272. if (GetSkillLevel(dwSkillVnum)>=40)
  3273. {
  3274. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ¼ِ·أاز ¼ِ ¾ّ½ہ´د´ظ."));
  3275. return false;
  3276. }
  3277.  
  3278. if (LearnSkillByBook(dwSkillVnum, iPct))
  3279. {
  3280. #ifdef ENABLE_BOOKS_STACKFIX
  3281. item->SetCount(item->GetCount() - 1);
  3282. #else
  3283. ITEM_MANAGER::instance().RemoveItem(item);
  3284. #endif
  3285.  
  3286. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3287. if (distribution_test_server) iReadDelay /= 3;
  3288.  
  3289. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3290. }
  3291. }
  3292. break;
  3293. // END_OF_MINING
  3294.  
  3295. case ITEM_HORSE_SKILL_TRAIN_BOOK:
  3296. {
  3297. if (IsPolymorphed())
  3298. {
  3299. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯½إءك؟،´آ أ¥ہ» ہذہ»¼ِ ¾ّ½ہ´د´ظ."));
  3300. return false;
  3301.  
  3302. }
  3303. DWORD dwSkillVnum = SKILL_HORSE;
  3304. int iPct = MINMAX(0, item->GetValue(1), 100);
  3305.  
  3306. if (GetLevel() < 50)
  3307. {
  3308. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ ½آ¸¶ ½؛إ³ہ» ¼ِ·أاز ¼ِ ہض´آ ·¹؛§ہج ¾ئ´ص´د´ظ."));
  3309. return false;
  3310. }
  3311.  
  3312. if (!test_server && get_global_time() < GetSkillNextReadTime(dwSkillVnum))
  3313. {
  3314. if (FindAffect(AFFECT_SKILL_NO_BOOK_DELAY))
  3315. {
  3316. // ءض¾ب¼ْ¼­ »ç؟ëءك؟،´آ ½أ°£ ء¦ار ¹«½أ
  3317. RemoveAffect(AFFECT_SKILL_NO_BOOK_DELAY);
  3318. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ءض¾ب¼ْ¼­¸¦ إëاط ءضب­ہش¸¶؟،¼­ ؛üء®³ھ؟ش½ہ´د´ظ."));
  3319. }
  3320. else
  3321. {
  3322. SkillLearnWaitMoreTimeMessage(GetSkillNextReadTime(dwSkillVnum) - get_global_time());
  3323. return false;
  3324. }
  3325. }
  3326.  
  3327. if (GetPoint(POINT_HORSE_SKILL) >= 20 ||
  3328. GetSkillLevel(SKILL_HORSE_WILDATTACK) + GetSkillLevel(SKILL_HORSE_CHARGE) + GetSkillLevel(SKILL_HORSE_ESCAPE) >= 60 ||
  3329. GetSkillLevel(SKILL_HORSE_WILDATTACK_RANGE) + GetSkillLevel(SKILL_HORSE_CHARGE) + GetSkillLevel(SKILL_HORSE_ESCAPE) >= 60)
  3330. {
  3331. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ½آ¸¶ ¼ِ·أ¼­¸¦ ہذہ» ¼ِ ¾ّ½ہ´د´ظ."));
  3332. return false;
  3333. }
  3334.  
  3335. if (number(1, 100) <= iPct)
  3336. {
  3337. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("½آ¸¶ ¼ِ·أ¼­¸¦ ہذ¾î ½آ¸¶ ½؛إ³ ئ÷ہخئ®¸¦ ¾ٍ¾ْ½ہ´د´ظ."));
  3338. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ٍہ؛ ئ÷ہخئ®·خ´آ ½آ¸¶ ½؛إ³ہا ·¹؛§ہ» ؟أ¸± ¼ِ ہض½ہ´د´ظ."));
  3339. PointChange(POINT_HORSE_SKILL, 1);
  3340.  
  3341. int iReadDelay = number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
  3342. if (distribution_test_server) iReadDelay /= 3;
  3343.  
  3344. if (!test_server)
  3345. SetSkillNextReadTime(dwSkillVnum, get_global_time() + iReadDelay);
  3346. }
  3347. else
  3348. {
  3349. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("½آ¸¶ ¼ِ·أ¼­ ہجاط؟، ½ائذاد؟´½ہ´د´ظ."));
  3350. }
  3351. #ifdef ENABLE_BOOKS_STACKFIX
  3352. item->SetCount(item->GetCount() - 1);
  3353. #else
  3354. ITEM_MANAGER::instance().RemoveItem(item);
  3355. #endif
  3356. }
  3357. break;
  3358.  
  3359. case 70102: // ¼±µخ
  3360. case 70103: // ¼±µخ
  3361. {
  3362. if (GetAlignment() >= 0)
  3363. return false;
  3364.  
  3365. int delta = MIN(-GetAlignment(), item->GetValue(0));
  3366.  
  3367. sys_log(0, "%s ALIGNMENT ITEM %d", GetName(), delta);
  3368.  
  3369. UpdateAlignment(delta);
  3370. item->SetCount(item->GetCount() - 1);
  3371.  
  3372. if (delta / 10 > 0)
  3373. {
  3374. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("¸¶ہ½ہج ¸¼¾ئءِ´آ±؛. °،½؟ہ» ء‏´©¸£´ّ ¹«¾ً°،°، ء» °،؛­؟ِءّ ´ہ³¦ہج¾ك."));
  3375. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼±¾اؤ،°، %d ءُ°،اد؟´½ہ´د´ظ."), delta/10);
  3376. }
  3377. }
  3378. break;
  3379.  
  3380. case 71107: // أµµµ؛¹¼‏¾ئ
  3381. {
  3382. int val = item->GetValue(0);
  3383. int interval = item->GetValue(1);
  3384. quest::PC* pPC = quest::CQuestManager::instance().GetPC(GetPlayerID());
  3385. int last_use_time = pPC->GetFlag("mythical_peach.last_use_time");
  3386.  
  3387. if (get_global_time() - last_use_time < interval * 60 * 60)
  3388. {
  3389. if (test_server == false)
  3390. {
  3391. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  3392. return false;
  3393. }
  3394. else
  3395. {
  3396. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("إ×½؛ئ® ¼­¹ِ ½أ°£ء¦ار إë°ْ"));
  3397. }
  3398. }
  3399.  
  3400. if (GetAlignment() == 200000)
  3401. {
  3402. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼±¾اؤ،¸¦ ´ُ ہج»َ ؟أ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  3403. return false;
  3404. }
  3405.  
  3406. if (200000 - GetAlignment() < val * 10)
  3407. {
  3408. val = (200000 - GetAlignment()) / 10;
  3409. }
  3410.  
  3411. int old_alignment = GetAlignment() / 10;
  3412.  
  3413. UpdateAlignment(val*10);
  3414.  
  3415. item->SetCount(item->GetCount()-1);
  3416. pPC->SetFlag("mythical_peach.last_use_time", get_global_time());
  3417.  
  3418. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("¸¶ہ½ہج ¸¼¾ئءِ´آ±؛. °،½؟ہ» ء‏´©¸£´ّ ¹«¾ً°،°، ء» °،؛­؟ِءّ ´ہ³¦ہج¾ك."));
  3419. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼±¾اؤ،°، %d ءُ°،اد؟´½ہ´د´ظ."), val);
  3420.  
  3421. char buf[256 + 1];
  3422. snprintf(buf, sizeof(buf), "%d %d", old_alignment, GetAlignment() / 10);
  3423. LogManager::instance().CharLog(this, val, "MYTHICAL_PEACH", buf);
  3424. }
  3425. break;
  3426.  
  3427. case 71109: // إ»¼®¼­
  3428. case 72719:
  3429. {
  3430. LPITEM item2;
  3431.  
  3432. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  3433. return false;
  3434.  
  3435. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  3436. return false;
  3437.  
  3438. if (item2->GetSocketCount() == 0)
  3439. return false;
  3440.  
  3441. switch( item2->GetType() )
  3442. {
  3443. case ITEM_WEAPON:
  3444. break;
  3445. case ITEM_ARMOR:
  3446. switch (item2->GetSubType())
  3447. {
  3448. case ARMOR_EAR:
  3449. case ARMOR_WRIST:
  3450. case ARMOR_NECK:
  3451. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»©³¾ ؟µ¼®ہج ¾ّ½ہ´د´ظ"));
  3452. return false;
  3453. }
  3454. break;
  3455.  
  3456. default:
  3457. return false;
  3458. }
  3459.  
  3460. std::stack<long> socket;
  3461.  
  3462. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  3463. socket.push(item2->GetSocket(i));
  3464.  
  3465. int idx = ITEM_SOCKET_MAX_NUM - 1;
  3466.  
  3467. while (socket.size() > 0)
  3468. {
  3469. if (socket.top() > 2 && socket.top() != ITEM_BROKEN_METIN_VNUM)
  3470. break;
  3471.  
  3472. idx--;
  3473. socket.pop();
  3474. }
  3475.  
  3476. if (socket.size() == 0)
  3477. {
  3478. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»©³¾ ؟µ¼®ہج ¾ّ½ہ´د´ظ"));
  3479. return false;
  3480. }
  3481.  
  3482. LPITEM pItemReward = AutoGiveItem(socket.top());
  3483.  
  3484. if (pItemReward != NULL)
  3485. {
  3486. item2->SetSocket(idx, 1);
  3487.  
  3488. char buf[256+1];
  3489. snprintf(buf, sizeof(buf), "%s(%u) %s(%u)",
  3490. item2->GetName(), item2->GetID(), pItemReward->GetName(), pItemReward->GetID());
  3491. LogManager::instance().ItemLog(this, item, "USE_DETACHMENT_ONE", buf);
  3492.  
  3493. item->SetCount(item->GetCount() - 1);
  3494. }
  3495. }
  3496. break;
  3497.  
  3498. case 70201: // إ»»ِء¦
  3499. case 70202: // ؟°»ِ¾à(بٍ»ِ)
  3500. case 70203: // ؟°»ِ¾à(±ف»ِ)
  3501. case 70204: // ؟°»ِ¾à(»،°£»ِ)
  3502. case 70205: // ؟°»ِ¾à(°¥»ِ)
  3503. case 70206: // ؟°»ِ¾à(°ثہ؛»ِ)
  3504. {
  3505. // NEW_HAIR_STYLE_ADD
  3506. if (GetPart(PART_HAIR) >= 1001)
  3507. {
  3508. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("اِہç اى¾î½؛إ¸ہد؟،¼­´آ ؟°»ِ°ْ إ»»ِہج ؛ز°،´ةاص´د´ظ."));
  3509. }
  3510. // END_NEW_HAIR_STYLE_ADD
  3511. else
  3512. {
  3513. quest::CQuestManager& q = quest::CQuestManager::instance();
  3514. quest::PC* pPC = q.GetPC(GetPlayerID());
  3515.  
  3516. if (pPC)
  3517. {
  3518. int last_dye_level = pPC->GetFlag("dyeing_hair.last_dye_level");
  3519.  
  3520. if (last_dye_level == 0 ||
  3521. last_dye_level+3 <= GetLevel() ||
  3522. item->GetVnum() == 70201)
  3523. {
  3524. SetPart(PART_HAIR, item->GetVnum() - 70201);
  3525.  
  3526. if (item->GetVnum() == 70201)
  3527. pPC->SetFlag("dyeing_hair.last_dye_level", 0);
  3528. else
  3529. pPC->SetFlag("dyeing_hair.last_dye_level", GetLevel());
  3530.  
  3531. item->SetCount(item->GetCount() - 1);
  3532. UpdatePacket();
  3533. }
  3534. else
  3535. {
  3536. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d ·¹؛§ہج µا¾î¾ك ´ظ½أ ؟°»ِاد½ا ¼ِ ہض½ہ´د´ظ."), last_dye_level+3);
  3537. }
  3538. }
  3539. }
  3540. }
  3541. break;
  3542.  
  3543. case ITEM_NEW_YEAR_GREETING_VNUM:
  3544. {
  3545. DWORD dwBoxVnum = ITEM_NEW_YEAR_GREETING_VNUM;
  3546. std::vector <DWORD> dwVnums;
  3547. std::vector <DWORD> dwCounts;
  3548. std::vector <LPITEM> item_gets;
  3549. int count = 0;
  3550.  
  3551. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  3552. {
  3553. for (int i = 0; i < count; i++)
  3554. {
  3555. if (dwVnums[i] == CSpecialItemGroup::GOLD)
  3556. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %d ³ةہ» ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  3557. }
  3558.  
  3559. item->SetCount(item->GetCount() - 1);
  3560. }
  3561. }
  3562. break;
  3563.  
  3564. case ITEM_VALENTINE_ROSE:
  3565. case ITEM_VALENTINE_CHOCOLATE:
  3566. {
  3567. DWORD dwBoxVnum = item->GetVnum();
  3568. std::vector <DWORD> dwVnums;
  3569. std::vector <DWORD> dwCounts;
  3570. std::vector <LPITEM> item_gets(0);
  3571. int count = 0;
  3572.  
  3573.  
  3574. if (((item->GetVnum() == ITEM_VALENTINE_ROSE) && (SEX_MALE==GET_SEX(this))) ||
  3575. ((item->GetVnum() == ITEM_VALENTINE_CHOCOLATE) && (SEX_FEMALE==GET_SEX(this))))
  3576. {
  3577. // ¼؛؛°ہج ¸آءِ¾ت¾ئ ¾µ ¼ِ ¾ّ´ظ.
  3578. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼؛؛°ہج ¸آءِ¾ت¾ئ ہج ¾ئہجإغہ» ؟­ ¼ِ ¾ّ½ہ´د´ظ."));
  3579. return false;
  3580. }
  3581.  
  3582.  
  3583. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  3584. item->SetCount(item->GetCount()-1);
  3585. }
  3586. break;
  3587.  
  3588. case ITEM_WHITEDAY_CANDY:
  3589. case ITEM_WHITEDAY_ROSE:
  3590. {
  3591. DWORD dwBoxVnum = item->GetVnum();
  3592. std::vector <DWORD> dwVnums;
  3593. std::vector <DWORD> dwCounts;
  3594. std::vector <LPITEM> item_gets(0);
  3595. int count = 0;
  3596.  
  3597.  
  3598. if (((item->GetVnum() == ITEM_WHITEDAY_CANDY) && (SEX_MALE==GET_SEX(this))) ||
  3599. ((item->GetVnum() == ITEM_WHITEDAY_ROSE) && (SEX_FEMALE==GET_SEX(this))))
  3600. {
  3601. // ¼؛؛°ہج ¸آءِ¾ت¾ئ ¾µ ¼ِ ¾ّ´ظ.
  3602. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼؛؛°ہج ¸آءِ¾ت¾ئ ہج ¾ئہجإغہ» ؟­ ¼ِ ¾ّ½ہ´د´ظ."));
  3603. return false;
  3604. }
  3605.  
  3606.  
  3607. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  3608. item->SetCount(item->GetCount()-1);
  3609. }
  3610. break;
  3611.  
  3612. case 50011: // ؟ù±¤؛¸اص
  3613. {
  3614. DWORD dwBoxVnum = 50011;
  3615. std::vector <DWORD> dwVnums;
  3616. std::vector <DWORD> dwCounts;
  3617. std::vector <LPITEM> item_gets(0);
  3618. int count = 0;
  3619.  
  3620. if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
  3621. {
  3622. for (int i = 0; i < count; i++)
  3623. {
  3624. char buf[50 + 1];
  3625. snprintf(buf, sizeof(buf), "%u %u", dwVnums[i], dwCounts[i]);
  3626. LogManager::instance().ItemLog(this, item, "MOONLIGHT_GET", buf);
  3627.  
  3628. //ITEM_MANAGER::instance().RemoveItem(item);
  3629. item->SetCount(item->GetCount() - 1);
  3630.  
  3631. switch (dwVnums[i])
  3632. {
  3633. case CSpecialItemGroup::GOLD:
  3634. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %d ³ةہ» ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  3635. break;
  3636.  
  3637. case CSpecialItemGroup::EXP:
  3638. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ؛خإح ½إ؛ٌار ؛ûہج ³ھ؟ة´د´ظ."));
  3639. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dہا °واèؤ،¸¦ ب¹µواك½ہ´د´ظ."), dwCounts[i]);
  3640. break;
  3641.  
  3642. case CSpecialItemGroup::MOB:
  3643. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  3644. break;
  3645.  
  3646. case CSpecialItemGroup::SLOW:
  3647. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ »،°£ ؟¬±â¸¦ µéہج¸¶½أہع ؟ٍء÷ہج´آ ¼سµµ°، ´ہ·ءء³½ہ´د´ظ!"));
  3648. break;
  3649.  
  3650. case CSpecialItemGroup::DRAIN_HP:
  3651. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع°، °©ہع±â ئّ¹كاد؟´½ہ´د´ظ! »‎¸ي·آہج °¨¼زاك½ہ´د´ظ."));
  3652. break;
  3653.  
  3654. case CSpecialItemGroup::POISON:
  3655. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  3656. break;
  3657. #ifdef ENABLE_WOLFMAN_CHARACTER
  3658. case CSpecialItemGroup::BLEEDING:
  3659. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ³ھ؟آ ³ى»ِ ؟¬±â¸¦ µéہج¸¶½أہع µ¶ہج ؟آ¸ِہ¸·خ ئغء‎´د´ظ!"));
  3660. break;
  3661. #endif
  3662. case CSpecialItemGroup::MOB_GROUP:
  3663. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ ¸َ½؛إح°، ³ھإ¸³µ½ہ´د´ظ!"));
  3664. break;
  3665.  
  3666. default:
  3667. if (item_gets[i])
  3668. {
  3669. if (dwCounts[i] > 1)
  3670. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، %d °³ ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName(), dwCounts[i]);
  3671. else
  3672. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»َہع؟،¼­ %s °، ³ھ؟ش½ہ´د´ظ."), item_gets[i]->GetName());
  3673. }
  3674. break;
  3675. }
  3676. }
  3677. }
  3678. else
  3679. {
  3680. ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("¾ئ¹«°حµµ ¾ٍہ» ¼ِ ¾ّ¾ْ½ہ´د´ظ."));
  3681. return false;
  3682. }
  3683. }
  3684. break;
  3685.  
  3686. case ITEM_GIVE_STAT_RESET_COUNT_VNUM:
  3687. {
  3688. //PointChange(POINT_GOLD, -iCost);
  3689. PointChange(POINT_STAT_RESET_COUNT, 1);
  3690. item->SetCount(item->GetCount()-1);
  3691. }
  3692. break;
  3693.  
  3694. case 50107:
  3695. {
  3696. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  3697. {
  3698. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  3699. return false;
  3700. }
  3701. EffectPacket(SE_CHINA_FIREWORK);
  3702. #ifdef ENABLE_FIREWORK_STUN
  3703. // ½؛إد °ّ°فہ» ؟أ·ءءط´ظ
  3704. AddAffect(AFFECT_CHINA_FIREWORK, POINT_STUN_PCT, 30, AFF_CHINA_FIREWORK, 5*60, 0, true);
  3705. #endif
  3706. item->SetCount(item->GetCount()-1);
  3707. }
  3708. break;
  3709.  
  3710. case 50108:
  3711. {
  3712. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  3713. {
  3714. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  3715. return false;
  3716. }
  3717. EffectPacket(SE_SPIN_TOP);
  3718. #ifdef ENABLE_FIREWORK_STUN
  3719. // ½؛إد °ّ°فہ» ؟أ·ءءط´ظ
  3720. AddAffect(AFFECT_CHINA_FIREWORK, POINT_STUN_PCT, 30, AFF_CHINA_FIREWORK, 5*60, 0, true);
  3721. #endif
  3722. item->SetCount(item->GetCount()-1);
  3723. }
  3724. break;
  3725.  
  3726. case ITEM_WONSO_BEAN_VNUM:
  3727. PointChange(POINT_HP, GetMaxHP() - GetHP());
  3728. item->SetCount(item->GetCount()-1);
  3729. break;
  3730.  
  3731. case ITEM_WONSO_SUGAR_VNUM:
  3732. PointChange(POINT_SP, GetMaxSP() - GetSP());
  3733. item->SetCount(item->GetCount()-1);
  3734. break;
  3735.  
  3736. case ITEM_WONSO_FRUIT_VNUM:
  3737. PointChange(POINT_STAMINA, GetMaxStamina()-GetStamina());
  3738. item->SetCount(item->GetCount()-1);
  3739. break;
  3740.  
  3741. case 90008: // VCARD
  3742. case 90009: // VCARD
  3743. VCardUse(this, this, item);
  3744. break;
  3745.  
  3746. case ITEM_ELK_VNUM: // µ·²ظ·¯¹ج
  3747. {
  3748. int iGold = item->GetSocket(0);
  3749. ITEM_MANAGER::instance().RemoveItem(item);
  3750. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %d ³ةہ» ب¹µواك½ہ´د´ظ."), iGold);
  3751. PointChange(POINT_GOLD, iGold);
  3752. }
  3753. break;
  3754.  
  3755. //±؛ءضہا ءُا¥
  3756. case 70021:
  3757. {
  3758. int HealPrice = quest::CQuestManager::instance().GetEventFlag("MonarchHealGold");
  3759. if (HealPrice == 0)
  3760. HealPrice = 2000000;
  3761.  
  3762. if (CMonarch::instance().HealMyEmpire(this, HealPrice))
  3763. {
  3764. char szNotice[256];
  3765. snprintf(szNotice, sizeof(szNotice), LC_TEXT("±؛ءضہا أà؛¹ہ¸·خ ہجءِ؟ھ %s ہ¯ہْ´آ HP,SP°، ¸ًµخ أ¤؟ِء‎´د´ظ."), EMPIRE_NAME(GetEmpire()));
  3766. SendNoticeMap(szNotice, GetMapIndex(), false);
  3767.  
  3768. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±؛ءضہا أà؛¹ہ» »ç؟ëاد؟´½ہ´د´ظ."));
  3769. }
  3770. }
  3771. break;
  3772.  
  3773. case 27995:
  3774. {
  3775. }
  3776. break;
  3777.  
  3778. case 71092 : // ؛¯½إ اطأ¼؛خ ہس½أ
  3779. {
  3780. if (m_pkChrTarget != NULL)
  3781. {
  3782. if (m_pkChrTarget->IsPolymorphed())
  3783. {
  3784. m_pkChrTarget->SetPolymorph(0);
  3785. m_pkChrTarget->RemoveAffect(AFFECT_POLYMORPH);
  3786. }
  3787. }
  3788. else
  3789. {
  3790. if (IsPolymorphed())
  3791. {
  3792. SetPolymorph(0);
  3793. RemoveAffect(AFFECT_POLYMORPH);
  3794. }
  3795. }
  3796. }
  3797. break;
  3798.  
  3799. case 71051 : // ءّہç°،
  3800. {
  3801. // ہ¯·´, ½ج°،ئْ, ؛£ئ®³² ءّہç°، »ç؟ë±فءِ
  3802. LPITEM item2;
  3803.  
  3804. if (!IsValidItemPosition(DestCell) || !(item2 = GetInventoryItem(wDestCell)))
  3805. return false;
  3806.  
  3807. if (ITEM_COSTUME == item2->GetType()) // @fixme124
  3808. {
  3809. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  3810. return false;
  3811. }
  3812.  
  3813. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  3814. return false;
  3815.  
  3816. if (item2->GetAttributeSetIndex() == -1)
  3817. {
  3818. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  3819. return false;
  3820. }
  3821.  
  3822. if (item2->AddRareAttribute() == true)
  3823. {
  3824. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼؛°ّہûہ¸·خ ¼س¼؛ہج أك°، µا¾ْ½ہ´د´ظ"));
  3825.  
  3826. int iAddedIdx = item2->GetRareAttrCount() + 4;
  3827. char buf[21];
  3828. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  3829.  
  3830. LogManager::instance().ItemLog(
  3831. GetPlayerID(),
  3832. item2->GetAttributeType(iAddedIdx),
  3833. item2->GetAttributeValue(iAddedIdx),
  3834. item->GetID(),
  3835. "ADD_RARE_ATTR",
  3836. buf,
  3837. GetDesc()->GetHostName(),
  3838. item->GetOriginalVnum());
  3839.  
  3840. item->SetCount(item->GetCount() - 1);
  3841. }
  3842. else
  3843. {
  3844. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ہج ¾ئہجإغہ¸·خ ¼س¼؛ہ» أك°،از ¼ِ ¾ّ½ہ´د´ظ"));
  3845. }
  3846. }
  3847. break;
  3848.  
  3849. case 71052 : // ءّہç°و
  3850. {
  3851. // ہ¯·´, ½ج°،ئْ, ؛£ئ®³² ءّہç°، »ç؟ë±فءِ
  3852. LPITEM item2;
  3853.  
  3854. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  3855. return false;
  3856.  
  3857. if (ITEM_COSTUME == item2->GetType()) // @fixme124
  3858. {
  3859. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  3860. return false;
  3861. }
  3862.  
  3863. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  3864. return false;
  3865.  
  3866. if (item2->GetAttributeSetIndex() == -1)
  3867. {
  3868. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  3869. return false;
  3870. }
  3871.  
  3872. if (item2->ChangeRareAttribute() == true)
  3873. {
  3874. char buf[21];
  3875. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  3876. LogManager::instance().ItemLog(this, item, "CHANGE_RARE_ATTR", buf);
  3877.  
  3878. item->SetCount(item->GetCount() - 1);
  3879. }
  3880. else
  3881. {
  3882. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯°و ½أإ³ ¼س¼؛ہج ¾ّ½ہ´د´ظ"));
  3883. }
  3884. }
  3885. break;
  3886.  
  3887. case ITEM_AUTO_HP_RECOVERY_S:
  3888. case ITEM_AUTO_HP_RECOVERY_M:
  3889. case ITEM_AUTO_HP_RECOVERY_L:
  3890. case ITEM_AUTO_HP_RECOVERY_X:
  3891. case ITEM_AUTO_SP_RECOVERY_S:
  3892. case ITEM_AUTO_SP_RECOVERY_M:
  3893. case ITEM_AUTO_SP_RECOVERY_L:
  3894. case ITEM_AUTO_SP_RECOVERY_X:
  3895. // ¹«½أ¹«½أادءِ¸¸ ہجہü؟، اد´ّ °ة °يؤ،±â´آ ¹«¼·°ي...
  3896. // ±×·،¼­ ±×³ة ادµه ؤعµù. ¼±¹° »َہع؟ë ہعµ؟¹°¾à ¾ئہجإغµé.
  3897. case REWARD_BOX_ITEM_AUTO_SP_RECOVERY_XS:
  3898. case REWARD_BOX_ITEM_AUTO_SP_RECOVERY_S:
  3899. case REWARD_BOX_ITEM_AUTO_HP_RECOVERY_XS:
  3900. case REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S:
  3901. case FUCKING_BRAZIL_ITEM_AUTO_SP_RECOVERY_S:
  3902. case FUCKING_BRAZIL_ITEM_AUTO_HP_RECOVERY_S:
  3903. {
  3904. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  3905. {
  3906. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  3907. return false;
  3908. }
  3909.  
  3910. EAffectTypes type = AFFECT_NONE;
  3911. bool isSpecialPotion = false;
  3912.  
  3913. switch (item->GetVnum())
  3914. {
  3915. case ITEM_AUTO_HP_RECOVERY_X:
  3916. isSpecialPotion = true;
  3917.  
  3918. case ITEM_AUTO_HP_RECOVERY_S:
  3919. case ITEM_AUTO_HP_RECOVERY_M:
  3920. case ITEM_AUTO_HP_RECOVERY_L:
  3921. case REWARD_BOX_ITEM_AUTO_HP_RECOVERY_XS:
  3922. case REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S:
  3923. case FUCKING_BRAZIL_ITEM_AUTO_HP_RECOVERY_S:
  3924. type = AFFECT_AUTO_HP_RECOVERY;
  3925. break;
  3926.  
  3927. case ITEM_AUTO_SP_RECOVERY_X:
  3928. isSpecialPotion = true;
  3929.  
  3930. case ITEM_AUTO_SP_RECOVERY_S:
  3931. case ITEM_AUTO_SP_RECOVERY_M:
  3932. case ITEM_AUTO_SP_RECOVERY_L:
  3933. case REWARD_BOX_ITEM_AUTO_SP_RECOVERY_XS:
  3934. case REWARD_BOX_ITEM_AUTO_SP_RECOVERY_S:
  3935. case FUCKING_BRAZIL_ITEM_AUTO_SP_RECOVERY_S:
  3936. type = AFFECT_AUTO_SP_RECOVERY;
  3937. break;
  3938. }
  3939.  
  3940. if (AFFECT_NONE == type)
  3941. break;
  3942.  
  3943. if (item->GetCount() > 1)
  3944. {
  3945. int pos = GetEmptyInventory(item->GetSize());
  3946.  
  3947. if (-1 == pos)
  3948. {
  3949. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِا°؟، ؛َ °ّ°£ہج ¾ّ½ہ´د´ظ."));
  3950. break;
  3951. }
  3952.  
  3953. item->SetCount( item->GetCount() - 1 );
  3954.  
  3955. LPITEM item2 = ITEM_MANAGER::instance().CreateItem( item->GetVnum(), 1 );
  3956. item2->AddToCharacter(this, TItemPos(INVENTORY, pos));
  3957.  
  3958. if (item->GetSocket(1) != 0)
  3959. {
  3960. item2->SetSocket(1, item->GetSocket(1));
  3961. }
  3962.  
  3963. item = item2;
  3964. }
  3965.  
  3966. CAffect* pAffect = FindAffect( type );
  3967.  
  3968. if (NULL == pAffect)
  3969. {
  3970. EPointTypes bonus = POINT_NONE;
  3971.  
  3972. if (true == isSpecialPotion)
  3973. {
  3974. if (type == AFFECT_AUTO_HP_RECOVERY)
  3975. {
  3976. bonus = POINT_MAX_HP_PCT;
  3977. }
  3978. else if (type == AFFECT_AUTO_SP_RECOVERY)
  3979. {
  3980. bonus = POINT_MAX_SP_PCT;
  3981. }
  3982. }
  3983.  
  3984. AddAffect( type, bonus, 4, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
  3985.  
  3986. item->Lock(true);
  3987. item->SetSocket(0, true);
  3988.  
  3989. AutoRecoveryItemProcess( type );
  3990. }
  3991. else
  3992. {
  3993. if (item->GetID() == pAffect->dwFlag)
  3994. {
  3995. RemoveAffect( pAffect );
  3996.  
  3997. item->Lock(false);
  3998. item->SetSocket(0, false);
  3999. }
  4000. else
  4001. {
  4002. LPITEM old = FindItemByID( pAffect->dwFlag );
  4003.  
  4004. if (NULL != old)
  4005. {
  4006. old->Lock(false);
  4007. old->SetSocket(0, false);
  4008. }
  4009.  
  4010. RemoveAffect( pAffect );
  4011.  
  4012. EPointTypes bonus = POINT_NONE;
  4013.  
  4014. if (true == isSpecialPotion)
  4015. {
  4016. if (type == AFFECT_AUTO_HP_RECOVERY)
  4017. {
  4018. bonus = POINT_MAX_HP_PCT;
  4019. }
  4020. else if (type == AFFECT_AUTO_SP_RECOVERY)
  4021. {
  4022. bonus = POINT_MAX_SP_PCT;
  4023. }
  4024. }
  4025.  
  4026. AddAffect( type, bonus, 4, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
  4027.  
  4028. item->Lock(true);
  4029. item->SetSocket(0, true);
  4030.  
  4031. AutoRecoveryItemProcess( type );
  4032. }
  4033. }
  4034. }
  4035. break;
  4036. }
  4037. break;
  4038.  
  4039. case USE_CLEAR:
  4040. {
  4041. switch (item->GetVnum())
  4042. {
  4043. #ifdef ENABLE_WOLFMAN_CHARACTER
  4044. case 27124: // Bandage
  4045. RemoveBleeding();
  4046. break;
  4047. #endif
  4048. case 27874: // Grilled Perch
  4049. default:
  4050. RemoveBadAffect();
  4051. break;
  4052. }
  4053. item->SetCount(item->GetCount() - 1);
  4054. }
  4055. break;
  4056.  
  4057. case USE_INVISIBILITY:
  4058. {
  4059. if (item->GetVnum() == 70026)
  4060. {
  4061. quest::CQuestManager& q = quest::CQuestManager::instance();
  4062. quest::PC* pPC = q.GetPC(GetPlayerID());
  4063.  
  4064. if (pPC != NULL)
  4065. {
  4066. int last_use_time = pPC->GetFlag("mirror_of_disapper.last_use_time");
  4067.  
  4068. if (get_global_time() - last_use_time < 10*60)
  4069. {
  4070. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  4071. return false;
  4072. }
  4073.  
  4074. pPC->SetFlag("mirror_of_disapper.last_use_time", get_global_time());
  4075. }
  4076. }
  4077.  
  4078. AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, 300, 0, true);
  4079. item->SetCount(item->GetCount() - 1);
  4080. }
  4081. break;
  4082.  
  4083. case USE_POTION_NODELAY:
  4084. {
  4085. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  4086. {
  4087. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit") > 0)
  4088. {
  4089. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  4090. return false;
  4091. }
  4092.  
  4093. switch (item->GetVnum())
  4094. {
  4095. case 70020 :
  4096. case 71018 :
  4097. case 71019 :
  4098. case 71020 :
  4099. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit_count") < 10000)
  4100. {
  4101. if (m_nPotionLimit <= 0)
  4102. {
  4103. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç؟ë ء¦ار·®ہ» أت°ْاد؟´½ہ´د´ظ."));
  4104. return false;
  4105. }
  4106. }
  4107. break;
  4108.  
  4109. default :
  4110. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  4111. return false;
  4112. }
  4113. }
  4114.  
  4115. bool used = false;
  4116.  
  4117. if (item->GetValue(0) != 0) // HP ہ‎´ë°ھ ب¸؛¹
  4118. {
  4119. if (GetHP() < GetMaxHP())
  4120. {
  4121. PointChange(POINT_HP, item->GetValue(0) * (100 + GetPoint(POINT_POTION_BONUS)) / 100);
  4122. EffectPacket(SE_HPUP_RED);
  4123. used = TRUE;
  4124. }
  4125. }
  4126.  
  4127. if (item->GetValue(1) != 0) // SP ہ‎´ë°ھ ب¸؛¹
  4128. {
  4129. if (GetSP() < GetMaxSP())
  4130. {
  4131. PointChange(POINT_SP, item->GetValue(1) * (100 + GetPoint(POINT_POTION_BONUS)) / 100);
  4132. EffectPacket(SE_SPUP_BLUE);
  4133. used = TRUE;
  4134. }
  4135. }
  4136.  
  4137. if (item->GetValue(3) != 0) // HP % ب¸؛¹
  4138. {
  4139. if (GetHP() < GetMaxHP())
  4140. {
  4141. PointChange(POINT_HP, item->GetValue(3) * GetMaxHP() / 100);
  4142. EffectPacket(SE_HPUP_RED);
  4143. used = TRUE;
  4144. }
  4145. }
  4146.  
  4147. if (item->GetValue(4) != 0) // SP % ب¸؛¹
  4148. {
  4149. if (GetSP() < GetMaxSP())
  4150. {
  4151. PointChange(POINT_SP, item->GetValue(4) * GetMaxSP() / 100);
  4152. EffectPacket(SE_SPUP_BLUE);
  4153. used = TRUE;
  4154. }
  4155. }
  4156.  
  4157. if (used)
  4158. {
  4159. if (item->GetVnum() == 50085 || item->GetVnum() == 50086)
  4160. {
  4161. if (test_server)
  4162. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؟ù؛´ ¶ا´آ ء¾ہع ¸¦ »ç؟ëاد؟´½ہ´د´ظ"));
  4163. SetUseSeedOrMoonBottleTime();
  4164. }
  4165. if (GetDungeon())
  4166. GetDungeon()->UsePotion(this);
  4167.  
  4168. if (GetWarMap())
  4169. GetWarMap()->UsePotion(this, item);
  4170.  
  4171. m_nPotionLimit--;
  4172.  
  4173. //RESTRICT_USE_SEED_OR_MOONBOTTLE
  4174. item->SetCount(item->GetCount() - 1);
  4175. //END_RESTRICT_USE_SEED_OR_MOONBOTTLE
  4176. }
  4177. }
  4178. break;
  4179.  
  4180. case USE_POTION:
  4181. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  4182. {
  4183. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit") > 0)
  4184. {
  4185. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  4186. return false;
  4187. }
  4188.  
  4189. switch (item->GetVnum())
  4190. {
  4191. case 27001 :
  4192. case 27002 :
  4193. case 27003 :
  4194. case 27004 :
  4195. case 27005 :
  4196. case 27006 :
  4197. if (quest::CQuestManager::instance().GetEventFlag("arena_potion_limit_count") < 10000)
  4198. {
  4199. if (m_nPotionLimit <= 0)
  4200. {
  4201. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç؟ë ء¦ار·®ہ» أت°ْاد؟´½ہ´د´ظ."));
  4202. return false;
  4203. }
  4204. }
  4205. break;
  4206.  
  4207. default :
  4208. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أہه؟،¼­ »ç؟ëاد½ا ¼ِ ¾ّ½ہ´د´ظ."));
  4209. return false;
  4210. }
  4211. }
  4212.  
  4213. if (item->GetValue(1) != 0)
  4214. {
  4215. if (GetPoint(POINT_SP_RECOVERY) + GetSP() >= GetMaxSP())
  4216. {
  4217. return false;
  4218. }
  4219.  
  4220. PointChange(POINT_SP_RECOVERY, item->GetValue(1) * MIN(200, (100 + GetPoint(POINT_POTION_BONUS))) / 100);
  4221. StartAffectEvent();
  4222. EffectPacket(SE_SPUP_BLUE);
  4223. }
  4224.  
  4225. if (item->GetValue(0) != 0)
  4226. {
  4227. if (GetPoint(POINT_HP_RECOVERY) + GetHP() >= GetMaxHP())
  4228. {
  4229. return false;
  4230. }
  4231.  
  4232. PointChange(POINT_HP_RECOVERY, item->GetValue(0) * MIN(200, (100 + GetPoint(POINT_POTION_BONUS))) / 100);
  4233. StartAffectEvent();
  4234. EffectPacket(SE_HPUP_RED);
  4235. }
  4236.  
  4237. if (GetDungeon())
  4238. GetDungeon()->UsePotion(this);
  4239.  
  4240. if (GetWarMap())
  4241. GetWarMap()->UsePotion(this, item);
  4242.  
  4243. item->SetCount(item->GetCount() - 1);
  4244. m_nPotionLimit--;
  4245. break;
  4246.  
  4247. case USE_POTION_CONTINUE:
  4248. {
  4249. if (item->GetValue(0) != 0)
  4250. {
  4251. AddAffect(AFFECT_HP_RECOVER_CONTINUE, POINT_HP_RECOVER_CONTINUE, item->GetValue(0), 0, item->GetValue(2), 0, true);
  4252. }
  4253. else if (item->GetValue(1) != 0)
  4254. {
  4255. AddAffect(AFFECT_SP_RECOVER_CONTINUE, POINT_SP_RECOVER_CONTINUE, item->GetValue(1), 0, item->GetValue(2), 0, true);
  4256. }
  4257. else
  4258. return false;
  4259. }
  4260.  
  4261. if (GetDungeon())
  4262. GetDungeon()->UsePotion(this);
  4263.  
  4264. if (GetWarMap())
  4265. GetWarMap()->UsePotion(this, item);
  4266.  
  4267. item->SetCount(item->GetCount() - 1);
  4268. break;
  4269.  
  4270. case USE_ABILITY_UP:
  4271. {
  4272. switch (item->GetValue(0))
  4273. {
  4274. case APPLY_MOV_SPEED:
  4275. AddAffect(AFFECT_MOV_SPEED, POINT_MOV_SPEED, item->GetValue(2), AFF_MOV_SPEED_POTION, item->GetValue(1), 0, true);
  4276. #ifdef ENABLE_EFFECT_EXTRAPOT
  4277. EffectPacket(SE_DXUP_PURPLE);
  4278. #endif
  4279. break;
  4280.  
  4281. case APPLY_ATT_SPEED:
  4282. AddAffect(AFFECT_ATT_SPEED, POINT_ATT_SPEED, item->GetValue(2), AFF_ATT_SPEED_POTION, item->GetValue(1), 0, true);
  4283. #ifdef ENABLE_EFFECT_EXTRAPOT
  4284. EffectPacket(SE_SPEEDUP_GREEN);
  4285. #endif
  4286. break;
  4287.  
  4288. case APPLY_STR:
  4289. AddAffect(AFFECT_STR, POINT_ST, item->GetValue(2), 0, item->GetValue(1), 0, true);
  4290. break;
  4291.  
  4292. case APPLY_DEX:
  4293. AddAffect(AFFECT_DEX, POINT_DX, item->GetValue(2), 0, item->GetValue(1), 0, true);
  4294. break;
  4295.  
  4296. case APPLY_CON:
  4297. AddAffect(AFFECT_CON, POINT_HT, item->GetValue(2), 0, item->GetValue(1), 0, true);
  4298. break;
  4299.  
  4300. case APPLY_INT:
  4301. AddAffect(AFFECT_INT, POINT_IQ, item->GetValue(2), 0, item->GetValue(1), 0, true);
  4302. break;
  4303.  
  4304. case APPLY_CAST_SPEED:
  4305. AddAffect(AFFECT_CAST_SPEED, POINT_CASTING_SPEED, item->GetValue(2), 0, item->GetValue(1), 0, true);
  4306. break;
  4307.  
  4308. case APPLY_ATT_GRADE_BONUS:
  4309. AddAffect(AFFECT_ATT_GRADE, POINT_ATT_GRADE_BONUS,
  4310. item->GetValue(2), 0, item->GetValue(1), 0, true);
  4311. break;
  4312.  
  4313. case APPLY_DEF_GRADE_BONUS:
  4314. AddAffect(AFFECT_DEF_GRADE, POINT_DEF_GRADE_BONUS,
  4315. item->GetValue(2), 0, item->GetValue(1), 0, true);
  4316. break;
  4317. }
  4318. }
  4319.  
  4320. if (GetDungeon())
  4321. GetDungeon()->UsePotion(this);
  4322.  
  4323. if (GetWarMap())
  4324. GetWarMap()->UsePotion(this, item);
  4325.  
  4326. item->SetCount(item->GetCount() - 1);
  4327. break;
  4328.  
  4329. case USE_TALISMAN:
  4330. {
  4331. const int TOWN_PORTAL = 1;
  4332. const int MEMORY_PORTAL = 2;
  4333.  
  4334.  
  4335. // gm_guild_build, oxevent ¸ت؟،¼­ ±حب¯؛خ ±حب¯±â¾ï؛خ ¸¦ »ç؟ë¸ّاد°ش ¸·ہ½
  4336. if (GetMapIndex() == 200 || GetMapIndex() == 113)
  4337. {
  4338. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("اِہç ہ§ؤ،؟،¼­ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  4339. return false;
  4340. }
  4341.  
  4342. if (CArenaManager::instance().IsArenaMap(GetMapIndex()) == true)
  4343. {
  4344. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·أ ءك؟،´آ ہج؟ëاز ¼ِ ¾ّ´آ ¹°ا°ہش´د´ظ."));
  4345. return false;
  4346. }
  4347.  
  4348. if (m_pkWarpEvent)
  4349. {
  4350. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہجµ؟از ءط؛ٌ°، µا¾îہضہ½ہ¸·خ ±حب¯؛خ¸¦ »ç؟ëاز¼ِ ¾ّ½ہ´د´ظ"));
  4351. return false;
  4352. }
  4353.  
  4354. // CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4355. int consumeLife = CalculateConsume(this);
  4356.  
  4357. if (consumeLife < 0)
  4358. return false;
  4359. // END_OF_CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4360.  
  4361. if (item->GetValue(0) == TOWN_PORTAL) // ±حب¯؛خ
  4362. {
  4363. if (item->GetSocket(0) == 0)
  4364. {
  4365. if (!GetDungeon())
  4366. if (!GiveRecallItem(item))
  4367. return false;
  4368.  
  4369. PIXEL_POSITION posWarp;
  4370.  
  4371. if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(GetMapIndex(), GetEmpire(), posWarp))
  4372. {
  4373. // CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4374. PointChange(POINT_HP, -consumeLife, false);
  4375. // END_OF_CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4376.  
  4377. WarpSet(posWarp.x, posWarp.y);
  4378. }
  4379. else
  4380. {
  4381. sys_err("CHARACTER::UseItem : cannot find spawn position (name %s, %d x %d)", GetName(), GetX(), GetY());
  4382. }
  4383. }
  4384. else
  4385. {
  4386. if (test_server)
  4387. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؟ّ·، ہ§ؤ،·خ ؛¹±ح"));
  4388.  
  4389. ProcessRecallItem(item);
  4390. }
  4391. }
  4392. else if (item->GetValue(0) == MEMORY_PORTAL) // ±حب¯±â¾ï؛خ
  4393. {
  4394. if (item->GetSocket(0) == 0)
  4395. {
  4396. if (GetDungeon())
  4397. {
  4398. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ّہü ¾ب؟،¼­´آ %s%s »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."),
  4399. item->GetName(),
  4400. "");
  4401. return false;
  4402. }
  4403.  
  4404. if (!GiveRecallItem(item))
  4405. return false;
  4406. }
  4407. else
  4408. {
  4409. // CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4410. PointChange(POINT_HP, -consumeLife, false);
  4411. // END_OF_CONSUME_LIFE_WHEN_USE_WARP_ITEM
  4412.  
  4413. ProcessRecallItem(item);
  4414. }
  4415. }
  4416. }
  4417. break;
  4418.  
  4419. case USE_TUNING:
  4420. case USE_DETACHMENT:
  4421. {
  4422. LPITEM item2;
  4423.  
  4424. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  4425. return false;
  4426.  
  4427. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  4428. return false;
  4429.  
  4430. if (item2->GetVnum() >= 28330 && item2->GetVnum() <= 28343) // ؟µ¼®+3
  4431. {
  4432. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("+3 ؟µ¼®ہ؛ ہج ¾ئہجإغہ¸·خ °³·®از ¼ِ ¾ّ½ہ´د´ظ"));
  4433. return false;
  4434. }
  4435.  
  4436. if (item2->GetVnum() >= 28430 && item2->GetVnum() <= 28443) // ؟µ¼®+4
  4437. {
  4438. if (item->GetVnum() == 71056) // أ»·وہا¼û°ل
  4439. {
  4440. RefineItem(item, item2);
  4441. }
  4442. else
  4443. {
  4444. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؟µ¼®ہ؛ ہج ¾ئہجإغہ¸·خ °³·®از ¼ِ ¾ّ½ہ´د´ظ"));
  4445. }
  4446. }
  4447. else
  4448. {
  4449. RefineItem(item, item2);
  4450. }
  4451. }
  4452. break;
  4453.  
  4454. // ACCESSORY_REFINE & ADD/CHANGE_ATTRIBUTES
  4455. // ACCESSORY_REFINE & ADD/CHANGE_ATTRIBUTES
  4456. case USE_CHANGE_COSTUME_ATTR:// Change costume attributes
  4457. case USE_RESET_COSTUME_ATTR:// Change & add costume attributes
  4458. {
  4459. LPITEM item2;
  4460. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  4461. return false;
  4462.  
  4463. if (item2->IsEquipped())
  4464. return false;
  4465.  
  4466. if (item2->IsExchanging())
  4467. return false;
  4468.  
  4469. #ifdef __ACCE_COSTUME_SYSTEM__
  4470. if (ITEM_COSTUME != item2->GetType() && COSTUME_HAIR < item2->GetSubType())
  4471. #else
  4472. if (ITEM_COSTUME != item2->GetType())
  4473. #endif
  4474. {
  4475. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ا׸ٌ°ْ ا׸ٌہا ¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ½ہ´د´ظ."));
  4476. return false;
  4477. }
  4478.  
  4479. if (item2->GetAttributeSetIndex() == -1)
  4480. {
  4481. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4482. return false;
  4483. }
  4484.  
  4485. switch (item->GetSubType())
  4486. {
  4487. case USE_CHANGE_COSTUME_ATTR:
  4488. {
  4489. if (item2->GetAttributeCount() == 0)
  4490. {
  4491. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯°واز ¼س¼؛ہج ¾ّ½ہ´د´ظ."));
  4492. return false;
  4493. }
  4494.  
  4495. item2->ChangeAttribute(aiCostumeAttributeLevelPercent);
  4496.  
  4497. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واد؟´½ہ´د´ظ."));
  4498. {
  4499. char buf[21];
  4500. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4501. LogManager::instance().ItemLog(this, item, "CHANGE_COSTUME_ATTR", buf);
  4502. }
  4503.  
  4504. item->SetCount(item->GetCount() - 1);
  4505. }
  4506. break;
  4507.  
  4508. case USE_RESET_COSTUME_ATTR:
  4509. {
  4510. item2->ClearAttribute();
  4511.  
  4512. char buf[21];
  4513. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4514.  
  4515. BYTE i;
  4516. for(i=0; i<COSTUME_ATTRIBUTE_MAX_NUM; i++)
  4517. {
  4518. char result[64];
  4519. if (number(1, 100) <= aiCostumeAttributeAddPercent[item2->GetAttributeCount()])
  4520. {
  4521. snprintf(result, sizeof(result), "RESET_COSTUME_ATTR_SUCCESS%d", i);
  4522. item2->AddAttribute();
  4523. int iAddedIdx = item2->GetAttributeCount()-1;
  4524. LogManager::instance().ItemLog(
  4525. GetPlayerID(),
  4526. item2->GetAttributeType(iAddedIdx),
  4527. item2->GetAttributeValue(iAddedIdx),
  4528. item->GetID(),
  4529. result,
  4530. buf,
  4531. GetDesc()->GetHostName(),
  4532. item->GetOriginalVnum());
  4533. }
  4534. else
  4535. {
  4536. snprintf(result, sizeof(result), "RESET_COSTUME_ATTR_FAIL%d", i);
  4537. LogManager::instance().ItemLog(this, item, result, buf);
  4538. break;
  4539. }
  4540. }
  4541.  
  4542. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واد؟´½ہ´د´ظ."));
  4543. item->SetCount(item->GetCount() - 1);
  4544. }
  4545. }
  4546. }
  4547. break;
  4548. case USE_PUT_INTO_BELT_SOCKET:
  4549. case USE_PUT_INTO_RING_SOCKET:
  4550. case USE_PUT_INTO_ACCESSORY_SOCKET:
  4551. case USE_ADD_ACCESSORY_SOCKET:
  4552. case USE_CLEAN_SOCKET:
  4553. case USE_CHANGE_ATTRIBUTE:
  4554. case USE_CHANGE_ATTRIBUTE2 :
  4555. case USE_ADD_ATTRIBUTE:
  4556. case USE_ADD_ATTRIBUTE2:
  4557. {
  4558. LPITEM item2;
  4559. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  4560. return false;
  4561.  
  4562. if (item2->IsEquipped())
  4563. {
  4564. BuffOnAttr_RemoveBuffsFromItem(item2);
  4565. }
  4566.  
  4567. // [NOTE] ؤع½؛ئ¬ ¾ئہجإغ؟،´آ ¾ئہجإغ أضأت »‎¼؛½أ ·£´‎ ¼س¼؛ہ» ؛خ؟©ادµا, ہç°وہç°، µîµîہ؛ ¸·¾ئ´ق¶َ´آ ؟نأ»ہج ہض¾ْہ½.
  4568. // ؟ّ·، ANTI_CHANGE_ATTRIBUTE °°ہ؛ ¾ئہجإغ Flag¸¦ أك°،اد؟© ±âب¹ ·¹؛§؟،¼­ ہ¯؟¬اد°ش ؤءئ®·ر از ¼ِ ہضµµ·د از ؟¹ء¤ہج¾ْہ¸³ھ
  4569. // ±×µ‎°إ ات؟ن¾ّہ¸´د ´عؤ،°ي »،¸® اط´ق·،¼­ ±×³ة ؟©±â¼­ ¸·ہ½... -_-
  4570. if (ITEM_COSTUME == item2->GetType())
  4571. {
  4572. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4573. return false;
  4574. }
  4575.  
  4576. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  4577. return false;
  4578.  
  4579. switch (item->GetSubType())
  4580. {
  4581. case USE_CLEAN_SOCKET:
  4582. {
  4583. int i;
  4584. for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  4585. {
  4586. if (item2->GetSocket(i) == ITEM_BROKEN_METIN_VNUM)
  4587. break;
  4588. }
  4589.  
  4590. if (i == ITEM_SOCKET_MAX_NUM)
  4591. {
  4592. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أ»¼زاز ¼®ہج ¹عاôہضءِ ¾ت½ہ´د´ظ."));
  4593. return false;
  4594. }
  4595.  
  4596. int j = 0;
  4597.  
  4598. for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  4599. {
  4600. if (item2->GetSocket(i) != ITEM_BROKEN_METIN_VNUM && item2->GetSocket(i) != 0)
  4601. item2->SetSocket(j++, item2->GetSocket(i));
  4602. }
  4603.  
  4604. for (; j < ITEM_SOCKET_MAX_NUM; ++j)
  4605. {
  4606. if (item2->GetSocket(j) > 0)
  4607. item2->SetSocket(j, 1);
  4608. }
  4609.  
  4610. {
  4611. char buf[21];
  4612. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4613. LogManager::instance().ItemLog(this, item, "CLEAN_SOCKET", buf);
  4614. }
  4615.  
  4616. item->SetCount(item->GetCount() - 1);
  4617.  
  4618. }
  4619. break;
  4620.  
  4621. case USE_CHANGE_ATTRIBUTE :
  4622. case USE_CHANGE_ATTRIBUTE2 : // @fixme123
  4623. if (item2->GetAttributeSetIndex() == -1)
  4624. {
  4625. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4626. return false;
  4627. }
  4628.  
  4629. if (item2->GetAttributeCount() == 0)
  4630. {
  4631. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛¯°واز ¼س¼؛ہج ¾ّ½ہ´د´ظ."));
  4632. return false;
  4633. }
  4634.  
  4635. if ((GM_PLAYER == GetGMLevel()) && (false == test_server) && (false == g_bDisableItemBonusChangeTime))
  4636. {
  4637. //
  4638. // Event Flag ¸¦ إëاط ہجہü؟، ¾ئہجإغ ¼س¼؛ ؛¯°وہ» ار ½أ°£ہ¸·خ ؛خإح أو؛ذار ½أ°£ہج بê·¶´آءِ °ث»çاد°ي
  4639. // ½أ°£ہج أو؛ذب÷ بê·¶´ظ¸é اِہç ¼س¼؛؛¯°و؟، ´ëار ½أ°£ہ» ¼³ء¤اط ءط´ظ.
  4640. //
  4641.  
  4642. DWORD dwChangeItemAttrCycle = quest::CQuestManager::instance().GetEventFlag(msc_szChangeItemAttrCycleFlag);
  4643. if (dwChangeItemAttrCycle < msc_dwDefaultChangeItemAttrCycle)
  4644. dwChangeItemAttrCycle = msc_dwDefaultChangeItemAttrCycle;
  4645.  
  4646. quest::PC* pPC = quest::CQuestManager::instance().GetPC(GetPlayerID());
  4647.  
  4648. if (pPC)
  4649. {
  4650. DWORD dwNowMin = get_global_time() / 60;
  4651.  
  4652. DWORD dwLastChangeItemAttrMin = pPC->GetFlag(msc_szLastChangeItemAttrFlag);
  4653.  
  4654. if (dwLastChangeItemAttrMin + dwChangeItemAttrCycle > dwNowMin)
  4655. {
  4656. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ¹ظ²غءِ %d؛ذ ہج³»؟،´آ ´ظ½أ ؛¯°واز ¼ِ ¾ّ½ہ´د´ظ.(%d ؛ذ ³²ہ½)"),
  4657. dwChangeItemAttrCycle, dwChangeItemAttrCycle - (dwNowMin - dwLastChangeItemAttrMin));
  4658. return false;
  4659. }
  4660.  
  4661. pPC->SetFlag(msc_szLastChangeItemAttrFlag, dwNowMin);
  4662. }
  4663. }
  4664.  
  4665. if (item->GetSubType() == USE_CHANGE_ATTRIBUTE2)
  4666. {
  4667. int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
  4668. {
  4669. 0, 0, 30, 40, 3
  4670. };
  4671.  
  4672. item2->ChangeAttribute(aiChangeProb);
  4673. }
  4674. else if (item->GetVnum() == 76014)
  4675. {
  4676. int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
  4677. {
  4678. 0, 10, 50, 39, 1
  4679. };
  4680.  
  4681. item2->ChangeAttribute(aiChangeProb);
  4682. }
  4683.  
  4684. else
  4685. {
  4686. // ؟¬ہç°و ئ¯¼ِأ³¸®
  4687. // ہ‎´ë·خ ؟¬ہç°، أك°، ¾بµة°إ¶َ اد؟© ادµه ؤعµùاش.
  4688. if (item->GetVnum() == 71151 || item->GetVnum() == 76023)
  4689. {
  4690. if ((item2->GetType() == ITEM_WEAPON)
  4691. || (item2->GetType() == ITEM_ARMOR && item2->GetSubType() == ARMOR_BODY))
  4692. {
  4693. bool bCanUse = true;
  4694. for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  4695. {
  4696. if (item2->GetLimitType(i) == LIMIT_LEVEL && item2->GetLimitValue(i) > 40)
  4697. {
  4698. bCanUse = false;
  4699. break;
  4700. }
  4701. }
  4702. if (false == bCanUse)
  4703. {
  4704. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہû؟ë ·¹؛§؛¸´ظ ³ô¾ئ »ç؟ëہج ؛ز°،´ةاص´د´ظ."));
  4705. break;
  4706. }
  4707. }
  4708. else
  4709. {
  4710. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹«±â؟ح °©؟ت؟،¸¸ »ç؟ë °،´ةاص´د´ظ."));
  4711. break;
  4712. }
  4713. }
  4714. item2->ChangeAttribute();
  4715. }
  4716.  
  4717. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واد؟´½ہ´د´ظ."));
  4718. {
  4719. char buf[21];
  4720. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4721. LogManager::instance().ItemLog(this, item, "CHANGE_ATTRIBUTE", buf);
  4722. }
  4723.  
  4724. item->SetCount(item->GetCount() - 1);
  4725. break;
  4726.  
  4727. case USE_ADD_ATTRIBUTE :
  4728. if (item2->GetAttributeSetIndex() == -1)
  4729. {
  4730. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4731. return false;
  4732. }
  4733.  
  4734. if (item2->GetAttributeCount() < 4)
  4735. {
  4736. // ؟¬ہç°، ئ¯¼ِأ³¸®
  4737. // ہ‎´ë·خ ؟¬ہç°، أك°، ¾بµة°إ¶َ اد؟© ادµه ؤعµùاش.
  4738. if (item->GetVnum() == 71152 || item->GetVnum() == 76024)
  4739. {
  4740. if ((item2->GetType() == ITEM_WEAPON)
  4741. || (item2->GetType() == ITEM_ARMOR && item2->GetSubType() == ARMOR_BODY))
  4742. {
  4743. bool bCanUse = true;
  4744. for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  4745. {
  4746. if (item2->GetLimitType(i) == LIMIT_LEVEL && item2->GetLimitValue(i) > 40)
  4747. {
  4748. bCanUse = false;
  4749. break;
  4750. }
  4751. }
  4752. if (false == bCanUse)
  4753. {
  4754. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہû؟ë ·¹؛§؛¸´ظ ³ô¾ئ »ç؟ëہج ؛ز°،´ةاص´د´ظ."));
  4755. break;
  4756. }
  4757. }
  4758. else
  4759. {
  4760. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹«±â؟ح °©؟ت؟،¸¸ »ç؟ë °،´ةاص´د´ظ."));
  4761. break;
  4762. }
  4763. }
  4764. char buf[21];
  4765. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4766.  
  4767. if (number(1, 100) <= aiItemAttributeAddPercent[item2->GetAttributeCount()])
  4768. {
  4769. item2->AddAttribute();
  4770. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ أك°،؟، ¼؛°ّاد؟´½ہ´د´ظ."));
  4771.  
  4772. int iAddedIdx = item2->GetAttributeCount() - 1;
  4773. LogManager::instance().ItemLog(
  4774. GetPlayerID(),
  4775. item2->GetAttributeType(iAddedIdx),
  4776. item2->GetAttributeValue(iAddedIdx),
  4777. item->GetID(),
  4778. "ADD_ATTRIBUTE_SUCCESS",
  4779. buf,
  4780. GetDesc()->GetHostName(),
  4781. item->GetOriginalVnum());
  4782. }
  4783. else
  4784. {
  4785. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ أك°،؟، ½ائذاد؟´½ہ´د´ظ."));
  4786. LogManager::instance().ItemLog(this, item, "ADD_ATTRIBUTE_FAIL", buf);
  4787. }
  4788.  
  4789. item->SetCount(item->GetCount() - 1);
  4790. }
  4791. else
  4792. {
  4793. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُہج»َ ہج ¾ئہجإغہ» ہج؟ëاد؟© ¼س¼؛ہ» أك°،از ¼ِ ¾ّ½ہ´د´ظ."));
  4794. }
  4795. break;
  4796.  
  4797. case USE_ADD_ATTRIBUTE2 :
  4798. // أà؛¹ہا ±¸½½
  4799. // ہç°،؛ٌ¼­¸¦ إëاط ¼س¼؛ہ» 4°³ أك°، ½أإ² ¾ئہجإغ؟، ´ëاط¼­ اد³ھہا ¼س¼؛ہ» ´ُ ؛ظ؟©ءط´ظ.
  4800. if (item2->GetAttributeSetIndex() == -1)
  4801. {
  4802. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ہ» ؛¯°واز ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4803. return false;
  4804. }
  4805.  
  4806. // ¼س¼؛ہج ہج¹ج 4°³ أك°، µا¾ْہ» ¶§¸¸ ¼س¼؛ہ» أك°، °،´ةاد´ظ.
  4807. if (item2->GetAttributeCount() == 4)
  4808. {
  4809. char buf[21];
  4810. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4811.  
  4812. if (number(1, 100) <= aiItemAttributeAddPercent[item2->GetAttributeCount()])
  4813. {
  4814. item2->AddAttribute();
  4815. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ أك°،؟، ¼؛°ّاد؟´½ہ´د´ظ."));
  4816.  
  4817. int iAddedIdx = item2->GetAttributeCount() - 1;
  4818. LogManager::instance().ItemLog(
  4819. GetPlayerID(),
  4820. item2->GetAttributeType(iAddedIdx),
  4821. item2->GetAttributeValue(iAddedIdx),
  4822. item->GetID(),
  4823. "ADD_ATTRIBUTE2_SUCCESS",
  4824. buf,
  4825. GetDesc()->GetHostName(),
  4826. item->GetOriginalVnum());
  4827. }
  4828. else
  4829. {
  4830. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼س¼؛ أك°،؟، ½ائذاد؟´½ہ´د´ظ."));
  4831. LogManager::instance().ItemLog(this, item, "ADD_ATTRIBUTE2_FAIL", buf);
  4832. }
  4833.  
  4834. item->SetCount(item->GetCount() - 1);
  4835. }
  4836. else if (item2->GetAttributeCount() == 5)
  4837. {
  4838. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ُ ہج»َ ہج ¾ئہجإغہ» ہج؟ëاد؟© ¼س¼؛ہ» أك°،از ¼ِ ¾ّ½ہ´د´ظ."));
  4839. }
  4840. else if (item2->GetAttributeCount() < 4)
  4841. {
  4842. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸صہْ ہç°،؛ٌ¼­¸¦ ہج؟ëاد؟© ¼س¼؛ہ» أك°،½أؤر ءض¼¼؟ن."));
  4843. }
  4844. else
  4845. {
  4846. // wtf ?!
  4847. sys_err("ADD_ATTRIBUTE2 : Item has wrong AttributeCount(%d)", item2->GetAttributeCount());
  4848. }
  4849. break;
  4850.  
  4851. case USE_ADD_ACCESSORY_SOCKET:
  4852. {
  4853. char buf[21];
  4854. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4855.  
  4856. if (item2->IsAccessoryForSocket())
  4857. {
  4858. if (item2->GetAccessorySocketMaxGrade() < ITEM_ACCESSORY_SOCKET_MAX_NUM)
  4859. {
  4860. #ifdef ENABLE_ADDSTONE_FAILURE
  4861. if (number(1, 100) <= 50)
  4862. #else
  4863. if (1)
  4864. #endif
  4865. {
  4866. item2->SetAccessorySocketMaxGrade(item2->GetAccessorySocketMaxGrade() + 1);
  4867. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زؤدہج ¼؛°ّہûہ¸·خ أك°،µا¾ْ½ہ´د´ظ."));
  4868. LogManager::instance().ItemLog(this, item, "ADD_SOCKET_SUCCESS", buf);
  4869. }
  4870. else
  4871. {
  4872. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زؤد أك°،؟، ½ائذاد؟´½ہ´د´ظ."));
  4873. LogManager::instance().ItemLog(this, item, "ADD_SOCKET_FAIL", buf);
  4874. }
  4875.  
  4876. item->SetCount(item->GetCount() - 1);
  4877. }
  4878. else
  4879. {
  4880. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾×¼¼¼­¸®؟،´آ ´ُہج»َ ¼زؤدہ» أك°،از °ّ°£ہج ¾ّ½ہ´د´ظ."));
  4881. }
  4882. }
  4883. else
  4884. {
  4885. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ¸·خ ¼زؤدہ» أك°،از ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  4886. }
  4887. }
  4888. break;
  4889.  
  4890. case USE_PUT_INTO_BELT_SOCKET:
  4891. case USE_PUT_INTO_ACCESSORY_SOCKET:
  4892. if (item2->IsAccessoryForSocket() && item->CanPutInto(item2))
  4893. {
  4894. char buf[21];
  4895. snprintf(buf, sizeof(buf), "%u", item2->GetID());
  4896.  
  4897. if (item2->GetAccessorySocketGrade() < item2->GetAccessorySocketMaxGrade())
  4898. {
  4899. if (number(1, 100) <= aiAccessorySocketPutPct[item2->GetAccessorySocketGrade()])
  4900. {
  4901. item2->SetAccessorySocketGrade(item2->GetAccessorySocketGrade() + 1);
  4902. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہهآّ؟، ¼؛°ّاد؟´½ہ´د´ظ."));
  4903. LogManager::instance().ItemLog(this, item, "PUT_SOCKET_SUCCESS", buf);
  4904. }
  4905. else
  4906. {
  4907. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہهآّ؟، ½ائذاد؟´½ہ´د´ظ."));
  4908. LogManager::instance().ItemLog(this, item, "PUT_SOCKET_FAIL", buf);
  4909. }
  4910.  
  4911. item->SetCount(item->GetCount() - 1);
  4912. }
  4913. else
  4914. {
  4915. if (item2->GetAccessorySocketMaxGrade() == 0)
  4916. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸صہْ ´ظہج¾ئ¸َµه·خ ¾ا¼¼¼­¸®؟، ¼زؤدہ» أك°،اط¾كاص´د´ظ."));
  4917. else if (item2->GetAccessorySocketMaxGrade() < ITEM_ACCESSORY_SOCKET_MAX_NUM)
  4918. {
  4919. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾×¼¼¼­¸®؟،´آ ´ُہج»َ ہهآّاز ¼زؤدہج ¾ّ½ہ´د´ظ."));
  4920. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ظہج¾ئ¸َµه·خ ¼زؤدہ» أك°،اط¾كاص´د´ظ."));
  4921. }
  4922. else
  4923. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾×¼¼¼­¸®؟،´آ ´ُہج»َ ؛¸¼®ہ» ہهآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  4924. }
  4925. }
  4926. else
  4927. {
  4928. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ» ہهآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  4929. }
  4930. break;
  4931. }
  4932. if (item2->IsEquipped())
  4933. {
  4934. BuffOnAttr_AddBuffsFromItem(item2);
  4935. }
  4936. }
  4937. break;
  4938. // END_OF_ACCESSORY_REFINE & END_OF_ADD_ATTRIBUTES & END_OF_CHANGE_ATTRIBUTES
  4939.  
  4940. case USE_BAIT:
  4941. {
  4942.  
  4943. if (m_pkFishingEvent)
  4944. {
  4945. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³¬½أ ءك؟، ¹ج³¢¸¦ °¥¾ئ³¢؟ï ¼ِ ¾ّ½ہ´د´ظ."));
  4946. return false;
  4947. }
  4948.  
  4949. LPITEM weapon = GetWear(WEAR_WEAPON);
  4950.  
  4951. if (!weapon || weapon->GetType() != ITEM_ROD)
  4952. return false;
  4953.  
  4954. if (weapon->GetSocket(2))
  4955. {
  4956. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ²باôہض´ّ ¹ج³¢¸¦ »©°ي %s¸¦ ³¢؟َ´د´ظ."), item->GetName());
  4957. }
  4958. else
  4959. {
  4960. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³¬½أ´ë؟، %s¸¦ ¹ج³¢·خ ³¢؟َ´د´ظ."), item->GetName());
  4961. }
  4962.  
  4963. weapon->SetSocket(2, item->GetValue(0));
  4964. item->SetCount(item->GetCount() - 1);
  4965. }
  4966. break;
  4967.  
  4968. case USE_MOVE:
  4969. case USE_TREASURE_BOX:
  4970. case USE_MONEYBAG:
  4971. break;
  4972.  
  4973. case USE_AFFECT :
  4974. {
  4975. if (FindAffect(item->GetValue(0), aApplyInfo[item->GetValue(1)].bPointType))
  4976. {
  4977. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  4978. }
  4979. else
  4980. {
  4981. // PC_BANG_ITEM_ADD
  4982. if (item->IsPCBangItem() == true)
  4983. {
  4984. // PC¹وہخءِ أ¼إ©اط¼­ أ³¸®
  4985. if (CPCBangManager::instance().IsPCBangIP(GetDesc()->GetHostName()) == false)
  4986. {
  4987. // PC¹وہج ¾ئ´ش!
  4988. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ PC¹و؟،¼­¸¸ »ç؟ëاز ¼ِ ہض½ہ´د´ظ."));
  4989. return false;
  4990. }
  4991. }
  4992. // END_PC_BANG_ITEM_ADD
  4993.  
  4994. AddAffect(item->GetValue(0), aApplyInfo[item->GetValue(1)].bPointType, item->GetValue(2), 0, item->GetValue(3), 0, false);
  4995. item->SetCount(item->GetCount() - 1);
  4996. }
  4997. }
  4998. break;
  4999.  
  5000. case USE_CREATE_STONE:
  5001. AutoGiveItem(number(28000, 28013));
  5002. item->SetCount(item->GetCount() - 1);
  5003. break;
  5004.  
  5005. // ¹°¾à ء¦ء¶ ½؛إ³؟ë ·¹½أاا أ³¸®
  5006. case USE_RECIPE :
  5007. {
  5008. LPITEM pSource1 = FindSpecifyItem(item->GetValue(1));
  5009. DWORD dwSourceCount1 = item->GetValue(2);
  5010.  
  5011. LPITEM pSource2 = FindSpecifyItem(item->GetValue(3));
  5012. DWORD dwSourceCount2 = item->GetValue(4);
  5013.  
  5014. if (dwSourceCount1 != 0)
  5015. {
  5016. if (pSource1 == NULL)
  5017. {
  5018. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹°¾à ء¶اصہ» ہ§ار ہç·ل°، ؛خء·اص´د´ظ."));
  5019. return false;
  5020. }
  5021. }
  5022.  
  5023. if (dwSourceCount2 != 0)
  5024. {
  5025. if (pSource2 == NULL)
  5026. {
  5027. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹°¾à ء¶اصہ» ہ§ار ہç·ل°، ؛خء·اص´د´ظ."));
  5028. return false;
  5029. }
  5030. }
  5031.  
  5032. if (pSource1 != NULL)
  5033. {
  5034. if (pSource1->GetCount() < dwSourceCount1)
  5035. {
  5036. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہç·ل(%s)°، ؛خء·اص´د´ظ."), pSource1->GetName());
  5037. return false;
  5038. }
  5039.  
  5040. pSource1->SetCount(pSource1->GetCount() - dwSourceCount1);
  5041. }
  5042.  
  5043. if (pSource2 != NULL)
  5044. {
  5045. if (pSource2->GetCount() < dwSourceCount2)
  5046. {
  5047. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہç·ل(%s)°، ؛خء·اص´د´ظ."), pSource2->GetName());
  5048. return false;
  5049. }
  5050.  
  5051. pSource2->SetCount(pSource2->GetCount() - dwSourceCount2);
  5052. }
  5053.  
  5054. LPITEM pBottle = FindSpecifyItem(50901);
  5055.  
  5056. if (!pBottle || pBottle->GetCount() < 1)
  5057. {
  5058. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛َ ؛´ہج ¸ًہع¸¨´د´ظ."));
  5059. return false;
  5060. }
  5061.  
  5062. pBottle->SetCount(pBottle->GetCount() - 1);
  5063.  
  5064. if (number(1, 100) > item->GetValue(5))
  5065. {
  5066. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹°¾à ء¦ء¶؟، ½ائذاك½ہ´د´ظ."));
  5067. return false;
  5068. }
  5069.  
  5070. AutoGiveItem(item->GetValue(0));
  5071. }
  5072. break;
  5073. }
  5074. }
  5075. break;
  5076.  
  5077. case ITEM_METIN:
  5078. {
  5079. LPITEM item2;
  5080.  
  5081. if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
  5082. return false;
  5083.  
  5084. if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
  5085. return false;
  5086.  
  5087. if (item2->GetType() == ITEM_PICK) return false;
  5088. if (item2->GetType() == ITEM_ROD) return false;
  5089.  
  5090. int i;
  5091.  
  5092. for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  5093. {
  5094. DWORD dwVnum;
  5095.  
  5096. if ((dwVnum = item2->GetSocket(i)) <= 2)
  5097. continue;
  5098.  
  5099. TItemTable * p = ITEM_MANAGER::instance().GetTable(dwVnum);
  5100.  
  5101. if (!p)
  5102. continue;
  5103.  
  5104. if (item->GetValue(5) == p->alValues[5])
  5105. {
  5106. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°°ہ؛ ء¾·ùہا ¸قئ¾¼®ہ؛ ؟©·¯°³ ؛خآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  5107. return false;
  5108. }
  5109. }
  5110.  
  5111. if (item2->GetType() == ITEM_ARMOR)
  5112. {
  5113. if (!IS_SET(item->GetWearFlag(), WEARABLE_BODY) || !IS_SET(item2->GetWearFlag(), WEARABLE_BODY))
  5114. {
  5115. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¸قئ¾¼®ہ؛ ہه؛ٌ؟، ؛خآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  5116. return false;
  5117. }
  5118. }
  5119. else if (item2->GetType() == ITEM_WEAPON)
  5120. {
  5121. if (!IS_SET(item->GetWearFlag(), WEARABLE_WEAPON))
  5122. {
  5123. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¸قئ¾¼®ہ؛ ¹«±â؟، ؛خآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  5124. return false;
  5125. }
  5126. }
  5127. else
  5128. {
  5129. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛خآّاز ¼ِ ہض´آ ½½·شہج ¾ّ½ہ´د´ظ."));
  5130. return false;
  5131. }
  5132.  
  5133. for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  5134. if (item2->GetSocket(i) >= 1 && item2->GetSocket(i) <= 2 && item2->GetSocket(i) >= item->GetValue(2))
  5135. {
  5136. // ¼® ب®·ü
  5137. #ifdef ENABLE_ADDSTONE_FAILURE
  5138. if (number(1, 100) <= 30)
  5139. #else
  5140. if (1)
  5141. #endif
  5142. {
  5143. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸قئ¾¼® ؛خآّ؟، ¼؛°ّاد؟´½ہ´د´ظ."));
  5144. item2->SetSocket(i, item->GetVnum());
  5145. }
  5146. else
  5147. {
  5148. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸قئ¾¼® ؛خآّ؟، ½ائذاد؟´½ہ´د´ظ."));
  5149. item2->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
  5150. }
  5151.  
  5152. LogManager::instance().ItemLog(this, item2, "SOCKET", item->GetName());
  5153. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (METIN)");
  5154. break;
  5155. }
  5156.  
  5157. if (i == ITEM_SOCKET_MAX_NUM)
  5158. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("؛خآّاز ¼ِ ہض´آ ½½·شہج ¾ّ½ہ´د´ظ."));
  5159. }
  5160. break;
  5161.  
  5162. case ITEM_AUTOUSE:
  5163. case ITEM_MATERIAL:
  5164. case ITEM_SPECIAL:
  5165. case ITEM_TOOL:
  5166. case ITEM_LOTTERY:
  5167. break;
  5168.  
  5169. case ITEM_TOTEM:
  5170. {
  5171. if (!item->IsEquipped())
  5172. EquipItem(item);
  5173. }
  5174. break;
  5175.  
  5176. case ITEM_BLEND:
  5177. // »ُ·خ؟î ¾àأتµé
  5178. sys_log(0,"ITEM_BLEND!!");
  5179. if (Blend_Item_find(item->GetVnum()))
  5180. {
  5181. int affect_type = AFFECT_BLEND;
  5182. int apply_type = aApplyInfo[item->GetSocket(0)].bPointType;
  5183. int apply_value = item->GetSocket(1);
  5184. int apply_duration = item->GetSocket(2);
  5185.  
  5186. if (FindAffect(affect_type, apply_type))
  5187. {
  5188. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  5189. }
  5190. else
  5191. {
  5192. if (FindAffect(AFFECT_EXP_BONUS_EURO_FREE, POINT_RESIST_MAGIC))
  5193. {
  5194. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ب؟°ْ°، °ة·ء ہض½ہ´د´ظ."));
  5195. }
  5196. else
  5197. {
  5198. AddAffect(affect_type, apply_type, apply_value, 0, apply_duration, 0, false);
  5199. item->SetCount(item->GetCount() - 1);
  5200. }
  5201. }
  5202. }
  5203. break;
  5204. case ITEM_EXTRACT:
  5205. {
  5206. LPITEM pDestItem = GetItem(DestCell);
  5207. if (NULL == pDestItem)
  5208. {
  5209. return false;
  5210. }
  5211. switch (item->GetSubType())
  5212. {
  5213. case EXTRACT_DRAGON_SOUL:
  5214. if (pDestItem->IsDragonSoul())
  5215. {
  5216. return DSManager::instance().PullOut(this, NPOS, pDestItem, item);
  5217. }
  5218. return false;
  5219. case EXTRACT_DRAGON_HEART:
  5220. if (pDestItem->IsDragonSoul())
  5221. {
  5222. return DSManager::instance().ExtractDragonHeart(this, pDestItem, item);
  5223. }
  5224. return false;
  5225. default:
  5226. return false;
  5227. }
  5228. }
  5229. break;
  5230.  
  5231. case ITEM_NONE:
  5232. sys_err("Item type NONE %s", item->GetName());
  5233. break;
  5234.  
  5235. default:
  5236. sys_log(0, "UseItemEx: Unknown type %s %d", item->GetName(), item->GetType());
  5237. return false;
  5238. }
  5239.  
  5240. return true;
  5241. }
  5242.  
  5243. int g_nPortalLimitTime = 10;
  5244.  
  5245. bool CHARACTER::UseItem(TItemPos Cell, TItemPos DestCell)
  5246. {
  5247. WORD wCell = Cell.cell;
  5248. BYTE window_type = Cell.window_type;
  5249. //WORD wDestCell = DestCell.cell;
  5250. //BYTE bDestInven = DestCell.window_type;
  5251. LPITEM item;
  5252.  
  5253. if (!CanHandleItem())
  5254. return false;
  5255.  
  5256. if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
  5257. return false;
  5258.  
  5259. sys_log(0, "%s: USE_ITEM %s (inven %d, cell: %d)", GetName(), item->GetName(), window_type, wCell);
  5260.  
  5261. if (item->IsExchanging())
  5262. return false;
  5263.  
  5264. if (!item->CanUsedBy(this))
  5265. {
  5266. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±؛ء÷ہج ¸آءِ¾ت¾ئ ہج ¾ئہجإغہ» »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  5267. return false;
  5268. }
  5269.  
  5270. if (IsStun())
  5271. return false;
  5272.  
  5273. if (false == FN_check_item_sex(this, item))
  5274. {
  5275. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼؛؛°ہج ¸آءِ¾ت¾ئ ہج ¾ئہجإغہ» »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  5276. return false;
  5277. }
  5278.  
  5279. //PREVENT_TRADE_WINDOW
  5280. if (IS_SUMMON_ITEM(item->GetVnum()))
  5281. {
  5282. if (false == IS_SUMMONABLE_ZONE(GetMapIndex()))
  5283. {
  5284. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç؟ëاز¼ِ ¾ّ½ہ´د´ظ."));
  5285. return false;
  5286. }
  5287.  
  5288. // °وب¥¹فءِ »ç؟ëءِ »َ´ë¹وہج SUMMONABLE_ZONE؟، ہض´آ°،´آ WarpToPC()؟،¼­ أ¼إ©
  5289.  
  5290. //»ï°إ¸® °ü·ء ¸ت؟،¼­´آ ±حب¯؛خ¸¦ ¸·¾ئ¹ِ¸°´ظ.
  5291. if (CThreeWayWar::instance().IsThreeWayWarMapIndex(GetMapIndex()))
  5292. {
  5293. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ï°إ¸® ہüإُ آü°،ءك؟،´آ ±حب¯؛خ,±حب¯±â¾ï؛خ¸¦ »ç؟ëاز¼ِ ¾ّ½ہ´د´ظ."));
  5294. return false;
  5295. }
  5296. int iPulse = thecore_pulse();
  5297.  
  5298. //أ¢°ي ؟¬بؤ أ¼إ©
  5299. if (iPulse - GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
  5300. {
  5301. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أ¢°ي¸¦ ؟¬بؤ %dأت ہج³»؟،´آ ±حب¯؛خ,±حب¯±â¾ï؛خ¸¦ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."), g_nPortalLimitTime);
  5302.  
  5303. if (test_server)
  5304. ChatPacket(CHAT_TYPE_INFO, "[TestOnly]Pulse %d LoadTime %d PASS %d", iPulse, GetSafeboxLoadTime(), PASSES_PER_SEC(g_nPortalLimitTime));
  5305. return false;
  5306. }
  5307.  
  5308. //°إ·،°ü·أ أ¢ أ¼إ©
  5309. if (GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
  5310. {
  5311. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°إ·،أ¢,أ¢°ي µîہ» ؟¬ »َإآ؟،¼­´آ ±حب¯؛خ,±حب¯±â¾ï؛خ ¸¦ »ç؟ëاز¼ِ ¾ّ½ہ´د´ظ."));
  5312. return false;
  5313. }
  5314.  
  5315. //PREVENT_REFINE_HACK
  5316. //°³·®بؤ ½أ°£أ¼إ©
  5317. {
  5318. if (iPulse - GetRefineTime() < PASSES_PER_SEC(g_nPortalLimitTime))
  5319. {
  5320. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ °³·®بؤ %dأت ہج³»؟،´آ ±حب¯؛خ,±حب¯±â¾ï؛خ¸¦ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."), g_nPortalLimitTime);
  5321. return false;
  5322. }
  5323. }
  5324. //END_PREVENT_REFINE_HACK
  5325.  
  5326.  
  5327. //PREVENT_ITEM_COPY
  5328. {
  5329. if (iPulse - GetMyShopTime() < PASSES_PER_SEC(g_nPortalLimitTime))
  5330. {
  5331. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³ہخ»َء، »ç؟ëبؤ %dأت ہج³»؟،´آ ±حب¯؛خ,±حب¯±â¾ï؛خ¸¦ »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."), g_nPortalLimitTime);
  5332. return false;
  5333. }
  5334.  
  5335. }
  5336. //END_PREVENT_ITEM_COPY
  5337.  
  5338.  
  5339. //±حب¯؛خ °إ¸®أ¼إ©
  5340. if (item->GetVnum() != 70302)
  5341. {
  5342. PIXEL_POSITION posWarp;
  5343.  
  5344. int x = 0;
  5345. int y = 0;
  5346.  
  5347. double nDist = 0;
  5348. const double nDistant = 5000.0;
  5349. //±حب¯±â¾ï؛خ
  5350. if (item->GetVnum() == 22010)
  5351. {
  5352. x = item->GetSocket(0) - GetX();
  5353. y = item->GetSocket(1) - GetY();
  5354. }
  5355. //±حب¯؛خ
  5356. else if (item->GetVnum() == 22000)
  5357. {
  5358. SECTREE_MANAGER::instance().GetRecallPositionByEmpire(GetMapIndex(), GetEmpire(), posWarp);
  5359.  
  5360. if (item->GetSocket(0) == 0)
  5361. {
  5362. x = posWarp.x - GetX();
  5363. y = posWarp.y - GetY();
  5364. }
  5365. else
  5366. {
  5367. x = item->GetSocket(0) - GetX();
  5368. y = item->GetSocket(1) - GetY();
  5369. }
  5370. }
  5371.  
  5372. nDist = sqrt(pow((float)x,2) + pow((float)y,2));
  5373.  
  5374. if (nDistant > nDist)
  5375. {
  5376. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہجµ؟ µا¾îءْ ہ§ؤ،؟ح ³ت¹« °،±î؟ِ ±حب¯؛خ¸¦ »ç؟ëاز¼ِ ¾ّ½ہ´د´ظ."));
  5377. if (test_server)
  5378. ChatPacket(CHAT_TYPE_INFO, "PossibleDistant %f nNowDist %f", nDistant,nDist);
  5379. return false;
  5380. }
  5381. }
  5382.  
  5383. //PREVENT_PORTAL_AFTER_EXCHANGE
  5384. //±³ب¯ بؤ ½أ°£أ¼إ©
  5385. if (iPulse - GetExchangeTime() < PASSES_PER_SEC(g_nPortalLimitTime))
  5386. {
  5387. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°إ·، بؤ %dأت ہج³»؟،´آ ±حب¯؛خ,±حب¯±â¾ï؛خµîہ» »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."), g_nPortalLimitTime);
  5388. return false;
  5389. }
  5390. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  5391.  
  5392. }
  5393.  
  5394. //؛¸µû¸® ؛ٌ´ـ »ç؟ë½أ °إ·،أ¢ ء¦ار أ¼إ©
  5395. if ((item->GetVnum() == 50200) || (item->GetVnum() == 71049))
  5396. {
  5397. if (GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
  5398. {
  5399. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°إ·،أ¢,أ¢°ي µîہ» ؟¬ »َإآ؟،¼­´آ ؛¸µû¸®,؛ٌ´ـ؛¸µû¸®¸¦ »ç؟ëاز¼ِ ¾ّ½ہ´د´ظ."));
  5400. return false;
  5401. }
  5402.  
  5403. }
  5404. //END_PREVENT_TRADE_WINDOW
  5405.  
  5406. if (IS_SET(item->GetFlag(), ITEM_FLAG_LOG)) // »ç؟ë ·خ±×¸¦ ³²±â´آ ¾ئہجإغ أ³¸®
  5407. {
  5408. DWORD vid = item->GetVID();
  5409. DWORD oldCount = item->GetCount();
  5410. DWORD vnum = item->GetVnum();
  5411.  
  5412. char hint[ITEM_NAME_MAX_LEN + 32 + 1];
  5413. int len = snprintf(hint, sizeof(hint) - 32, "%s", item->GetName());
  5414.  
  5415. if (len < 0 || len >= (int) sizeof(hint) - 32)
  5416. len = (sizeof(hint) - 32) - 1;
  5417.  
  5418. bool ret = UseItemEx(item, DestCell);
  5419.  
  5420. if (NULL == ITEM_MANAGER::instance().FindByVID(vid)) // UseItemEx؟،¼­ ¾ئہجإغہج »èء¦ µا¾ْ´ظ. »èء¦ ·خ±×¸¦ ³²±è
  5421. {
  5422. LogManager::instance().ItemLog(this, vid, vnum, "REMOVE", hint);
  5423. }
  5424. else if (oldCount != item->GetCount())
  5425. {
  5426. snprintf(hint + len, sizeof(hint) - len, " %u", oldCount - 1);
  5427. LogManager::instance().ItemLog(this, vid, vnum, "USE_ITEM", hint);
  5428. }
  5429. return (ret);
  5430. }
  5431. else
  5432. return UseItemEx(item, DestCell);
  5433. }
  5434.  
  5435. bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount)
  5436. {
  5437. LPITEM item = NULL;
  5438.  
  5439. if (!CanHandleItem())
  5440. {
  5441. if (NULL != DragonSoul_RefineWindow_GetOpener())
  5442. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°­ب­أ¢ہ» ؟¬ »َإآ؟،¼­´آ ¾ئہجإغہ» ؟إ±و ¼ِ ¾ّ½ہ´د´ظ."));
  5443. return false;
  5444. }
  5445. #ifdef ENABLE_NEWSTUFF
  5446. if (0 != g_ItemDropTimeLimitValue)
  5447. {
  5448. if (get_dword_time() < m_dwLastItemDropTime+g_ItemDropTimeLimitValue)
  5449. {
  5450. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ °ٌµه¸¦ ¹ِ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  5451. return false;
  5452. }
  5453. }
  5454.  
  5455. m_dwLastItemDropTime = get_dword_time();
  5456. #endif
  5457. if (IsDead())
  5458. return false;
  5459.  
  5460. if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
  5461. return false;
  5462.  
  5463. if (item->IsExchanging())
  5464. return false;
  5465.  
  5466. if (true == item->isLocked())
  5467. return false;
  5468.  
  5469. if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
  5470. return false;
  5471.  
  5472. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_DROP | ITEM_ANTIFLAG_GIVE))
  5473. {
  5474. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹ِ¸± ¼ِ ¾ّ´آ ¾ئہجإغہش´د´ظ."));
  5475. return false;
  5476. }
  5477.  
  5478. if (bCount == 0 || bCount > item->GetCount())
  5479. bCount = item->GetCount();
  5480.  
  5481. SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); // Quickslot ؟،¼­ ءِ؟ٍ
  5482.  
  5483. LPITEM pkItemToDrop;
  5484.  
  5485. if (bCount == item->GetCount())
  5486. {
  5487. item->RemoveFromCharacter();
  5488. pkItemToDrop = item;
  5489. }
  5490. else
  5491. {
  5492. if (bCount == 0)
  5493. {
  5494. if (test_server)
  5495. sys_log(0, "[DROP_ITEM] drop item count == 0");
  5496. return false;
  5497. }
  5498.  
  5499. item->SetCount(item->GetCount() - bCount);
  5500. ITEM_MANAGER::instance().FlushDelayedSave(item);
  5501.  
  5502. pkItemToDrop = ITEM_MANAGER::instance().CreateItem(item->GetVnum(), bCount);
  5503.  
  5504. // copy item socket -- by mhh
  5505. FN_copy_item_socket(pkItemToDrop, item);
  5506.  
  5507. char szBuf[51 + 1];
  5508. snprintf(szBuf, sizeof(szBuf), "%u %u", pkItemToDrop->GetID(), pkItemToDrop->GetCount());
  5509. LogManager::instance().ItemLog(this, item, "ITEM_SPLIT", szBuf);
  5510. }
  5511.  
  5512. PIXEL_POSITION pxPos = GetXYZ();
  5513.  
  5514. if (pkItemToDrop->AddToGround(GetMapIndex(), pxPos))
  5515. {
  5516. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¶³¾îءّ ¾ئہجإغہ؛ 3؛ذ بؤ »ç¶َء‎´د´ظ."));
  5517. #ifdef ENABLE_NEWSTUFF
  5518. pkItemToDrop->StartDestroyEvent(g_aiItemDestroyTime[ITEM_DESTROY_TIME_DROPITEM]);
  5519. #else
  5520. pkItemToDrop->StartDestroyEvent();
  5521. #endif
  5522.  
  5523. ITEM_MANAGER::instance().FlushDelayedSave(pkItemToDrop);
  5524.  
  5525. char szHint[32 + 1];
  5526. snprintf(szHint, sizeof(szHint), "%s %u %u", pkItemToDrop->GetName(), pkItemToDrop->GetCount(), pkItemToDrop->GetOriginalVnum());
  5527. LogManager::instance().ItemLog(this, pkItemToDrop, "DROP", szHint);
  5528. //Motion(MOTION_PICKUP);
  5529. }
  5530.  
  5531. return true;
  5532. }
  5533.  
  5534. bool CHARACTER::DropGold(int gold)
  5535. {
  5536. if (gold <= 0 || gold > GetGold())
  5537. return false;
  5538.  
  5539. if (!CanHandleItem())
  5540. return false;
  5541.  
  5542. if (0 != g_GoldDropTimeLimitValue)
  5543. {
  5544. if (get_dword_time() < m_dwLastGoldDropTime+g_GoldDropTimeLimitValue)
  5545. {
  5546. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ °ٌµه¸¦ ¹ِ¸± ¼ِ ¾ّ½ہ´د´ظ."));
  5547. return false;
  5548. }
  5549. }
  5550.  
  5551. m_dwLastGoldDropTime = get_dword_time();
  5552.  
  5553. LPITEM item = ITEM_MANAGER::instance().CreateItem(1, gold);
  5554.  
  5555. if (item)
  5556. {
  5557. PIXEL_POSITION pos = GetXYZ();
  5558.  
  5559. if (item->AddToGround(GetMapIndex(), pos))
  5560. {
  5561. //Motion(MOTION_PICKUP);
  5562. PointChange(POINT_GOLD, -gold, true);
  5563.  
  5564. if (gold > 1000) // أµ؟ّ ہج»َ¸¸ ±â·دار´ظ.
  5565. LogManager::instance().CharLog(this, gold, "DROP_GOLD", "");
  5566.  
  5567. #ifdef ENABLE_NEWSTUFF
  5568. item->StartDestroyEvent(g_aiItemDestroyTime[ITEM_DESTROY_TIME_DROPGOLD]);
  5569. #else
  5570. item->StartDestroyEvent();
  5571. #endif
  5572. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¶³¾îءّ ¾ئہجإغہ؛ %d؛ذ بؤ »ç¶َء‎´د´ظ."), 150/60);
  5573. }
  5574.  
  5575. Save();
  5576. return true;
  5577. }
  5578.  
  5579. return false;
  5580. }
  5581.  
  5582. bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, BYTE count)
  5583. {
  5584. LPITEM item = NULL;
  5585.  
  5586. if (!IsValidItemPosition(Cell))
  5587. return false;
  5588.  
  5589. if (!(item = GetItem(Cell)))
  5590. return false;
  5591.  
  5592. if (item->IsExchanging())
  5593. return false;
  5594.  
  5595. if (item->GetCount() < count)
  5596. return false;
  5597.  
  5598. if (INVENTORY == Cell.window_type && Cell.cell >= INVENTORY_MAX_NUM && IS_SET(item->GetFlag(), ITEM_FLAG_IRREMOVABLE))
  5599. return false;
  5600.  
  5601. if (true == item->isLocked())
  5602. return false;
  5603.  
  5604. if (!IsValidItemPosition(DestCell))
  5605. {
  5606. return false;
  5607. }
  5608.  
  5609. if (!CanHandleItem())
  5610. {
  5611. if (NULL != DragonSoul_RefineWindow_GetOpener())
  5612. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°­ب­أ¢ہ» ؟¬ »َإآ؟،¼­´آ ¾ئہجإغہ» ؟إ±و ¼ِ ¾ّ½ہ´د´ظ."));
  5613. return false;
  5614. }
  5615.  
  5616. // ±âب¹ہعہا ؟نأ»ہ¸·خ ؛§ئ® ہخ؛¥إن¸®؟،´آ ئ¯ء¤ إ¸ہشہا ¾ئہجإغ¸¸ ³ضہ» ¼ِ ہض´ظ.
  5617. if (DestCell.IsBeltInventoryPosition() && false == CBeltInventoryHelper::CanMoveIntoBeltInventory(item))
  5618. {
  5619. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ ؛§ئ® ہخ؛¥إن¸®·خ ؟إ±و ¼ِ ¾ّ½ہ´د´ظ."));
  5620. return false;
  5621. }
  5622.  
  5623. // ہج¹ج آّ؟ëءكہخ ¾ئہجإغہ» ´ظ¸¥ °÷ہ¸·خ ؟إ±â´آ °و؟ى, 'ہهأ¥ اطء¦' °،´ةار ءِ ب®ہخاد°ي ؟إ±è
  5624. if (Cell.IsEquipPosition() && !CanUnequipNow(item))
  5625. return false;
  5626.  
  5627. if (DestCell.IsEquipPosition())
  5628. {
  5629. if (GetItem(DestCell)) // ہه؛ٌہد °و؟ى ار °÷¸¸ °ث»çاطµµ µب´ظ.
  5630. {
  5631. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج ہه؛ٌ¸¦ آّ؟ëاد°ي ہض½ہ´د´ظ."));
  5632.  
  5633. return false;
  5634. }
  5635.  
  5636. EquipItem(item, DestCell.cell - INVENTORY_MAX_NUM);
  5637. }
  5638. else
  5639. {
  5640. if (item->IsDragonSoul())
  5641. {
  5642. if (item->IsEquipped())
  5643. {
  5644. return DSManager::instance().PullOut(this, DestCell, item);
  5645. }
  5646. else
  5647. {
  5648. if (DestCell.window_type != DRAGON_SOUL_INVENTORY)
  5649. {
  5650. return false;
  5651. }
  5652.  
  5653. if (!DSManager::instance().IsValidCellForThisItem(item, DestCell))
  5654. return false;
  5655. }
  5656. }
  5657. // ؟ëب¥¼®ہج ¾ئ´ر ¾ئہجإغہ؛ ؟ëب¥¼® ہخ؛¥؟، µé¾î°¥ ¼ِ ¾ّ´ظ.
  5658. else if (DRAGON_SOUL_INVENTORY == DestCell.window_type)
  5659. return false;
  5660.  
  5661. LPITEM item2;
  5662.  
  5663. if ((item2 = GetItem(DestCell)) && item != item2 && item2->IsStackable() &&
  5664. !IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_STACK) &&
  5665. item2->GetVnum() == item->GetVnum()) // اصؤ¥ ¼ِ ہض´آ ¾ئہجإغہا °و؟ى
  5666. {
  5667. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  5668. if (item2->GetSocket(i) != item->GetSocket(i))
  5669. return false;
  5670.  
  5671. if (count == 0)
  5672. count = item->GetCount();
  5673.  
  5674. sys_log(0, "%s: ITEM_STACK %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
  5675. DestCell.window_type, DestCell.cell, count);
  5676.  
  5677. count = MIN(g_bItemCountLimit - item2->GetCount(), count);
  5678.  
  5679. item->SetCount(item->GetCount() - count);
  5680. item2->SetCount(item2->GetCount() + count);
  5681. return true;
  5682. }
  5683.  
  5684. if (!IsEmptyItemGrid(DestCell, item->GetSize(), Cell.cell))
  5685. return false;
  5686.  
  5687. if (count == 0 || count >= item->GetCount() || !item->IsStackable() || IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
  5688. {
  5689. sys_log(0, "%s: ITEM_MOVE %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
  5690. DestCell.window_type, DestCell.cell, count);
  5691.  
  5692. item->RemoveFromCharacter();
  5693. SetItem(DestCell, item);
  5694.  
  5695. if (INVENTORY == Cell.window_type && INVENTORY == DestCell.window_type)
  5696. SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, DestCell.cell);
  5697. }
  5698. else if (count < item->GetCount())
  5699. {
  5700.  
  5701. sys_log(0, "%s: ITEM_SPLIT %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
  5702. DestCell.window_type, DestCell.cell, count);
  5703.  
  5704. item->SetCount(item->GetCount() - count);
  5705. LPITEM item2 = ITEM_MANAGER::instance().CreateItem(item->GetVnum(), count);
  5706.  
  5707. // copy socket -- by mhh
  5708. FN_copy_item_socket(item2, item);
  5709.  
  5710. item2->AddToCharacter(this, DestCell);
  5711.  
  5712. char szBuf[51+1];
  5713. snprintf(szBuf, sizeof(szBuf), "%u %u %u %u ", item2->GetID(), item2->GetCount(), item->GetCount(), item->GetCount() + item2->GetCount());
  5714. LogManager::instance().ItemLog(this, item, "ITEM_SPLIT", szBuf);
  5715. }
  5716. }
  5717.  
  5718. return true;
  5719. }
  5720.  
  5721. namespace NPartyPickupDistribute
  5722. {
  5723. struct FFindOwnership
  5724. {
  5725. LPITEM item;
  5726. LPCHARACTER owner;
  5727.  
  5728. FFindOwnership(LPITEM item)
  5729. : item(item), owner(NULL)
  5730. {
  5731. }
  5732.  
  5733. void operator () (LPCHARACTER ch)
  5734. {
  5735. if (item->IsOwnership(ch))
  5736. owner = ch;
  5737. }
  5738. };
  5739.  
  5740. struct FCountNearMember
  5741. {
  5742. int total;
  5743. int x, y;
  5744.  
  5745. FCountNearMember(LPCHARACTER center )
  5746. : total(0), x(center->GetX()), y(center->GetY())
  5747. {
  5748. }
  5749.  
  5750. void operator () (LPCHARACTER ch)
  5751. {
  5752. if (DISTANCE_APPROX(ch->GetX() - x, ch->GetY() - y) <= PARTY_DEFAULT_RANGE)
  5753. total += 1;
  5754. }
  5755. };
  5756.  
  5757. struct FMoneyDistributor
  5758. {
  5759. int total;
  5760. LPCHARACTER c;
  5761. int x, y;
  5762. int iMoney;
  5763.  
  5764. FMoneyDistributor(LPCHARACTER center, int iMoney)
  5765. : total(0), c(center), x(center->GetX()), y(center->GetY()), iMoney(iMoney)
  5766. {
  5767. }
  5768.  
  5769. void operator ()(LPCHARACTER ch)
  5770. {
  5771. if (ch!=c)
  5772. if (DISTANCE_APPROX(ch->GetX() - x, ch->GetY() - y) <= PARTY_DEFAULT_RANGE)
  5773. {
  5774. ch->PointChange(POINT_GOLD, iMoney, true);
  5775.  
  5776. if (iMoney > 1000) // أµ؟ّ ہج»َ¸¸ ±â·دار´ظ.
  5777. {
  5778. LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().CharLog(ch, iMoney, "GET_GOLD", ""));
  5779. }
  5780. }
  5781. }
  5782. };
  5783. }
  5784.  
  5785. void CHARACTER::GiveGold(int iAmount)
  5786. {
  5787. if (iAmount <= 0)
  5788. return;
  5789.  
  5790. sys_log(0, "GIVE_GOLD: %s %d", GetName(), iAmount);
  5791.  
  5792. if (GetParty())
  5793. {
  5794. LPPARTY pParty = GetParty();
  5795.  
  5796. // ئؤئ¼°، ہض´آ °و؟ى ³ھ´©¾î °،ءّ´ظ.
  5797. DWORD dwTotal = iAmount;
  5798. DWORD dwMyAmount = dwTotal;
  5799.  
  5800. NPartyPickupDistribute::FCountNearMember funcCountNearMember(this);
  5801. pParty->ForEachOnlineMember(funcCountNearMember);
  5802.  
  5803. if (funcCountNearMember.total > 1)
  5804. {
  5805. DWORD dwShare = dwTotal / funcCountNearMember.total;
  5806. dwMyAmount -= dwShare * (funcCountNearMember.total - 1);
  5807.  
  5808. NPartyPickupDistribute::FMoneyDistributor funcMoneyDist(this, dwShare);
  5809.  
  5810. pParty->ForEachOnlineMember(funcMoneyDist);
  5811. }
  5812.  
  5813. PointChange(POINT_GOLD, dwMyAmount, true);
  5814.  
  5815. if (dwMyAmount > 1000) // أµ؟ّ ہج»َ¸¸ ±â·دار´ظ.
  5816. {
  5817. LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().CharLog(this, dwMyAmount, "GET_GOLD", ""));
  5818. }
  5819. }
  5820. else
  5821. {
  5822. PointChange(POINT_GOLD, iAmount, true);
  5823.  
  5824. if (iAmount > 1000) // أµ؟ّ ہج»َ¸¸ ±â·دار´ظ.
  5825. {
  5826. LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().CharLog(this, iAmount, "GET_GOLD", ""));
  5827. }
  5828. }
  5829. }
  5830.  
  5831. bool CHARACTER::PickupItem(DWORD dwVID)
  5832. {
  5833. LPITEM item = ITEM_MANAGER::instance().FindByVID(dwVID);
  5834.  
  5835. if (IsObserverMode())
  5836. return false;
  5837.  
  5838. if (!item || !item->GetSectree())
  5839. return false;
  5840.  
  5841. if (item->DistanceValid(this))
  5842. {
  5843. if (item->IsOwnership(this))
  5844. {
  5845. // ¸¸¾à ءضہ¸·ء اد´آ ¾ئہجإغہج ؟¤إ©¶َ¸é
  5846. if (item->GetType() == ITEM_ELK)
  5847. {
  5848. GiveGold(item->GetCount());
  5849. item->RemoveFromGround();
  5850.  
  5851. M2_DESTROY_ITEM(item);
  5852.  
  5853. Save();
  5854. }
  5855. // ئٍ¹üار ¾ئہجإغہج¶َ¸é
  5856. else
  5857. {
  5858. if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
  5859. {
  5860. BYTE bCount = item->GetCount();
  5861.  
  5862. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  5863. {
  5864. LPITEM item2 = GetInventoryItem(i);
  5865.  
  5866. if (!item2)
  5867. continue;
  5868.  
  5869. if (item2->GetVnum() == item->GetVnum())
  5870. {
  5871. int j;
  5872.  
  5873. for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
  5874. if (item2->GetSocket(j) != item->GetSocket(j))
  5875. break;
  5876.  
  5877. if (j != ITEM_SOCKET_MAX_NUM)
  5878. continue;
  5879.  
  5880. BYTE bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
  5881. bCount -= bCount2;
  5882.  
  5883. item2->SetCount(item2->GetCount() + bCount2);
  5884.  
  5885. if (bCount == 0)
  5886. {
  5887. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s"), item2->GetName());
  5888. M2_DESTROY_ITEM(item);
  5889. if (item2->GetType() == ITEM_QUEST)
  5890. quest::CQuestManager::instance().PickupItem (GetPlayerID(), item2);
  5891. return true;
  5892. }
  5893. }
  5894. }
  5895.  
  5896. item->SetCount(bCount);
  5897. }
  5898.  
  5899. int iEmptyCell;
  5900. if (item->IsDragonSoul())
  5901. {
  5902. if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
  5903. {
  5904. sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
  5905. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِاد°ي ہض´آ ¾ئہجإغہج ³ت¹« ¸¹½ہ´د´ظ."));
  5906. return false;
  5907. }
  5908. }
  5909. else
  5910. {
  5911. if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
  5912. {
  5913. sys_log(0, "No empty inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
  5914. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِاد°ي ہض´آ ¾ئہجإغہج ³ت¹« ¸¹½ہ´د´ظ."));
  5915. return false;
  5916. }
  5917. }
  5918.  
  5919. item->RemoveFromGround();
  5920.  
  5921. if (item->IsDragonSoul())
  5922. item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
  5923. else
  5924. item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
  5925.  
  5926. char szHint[32+1];
  5927. snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
  5928. LogManager::instance().ItemLog(this, item, "GET", szHint);
  5929. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s"), item->GetName());
  5930.  
  5931. if (item->GetType() == ITEM_QUEST)
  5932. quest::CQuestManager::instance().PickupItem (GetPlayerID(), item);
  5933. }
  5934.  
  5935. //Motion(MOTION_PICKUP);
  5936. return true;
  5937. }
  5938. else if (!IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_GIVE | ITEM_ANTIFLAG_DROP) && GetParty())
  5939. {
  5940. // ´ظ¸¥ ئؤئ¼؟ّ ¼زہ¯±ا ¾ئہجإغہ» ءضہ¸·ء°ي ار´ظ¸é
  5941. NPartyPickupDistribute::FFindOwnership funcFindOwnership(item);
  5942.  
  5943. GetParty()->ForEachOnlineMember(funcFindOwnership);
  5944.  
  5945. LPCHARACTER owner = funcFindOwnership.owner;
  5946. // @fixme115
  5947. if (!owner)
  5948. return false;
  5949.  
  5950. int iEmptyCell;
  5951.  
  5952. if (item->IsDragonSoul())
  5953. {
  5954. if (!(owner && (iEmptyCell = owner->GetEmptyDragonSoulInventory(item)) != -1))
  5955. {
  5956. owner = this;
  5957.  
  5958. if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
  5959. {
  5960. owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِاد°ي ہض´آ ¾ئہجإغہج ³ت¹« ¸¹½ہ´د´ظ."));
  5961. return false;
  5962. }
  5963. }
  5964. }
  5965. else
  5966. {
  5967. if (!(owner && (iEmptyCell = owner->GetEmptyInventory(item->GetSize())) != -1))
  5968. {
  5969. owner = this;
  5970.  
  5971. if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
  5972. {
  5973. owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼زءِاد°ي ہض´آ ¾ئہجإغہج ³ت¹« ¸¹½ہ´د´ظ."));
  5974. return false;
  5975. }
  5976. }
  5977. }
  5978.  
  5979. item->RemoveFromGround();
  5980.  
  5981. if (item->IsDragonSoul())
  5982. item->AddToCharacter(owner, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
  5983. else
  5984. item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
  5985.  
  5986. char szHint[32+1];
  5987. snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
  5988. LogManager::instance().ItemLog(owner, item, "GET", szHint);
  5989.  
  5990. if (owner == this)
  5991. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s"), item->GetName());
  5992. else
  5993. {
  5994. owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s ´شہ¸·خ؛خإح %s"), GetName(), item->GetName());
  5995. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ہü´ق: %s ´ش؟،°ش %s"), owner->GetName(), item->GetName());
  5996. }
  5997.  
  5998. if (item->GetType() == ITEM_QUEST)
  5999. quest::CQuestManager::instance().PickupItem (owner->GetPlayerID(), item);
  6000.  
  6001. return true;
  6002. }
  6003. }
  6004.  
  6005. return false;
  6006. }
  6007.  
  6008. bool CHARACTER::SwapItem(BYTE bCell, BYTE bDestCell)
  6009. {
  6010. if (!CanHandleItem())
  6011. return false;
  6012.  
  6013. TItemPos srcCell(INVENTORY, bCell), destCell(INVENTORY, bDestCell);
  6014.  
  6015. // ؟أ¹ظ¸¥ Cell ہخءِ °ث»ç
  6016. // ؟ëب¥¼®ہ؛ Swapاز ¼ِ ¾ّہ¸¹ا·خ, ؟©±â¼­ °ة¸².
  6017. //if (bCell >= INVENTORY_MAX_NUM + WEAR_MAX_NUM || bDestCell >= INVENTORY_MAX_NUM + WEAR_MAX_NUM)
  6018. if (srcCell.IsDragonSoulEquipPosition() || destCell.IsDragonSoulEquipPosition())
  6019. return false;
  6020.  
  6021. // °°ہ؛ CELL ہخءِ °ث»ç
  6022. if (bCell == bDestCell)
  6023. return false;
  6024.  
  6025. // µر ´ظ ہه؛ٌأ¢ ہ§ؤ،¸é Swap از ¼ِ ¾ّ´ظ.
  6026. if (srcCell.IsEquipPosition() && destCell.IsEquipPosition())
  6027. return false;
  6028.  
  6029. LPITEM item1, item2;
  6030.  
  6031. // item2°، ہه؛ٌأ¢؟، ہض´آ °حہج µاµµ·د.
  6032. if (srcCell.IsEquipPosition())
  6033. {
  6034. item1 = GetInventoryItem(bDestCell);
  6035. item2 = GetInventoryItem(bCell);
  6036. }
  6037. else
  6038. {
  6039. item1 = GetInventoryItem(bCell);
  6040. item2 = GetInventoryItem(bDestCell);
  6041. }
  6042.  
  6043. if (!item1 || !item2)
  6044. return false;
  6045.  
  6046. if (item1 == item2)
  6047. {
  6048. sys_log(0, "[WARNING][WARNING][HACK USER!] : %s %d %d", m_stName.c_str(), bCell, bDestCell);
  6049. return false;
  6050. }
  6051.  
  6052. // item2°، bCellہ§ؤ،؟، µé¾î°¥ ¼ِ ہض´آءِ ب®ہخار´ظ.
  6053. if (!IsEmptyItemGrid(TItemPos (INVENTORY, item1->GetCell()), item2->GetSize(), item1->GetCell()))
  6054. return false;
  6055.  
  6056. // ¹ظ²ـ ¾ئہجإغہج ہه؛ٌأ¢؟، ہضہ¸¸é
  6057. if (TItemPos(EQUIPMENT, item2->GetCell()).IsEquipPosition())
  6058. {
  6059. BYTE bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM;
  6060. BYTE bInvenCell = item1->GetCell();
  6061.  
  6062. // آّ؟ëءكہخ ¾ئہجإغہ» ¹‏ہ» ¼ِ ہض°ي, آّ؟ë ؟¹ء¤ ¾ئہجإغہج آّ؟ë °،´ةار »َإآ؟©¾ك¸¸ ءّاà
  6063. if (item2->IsDragonSoul()) // @fixme117
  6064. {
  6065. if (false == CanUnequipNow(item2) || false == CanEquipNow(item1))
  6066. return false;
  6067. }
  6068.  
  6069. if (bEquipCell != item1->FindEquipCell(this)) // °°ہ؛ ہ§ؤ،ہد¶§¸¸ ام؟ë
  6070. return false;
  6071.  
  6072. item2->RemoveFromCharacter();
  6073.  
  6074. if (item1->EquipTo(this, bEquipCell))
  6075. item2->AddToCharacter(this, TItemPos(INVENTORY, bInvenCell));
  6076. else
  6077. sys_err("SwapItem cannot equip %s! item1 %s", item2->GetName(), item1->GetName());
  6078. }
  6079. else
  6080. {
  6081. BYTE bCell1 = item1->GetCell();
  6082. BYTE bCell2 = item2->GetCell();
  6083.  
  6084. item1->RemoveFromCharacter();
  6085. item2->RemoveFromCharacter();
  6086.  
  6087. item1->AddToCharacter(this, TItemPos(INVENTORY, bCell2));
  6088. item2->AddToCharacter(this, TItemPos(INVENTORY, bCell1));
  6089. }
  6090.  
  6091. return true;
  6092. }
  6093.  
  6094. bool CHARACTER::UnequipItem(LPITEM item)
  6095. {
  6096. int pos;
  6097.  
  6098. if (false == CanUnequipNow(item))
  6099. return false;
  6100.  
  6101. if (item->IsDragonSoul())
  6102. pos = GetEmptyDragonSoulInventory(item);
  6103. else
  6104. pos = GetEmptyInventory(item->GetSize());
  6105.  
  6106. // HARD CODING
  6107. if (item->GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
  6108. ShowAlignment(true);
  6109.  
  6110. item->RemoveFromCharacter();
  6111. if (item->IsDragonSoul())
  6112. {
  6113. item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, pos));
  6114. }
  6115. else
  6116. item->AddToCharacter(this, TItemPos(INVENTORY, pos));
  6117.  
  6118. CheckMaximumPoints();
  6119.  
  6120. return true;
  6121. }
  6122.  
  6123. //
  6124. // @version 05/07/05 Bang2ni - Skill »ç؟ëبؤ 1.5 أت ہج³»؟، ہه؛ٌ آّ؟ë ±فءِ
  6125. //
  6126. bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell)
  6127. {
  6128. if (item->IsExchanging())
  6129. return false;
  6130.  
  6131. if (false == item->IsEquipable())
  6132. return false;
  6133.  
  6134. if (false == CanEquipNow(item))
  6135. return false;
  6136.  
  6137. int iWearCell = item->FindEquipCell(this, iCandidateCell);
  6138.  
  6139. if (iWearCell < 0)
  6140. return false;
  6141.  
  6142. // ¹«¾ً°،¸¦ إ؛ »َإآ؟،¼­ إخ½أµµ ہش±â ±فءِ
  6143. if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11901 && item->GetVnum() <= 11904))
  6144. {
  6145. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»ہ» إ؛ »َإآ؟،¼­ ؟¹؛¹ہ» ہشہ» ¼ِ ¾ّ½ہ´د´ظ."));
  6146. return false;
  6147. }
  6148.  
  6149. if (iWearCell != WEAR_ARROW && IsPolymorphed())
  6150. {
  6151. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µذ°© ءك؟،´آ آّ؟ëءكہخ ہه؛ٌ¸¦ ؛¯°واز ¼ِ ¾ّ½ہ´د´ظ."));
  6152. return false;
  6153. }
  6154.  
  6155. if (FN_check_item_sex(this, item) == false)
  6156. {
  6157. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼؛؛°ہج ¸آءِ¾ت¾ئ ہج ¾ئہجإغہ» »ç؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  6158. return false;
  6159. }
  6160.  
  6161. //½إ±ش إ»°ح »ç؟ë½أ ±âء¸ ¸» »ç؟ë؟©؛خ أ¼إ©
  6162. if(item->IsRideItem() && IsRiding())
  6163. {
  6164. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج إ»°حہ» ہج؟ëءكہش´د´ظ."));
  6165. return false;
  6166. }
  6167.  
  6168. // ب­»ى ہج؟ـ؟،´آ ¸¶ءِ¸· °ّ°ف ½أ°£ ¶ا´آ ½؛إ³ »ç؟ë 1.5 بؤ؟، ہه؛ٌ ±³أ¼°، °،´ة
  6169. DWORD dwCurTime = get_dword_time();
  6170.  
  6171. if (iWearCell != WEAR_ARROW
  6172. && (dwCurTime - GetLastAttackTime() <= 1500 || dwCurTime - m_dwLastSkillTime <= 1500))
  6173. {
  6174. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°،¸¸ب÷ ہضہ» ¶§¸¸ آّ؟ëاز ¼ِ ہض½ہ´د´ظ."));
  6175. return false;
  6176. }
  6177.  
  6178. // ؟ëب¥¼® ئ¯¼ِ أ³¸®
  6179. if (item->IsDragonSoul())
  6180. {
  6181. // °°ہ؛ إ¸ہشہا ؟ëب¥¼®ہج ہج¹ج µé¾î°، ہض´ظ¸é آّ؟ëاز ¼ِ ¾ّ´ظ.
  6182. // ؟ëب¥¼®ہ؛ swapہ» ءِ؟ّاد¸é ¾بµت.
  6183. if(GetInventoryItem(INVENTORY_MAX_NUM + iWearCell))
  6184. {
  6185. ChatPacket(CHAT_TYPE_INFO, "ہج¹ج °°ہ؛ ء¾·ùہا ؟ëب¥¼®ہ» آّ؟ëاد°ي ہض½ہ´د´ظ.");
  6186. return false;
  6187. }
  6188.  
  6189. if (!item->EquipTo(this, iWearCell))
  6190. {
  6191. return false;
  6192. }
  6193. }
  6194. // ؟ëب¥¼®ہج ¾ئ´ش.
  6195. else
  6196. {
  6197. // آّ؟ëاز °÷؟، ¾ئہجإغہج ہض´ظ¸é,
  6198. if (GetWear(iWearCell) && !IS_SET(GetWear(iWearCell)->GetFlag(), ITEM_FLAG_IRREMOVABLE))
  6199. {
  6200. // ہج ¾ئہجإغہ؛ ار¹ّ ¹عب÷¸é ؛¯°و ؛ز°،. swap ؟ھ½أ ؟دہü ؛ز°،
  6201. if (item->GetWearFlag() == WEARABLE_ABILITY)
  6202. return false;
  6203.  
  6204. if (false == SwapItem(item->GetCell(), INVENTORY_MAX_NUM + iWearCell))
  6205. {
  6206. return false;
  6207. }
  6208. }
  6209. else
  6210. {
  6211. BYTE bOldCell = item->GetCell();
  6212.  
  6213. if (item->EquipTo(this, iWearCell))
  6214. {
  6215. SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
  6216. }
  6217. }
  6218. }
  6219.  
  6220. if (true == item->IsEquipped())
  6221. {
  6222. // ¾ئہجإغ أضأت »ç؟ë ہجبؤ؛خإح´آ »ç؟ëادءِ ¾ت¾ئµµ ½أ°£ہج آ÷°¨µا´آ ¹و½ؤ أ³¸®.
  6223. if (-1 != item->GetProto()->cLimitRealTimeFirstUseIndex)
  6224. {
  6225. // ار ¹ّہج¶َµµ »ç؟ëار ¾ئہجإغہخءِ ؟©؛خ´آ Socket1ہ» ؛¸°ي ئا´ـار´ظ. (Socket1؟، »ç؟ëب½¼ِ ±â·د)
  6226. if (0 == item->GetSocket(1))
  6227. {
  6228. // »ç؟ë°،´ة½أ°£ہ؛ Default °ھہ¸·خ Limit Value °ھہ» »ç؟ëادµا, Socket0؟، °ھہج ہضہ¸¸é ±× °ھہ» »ç؟ëادµµ·د ار´ظ. (´ـہ§´آ أت)
  6229. long duration = (0 != item->GetSocket(0)) ? item->GetSocket(0) : item->GetProto()->aLimits[(unsigned char)(item->GetProto()->cLimitRealTimeFirstUseIndex)].lValue;
  6230.  
  6231. if (0 == duration)
  6232. duration = 60 * 60 * 24 * 7;
  6233.  
  6234. item->SetSocket(0, time(0) + duration);
  6235. item->StartRealTimeExpireEvent();
  6236. }
  6237.  
  6238. item->SetSocket(1, item->GetSocket(1) + 1);
  6239. }
  6240.  
  6241. if (item->GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
  6242. ShowAlignment(false);
  6243.  
  6244. const DWORD& dwVnum = item->GetVnum();
  6245.  
  6246. // ¶َ¸¶´ـ ہج؛¥ئ® أت½آ´قہا ¹فءِ(71135) آّ؟ë½أ ہجئهئ® ¹كµ؟
  6247. if (true == CItemVnumHelper::IsRamadanMoonRing(dwVnum))
  6248. {
  6249. this->EffectPacket(SE_EQUIP_RAMADAN_RING);
  6250. }
  6251. // از·خہ© »çإء(71136) آّ؟ë½أ ہجئهئ® ¹كµ؟
  6252. else if (true == CItemVnumHelper::IsHalloweenCandy(dwVnum))
  6253. {
  6254. this->EffectPacket(SE_EQUIP_HALLOWEEN_CANDY);
  6255. }
  6256. // اà؛¹ہا ¹فءِ(71143) آّ؟ë½أ ہجئهئ® ¹كµ؟
  6257. else if (true == CItemVnumHelper::IsHappinessRing(dwVnum))
  6258. {
  6259. this->EffectPacket(SE_EQUIP_HAPPINESS_RING);
  6260. }
  6261. // »ç¶ûہا ئز´ّئ®(71145) آّ؟ë½أ ہجئهئ® ¹كµ؟
  6262. else if (true == CItemVnumHelper::IsLovePendant(dwVnum))
  6263. {
  6264. this->EffectPacket(SE_EQUIP_LOVE_PENDANT);
  6265. }
  6266. // ITEM_UNIQUEہا °و؟ى, SpecialItemGroup؟، ء¤ہاµا¾î ہض°ي, (item->GetSIGVnum() != NULL)
  6267. //
  6268. else if (ITEM_UNIQUE == item->GetType() && 0 != item->GetSIGVnum())
  6269. {
  6270. const CSpecialItemGroup* pGroup = ITEM_MANAGER::instance().GetSpecialItemGroup(item->GetSIGVnum());
  6271. if (NULL != pGroup)
  6272. {
  6273. const CSpecialAttrGroup* pAttrGroup = ITEM_MANAGER::instance().GetSpecialAttrGroup(pGroup->GetAttrVnum(item->GetVnum()));
  6274. if (NULL != pAttrGroup)
  6275. {
  6276. const std::string& std = pAttrGroup->m_stEffectFileName;
  6277. SpecificEffectPacket(std.c_str());
  6278. }
  6279. }
  6280. }
  6281.  
  6282. if (UNIQUE_SPECIAL_RIDE == item->GetSubType() && IS_SET(item->GetFlag(), ITEM_FLAG_QUEST_USE))
  6283. {
  6284. quest::CQuestManager::instance().UseItem(GetPlayerID(), item, false);
  6285. }
  6286. }
  6287.  
  6288. return true;
  6289. }
  6290.  
  6291. void CHARACTER::BuffOnAttr_AddBuffsFromItem(LPITEM pItem)
  6292. {
  6293. for (size_t i = 0; i < sizeof(g_aBuffOnAttrPoints)/sizeof(g_aBuffOnAttrPoints[0]); i++)
  6294. {
  6295. TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.find(g_aBuffOnAttrPoints[i]);
  6296. if (it != m_map_buff_on_attrs.end())
  6297. {
  6298. it->second->AddBuffFromItem(pItem);
  6299. }
  6300. }
  6301. }
  6302.  
  6303. void CHARACTER::BuffOnAttr_RemoveBuffsFromItem(LPITEM pItem)
  6304. {
  6305. for (size_t i = 0; i < sizeof(g_aBuffOnAttrPoints)/sizeof(g_aBuffOnAttrPoints[0]); i++)
  6306. {
  6307. TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.find(g_aBuffOnAttrPoints[i]);
  6308. if (it != m_map_buff_on_attrs.end())
  6309. {
  6310. it->second->RemoveBuffFromItem(pItem);
  6311. }
  6312. }
  6313. }
  6314.  
  6315. void CHARACTER::BuffOnAttr_ClearAll()
  6316. {
  6317. for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
  6318. {
  6319. CBuffOnAttributes* pBuff = it->second;
  6320. if (pBuff)
  6321. {
  6322. pBuff->Initialize();
  6323. }
  6324. }
  6325. }
  6326.  
  6327. void CHARACTER::BuffOnAttr_ValueChange(BYTE bType, BYTE bOldValue, BYTE bNewValue)
  6328. {
  6329. TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.find(bType);
  6330.  
  6331. if (0 == bNewValue)
  6332. {
  6333. if (m_map_buff_on_attrs.end() == it)
  6334. return;
  6335. else
  6336. it->second->Off();
  6337. }
  6338. else if(0 == bOldValue)
  6339. {
  6340. CBuffOnAttributes* pBuff = NULL;
  6341. if (m_map_buff_on_attrs.end() == it)
  6342. {
  6343. switch (bType)
  6344. {
  6345. case POINT_ENERGY:
  6346. {
  6347. static BYTE abSlot[] = { WEAR_BODY, WEAR_HEAD, WEAR_FOOTS, WEAR_WRIST, WEAR_WEAPON, WEAR_NECK, WEAR_EAR, WEAR_SHIELD };
  6348. static std::vector <BYTE> vec_slots (abSlot, abSlot + _countof(abSlot));
  6349. pBuff = M2_NEW CBuffOnAttributes(this, bType, &vec_slots);
  6350. }
  6351. break;
  6352. case POINT_COSTUME_ATTR_BONUS:
  6353. {
  6354. static BYTE abSlot[] = { WEAR_COSTUME_BODY, WEAR_COSTUME_HAIR };
  6355. static std::vector <BYTE> vec_slots (abSlot, abSlot + _countof(abSlot));
  6356. pBuff = M2_NEW CBuffOnAttributes(this, bType, &vec_slots);
  6357. }
  6358. break;
  6359. default:
  6360. break;
  6361. }
  6362. m_map_buff_on_attrs.insert(TMapBuffOnAttrs::value_type(bType, pBuff));
  6363.  
  6364. }
  6365. else
  6366. pBuff = it->second;
  6367. if (pBuff != NULL)
  6368. pBuff->On(bNewValue);
  6369. }
  6370. else
  6371. {
  6372. assert (m_map_buff_on_attrs.end() != it);
  6373. it->second->ChangeBuffValue(bNewValue);
  6374. }
  6375. }
  6376.  
  6377.  
  6378. LPITEM CHARACTER::FindSpecifyItem(DWORD vnum) const
  6379. {
  6380. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  6381. if (GetInventoryItem(i) && GetInventoryItem(i)->GetVnum() == vnum)
  6382. return GetInventoryItem(i);
  6383.  
  6384. return NULL;
  6385. }
  6386.  
  6387. LPITEM CHARACTER::FindItemByID(DWORD id) const
  6388. {
  6389. for (int i=0 ; i < INVENTORY_MAX_NUM ; ++i)
  6390. {
  6391. if (NULL != GetInventoryItem(i) && GetInventoryItem(i)->GetID() == id)
  6392. return GetInventoryItem(i);
  6393. }
  6394.  
  6395. for (int i=BELT_INVENTORY_SLOT_START; i < BELT_INVENTORY_SLOT_END ; ++i)
  6396. {
  6397. if (NULL != GetInventoryItem(i) && GetInventoryItem(i)->GetID() == id)
  6398. return GetInventoryItem(i);
  6399. }
  6400.  
  6401. return NULL;
  6402. }
  6403.  
  6404. int CHARACTER::CountSpecifyItem(DWORD vnum) const
  6405. {
  6406. int count = 0;
  6407. LPITEM item;
  6408.  
  6409. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  6410. {
  6411. item = GetInventoryItem(i);
  6412. if (NULL != item && item->GetVnum() == vnum)
  6413. {
  6414. // °³ہخ »َء،؟، µî·دµب ¹°°اہج¸é ³ر¾î°£´ظ.
  6415. if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
  6416. {
  6417. continue;
  6418. }
  6419. else
  6420. {
  6421. count += item->GetCount();
  6422. }
  6423. }
  6424. }
  6425.  
  6426. return count;
  6427. }
  6428.  
  6429. void CHARACTER::RemoveSpecifyItem(DWORD vnum, DWORD count)
  6430. {
  6431. if (0 == count)
  6432. return;
  6433.  
  6434. for (UINT i = 0; i < INVENTORY_MAX_NUM; ++i)
  6435. {
  6436. if (NULL == GetInventoryItem(i))
  6437. continue;
  6438.  
  6439. if (GetInventoryItem(i)->GetVnum() != vnum)
  6440. continue;
  6441.  
  6442. //°³ہخ »َء،؟، µî·دµب ¹°°اہج¸é ³ر¾î°£´ظ. (°³ہخ »َء،؟،¼­ ئا¸إµة¶§ ہج ؛خ؛ذہ¸·خ µé¾î؟أ °و؟ى ¹®ء¦!)
  6443. if(m_pkMyShop)
  6444. {
  6445. bool isItemSelling = m_pkMyShop->IsSellingItem(GetInventoryItem(i)->GetID());
  6446. if (isItemSelling)
  6447. continue;
  6448. }
  6449.  
  6450. if (vnum >= 80003 && vnum <= 80007)
  6451. LogManager::instance().GoldBarLog(GetPlayerID(), GetInventoryItem(i)->GetID(), QUEST, "RemoveSpecifyItem");
  6452.  
  6453. if (count >= GetInventoryItem(i)->GetCount())
  6454. {
  6455. count -= GetInventoryItem(i)->GetCount();
  6456. GetInventoryItem(i)->SetCount(0);
  6457.  
  6458. if (0 == count)
  6459. return;
  6460. }
  6461. else
  6462. {
  6463. GetInventoryItem(i)->SetCount(GetInventoryItem(i)->GetCount() - count);
  6464. return;
  6465. }
  6466. }
  6467.  
  6468. // ؟¹؟ـأ³¸®°، ¾àاد´ظ.
  6469. if (count)
  6470. sys_log(0, "CHARACTER::RemoveSpecifyItem cannot remove enough item vnum %u, still remain %d", vnum, count);
  6471. }
  6472.  
  6473. int CHARACTER::CountSpecifyTypeItem(BYTE type) const
  6474. {
  6475. int count = 0;
  6476.  
  6477. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  6478. {
  6479. LPITEM pItem = GetInventoryItem(i);
  6480. if (pItem != NULL && pItem->GetType() == type)
  6481. {
  6482. count += pItem->GetCount();
  6483. }
  6484. }
  6485.  
  6486. return count;
  6487. }
  6488.  
  6489. void CHARACTER::RemoveSpecifyTypeItem(BYTE type, DWORD count)
  6490. {
  6491. if (0 == count)
  6492. return;
  6493.  
  6494. for (UINT i = 0; i < INVENTORY_MAX_NUM; ++i)
  6495. {
  6496. if (NULL == GetInventoryItem(i))
  6497. continue;
  6498.  
  6499. if (GetInventoryItem(i)->GetType() != type)
  6500. continue;
  6501.  
  6502. //°³ہخ »َء،؟، µî·دµب ¹°°اہج¸é ³ر¾î°£´ظ. (°³ہخ »َء،؟،¼­ ئا¸إµة¶§ ہج ؛خ؛ذہ¸·خ µé¾î؟أ °و؟ى ¹®ء¦!)
  6503. if(m_pkMyShop)
  6504. {
  6505. bool isItemSelling = m_pkMyShop->IsSellingItem(GetInventoryItem(i)->GetID());
  6506. if (isItemSelling)
  6507. continue;
  6508. }
  6509.  
  6510. if (count >= GetInventoryItem(i)->GetCount())
  6511. {
  6512. count -= GetInventoryItem(i)->GetCount();
  6513. GetInventoryItem(i)->SetCount(0);
  6514.  
  6515. if (0 == count)
  6516. return;
  6517. }
  6518. else
  6519. {
  6520. GetInventoryItem(i)->SetCount(GetInventoryItem(i)->GetCount() - count);
  6521. return;
  6522. }
  6523. }
  6524. }
  6525.  
  6526. void CHARACTER::AutoGiveItem(LPITEM item, bool longOwnerShip)
  6527. {
  6528. if (NULL == item)
  6529. {
  6530. sys_err ("NULL point.");
  6531. return;
  6532. }
  6533. if (item->GetOwner())
  6534. {
  6535. sys_err ("item %d 's owner exists!",item->GetID());
  6536. return;
  6537. }
  6538.  
  6539. int cell;
  6540. if (item->IsDragonSoul())
  6541. {
  6542. cell = GetEmptyDragonSoulInventory(item);
  6543. }
  6544. else
  6545. {
  6546. cell = GetEmptyInventory (item->GetSize());
  6547. }
  6548.  
  6549. if (cell != -1)
  6550. {
  6551. if (item->IsDragonSoul())
  6552. item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, cell));
  6553. else
  6554. item->AddToCharacter(this, TItemPos(INVENTORY, cell));
  6555.  
  6556. LogManager::instance().ItemLog(this, item, "SYSTEM", item->GetName());
  6557.  
  6558. if (item->GetType() == ITEM_USE && item->GetSubType() == USE_POTION)
  6559. {
  6560. TQuickslot * pSlot;
  6561.  
  6562. if (GetQuickslot(0, &pSlot) && pSlot->type == QUICKSLOT_TYPE_NONE)
  6563. {
  6564. TQuickslot slot;
  6565. slot.type = QUICKSLOT_TYPE_ITEM;
  6566. slot.pos = cell;
  6567. SetQuickslot(0, slot);
  6568. }
  6569. }
  6570. }
  6571. else
  6572. {
  6573. item->AddToGround (GetMapIndex(), GetXYZ());
  6574. #ifdef ENABLE_NEWSTUFF
  6575. item->StartDestroyEvent(g_aiItemDestroyTime[ITEM_DESTROY_TIME_AUTOGIVE]);
  6576. #else
  6577. item->StartDestroyEvent();
  6578. #endif
  6579.  
  6580. if (longOwnerShip)
  6581. item->SetOwnership (this, 300);
  6582. else
  6583. item->SetOwnership (this, 60);
  6584. LogManager::instance().ItemLog(this, item, "SYSTEM_DROP", item->GetName());
  6585. }
  6586. }
  6587.  
  6588. LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool bMsg)
  6589. {
  6590. TItemTable * p = ITEM_MANAGER::instance().GetTable(dwItemVnum);
  6591.  
  6592. if (!p)
  6593. return NULL;
  6594.  
  6595. DBManager::instance().SendMoneyLog(MONEY_LOG_DROP, dwItemVnum, bCount);
  6596.  
  6597. if (p->dwFlags & ITEM_FLAG_STACKABLE && p->bType != ITEM_BLEND)
  6598. {
  6599. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  6600. {
  6601. LPITEM item = GetInventoryItem(i);
  6602.  
  6603. if (!item)
  6604. continue;
  6605.  
  6606. if (item->GetVnum() == dwItemVnum && FN_check_item_socket(item))
  6607. {
  6608. if (IS_SET(p->dwFlags, ITEM_FLAG_MAKECOUNT))
  6609. {
  6610. if (bCount < p->alValues[1])
  6611. bCount = p->alValues[1];
  6612. }
  6613.  
  6614. BYTE bCount2 = MIN(g_bItemCountLimit - item->GetCount(), bCount);
  6615. bCount -= bCount2;
  6616.  
  6617. item->SetCount(item->GetCount() + bCount2);
  6618.  
  6619. if (bCount == 0)
  6620. {
  6621. if (bMsg)
  6622. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s"), item->GetName());
  6623.  
  6624. return item;
  6625. }
  6626. }
  6627. }
  6628. }
  6629.  
  6630. LPITEM item = ITEM_MANAGER::instance().CreateItem(dwItemVnum, bCount, 0, true);
  6631.  
  6632. if (!item)
  6633. {
  6634. sys_err("cannot create item by vnum %u (name: %s)", dwItemVnum, GetName());
  6635. return NULL;
  6636. }
  6637.  
  6638. if (item->GetType() == ITEM_BLEND)
  6639. {
  6640. for (int i=0; i < INVENTORY_MAX_NUM; i++)
  6641. {
  6642. LPITEM inv_item = GetInventoryItem(i);
  6643.  
  6644. if (inv_item == NULL) continue;
  6645.  
  6646. if (inv_item->GetType() == ITEM_BLEND)
  6647. {
  6648. if (inv_item->GetVnum() == item->GetVnum())
  6649. {
  6650. if (inv_item->GetSocket(0) == item->GetSocket(0) &&
  6651. inv_item->GetSocket(1) == item->GetSocket(1) &&
  6652. inv_item->GetSocket(2) == item->GetSocket(2) &&
  6653. inv_item->GetCount() < g_bItemCountLimit)
  6654. {
  6655. inv_item->SetCount(inv_item->GetCount() + item->GetCount());
  6656. return inv_item;
  6657. }
  6658. }
  6659. }
  6660. }
  6661. }
  6662.  
  6663. int iEmptyCell;
  6664. if (item->IsDragonSoul())
  6665. {
  6666. iEmptyCell = GetEmptyDragonSoulInventory(item);
  6667. }
  6668. else
  6669. iEmptyCell = GetEmptyInventory(item->GetSize());
  6670.  
  6671. if (iEmptyCell != -1)
  6672. {
  6673. if (bMsg)
  6674. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئہجإغ ب¹µو: %s"), item->GetName());
  6675.  
  6676. if (item->IsDragonSoul())
  6677. item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
  6678. else
  6679. item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
  6680. LogManager::instance().ItemLog(this, item, "SYSTEM", item->GetName());
  6681.  
  6682. if (item->GetType() == ITEM_USE && item->GetSubType() == USE_POTION)
  6683. {
  6684. TQuickslot * pSlot;
  6685.  
  6686. if (GetQuickslot(0, &pSlot) && pSlot->type == QUICKSLOT_TYPE_NONE)
  6687. {
  6688. TQuickslot slot;
  6689. slot.type = QUICKSLOT_TYPE_ITEM;
  6690. slot.pos = iEmptyCell;
  6691. SetQuickslot(0, slot);
  6692. }
  6693. }
  6694. }
  6695. else
  6696. {
  6697. item->AddToGround(GetMapIndex(), GetXYZ());
  6698. #ifdef ENABLE_NEWSTUFF
  6699. item->StartDestroyEvent(g_aiItemDestroyTime[ITEM_DESTROY_TIME_AUTOGIVE]);
  6700. #else
  6701. item->StartDestroyEvent();
  6702. #endif
  6703. // ¾بئ¼ µه¶ّ flag°، °ة·ءہض´آ ¾ئہجإغہا °و؟ى,
  6704. // ہخ؛¥؟، ؛َ °ّ°£ہج ¾ّ¾î¼­ ¾îآ؟ ¼ِ ¾ّہج ¶³¾îئ®¸®°ش µا¸é,
  6705. // ownershipہ» ¾ئہجإغہج »ç¶َءْ ¶§±îءِ(300أت) ہ¯ءِار´ظ.
  6706. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_DROP))
  6707. item->SetOwnership(this, 300);
  6708. else
  6709. item->SetOwnership(this, 60);
  6710. LogManager::instance().ItemLog(this, item, "SYSTEM_DROP", item->GetName());
  6711. }
  6712.  
  6713. sys_log(0,
  6714. "7: %d %d", dwItemVnum, bCount);
  6715. return item;
  6716. }
  6717.  
  6718. bool CHARACTER::GiveItem(LPCHARACTER victim, TItemPos Cell)
  6719. {
  6720. if (!CanHandleItem())
  6721. return false;
  6722.  
  6723. LPITEM item = GetItem(Cell);
  6724.  
  6725. if (item && !item->IsExchanging())
  6726. {
  6727. if (victim->CanReceiveItem(this, item))
  6728. {
  6729. victim->ReceiveItem(this, item);
  6730. return true;
  6731. }
  6732. }
  6733.  
  6734. return false;
  6735. }
  6736.  
  6737. bool CHARACTER::CanReceiveItem(LPCHARACTER from, LPITEM item) const
  6738. {
  6739. if (IsPC())
  6740. return false;
  6741.  
  6742. // TOO_LONG_DISTANCE_EXCHANGE_BUG_FIX
  6743. if (DISTANCE_APPROX(GetX() - from->GetX(), GetY() - from->GetY()) > 2000)
  6744. return false;
  6745. // END_OF_TOO_LONG_DISTANCE_EXCHANGE_BUG_FIX
  6746.  
  6747. switch (GetRaceNum())
  6748. {
  6749. case fishing::CAMPFIRE_MOB:
  6750. if (item->GetType() == ITEM_FISH &&
  6751. (item->GetSubType() == FISH_ALIVE || item->GetSubType() == FISH_DEAD))
  6752. return true;
  6753. break;
  6754.  
  6755. case fishing::FISHER_MOB:
  6756. if (item->GetType() == ITEM_ROD)
  6757. return true;
  6758. break;
  6759.  
  6760. // BUILDING_NPC
  6761. case BLACKSMITH_WEAPON_MOB:
  6762. case DEVILTOWER_BLACKSMITH_WEAPON_MOB:
  6763. if (item->GetType() == ITEM_WEAPON &&
  6764. item->GetRefinedVnum())
  6765. return true;
  6766. else
  6767. return false;
  6768. break;
  6769.  
  6770. case BLACKSMITH_ARMOR_MOB:
  6771. case DEVILTOWER_BLACKSMITH_ARMOR_MOB:
  6772. if (item->GetType() == ITEM_ARMOR &&
  6773. (item->GetSubType() == ARMOR_BODY || item->GetSubType() == ARMOR_SHIELD || item->GetSubType() == ARMOR_HEAD) &&
  6774. item->GetRefinedVnum())
  6775. return true;
  6776. else
  6777. return false;
  6778. break;
  6779.  
  6780. case BLACKSMITH_ACCESSORY_MOB:
  6781. case DEVILTOWER_BLACKSMITH_ACCESSORY_MOB:
  6782. if (item->GetType() == ITEM_ARMOR &&
  6783. !(item->GetSubType() == ARMOR_BODY || item->GetSubType() == ARMOR_SHIELD || item->GetSubType() == ARMOR_HEAD) &&
  6784. item->GetRefinedVnum())
  6785. return true;
  6786. else
  6787. return false;
  6788. break;
  6789. // END_OF_BUILDING_NPC
  6790.  
  6791. case BLACKSMITH_MOB:
  6792. if (item->GetRefinedVnum() && item->GetRefineSet() < 500)
  6793. {
  6794. return true;
  6795. }
  6796. else
  6797. {
  6798. return false;
  6799. }
  6800.  
  6801. case BLACKSMITH2_MOB:
  6802. if (item->GetRefineSet() >= 500)
  6803. {
  6804. return true;
  6805. }
  6806. else
  6807. {
  6808. return false;
  6809. }
  6810.  
  6811. case ALCHEMIST_MOB:
  6812. if (item->GetRefinedVnum())
  6813. return true;
  6814. break;
  6815.  
  6816. case 20101:
  6817. case 20102:
  6818. case 20103:
  6819. // أت±ق ¸»
  6820. if (item->GetVnum() == ITEM_REVIVE_HORSE_1)
  6821. {
  6822. if (!IsDead())
  6823. {
  6824. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ءِ ¾تہ؛ ¸»؟،°ش ¼±أت¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6825. return false;
  6826. }
  6827. return true;
  6828. }
  6829. else if (item->GetVnum() == ITEM_HORSE_FOOD_1)
  6830. {
  6831. if (IsDead())
  6832. {
  6833. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ہ؛ ¸»؟،°ش »ç·ل¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6834. return false;
  6835. }
  6836. return true;
  6837. }
  6838. else if (item->GetVnum() == ITEM_HORSE_FOOD_2 || item->GetVnum() == ITEM_HORSE_FOOD_3)
  6839. {
  6840. return false;
  6841. }
  6842. break;
  6843. case 20104:
  6844. case 20105:
  6845. case 20106:
  6846. // ءك±ق ¸»
  6847. if (item->GetVnum() == ITEM_REVIVE_HORSE_2)
  6848. {
  6849. if (!IsDead())
  6850. {
  6851. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ءِ ¾تہ؛ ¸»؟،°ش ¼±أت¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6852. return false;
  6853. }
  6854. return true;
  6855. }
  6856. else if (item->GetVnum() == ITEM_HORSE_FOOD_2)
  6857. {
  6858. if (IsDead())
  6859. {
  6860. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ہ؛ ¸»؟،°ش »ç·ل¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6861. return false;
  6862. }
  6863. return true;
  6864. }
  6865. else if (item->GetVnum() == ITEM_HORSE_FOOD_1 || item->GetVnum() == ITEM_HORSE_FOOD_3)
  6866. {
  6867. return false;
  6868. }
  6869. break;
  6870. case 20107:
  6871. case 20108:
  6872. case 20109:
  6873. // °ي±ق ¸»
  6874. if (item->GetVnum() == ITEM_REVIVE_HORSE_3)
  6875. {
  6876. if (!IsDead())
  6877. {
  6878. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ءِ ¾تہ؛ ¸»؟،°ش ¼±أت¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6879. return false;
  6880. }
  6881. return true;
  6882. }
  6883. else if (item->GetVnum() == ITEM_HORSE_FOOD_3)
  6884. {
  6885. if (IsDead())
  6886. {
  6887. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ء×ہ؛ ¸»؟،°ش »ç·ل¸¦ ¸شہد ¼ِ ¾ّ½ہ´د´ظ."));
  6888. return false;
  6889. }
  6890. return true;
  6891. }
  6892. else if (item->GetVnum() == ITEM_HORSE_FOOD_1 || item->GetVnum() == ITEM_HORSE_FOOD_2)
  6893. {
  6894. return false;
  6895. }
  6896. break;
  6897. }
  6898.  
  6899. //if (IS_SET(item->GetFlag(), ITEM_FLAG_QUEST_GIVE))
  6900. {
  6901. return true;
  6902. }
  6903.  
  6904. return false;
  6905. }
  6906.  
  6907. void CHARACTER::ReceiveItem(LPCHARACTER from, LPITEM item)
  6908. {
  6909. if (IsPC())
  6910. return;
  6911.  
  6912. switch (GetRaceNum())
  6913. {
  6914. case fishing::CAMPFIRE_MOB:
  6915. if (item->GetType() == ITEM_FISH && (item->GetSubType() == FISH_ALIVE || item->GetSubType() == FISH_DEAD))
  6916. fishing::Grill(from, item);
  6917. else
  6918. {
  6919. // TAKE_ITEM_BUG_FIX
  6920. from->SetQuestNPCID(GetVID());
  6921. // END_OF_TAKE_ITEM_BUG_FIX
  6922. quest::CQuestManager::instance().TakeItem(from->GetPlayerID(), GetRaceNum(), item);
  6923. }
  6924. break;
  6925.  
  6926. // DEVILTOWER_NPC
  6927. case DEVILTOWER_BLACKSMITH_WEAPON_MOB:
  6928. case DEVILTOWER_BLACKSMITH_ARMOR_MOB:
  6929. case DEVILTOWER_BLACKSMITH_ACCESSORY_MOB:
  6930. if (item->GetRefinedVnum() != 0 && item->GetRefineSet() != 0 && item->GetRefineSet() < 500)
  6931. {
  6932. from->SetRefineNPC(this);
  6933. from->RefineInformation(item->GetCell(), REFINE_TYPE_MONEY_ONLY);
  6934. }
  6935. else
  6936. {
  6937. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  6938. }
  6939. break;
  6940. // END_OF_DEVILTOWER_NPC
  6941.  
  6942. case BLACKSMITH_MOB:
  6943. case BLACKSMITH2_MOB:
  6944. case BLACKSMITH_WEAPON_MOB:
  6945. case BLACKSMITH_ARMOR_MOB:
  6946. case BLACKSMITH_ACCESSORY_MOB:
  6947. if (item->GetRefinedVnum())
  6948. {
  6949. from->SetRefineNPC(this);
  6950. from->RefineInformation(item->GetCell(), REFINE_TYPE_NORMAL);
  6951. }
  6952. else
  6953. {
  6954. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج ¾ئہجإغہ؛ °³·®از ¼ِ ¾ّ½ہ´د´ظ."));
  6955. }
  6956. break;
  6957.  
  6958. case 20101:
  6959. case 20102:
  6960. case 20103:
  6961. case 20104:
  6962. case 20105:
  6963. case 20106:
  6964. case 20107:
  6965. case 20108:
  6966. case 20109:
  6967. if (item->GetVnum() == ITEM_REVIVE_HORSE_1 ||
  6968. item->GetVnum() == ITEM_REVIVE_HORSE_2 ||
  6969. item->GetVnum() == ITEM_REVIVE_HORSE_3)
  6970. {
  6971. from->ReviveHorse();
  6972. item->SetCount(item->GetCount()-1);
  6973. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»؟،°ش ¼±أت¸¦ ءض¾ْ½ہ´د´ظ."));
  6974. }
  6975. else if (item->GetVnum() == ITEM_HORSE_FOOD_1 ||
  6976. item->GetVnum() == ITEM_HORSE_FOOD_2 ||
  6977. item->GetVnum() == ITEM_HORSE_FOOD_3)
  6978. {
  6979. from->FeedHorse();
  6980. from->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»؟،°ش »ç·ل¸¦ ءض¾ْ½ہ´د´ظ."));
  6981. item->SetCount(item->GetCount()-1);
  6982. EffectPacket(SE_HPUP_RED);
  6983. }
  6984. break;
  6985.  
  6986. default:
  6987. sys_log(0, "TakeItem %s %d %s", from->GetName(), GetRaceNum(), item->GetName());
  6988. from->SetQuestNPCID(GetVID());
  6989. quest::CQuestManager::instance().TakeItem(from->GetPlayerID(), GetRaceNum(), item);
  6990. break;
  6991. }
  6992. }
  6993.  
  6994. bool CHARACTER::IsEquipUniqueItem(DWORD dwItemVnum) const
  6995. {
  6996. {
  6997. LPITEM u = GetWear(WEAR_UNIQUE1);
  6998.  
  6999. if (u && u->GetVnum() == dwItemVnum)
  7000. return true;
  7001. }
  7002.  
  7003. {
  7004. LPITEM u = GetWear(WEAR_UNIQUE2);
  7005.  
  7006. if (u && u->GetVnum() == dwItemVnum)
  7007. return true;
  7008. }
  7009.  
  7010. // ¾ً¾î¹فءِہخ °و؟ى ¾ً¾î¹فءِ(°ك؛») ہخءِµµ أ¼إ©ار´ظ.
  7011. if (dwItemVnum == UNIQUE_ITEM_RING_OF_LANGUAGE)
  7012. return IsEquipUniqueItem(UNIQUE_ITEM_RING_OF_LANGUAGE_SAMPLE);
  7013.  
  7014. return false;
  7015. }
  7016.  
  7017. // CHECK_UNIQUE_GROUP
  7018. bool CHARACTER::IsEquipUniqueGroup(DWORD dwGroupVnum) const
  7019. {
  7020. {
  7021. LPITEM u = GetWear(WEAR_UNIQUE1);
  7022.  
  7023. if (u && u->GetSpecialGroup() == (int) dwGroupVnum)
  7024. return true;
  7025. }
  7026.  
  7027. {
  7028. LPITEM u = GetWear(WEAR_UNIQUE2);
  7029.  
  7030. if (u && u->GetSpecialGroup() == (int) dwGroupVnum)
  7031. return true;
  7032. }
  7033.  
  7034. return false;
  7035. }
  7036. // END_OF_CHECK_UNIQUE_GROUP
  7037.  
  7038. void CHARACTER::SetRefineMode(int iAdditionalCell)
  7039. {
  7040. m_iRefineAdditionalCell = iAdditionalCell;
  7041. m_bUnderRefine = true;
  7042. }
  7043.  
  7044. void CHARACTER::ClearRefineMode()
  7045. {
  7046. m_bUnderRefine = false;
  7047. SetRefineNPC( NULL );
  7048. }
  7049.  
  7050. bool CHARACTER::GiveItemFromSpecialItemGroup(DWORD dwGroupNum, std::vector<DWORD> &dwItemVnums,
  7051. std::vector<DWORD> &dwItemCounts, std::vector <LPITEM> &item_gets, int &count)
  7052. {
  7053. const CSpecialItemGroup* pGroup = ITEM_MANAGER::instance().GetSpecialItemGroup(dwGroupNum);
  7054.  
  7055. if (!pGroup)
  7056. {
  7057. sys_err("cannot find special item group %d", dwGroupNum);
  7058. return false;
  7059. }
  7060.  
  7061. std::vector <int> idxes;
  7062. int n = pGroup->GetMultiIndex(idxes);
  7063.  
  7064. bool bSuccess;
  7065.  
  7066. for (int i = 0; i < n; i++)
  7067. {
  7068. bSuccess = false;
  7069. int idx = idxes[i];
  7070. DWORD dwVnum = pGroup->GetVnum(idx);
  7071. DWORD dwCount = pGroup->GetCount(idx);
  7072. int iRarePct = pGroup->GetRarePct(idx);
  7073. LPITEM item_get = NULL;
  7074. switch (dwVnum)
  7075. {
  7076. case CSpecialItemGroup::GOLD:
  7077. PointChange(POINT_GOLD, dwCount);
  7078. LogManager::instance().CharLog(this, dwCount, "TREASURE_GOLD", "");
  7079.  
  7080. bSuccess = true;
  7081. break;
  7082. case CSpecialItemGroup::EXP:
  7083. {
  7084. PointChange(POINT_EXP, dwCount);
  7085. LogManager::instance().CharLog(this, dwCount, "TREASURE_EXP", "");
  7086.  
  7087. bSuccess = true;
  7088. }
  7089. break;
  7090.  
  7091. case CSpecialItemGroup::MOB:
  7092. {
  7093. sys_log(0, "CSpecialItemGroup::MOB %d", dwCount);
  7094. int x = GetX() + number(-500, 500);
  7095. int y = GetY() + number(-500, 500);
  7096.  
  7097. LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob(dwCount, GetMapIndex(), x, y, 0, true, -1);
  7098. if (ch)
  7099. ch->SetAggressive();
  7100. bSuccess = true;
  7101. }
  7102. break;
  7103. case CSpecialItemGroup::SLOW:
  7104. {
  7105. sys_log(0, "CSpecialItemGroup::SLOW %d", -(int)dwCount);
  7106. AddAffect(AFFECT_SLOW, POINT_MOV_SPEED, -(int)dwCount, AFF_SLOW, 300, 0, true);
  7107. bSuccess = true;
  7108. }
  7109. break;
  7110. case CSpecialItemGroup::DRAIN_HP:
  7111. {
  7112. int iDropHP = GetMaxHP()*dwCount/100;
  7113. sys_log(0, "CSpecialItemGroup::DRAIN_HP %d", -iDropHP);
  7114. iDropHP = MIN(iDropHP, GetHP()-1);
  7115. sys_log(0, "CSpecialItemGroup::DRAIN_HP %d", -iDropHP);
  7116. PointChange(POINT_HP, -iDropHP);
  7117. bSuccess = true;
  7118. }
  7119. break;
  7120. case CSpecialItemGroup::POISON:
  7121. {
  7122. AttackedByPoison(NULL);
  7123. bSuccess = true;
  7124. }
  7125. break;
  7126. #ifdef ENABLE_WOLFMAN_CHARACTER
  7127. case CSpecialItemGroup::BLEEDING:
  7128. {
  7129. AttackedByBleeding(NULL);
  7130. bSuccess = true;
  7131. }
  7132. break;
  7133. #endif
  7134. case CSpecialItemGroup::MOB_GROUP:
  7135. {
  7136. int sx = GetX() - number(300, 500);
  7137. int sy = GetY() - number(300, 500);
  7138. int ex = GetX() + number(300, 500);
  7139. int ey = GetY() + number(300, 500);
  7140. CHARACTER_MANAGER::instance().SpawnGroup(dwCount, GetMapIndex(), sx, sy, ex, ey, NULL, true);
  7141.  
  7142. bSuccess = true;
  7143. }
  7144. break;
  7145. default:
  7146. {
  7147. item_get = AutoGiveItem(dwVnum, dwCount, iRarePct);
  7148.  
  7149. if (item_get)
  7150. {
  7151. bSuccess = true;
  7152. }
  7153. }
  7154. break;
  7155. }
  7156.  
  7157. if (bSuccess)
  7158. {
  7159. dwItemVnums.push_back(dwVnum);
  7160. dwItemCounts.push_back(dwCount);
  7161. item_gets.push_back(item_get);
  7162. count++;
  7163.  
  7164. }
  7165. else
  7166. {
  7167. return false;
  7168. }
  7169. }
  7170. return bSuccess;
  7171. }
  7172.  
  7173. // NEW_HAIR_STYLE_ADD
  7174. bool CHARACTER::ItemProcess_Hair(LPITEM item, int iDestCell)
  7175. {
  7176. if (item->CheckItemUseLevel(GetLevel()) == false)
  7177. {
  7178. // ·¹؛§ ء¦ار؟، °ة¸²
  7179. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ئء÷ ہج ¸س¸®¸¦ »ç؟ëاز ¼ِ ¾ّ´آ ·¹؛§ہش´د´ظ."));
  7180. return false;
  7181. }
  7182.  
  7183. DWORD hair = item->GetVnum();
  7184.  
  7185. switch (GetJob())
  7186. {
  7187. case JOB_WARRIOR :
  7188. hair -= 72000; // 73001 - 72000 = 1001 ؛خإح اى¾î ¹ّب£ ½أہغ
  7189. break;
  7190.  
  7191. case JOB_ASSASSIN :
  7192. hair -= 71250;
  7193. break;
  7194.  
  7195. case JOB_SURA :
  7196. hair -= 70500;
  7197. break;
  7198.  
  7199. case JOB_SHAMAN :
  7200. hair -= 69750;
  7201. break;
  7202. #ifdef ENABLE_WOLFMAN_CHARACTER
  7203. case JOB_WOLFMAN:
  7204. break; // NOTE: ہج اى¾îؤعµه´آ ¾ب ¾²ہج¹ا·خ ئذ½؛. (اِہç اى¾î½أ½؛إغہ؛ ہج¹ج ؤع½؛ئ¬ہ¸·خ ´ëأ¼ µب »َإآہس)
  7205. #endif
  7206. default :
  7207. return false;
  7208. break;
  7209. }
  7210.  
  7211. if (hair == GetPart(PART_HAIR))
  7212. {
  7213. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ؟ہدار ¸س¸® ½؛إ¸ہد·خ´آ ±³أ¼از ¼ِ ¾ّ½ہ´د´ظ."));
  7214. return true;
  7215. }
  7216.  
  7217. item->SetCount(item->GetCount() - 1);
  7218.  
  7219. SetPart(PART_HAIR, hair);
  7220. UpdatePacket();
  7221.  
  7222. return true;
  7223. }
  7224. // END_NEW_HAIR_STYLE_ADD
  7225.  
  7226. bool CHARACTER::ItemProcess_Polymorph(LPITEM item)
  7227. {
  7228. if (IsPolymorphed())
  7229. {
  7230. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہج¹ج µذ°©ءكہخ »َإآہش´د´ظ."));
  7231. return false;
  7232. }
  7233.  
  7234. if (true == IsRiding())
  7235. {
  7236. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µذ°©از ¼ِ ¾ّ´آ »َإآہش´د´ظ."));
  7237. return false;
  7238. }
  7239.  
  7240. DWORD dwVnum = item->GetSocket(0);
  7241.  
  7242. if (dwVnum == 0)
  7243. {
  7244. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہك¸ّµب µذ°© ¾ئہجإغہش´د´ظ."));
  7245. item->SetCount(item->GetCount()-1);
  7246. return false;
  7247. }
  7248.  
  7249. const CMob* pMob = CMobManager::instance().Get(dwVnum);
  7250.  
  7251. if (pMob == NULL)
  7252. {
  7253. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ہك¸ّµب µذ°© ¾ئہجإغہش´د´ظ."));
  7254. item->SetCount(item->GetCount()-1);
  7255. return false;
  7256. }
  7257.  
  7258. switch (item->GetVnum())
  7259. {
  7260. case 70104 :
  7261. case 70105 :
  7262. case 70106 :
  7263. case 70107 :
  7264. case 71093 :
  7265. {
  7266. // µذ°©±¸ أ³¸®
  7267. sys_log(0, "USE_POLYMORPH_BALL PID(%d) vnum(%d)", GetPlayerID(), dwVnum);
  7268.  
  7269. // ·¹؛§ ء¦ار أ¼إ©
  7270. int iPolymorphLevelLimit = MAX(0, 20 - GetLevel() * 3 / 10);
  7271. if (pMob->m_table.bLevel >= GetLevel() + iPolymorphLevelLimit)
  7272. {
  7273. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³ھ؛¸´ظ ³ت¹« ³ôہ؛ ·¹؛§ہا ¸َ½؛إح·خ´آ ؛¯½إ از ¼ِ ¾ّ½ہ´د´ظ."));
  7274. return false;
  7275. }
  7276.  
  7277. int iDuration = GetSkillLevel(POLYMORPH_SKILL_ID) == 0 ? 5 : (5 + (5 + GetSkillLevel(POLYMORPH_SKILL_ID)/40 * 25));
  7278. iDuration *= 60;
  7279.  
  7280. DWORD dwBonus = 0;
  7281.  
  7282. dwBonus = (2 + GetSkillLevel(POLYMORPH_SKILL_ID)/40) * 100;
  7283.  
  7284. AddAffect(AFFECT_POLYMORPH, POINT_POLYMORPH, dwVnum, AFF_POLYMORPH, iDuration, 0, true);
  7285. AddAffect(AFFECT_POLYMORPH, POINT_ATT_BONUS, dwBonus, AFF_POLYMORPH, iDuration, 0, false);
  7286.  
  7287. item->SetCount(item->GetCount()-1);
  7288. }
  7289. break;
  7290.  
  7291. case 50322:
  7292. {
  7293. // ؛¸·ù
  7294.  
  7295. // µذ°©¼­ أ³¸®
  7296. // ¼زؤد0 ¼زؤد1 ¼زؤد2
  7297. // µذ°©از ¸َ½؛إح ¹ّب£ ¼ِ·أء¤µµ µذ°©¼­ ·¹؛§
  7298. sys_log(0, "USE_POLYMORPH_BOOK: %s(%u) vnum(%u)", GetName(), GetPlayerID(), dwVnum);
  7299.  
  7300. if (CPolymorphUtils::instance().PolymorphCharacter(this, item, pMob) == true)
  7301. {
  7302. CPolymorphUtils::instance().UpdateBookPracticeGrade(this, item);
  7303. }
  7304. else
  7305. {
  7306. }
  7307. }
  7308. break;
  7309.  
  7310. default :
  7311. sys_err("POLYMORPH invalid item passed PID(%d) vnum(%d)", GetPlayerID(), item->GetOriginalVnum());
  7312. return false;
  7313. }
  7314.  
  7315. return true;
  7316. }
  7317.  
  7318. bool CHARACTER::CanDoCube() const
  7319. {
  7320. if (m_bIsObserver) return false;
  7321. if (GetShop()) return false;
  7322. if (GetMyShop()) return false;
  7323. if (m_bUnderRefine) return false;
  7324. if (IsWarping()) return false;
  7325.  
  7326. return true;
  7327. }
  7328.  
  7329. bool CHARACTER::UnEquipSpecialRideUniqueItem()
  7330. {
  7331. LPITEM Unique1 = GetWear(WEAR_UNIQUE1);
  7332. LPITEM Unique2 = GetWear(WEAR_UNIQUE2);
  7333.  
  7334. if( NULL != Unique1 )
  7335. {
  7336. if( UNIQUE_GROUP_SPECIAL_RIDE == Unique1->GetSpecialGroup() )
  7337. {
  7338. return UnequipItem(Unique1);
  7339. }
  7340. }
  7341.  
  7342. if( NULL != Unique2 )
  7343. {
  7344. if( UNIQUE_GROUP_SPECIAL_RIDE == Unique2->GetSpecialGroup() )
  7345. {
  7346. return UnequipItem(Unique2);
  7347. }
  7348. }
  7349.  
  7350. return true;
  7351. }
  7352.  
  7353. void CHARACTER::AutoRecoveryItemProcess(const EAffectTypes type)
  7354. {
  7355. if (true == IsDead() || true == IsStun())
  7356. return;
  7357.  
  7358. if (false == IsPC())
  7359. return;
  7360.  
  7361. if (AFFECT_AUTO_HP_RECOVERY != type && AFFECT_AUTO_SP_RECOVERY != type)
  7362. return;
  7363.  
  7364. if (NULL != FindAffect(AFFECT_STUN))
  7365. return;
  7366.  
  7367. {
  7368. const DWORD stunSkills[] = { SKILL_TANHWAN, SKILL_GEOMPUNG, SKILL_BYEURAK, SKILL_GIGUNG };
  7369.  
  7370. for (size_t i=0 ; i < sizeof(stunSkills)/sizeof(DWORD) ; ++i)
  7371. {
  7372. const CAffect* p = FindAffect(stunSkills[i]);
  7373.  
  7374. if (NULL != p && AFF_STUN == p->dwFlag)
  7375. return;
  7376. }
  7377. }
  7378.  
  7379. const CAffect* pAffect = FindAffect(type);
  7380. const size_t idx_of_amount_of_used = 1;
  7381. const size_t idx_of_amount_of_full = 2;
  7382.  
  7383. if (NULL != pAffect)
  7384. {
  7385. LPITEM pItem = FindItemByID(pAffect->dwFlag);
  7386.  
  7387. if (NULL != pItem && true == pItem->GetSocket(0))
  7388. {
  7389. if (false == CArenaManager::instance().IsArenaMap(GetMapIndex()))
  7390. {
  7391. const long amount_of_used = pItem->GetSocket(idx_of_amount_of_used);
  7392. const long amount_of_full = pItem->GetSocket(idx_of_amount_of_full);
  7393.  
  7394. const int32_t avail = amount_of_full - amount_of_used;
  7395.  
  7396. int32_t amount = 0;
  7397.  
  7398. if (AFFECT_AUTO_HP_RECOVERY == type)
  7399. {
  7400. amount = GetMaxHP() - (GetHP() + GetPoint(POINT_HP_RECOVERY));
  7401. }
  7402. else if (AFFECT_AUTO_SP_RECOVERY == type)
  7403. {
  7404. amount = GetMaxSP() - (GetSP() + GetPoint(POINT_SP_RECOVERY));
  7405. }
  7406.  
  7407. if (amount > 0)
  7408. {
  7409. if (avail > amount)
  7410. {
  7411. const int pct_of_used = amount_of_used * 100 / amount_of_full;
  7412. const int pct_of_will_used = (amount_of_used + amount) * 100 / amount_of_full;
  7413.  
  7414. bool bLog = false;
  7415. // »ç؟ë·®ہا 10% ´ـہ§·خ ·خ±×¸¦ ³²±è
  7416. // (»ç؟ë·®ہا %؟،¼­, ½تہا ہع¸®°، ¹ظ²ً ¶§¸¶´ظ ·خ±×¸¦ ³²±è.)
  7417. if ((pct_of_will_used / 10) - (pct_of_used / 10) >= 1)
  7418. bLog = true;
  7419. pItem->SetSocket(idx_of_amount_of_used, amount_of_used + amount, bLog);
  7420. }
  7421. else
  7422. {
  7423. amount = avail;
  7424.  
  7425. ITEM_MANAGER::instance().RemoveItem( pItem );
  7426. }
  7427.  
  7428. if (AFFECT_AUTO_HP_RECOVERY == type)
  7429. {
  7430. PointChange( POINT_HP_RECOVERY, amount );
  7431. EffectPacket( SE_AUTO_HPUP );
  7432. }
  7433. else if (AFFECT_AUTO_SP_RECOVERY == type)
  7434. {
  7435. PointChange( POINT_SP_RECOVERY, amount );
  7436. EffectPacket( SE_AUTO_SPUP );
  7437. }
  7438. }
  7439. }
  7440. else
  7441. {
  7442. pItem->Lock(false);
  7443. pItem->SetSocket(0, false);
  7444. RemoveAffect( const_cast<CAffect*>(pAffect) );
  7445. }
  7446. }
  7447. else
  7448. {
  7449. RemoveAffect( const_cast<CAffect*>(pAffect) );
  7450. }
  7451. }
  7452. }
  7453.  
  7454. bool CHARACTER::IsValidItemPosition(TItemPos Pos) const
  7455. {
  7456. BYTE window_type = Pos.window_type;
  7457. WORD cell = Pos.cell;
  7458.  
  7459. switch (window_type)
  7460. {
  7461. case RESERVED_WINDOW:
  7462. return false;
  7463.  
  7464. case INVENTORY:
  7465. case EQUIPMENT:
  7466. return cell < (INVENTORY_AND_EQUIP_SLOT_MAX);
  7467.  
  7468. case DRAGON_SOUL_INVENTORY:
  7469. return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
  7470.  
  7471. case SAFEBOX:
  7472. if (NULL != m_pkSafebox)
  7473. return m_pkSafebox->IsValidPosition(cell);
  7474. else
  7475. return false;
  7476.  
  7477. case MALL:
  7478. if (NULL != m_pkMall)
  7479. return m_pkMall->IsValidPosition(cell);
  7480. else
  7481. return false;
  7482. default:
  7483. return false;
  7484. }
  7485. }
  7486.  
  7487.  
  7488. // ±حآْ¾ئ¼­ ¸¸µç ¸إإ©·خ.. exp°، true¸é msg¸¦ أâ·آاد°ي return false اد´آ ¸إإ©·خ (ہد¹فہûہخ verify ؟ëµµ¶ûہ؛ return ¶§¹®؟، ¾à°£ ¹ف´ë¶َ ہج¸§¶§¹®؟، اٍ°¥¸± ¼ِµµ ہض°ع´ظ..)
  7489. #define VERIFY_MSG(exp, msg) \
  7490. if (true == (exp)) { \
  7491. ChatPacket(CHAT_TYPE_INFO, LC_TEXT(msg)); \
  7492. return false; \
  7493. }
  7494.  
  7495. /// اِہç ؤ³¸¯إحہا »َإآ¸¦ ¹ظإءہ¸·خ ءض¾îءّ itemہ» آّ؟ëاز ¼ِ ہض´آ ءِ ب®ہخاد°ي, ؛ز°،´ة اد´ظ¸é ؤ³¸¯إح؟،°ش ہجہ¯¸¦ ¾ث·ءءض´آ اش¼ِ
  7496. bool CHARACTER::CanEquipNow(const LPITEM item, const TItemPos& srcCell, const TItemPos& destCell) /*const*/
  7497. {
  7498. const TItemTable* itemTable = item->GetProto();
  7499. //BYTE itemType = item->GetType();
  7500. //BYTE itemSubType = item->GetSubType();
  7501.  
  7502. switch (GetJob())
  7503. {
  7504. case JOB_WARRIOR:
  7505. if (item->GetAntiFlag() & ITEM_ANTIFLAG_WARRIOR)
  7506. return false;
  7507. break;
  7508.  
  7509. case JOB_ASSASSIN:
  7510. if (item->GetAntiFlag() & ITEM_ANTIFLAG_ASSASSIN)
  7511. return false;
  7512. break;
  7513.  
  7514. case JOB_SHAMAN:
  7515. if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHAMAN)
  7516. return false;
  7517. break;
  7518.  
  7519. case JOB_SURA:
  7520. if (item->GetAntiFlag() & ITEM_ANTIFLAG_SURA)
  7521. return false;
  7522. break;
  7523. #ifdef ENABLE_WOLFMAN_CHARACTER
  7524. case JOB_WOLFMAN:
  7525. if (item->GetAntiFlag() & ITEM_ANTIFLAG_WOLFMAN)
  7526. return false;
  7527. break; // TODO: ¼ِہخء· ¾ئہجإغ آّ؟ë°،´ة؟©؛خ أ³¸®
  7528. #endif
  7529. }
  7530.  
  7531. for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  7532. {
  7533. long limit = itemTable->aLimits[i].lValue;
  7534. switch (itemTable->aLimits[i].bType)
  7535. {
  7536. case LIMIT_LEVEL:
  7537. if (GetLevel() < limit)
  7538. {
  7539. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·¹؛§ہج ³·¾ئ آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7540. return false;
  7541. }
  7542. break;
  7543.  
  7544. case LIMIT_STR:
  7545. if (GetPoint(POINT_ST) < limit)
  7546. {
  7547. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ظ·آہج ³·¾ئ آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7548. return false;
  7549. }
  7550. break;
  7551.  
  7552. case LIMIT_INT:
  7553. if (GetPoint(POINT_IQ) < limit)
  7554. {
  7555. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ءِ´ةہج ³·¾ئ آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7556. return false;
  7557. }
  7558. break;
  7559.  
  7560. case LIMIT_DEX:
  7561. if (GetPoint(POINT_DX) < limit)
  7562. {
  7563. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¹خأ¸ہج ³·¾ئ آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7564. return false;
  7565. }
  7566. break;
  7567.  
  7568. case LIMIT_CON:
  7569. if (GetPoint(POINT_HT) < limit)
  7570. {
  7571. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("أ¼·آہج ³·¾ئ آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7572. return false;
  7573. }
  7574. break;
  7575. }
  7576. }
  7577.  
  7578. if (item->GetWearFlag() & WEARABLE_UNIQUE)
  7579. {
  7580. if ((GetWear(WEAR_UNIQUE1) && GetWear(WEAR_UNIQUE1)->IsSameSpecialGroup(item)) ||
  7581. (GetWear(WEAR_UNIQUE2) && GetWear(WEAR_UNIQUE2)->IsSameSpecialGroup(item)))
  7582. {
  7583. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°°ہ؛ ء¾·ùہا ہ¯´دإ© ¾ئہجإغ µخ °³¸¦ µ؟½أ؟، ہهآّاز ¼ِ ¾ّ½ہ´د´ظ."));
  7584. return false;
  7585. }
  7586.  
  7587. if (marriage::CManager::instance().IsMarriageUniqueItem(item->GetVnum()) &&
  7588. !marriage::CManager::instance().IsMarried(GetPlayerID()))
  7589. {
  7590. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°لب¥ادءِ ¾تہ؛ »َإآ؟،¼­ ؟¹¹°ہ» آّ؟ëاز ¼ِ ¾ّ½ہ´د´ظ."));
  7591. return false;
  7592. }
  7593.  
  7594. }
  7595.  
  7596. return true;
  7597. }
  7598.  
  7599. /// اِہç ؤ³¸¯إحہا »َإآ¸¦ ¹ظإءہ¸·خ آّ؟ë ءكہخ itemہ» ¹‏ہ» ¼ِ ہض´آ ءِ ب®ہخاد°ي, ؛ز°،´ة اد´ظ¸é ؤ³¸¯إح؟،°ش ہجہ¯¸¦ ¾ث·ءءض´آ اش¼ِ
  7600. bool CHARACTER::CanUnequipNow(const LPITEM item, const TItemPos& srcCell, const TItemPos& destCell) /*const*/
  7601. {
  7602.  
  7603. if (ITEM_BELT == item->GetType())
  7604. VERIFY_MSG(CBeltInventoryHelper::IsExistItemInBeltInventory(this), "؛§ئ® ہخ؛¥إن¸®؟، ¾ئہجإغہج ء¸ہçاد¸é اطء¦از ¼ِ ¾ّ½ہ´د´ظ.");
  7605.  
  7606. // ؟µ؟ّب÷ اطء¦از ¼ِ ¾ّ´آ ¾ئہجإغ
  7607. if (IS_SET(item->GetFlag(), ITEM_FLAG_IRREMOVABLE))
  7608. return false;
  7609.  
  7610. // ¾ئہجإغ unequip½أ ہخ؛¥إن¸®·خ ؟إ±و ¶§ ؛َ ہع¸®°، ہض´آ ءِ ب®ہخ
  7611. {
  7612. int pos = -1;
  7613.  
  7614. if (item->IsDragonSoul())
  7615. pos = GetEmptyDragonSoulInventory(item);
  7616. else
  7617. pos = GetEmptyInventory(item->GetSize());
  7618.  
  7619. VERIFY_MSG( -1 == pos, "¼زءِا°؟، ؛َ °ّ°£ہج ¾ّ½ہ´د´ظ." );
  7620. }
  7621.  
  7622.  
  7623. return true;
  7624. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement