Guest User

Untitled

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