Guest User

Untitled

a guest
Apr 13th, 2019
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 79.01 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3.  
  4. #include "config.h"
  5. #include "questmanager.h"
  6. #include "sectree_manager.h"
  7. #include "char.h"
  8. #include "char_manager.h"
  9. #include "affect.h"
  10. #include "item.h"
  11. #include "item_manager.h"
  12. #include "guild_manager.h"
  13. #include "war_map.h"
  14. #include "start_position.h"
  15. #include "marriage.h"
  16. #include "mining.h"
  17. #include "p2p.h"
  18. #include "polymorph.h"
  19. #include "desc_client.h"
  20. #include "messenger_manager.h"
  21. #include "log.h"
  22. #include "utils.h"
  23. #include "unique_item.h"
  24. #include "mob_manager.h"
  25.  
  26. #include <cctype>
  27. #undef sys_err
  28. #ifndef __WIN32__
  29. #define sys_err(fmt, args...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, ##args)
  30. #else
  31. #define sys_err(fmt, ...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, __VA_ARGS__)
  32. #endif
  33.  
  34. extern int g_nPortalLimitTime;
  35. extern LPCLIENT_DESC db_clientdesc;
  36. const int ITEM_BROKEN_METIN_VNUM = 28960;
  37.  
  38. namespace quest
  39. {
  40. //
  41. // "pc" Lua functions
  42. //
  43. int pc_has_master_skill(lua_State* L)
  44. {
  45. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  46. bool bHasMasterSkill = false;
  47. for (int i=0; i< SKILL_MAX_NUM; i++)
  48. if (ch->GetSkillMasterType(i) >= SKILL_MASTER && ch->GetSkillLevel(i) >= 21)
  49. {
  50. bHasMasterSkill = true;
  51. break;
  52. }
  53.  
  54. lua_pushboolean(L, bHasMasterSkill);
  55. return 1;
  56. }
  57.  
  58. int pc_remove_skill_book_no_delay(lua_State* L)
  59. {
  60. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  61. ch->RemoveAffect(AFFECT_SKILL_NO_BOOK_DELAY);
  62. return 0;
  63. }
  64.  
  65. int pc_is_skill_book_no_delay(lua_State* L)
  66. {
  67. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  68.  
  69. lua_pushboolean(L, ch->FindAffect(AFFECT_SKILL_NO_BOOK_DELAY) ? true : false);
  70. return 1;
  71. }
  72.  
  73. int pc_learn_grand_master_skill(lua_State* L)
  74. {
  75. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  76.  
  77. if (!lua_isnumber(L, 1))
  78. {
  79. sys_err("wrong skill index");
  80. return 0;
  81. }
  82.  
  83. lua_pushboolean(L, ch->LearnGrandMasterSkill((long)lua_tonumber(L, 1)));
  84. return 1;
  85. }
  86.  
  87. int pc_set_warp_location(lua_State * L)
  88. {
  89. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  90.  
  91. if (!lua_isnumber(L, 1))
  92. {
  93. sys_err("wrong map index");
  94. return 0;
  95. }
  96.  
  97. if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
  98. {
  99. sys_err("wrong coodinate");
  100. return 0;
  101. }
  102.  
  103. ch->SetWarpLocation((long)lua_tonumber(L,1), (long)lua_tonumber(L,2), (long)lua_tonumber(L,3));
  104. return 0;
  105. }
  106.  
  107. int pc_set_warp_location_local(lua_State * L)
  108. {
  109. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  110.  
  111. if (!lua_isnumber(L, 1))
  112. {
  113. sys_err("wrong map index");
  114. return 0;
  115. }
  116.  
  117. if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
  118. {
  119. sys_err("wrong coodinate");
  120. return 0;
  121. }
  122.  
  123. long lMapIndex = (long) lua_tonumber(L, 1);
  124. const TMapRegion * region = SECTREE_MANAGER::instance().GetMapRegion(lMapIndex);
  125.  
  126. if (!region)
  127. {
  128. sys_err("invalid map index %d", lMapIndex);
  129. return 0;
  130. }
  131.  
  132. int x = (int) lua_tonumber(L, 2);
  133. int y = (int) lua_tonumber(L, 3);
  134.  
  135. if (x > region->ex - region->sx)
  136. {
  137. sys_err("x coordinate overflow max: %d input: %d", region->ex - region->sx, x);
  138. return 0;
  139. }
  140.  
  141. if (y > region->ey - region->sy)
  142. {
  143. sys_err("y coordinate overflow max: %d input: %d", region->ey - region->sy, y);
  144. return 0;
  145. }
  146.  
  147. ch->SetWarpLocation(lMapIndex, x, y);
  148. return 0;
  149. }
  150.  
  151. int pc_get_start_location(lua_State * L)
  152. {
  153. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  154.  
  155. lua_pushnumber(L, g_start_map[ch->GetEmpire()]);
  156. lua_pushnumber(L, g_start_position[ch->GetEmpire()][0] / 100);
  157. lua_pushnumber(L, g_start_position[ch->GetEmpire()][1] / 100);
  158. return 3;
  159. }
  160.  
  161. int pc_warp(lua_State * L)
  162. {
  163. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  164.  
  165. if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
  166. {
  167. lua_pushboolean(L, false);
  168. return 1;
  169. }
  170.  
  171. long map_index = 0;
  172.  
  173. if (lua_isnumber(L, 3))
  174. map_index = (int) lua_tonumber(L,3);
  175.  
  176. //PREVENT_HACK
  177. if ( ch->IsHack() )
  178. {
  179. lua_pushboolean(L, false);
  180. return 1;
  181. }
  182. //END_PREVENT_HACK
  183.  
  184. if ( test_server )
  185. ch->ChatPacket( CHAT_TYPE_INFO, "pc_warp %d %d %d",(int)lua_tonumber(L,1),
  186. (int)lua_tonumber(L,2),map_index );
  187. ch->WarpSet((int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2), map_index);
  188.  
  189. lua_pushboolean(L, true);
  190.  
  191. return 1;
  192. }
  193.  
  194. int pc_warp_local(lua_State * L)
  195. {
  196. if (!lua_isnumber(L, 1))
  197. {
  198. sys_err("no map index argument");
  199. return 0;
  200. }
  201.  
  202. if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3))
  203. {
  204. sys_err("no coodinate argument");
  205. return 0;
  206. }
  207.  
  208. long lMapIndex = (long) lua_tonumber(L, 1);
  209. const TMapRegion * region = SECTREE_MANAGER::instance().GetMapRegion(lMapIndex);
  210.  
  211. if (!region)
  212. {
  213. sys_err("invalid map index %d", lMapIndex);
  214. return 0;
  215. }
  216.  
  217. int x = (int) lua_tonumber(L, 2);
  218. int y = (int) lua_tonumber(L, 3);
  219.  
  220. if (x > region->ex - region->sx)
  221. {
  222. sys_err("x coordinate overflow max: %d input: %d", region->ex - region->sx, x);
  223. return 0;
  224. }
  225.  
  226. if (y > region->ey - region->sy)
  227. {
  228. sys_err("y coordinate overflow max: %d input: %d", region->ey - region->sy, y);
  229. return 0;
  230. }
  231.  
  232. /*
  233. int iPulse = thecore_pulse();
  234. if ( pkChr->GetExchange() || pkChr->GetMyShop() || pkChr->GetShopOwner() || pkChr->IsOpenSafebox() )
  235. {
  236. pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("거래창,창고 등을 연 상태에서는 다른곳으로 이동할수 없습니다" ));
  237.  
  238. return;
  239. }
  240. //PREVENT_PORTAL_AFTER_EXCHANGE
  241. //교환 후 시간체크
  242. if ( iPulse - pkChr->GetExchangeTime() < PASSES_PER_SEC(60) )
  243. {
  244. pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("거래 후 1분 이내에는 다른지역으로 이동 할 수 없습니다." ) );
  245. return;
  246. }
  247. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  248. //PREVENT_ITEM_COPY
  249. {
  250. if ( iPulse - pkChr->GetMyShopTime() < PASSES_PER_SEC(60) )
  251. {
  252. pkChr->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("거래 후 1분 이내에는 다른지역으로 이동 할 수 없습니다." ) );
  253. return;
  254. }
  255.  
  256. }
  257. //END_PREVENT_ITEM_COPY
  258. */
  259.  
  260. CQuestManager::instance().GetCurrentCharacterPtr()->WarpSet(region->sx + x, region->sy + y);
  261. return 0;
  262. }
  263.  
  264. int pc_warp_exit(lua_State * L)
  265. {
  266. CQuestManager::instance().GetCurrentCharacterPtr()->ExitToSavedLocation();
  267. return 0;
  268. }
  269.  
  270. int pc_in_dungeon(lua_State * L)
  271. {
  272. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  273. lua_pushboolean(L, ch->GetDungeon()?1:0);
  274. return 1;
  275. }
  276.  
  277. int pc_hasguild(lua_State * L)
  278. {
  279. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  280. lua_pushboolean(L, ch->GetGuild() ? 1 : 0);
  281. return 1;
  282. }
  283.  
  284. int pc_getguild(lua_State * L)
  285. {
  286. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  287. lua_pushnumber(L, ch->GetGuild() ? ch->GetGuild()->GetID() : 0);
  288. return 1;
  289. }
  290.  
  291. int pc_isguildmaster(lua_State * L)
  292. {
  293. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  294. CGuild * g = ch->GetGuild();
  295.  
  296. if (g)
  297. lua_pushboolean(L, (ch->GetPlayerID() == g->GetMasterPID()));
  298. else
  299. lua_pushboolean(L, 0);
  300.  
  301. return 1;
  302. }
  303.  
  304. int pc_destroy_guild(lua_State * L)
  305. {
  306. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  307. CGuild * g = ch->GetGuild();
  308.  
  309. if (g)
  310. g->RequestDisband(ch->GetPlayerID());
  311.  
  312. return 0;
  313. }
  314.  
  315. int pc_remove_from_guild(lua_State* L)
  316. {
  317. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  318. CGuild * g = ch->GetGuild();
  319.  
  320. if (g)
  321. g->RequestRemoveMember(ch->GetPlayerID());
  322.  
  323. return 0;
  324. }
  325.  
  326. int pc_give_gold(lua_State* L)
  327. {
  328. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  329.  
  330. if (!lua_isnumber(L, 1))
  331. {
  332. sys_err("QUEST : wrong argument");
  333. return 0;
  334. }
  335.  
  336. long long iAmount = (long long) lua_tonumber(L, 1);
  337.  
  338. if (iAmount <= 0)
  339. {
  340. sys_err("QUEST : gold amount less then zero");
  341. return 0;
  342. }
  343.  
  344. DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), iAmount);
  345. ch->PointChange(POINT_GOLD, iAmount, true);
  346. return 0;
  347. }
  348.  
  349. int pc_warp_to_guild_war_observer_position(lua_State* L)
  350. {
  351. luaL_checknumber(L, 1);
  352. luaL_checknumber(L, 2);
  353.  
  354. DWORD gid1 = (DWORD)lua_tonumber(L, 1);
  355. DWORD gid2 = (DWORD)lua_tonumber(L, 2);
  356.  
  357. CGuild* g1 = CGuildManager::instance().FindGuild(gid1);
  358. CGuild* g2 = CGuildManager::instance().FindGuild(gid2);
  359.  
  360. if (!g1 || !g2)
  361. {
  362. luaL_error(L, "no such guild with id %d %d", gid1, gid2);
  363. }
  364.  
  365. PIXEL_POSITION pos;
  366.  
  367. DWORD dwMapIndex = g1->GetGuildWarMapIndex(gid2);
  368.  
  369. if (!CWarMapManager::instance().GetStartPosition(dwMapIndex, 2, pos))
  370. {
  371. luaL_error(L, "not under warp guild war between guild %d %d", gid1, gid2);
  372. return 0;
  373. }
  374.  
  375. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  376.  
  377. //PREVENT_HACK
  378. if ( ch->IsHack() )
  379. return 0;
  380. //END_PREVENT_HACK
  381.  
  382. ch->SetQuestFlag("war.is_war_member", 0);
  383. ch->SaveExitLocation();
  384. ch->WarpSet(pos.x, pos.y, dwMapIndex);
  385. return 0;
  386. }
  387.  
  388. int pc_give_item_from_special_item_group(lua_State* L)
  389. {
  390. luaL_checknumber(L, 1);
  391.  
  392. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  393.  
  394. DWORD dwGroupVnum = (DWORD) lua_tonumber(L,1);
  395.  
  396. std::vector <DWORD> dwVnums;
  397. std::vector <DWORD> dwCounts;
  398. std::vector <LPITEM> item_gets(NULL);
  399. int count = 0;
  400.  
  401. ch->GiveItemFromSpecialItemGroup(dwGroupVnum, dwVnums, dwCounts, item_gets, count);
  402.  
  403. for (int i = 0; i < count; i++)
  404. {
  405. if (!item_gets[i])
  406. {
  407. if (dwVnums[i] == 1)
  408. {
  409. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("돈 %d 냥을 획득했습니다."), dwCounts[i]);
  410. }
  411. else if (dwVnums[i] == 2)
  412. {
  413. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("나무에서 부터 신비한 빛이 나옵니다."));
  414. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d의 경험치를 획득했습니다."), dwCounts[i]);
  415. }
  416. }
  417. }
  418. return 0;
  419. }
  420.  
  421. int pc_enough_inventory(lua_State* L)
  422. {
  423. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  424. if (!lua_isnumber(L, 1))
  425. {
  426. lua_pushboolean(L, 0);
  427. return 1;
  428. }
  429.  
  430. DWORD item_vnum = (DWORD)lua_tonumber(L, 1);
  431. TItemTable * pTable = ITEM_MANAGER::instance().GetTable(item_vnum);
  432. if (!pTable)
  433. {
  434. lua_pushboolean(L, 0);
  435. return 1;
  436. }
  437.  
  438. bool bEnoughInventoryForItem = ch->GetEmptyInventory(pTable->bSize) != -1;
  439. lua_pushboolean(L, bEnoughInventoryForItem);
  440. return 1;
  441. }
  442.  
  443. int pc_give_item(lua_State* L)
  444. {
  445. PC* pPC = CQuestManager::instance().GetCurrentPC();
  446. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  447.  
  448. if (!lua_isstring(L, 1) || !(lua_isstring(L, 2)||lua_isnumber(L, 2)))
  449. {
  450. sys_err("QUEST : wrong argument");
  451. return 0;
  452. }
  453.  
  454. DWORD dwVnum;
  455.  
  456. if (lua_isnumber(L,2)) // 번호인경우 번호로 준다.
  457. dwVnum = (int) lua_tonumber(L, 2);
  458. else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 2), dwVnum))
  459. {
  460. sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
  461. return 0;
  462. }
  463.  
  464. int icount = 1;
  465.  
  466. if (lua_isnumber(L, 3) && lua_tonumber(L, 3) > 0)
  467. {
  468. icount = (int)rint(lua_tonumber(L, 3));
  469.  
  470. if (icount <= 0)
  471. {
  472. sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L, 2));
  473. return 0;
  474. }
  475. }
  476.  
  477. pPC->GiveItem(lua_tostring(L, 1), dwVnum, icount);
  478.  
  479. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
  480. return 0;
  481. }
  482.  
  483. int pc_give_or_drop_item(lua_State* L)
  484. {
  485. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  486.  
  487. if (!lua_isstring(L, 1) && !lua_isnumber(L, 1))
  488. {
  489. sys_err("QUEST Make item call error : wrong argument");
  490. lua_pushnumber (L, 0);
  491. return 1;
  492. }
  493.  
  494. DWORD dwVnum;
  495.  
  496. if (lua_isnumber(L, 1)) // 번호인경우 번호로 준다.
  497. {
  498. dwVnum = (int) lua_tonumber(L, 1);
  499. }
  500. else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 1), dwVnum))
  501. {
  502. sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
  503. lua_pushnumber (L, 0);
  504.  
  505. return 1;
  506. }
  507.  
  508. int icount = 1;
  509. if (lua_isnumber(L,2) && lua_tonumber(L,2)>0)
  510. {
  511. icount = (int)rint(lua_tonumber(L,2));
  512. if (icount<=0)
  513. {
  514. sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L,2));
  515. lua_pushnumber (L, 0);
  516. return 1;
  517. }
  518. }
  519.  
  520. sys_log(0, "QUEST [REWARD] item %s to %s", lua_tostring(L, 1), ch->GetName());
  521.  
  522. PC* pPC = CQuestManager::instance().GetCurrentPC();
  523.  
  524. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
  525.  
  526. LPITEM item = ch->AutoGiveItem(dwVnum, icount);
  527.  
  528. if ( dwVnum >= 80003 && dwVnum <= 80007 )
  529. {
  530. LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), QUEST, "quest: give_item2");
  531. }
  532.  
  533. if (NULL != item)
  534. lua_pushnumber (L, item->GetID());
  535. else
  536. lua_pushnumber (L, 0);
  537. return 1;
  538. }
  539.  
  540. int pc_give_or_drop_item_and_select(lua_State* L)
  541. {
  542. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  543.  
  544. if (!lua_isstring(L, 1) && !lua_isnumber(L, 1))
  545. {
  546. sys_err("QUEST Make item call error : wrong argument");
  547. return 0;
  548. }
  549.  
  550. DWORD dwVnum;
  551.  
  552. if (lua_isnumber(L, 1)) // 번호인경우 번호로 준다.
  553. {
  554. dwVnum = (int) lua_tonumber(L, 1);
  555. }
  556. else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 1), dwVnum))
  557. {
  558. sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L,1));
  559. return 0;
  560. }
  561.  
  562. int icount = 1;
  563. if (lua_isnumber(L,2) && lua_tonumber(L,2)>0)
  564. {
  565. icount = (int)rint(lua_tonumber(L,2));
  566. if (icount<=0)
  567. {
  568. sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L,2));
  569. return 0;
  570. }
  571. }
  572.  
  573. sys_log(0, "QUEST [REWARD] item %s to %s", lua_tostring(L, 1), ch->GetName());
  574.  
  575. PC* pPC = CQuestManager::instance().GetCurrentPC();
  576.  
  577. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), dwVnum, icount);
  578.  
  579. LPITEM item = ch->AutoGiveItem(dwVnum, icount);
  580.  
  581. if (NULL != item)
  582. CQuestManager::Instance().SetCurrentItem(item);
  583.  
  584. if ( dwVnum >= 80003 && dwVnum <= 80007 )
  585. {
  586. LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), QUEST, "quest: give_item2");
  587. }
  588.  
  589. return 0;
  590. }
  591.  
  592. int pc_get_current_map_index(lua_State* L)
  593. {
  594. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMapIndex());
  595. return 1;
  596. }
  597.  
  598. int pc_get_x(lua_State* L)
  599. {
  600. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  601. lua_pushnumber(L, ch->GetX()/100);
  602. return 1;
  603. }
  604.  
  605. int pc_get_y(lua_State* L)
  606. {
  607. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  608. lua_pushnumber(L, ch->GetY()/100);
  609. return 1;
  610. }
  611.  
  612. int pc_get_local_x(lua_State* L)
  613. {
  614. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  615. LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
  616.  
  617. if (pMap)
  618. lua_pushnumber(L, (ch->GetX() - pMap->m_setting.iBaseX) / 100);
  619. else
  620. lua_pushnumber(L, ch->GetX() / 100);
  621.  
  622. return 1;
  623. }
  624.  
  625. int pc_get_local_y(lua_State* L)
  626. {
  627. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  628. LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
  629.  
  630. if (pMap)
  631. lua_pushnumber(L, (ch->GetY() - pMap->m_setting.iBaseY) / 100);
  632. else
  633. lua_pushnumber(L, ch->GetY() / 100);
  634.  
  635. return 1;
  636. }
  637.  
  638. int pc_count_item(lua_State* L)
  639. {
  640. if (lua_isnumber(L, -1))
  641. lua_pushnumber(L,CQuestManager::instance().GetCurrentCharacterPtr()->CountSpecifyItem((DWORD)lua_tonumber(L, -1)));
  642. else if (lua_isstring(L, -1))
  643. {
  644. DWORD item_vnum;
  645.  
  646. if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
  647. {
  648. sys_err("QUEST count_item call error : wrong item name : %s", lua_tostring(L,1));
  649. lua_pushnumber(L, 0);
  650. }
  651. else
  652. {
  653. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->CountSpecifyItem(item_vnum));
  654. }
  655. }
  656. else
  657. lua_pushnumber(L, 0);
  658.  
  659. return 1;
  660. }
  661.  
  662. int pc_remove_item(lua_State* L)
  663. {
  664. if (lua_gettop(L) == 1)
  665. {
  666. DWORD item_vnum;
  667.  
  668. if (lua_isnumber(L,1))
  669. {
  670. item_vnum = (DWORD)lua_tonumber(L, 1);
  671. }
  672. else if (lua_isstring(L,1))
  673. {
  674. if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
  675. {
  676. sys_err("QUEST remove_item call error : wrong item name : %s", lua_tostring(L,1));
  677. return 0;
  678. }
  679. }
  680. else
  681. {
  682. sys_err("QUEST remove_item wrong argument");
  683. return 0;
  684. }
  685.  
  686. sys_log(0,"QUEST remove a item vnum %d of %s[%d]", item_vnum, CQuestManager::instance().GetCurrentCharacterPtr()->GetName(), CQuestManager::instance().GetCurrentCharacterPtr()->GetPlayerID());
  687. CQuestManager::instance().GetCurrentCharacterPtr()->RemoveSpecifyItem(item_vnum);
  688. }
  689. else if (lua_gettop(L) == 2)
  690. {
  691. DWORD item_vnum;
  692.  
  693. if (lua_isnumber(L, 1))
  694. {
  695. item_vnum = (DWORD)lua_tonumber(L, 1);
  696. }
  697. else if (lua_isstring(L, 1))
  698. {
  699. if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L,1), item_vnum))
  700. {
  701. sys_err("QUEST remove_item call error : wrong item name : %s", lua_tostring(L,1));
  702. return 0;
  703. }
  704. }
  705. else
  706. {
  707. sys_err("QUEST remove_item wrong argument");
  708. return 0;
  709. }
  710.  
  711. DWORD item_count = (DWORD) lua_tonumber(L, 2);
  712. sys_log(0, "QUEST remove items(vnum %d) count %d of %s[%d]",
  713. item_vnum,
  714. item_count,
  715. CQuestManager::instance().GetCurrentCharacterPtr()->GetName(),
  716. CQuestManager::instance().GetCurrentCharacterPtr()->GetPlayerID());
  717.  
  718. CQuestManager::instance().GetCurrentCharacterPtr()->RemoveSpecifyItem(item_vnum, item_count);
  719. }
  720. return 0;
  721. }
  722.  
  723. int pc_get_leadership(lua_State * L)
  724. {
  725. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetLeadershipSkillLevel());
  726. return 1;
  727. }
  728.  
  729. int pc_reset_point(lua_State * L)
  730. {
  731. CQuestManager::instance().GetCurrentCharacterPtr()->ResetPoint(CQuestManager::instance().GetCurrentCharacterPtr()->GetLevel());
  732. return 0;
  733. }
  734.  
  735. int pc_get_playtime(lua_State* L)
  736. {
  737. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRealPoint(POINT_PLAYTIME));
  738. return 1;
  739. }
  740.  
  741. int pc_is_afk(lua_State* L)
  742. {
  743. if (CQuestManager::instance().GetCurrentCharacterPtr()->IsAfk())
  744. lua_pushboolean(L, true);
  745. else
  746. lua_pushboolean(L, false);
  747.  
  748. return 1;
  749. }
  750.  
  751. int pc_set_afk(lua_State* L)
  752. {
  753. CQuestManager::instance().GetCurrentCharacterPtr()->SetAfk();
  754. return 1;
  755. }
  756.  
  757. int pc_del_afk(lua_State* L)
  758. {
  759. CQuestManager::instance().GetCurrentCharacterPtr()->DelAfk();
  760. return 1;
  761. }
  762.  
  763. int pc_get_vid(lua_State* L)
  764. {
  765. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetVID());
  766. return 1;
  767. }
  768. int pc_get_name(lua_State* L)
  769. {
  770. lua_pushstring(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetName());
  771. return 1;
  772. }
  773.  
  774. int pc_get_next_exp(lua_State* L)
  775. {
  776. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetNextExp());
  777. return 1;
  778. }
  779.  
  780. int pc_get_exp(lua_State* L)
  781. {
  782. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetExp());
  783. return 1;
  784. }
  785.  
  786. int pc_get_race(lua_State* L)
  787. {
  788. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRaceNum());
  789. return 1;
  790. }
  791.  
  792. int pc_change_sex(lua_State* L)
  793. {
  794. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->ChangeSex());
  795. return 1;
  796. }
  797.  
  798. int pc_get_job(lua_State* L)
  799. {
  800. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetJob());
  801. return 1;
  802. }
  803.  
  804. int pc_get_max_sp(lua_State* L)
  805. {
  806. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMaxSP());
  807. return 1;
  808. }
  809.  
  810. int pc_get_sp(lua_State * L)
  811. {
  812. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetSP());
  813. return 1;
  814. }
  815.  
  816. int pc_change_sp(lua_State * L)
  817. {
  818. if (!lua_isnumber(L, 1))
  819. {
  820. sys_err("invalid argument");
  821. lua_pushboolean(L, 0);
  822. return 1;
  823. }
  824.  
  825. long val = (long) lua_tonumber(L, 1);
  826.  
  827. if (val == 0)
  828. {
  829. lua_pushboolean(L, 0);
  830. return 1;
  831. }
  832.  
  833. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  834.  
  835. if (val > 0) // 증가시키는 것이므로 무조건 성공 리턴
  836. ch->PointChange(POINT_SP, val);
  837. else if (val < 0)
  838. {
  839. if (ch->GetSP() < -val)
  840. {
  841. lua_pushboolean(L, 0);
  842. return 1;
  843. }
  844.  
  845. ch->PointChange(POINT_SP, val);
  846. }
  847.  
  848. lua_pushboolean(L, 1);
  849. return 1;
  850. }
  851.  
  852. int pc_get_max_hp(lua_State * L)
  853. {
  854. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetMaxHP());
  855. return 1;
  856. }
  857.  
  858. int pc_get_hp(lua_State * L)
  859. {
  860. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetHP());
  861. return 1;
  862. }
  863.  
  864. int pc_get_level(lua_State * L)
  865. {
  866. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetLevel());
  867. return 1;
  868. }
  869.  
  870. int pc_set_level(lua_State * L)
  871. {
  872. if (!lua_isnumber(L, 1))
  873. {
  874. sys_err("invalid argument");
  875. return 0;
  876. }
  877. else
  878. {
  879. int newLevel = lua_tonumber(L, 1);
  880. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  881.  
  882.  
  883. sys_log(0,"QUEST [LEVEL] %s jumpint to level %d", ch->GetName(), (int)rint(lua_tonumber(L,1)));
  884.  
  885. PC* pPC = CQuestManager::instance().GetCurrentPC();
  886. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), newLevel, 0);
  887.  
  888. //포인트 : 스킬, 서브스킬, 스탯
  889. ch->PointChange(POINT_SKILL, newLevel - ch->GetLevel());
  890. ch->PointChange(POINT_SUB_SKILL, newLevel < 10 ? 0 : newLevel - MAX(ch->GetLevel(), 9));
  891. ch->PointChange(POINT_STAT, ((MINMAX(1, newLevel, 90) - ch->GetLevel()) * 3) + ch->GetPoint(POINT_LEVEL_STEP));
  892. //레벨
  893. ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel());
  894. //HP, SP
  895. ch->SetRandomHP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].hp_per_lv_begin, JobInitialPoints[ch->GetJob()].hp_per_lv_end));
  896. ch->SetRandomSP((newLevel - 1) * number(JobInitialPoints[ch->GetJob()].sp_per_lv_begin, JobInitialPoints[ch->GetJob()].sp_per_lv_end));
  897.  
  898.  
  899. // 회복
  900. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  901. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  902.  
  903. ch->ComputePoints();
  904. ch->PointsPacket();
  905. ch->SkillLevelPacket();
  906.  
  907. return 0;
  908. }
  909. }
  910.  
  911. int pc_get_weapon(lua_State * L)
  912. {
  913. LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(WEAR_WEAPON);
  914.  
  915. if (!item)
  916. lua_pushnumber(L, 0);
  917. else
  918. lua_pushnumber(L, item->GetVnum());
  919.  
  920. return 1;
  921. }
  922.  
  923. int pc_get_armor(lua_State * L)
  924. {
  925. LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(WEAR_BODY);
  926.  
  927. if (!item)
  928. lua_pushnumber(L, 0);
  929. else
  930. lua_pushnumber(L, item->GetVnum());
  931.  
  932. return 1;
  933. }
  934.  
  935. int pc_get_wear(lua_State * L)
  936. {
  937. if (!lua_isnumber(L, 1))
  938. {
  939. sys_err("QUEST wrong set flag");
  940. return 0;
  941. }
  942.  
  943. BYTE bCell = (BYTE)lua_tonumber(L, 1);
  944.  
  945. LPITEM item = CQuestManager::instance().GetCurrentCharacterPtr()->GetWear(bCell);
  946.  
  947.  
  948. if (!item)
  949. lua_pushnil(L);
  950. else
  951. lua_pushnumber(L, item->GetVnum());
  952.  
  953. return 1;
  954. }
  955.  
  956. int pc_get_money(lua_State * L)
  957. {
  958. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetGold());
  959. return 1;
  960. }
  961.  
  962. // 20050725.myevan.은둔의 망토 사용중 혼석 수련시 선악치가 두배 소모되는 버그가 발생해
  963. // 실제 선악치를 이용해 계산을 하게 한다.
  964. int pc_get_real_alignment(lua_State* L)
  965. {
  966. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetRealAlignment()/10);
  967. return 1;
  968. }
  969.  
  970. int pc_get_alignment(lua_State* L)
  971. {
  972. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetAlignment()/10);
  973. return 1;
  974. }
  975.  
  976. int pc_change_alignment(lua_State * L)
  977. {
  978. int alignment = (int)(lua_tonumber(L, 1)*10);
  979. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  980.  
  981. ch->UpdateAlignment(alignment);
  982. return 0;
  983. }
  984.  
  985. int pc_change_money(lua_State * L)
  986. {
  987. long long gold = (long long)lua_tonumber(L, -1);
  988.  
  989. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  990.  
  991. if (gold + ch->GetGold() < 0)
  992. sys_err("QUEST wrong ChangeGold %d (now %lld)", gold, ch->GetGold());
  993. else
  994. {
  995. DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), gold);
  996. ch->PointChange(POINT_GOLD, gold, true);
  997. }
  998.  
  999. return 0;
  1000. }
  1001.  
  1002. int pc_set_another_quest_flag(lua_State* L)
  1003. {
  1004. if (!lua_isstring(L, 1) || !lua_isstring(L, 2) || !lua_isnumber(L, 3))
  1005. {
  1006. sys_err("QUEST wrong set flag");
  1007. return 0;
  1008. }
  1009. else
  1010. {
  1011. const char * sz = lua_tostring(L, 1);
  1012. const char * sz2 = lua_tostring(L, 2);
  1013. CQuestManager & q = CQuestManager::Instance();
  1014. PC * pPC = q.GetCurrentPC();
  1015. pPC->SetFlag(string(sz)+"."+sz2, int(rint(lua_tonumber(L,3))));
  1016. return 0;
  1017. }
  1018. }
  1019.  
  1020. int pc_get_another_quest_flag(lua_State* L)
  1021. {
  1022. if (!lua_isstring(L,1) || !lua_isstring(L,2))
  1023. {
  1024. sys_err("QUEST wrong get flag");
  1025. return 0;
  1026. }
  1027. else
  1028. {
  1029. const char* sz = lua_tostring(L,1);
  1030. const char* sz2 = lua_tostring(L,2);
  1031. CQuestManager& q = CQuestManager::Instance();
  1032. PC* pPC = q.GetCurrentPC();
  1033. if (!pPC)
  1034. {
  1035. return 0;
  1036. }
  1037. lua_pushnumber(L,pPC->GetFlag(string(sz)+"."+sz2));
  1038. return 1;
  1039. }
  1040. }
  1041.  
  1042. int pc_get_flag(lua_State* L)
  1043. {
  1044. if (!lua_isstring(L,-1))
  1045. {
  1046. sys_err("QUEST wrong get flag");
  1047. return 0;
  1048. }
  1049. else
  1050. {
  1051. const char* sz = lua_tostring(L,-1);
  1052. CQuestManager& q = CQuestManager::Instance();
  1053. PC* pPC = q.GetCurrentPC();
  1054. lua_pushnumber(L,pPC->GetFlag(sz));
  1055. return 1;
  1056. }
  1057. }
  1058.  
  1059. int pc_get_quest_flag(lua_State* L)
  1060. {
  1061. if (!lua_isstring(L,-1))
  1062. {
  1063. sys_err("QUEST wrong get flag");
  1064. return 0;
  1065. }
  1066. else
  1067. {
  1068. const char* sz = lua_tostring(L,-1);
  1069. CQuestManager& q = CQuestManager::Instance();
  1070. PC* pPC = q.GetCurrentPC();
  1071. lua_pushnumber(L,pPC->GetFlag(pPC->GetCurrentQuestName() + "."+sz));
  1072. if ( test_server )
  1073. sys_log( 0 ,"GetQF ( %s . %s )", pPC->GetCurrentQuestName().c_str(), sz );
  1074. }
  1075. return 1;
  1076. }
  1077.  
  1078. int pc_set_flag(lua_State* L)
  1079. {
  1080. if (!lua_isstring(L,1) || !lua_isnumber(L,2))
  1081. {
  1082. sys_err("QUEST wrong set flag");
  1083. }
  1084. else
  1085. {
  1086. const char* sz = lua_tostring(L,1);
  1087. CQuestManager& q = CQuestManager::Instance();
  1088. PC* pPC = q.GetCurrentPC();
  1089. pPC->SetFlag(sz, int(rint(lua_tonumber(L,2))));
  1090. }
  1091. return 0;
  1092. }
  1093.  
  1094. int pc_set_quest_flag(lua_State* L)
  1095. {
  1096. if (!lua_isstring(L,1) || !lua_isnumber(L,2))
  1097. {
  1098. sys_err("QUEST wrong set flag");
  1099. }
  1100. else
  1101. {
  1102. const char* sz = lua_tostring(L,1);
  1103. CQuestManager& q = CQuestManager::Instance();
  1104. PC* pPC = q.GetCurrentPC();
  1105. pPC->SetFlag(pPC->GetCurrentQuestName()+"."+sz, int(rint(lua_tonumber(L,2))));
  1106. }
  1107. return 0;
  1108. }
  1109.  
  1110. int pc_del_quest_flag(lua_State *L)
  1111. {
  1112. if (!lua_isstring(L, 1))
  1113. {
  1114. sys_err("argument error");
  1115. return 0;
  1116. }
  1117.  
  1118. const char * sz = lua_tostring(L, 1);
  1119. PC * pPC = CQuestManager::instance().GetCurrentPC();
  1120. pPC->DeleteFlag(pPC->GetCurrentQuestName()+"."+sz);
  1121. return 0;
  1122. }
  1123.  
  1124. int pc_give_exp2(lua_State* L)
  1125. {
  1126. CQuestManager& q = CQuestManager::instance();
  1127. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1128. if (!lua_isnumber(L,1))
  1129. return 0;
  1130.  
  1131. sys_log(0,"QUEST [REWARD] %s give exp2 %d", ch->GetName(), (int)rint(lua_tonumber(L,1)));
  1132.  
  1133. DWORD exp = (DWORD)rint(lua_tonumber(L,1));
  1134.  
  1135. PC* pPC = CQuestManager::instance().GetCurrentPC();
  1136. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
  1137. ch->PointChange(POINT_EXP, exp);
  1138. return 0;
  1139. }
  1140.  
  1141. int pc_give_exp(lua_State* L)
  1142. {
  1143. if (!lua_isstring(L,1) || !lua_isnumber(L,2))
  1144. return 0;
  1145.  
  1146. CQuestManager& q = CQuestManager::instance();
  1147. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1148.  
  1149. sys_log(0,"QUEST [REWARD] %s give exp %s %d", ch->GetName(), lua_tostring(L,1), (int)rint(lua_tonumber(L,2)));
  1150.  
  1151. DWORD exp = (DWORD)rint(lua_tonumber(L,2));
  1152.  
  1153. PC* pPC = CQuestManager::instance().GetCurrentPC();
  1154.  
  1155. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
  1156.  
  1157. pPC->GiveExp(lua_tostring(L,1), exp);
  1158. return 0;
  1159. }
  1160.  
  1161. int pc_give_exp_perc(lua_State* L)
  1162. {
  1163. CQuestManager & q = CQuestManager::instance();
  1164. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1165.  
  1166. if (!ch || !lua_isstring(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
  1167. return 0;
  1168.  
  1169. int lev = (int)rint(lua_tonumber(L,2));
  1170. double proc = (lua_tonumber(L,3));
  1171.  
  1172. sys_log(0, "QUEST [REWARD] %s give exp %s lev %d percent %g%%", ch->GetName(), lua_tostring(L, 1), lev, proc);
  1173.  
  1174. DWORD exp = (DWORD)((exp_table[MINMAX(0, lev, PLAYER_EXP_TABLE_MAX)] * proc) / 100);
  1175. PC * pPC = CQuestManager::instance().GetCurrentPC();
  1176.  
  1177. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), exp, 0);
  1178.  
  1179. pPC->GiveExp(lua_tostring(L, 1), exp);
  1180. return 0;
  1181. }
  1182.  
  1183. int pc_get_empire(lua_State* L)
  1184. {
  1185. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetEmpire());
  1186. return 1;
  1187. }
  1188.  
  1189. int pc_get_part(lua_State* L)
  1190. {
  1191. CQuestManager& q = CQuestManager::instance();
  1192. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1193. if (!lua_isnumber(L,1))
  1194. {
  1195. lua_pushnumber(L, 0);
  1196. return 1;
  1197. }
  1198. int part_idx = (int)lua_tonumber(L, 1);
  1199. lua_pushnumber(L, ch->GetPart(part_idx));
  1200. return 1;
  1201. }
  1202.  
  1203. int pc_set_part(lua_State* L)
  1204. {
  1205. CQuestManager& q = CQuestManager::instance();
  1206. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1207. if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
  1208. {
  1209. return 0;
  1210. }
  1211. int part_idx = (int)lua_tonumber(L, 1);
  1212. int part_value = (int)lua_tonumber(L, 2);
  1213. ch->SetPart(part_idx, part_value);
  1214. ch->UpdatePacket();
  1215. return 0;
  1216. }
  1217.  
  1218. int pc_get_skillgroup(lua_State* L)
  1219. {
  1220. lua_pushnumber(L, CQuestManager::instance().GetCurrentCharacterPtr()->GetSkillGroup());
  1221. return 1;
  1222. }
  1223.  
  1224. int pc_set_skillgroup(lua_State* L)
  1225. {
  1226. if (!lua_isnumber(L, 1))
  1227. sys_err("QUEST wrong skillgroup number");
  1228. else
  1229. {
  1230. CQuestManager & q = CQuestManager::Instance();
  1231. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1232.  
  1233. ch->SetSkillGroup((BYTE) rint(lua_tonumber(L, 1)));
  1234. }
  1235. return 0;
  1236. }
  1237.  
  1238. int pc_is_polymorphed(lua_State* L)
  1239. {
  1240. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1241. lua_pushboolean(L, ch->IsPolymorphed());
  1242. return 1;
  1243. }
  1244.  
  1245. int pc_remove_polymorph(lua_State* L)
  1246. {
  1247. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1248. ch->RemoveAffect(AFFECT_POLYMORPH);
  1249. ch->SetPolymorph(0);
  1250. return 0;
  1251. }
  1252.  
  1253. int pc_polymorph(lua_State* L)
  1254. {
  1255. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1256. DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
  1257. int iDuration = (int) lua_tonumber(L, 2);
  1258. ch->AddAffect(AFFECT_POLYMORPH, POINT_POLYMORPH, dwVnum, AFF_POLYMORPH, iDuration, 0, true);
  1259. return 0;
  1260. }
  1261.  
  1262. int pc_is_mount(lua_State* L)
  1263. {
  1264. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1265. lua_pushboolean(L, ch->GetMountVnum());
  1266. return 1;
  1267. }
  1268.  
  1269. int pc_mount(lua_State* L)
  1270. {
  1271. if (!lua_isnumber(L, 1))
  1272. return 0;
  1273.  
  1274. int length = 60;
  1275.  
  1276. if (lua_isnumber(L, 2))
  1277. length = (int)lua_tonumber(L, 2);
  1278.  
  1279. DWORD mount_vnum = (DWORD)lua_tonumber(L, 1);
  1280.  
  1281. if (length < 0)
  1282. length = 60;
  1283.  
  1284. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1285.  
  1286. ch->RemoveAffect(AFFECT_MOUNT);
  1287. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  1288.  
  1289. if (ch->GetHorse())
  1290. ch->HorseSummon(false);
  1291.  
  1292. if (mount_vnum)
  1293. {
  1294. ch->AddAffect(AFFECT_MOUNT, POINT_MOUNT, mount_vnum, AFF_NONE, length, 0, true);
  1295. switch (mount_vnum)
  1296. {
  1297. case 20201:
  1298. case 20202:
  1299. case 20203:
  1300. case 20204:
  1301. case 20213:
  1302. case 20216:
  1303. ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 30, AFF_NONE, length, 0, true, true);
  1304. break;
  1305.  
  1306. case 20205:
  1307. case 20206:
  1308. case 20207:
  1309. case 20208:
  1310. case 20214:
  1311. case 20217:
  1312. ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 40, AFF_NONE, length, 0, true, true);
  1313. break;
  1314.  
  1315. case 20209:
  1316. case 20210:
  1317. case 20211:
  1318. case 20212:
  1319. case 20215:
  1320. case 20218:
  1321. ch->AddAffect(AFFECT_MOUNT, POINT_MOV_SPEED, 50, AFF_NONE, length, 0, true, true);
  1322. break;
  1323.  
  1324. }
  1325. }
  1326.  
  1327. return 0;
  1328. }
  1329.  
  1330. int pc_mount_bonus(lua_State* L)
  1331. {
  1332. BYTE applyOn = static_cast<BYTE>(lua_tonumber(L, 1));
  1333. long value = static_cast<long>(lua_tonumber(L, 2));
  1334. long duration = static_cast<long>(lua_tonumber(L, 3));
  1335.  
  1336. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1337.  
  1338. if( NULL != ch )
  1339. {
  1340. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  1341. ch->AddAffect(AFFECT_MOUNT_BONUS, aApplyInfo[applyOn].bPointType, value, AFF_NONE, duration, 0, false);
  1342. }
  1343.  
  1344. return 0;
  1345. }
  1346.  
  1347. int pc_unmount(lua_State* L)
  1348. {
  1349. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1350. ch->RemoveAffect(AFFECT_MOUNT);
  1351. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  1352. if (ch->IsHorseRiding())
  1353. ch->StopRiding();
  1354. return 0;
  1355. }
  1356.  
  1357. int pc_get_horse_level(lua_State* L)
  1358. {
  1359. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1360. lua_pushnumber(L, ch->GetHorseLevel());
  1361. return 1;
  1362. }
  1363.  
  1364. int pc_get_horse_hp(lua_State* L)
  1365. {
  1366. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1367. if (ch->GetHorseLevel())
  1368. lua_pushnumber(L, ch->GetHorseHealth());
  1369. else
  1370. lua_pushnumber(L, 0);
  1371.  
  1372. return 1;
  1373. }
  1374.  
  1375. int pc_get_horse_stamina(lua_State* L)
  1376. {
  1377. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1378. if (ch->GetHorseLevel())
  1379. lua_pushnumber(L, ch->GetHorseStamina());
  1380. else
  1381. lua_pushnumber(L, 0);
  1382.  
  1383. return 1;
  1384. }
  1385.  
  1386. int pc_is_horse_alive(lua_State* L)
  1387. {
  1388. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1389. lua_pushboolean(L, ch->GetHorseLevel() > 0 && ch->GetHorseHealth()>0);
  1390. return 1;
  1391. }
  1392.  
  1393. int pc_revive_horse(lua_State* L)
  1394. {
  1395. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1396. ch->ReviveHorse();
  1397. return 0;
  1398. }
  1399.  
  1400. int pc_have_map_scroll(lua_State* L)
  1401. {
  1402. if (!lua_isstring(L, 1))
  1403. {
  1404. lua_pushboolean(L, 0);
  1405. return 1;
  1406. }
  1407.  
  1408. const char * szMapName = lua_tostring(L, 1);
  1409. const TMapRegion * region = SECTREE_MANAGER::instance().FindRegionByPartialName(szMapName);
  1410.  
  1411. if (!region)
  1412. {
  1413. lua_pushboolean(L, 0);
  1414. return 1;
  1415. }
  1416.  
  1417. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1418.  
  1419. bool bFind = false;
  1420. for (int iCell = 0; iCell < INVENTORY_MAX_NUM; iCell++)
  1421. {
  1422. LPITEM item = ch->GetInventoryItem(iCell);
  1423. if (!item)
  1424. continue;
  1425.  
  1426. if (item->GetType() == ITEM_USE &&
  1427. item->GetSubType() == USE_TALISMAN &&
  1428. (item->GetValue(0) == 1 || item->GetValue(0) == 2))
  1429. {
  1430. int x = item->GetSocket(0);
  1431. int y = item->GetSocket(1);
  1432. //if ((x-item_x)*(x-item_x)+(y-item_y)*(y-item_y)<r*r)
  1433. if (region->sx <=x && region->sy <= y && x <= region->ex && y <= region->ey)
  1434. {
  1435. bFind = true;
  1436. break;
  1437. }
  1438. }
  1439. }
  1440.  
  1441. lua_pushboolean(L, bFind);
  1442. return 1;
  1443. }
  1444.  
  1445. int pc_get_war_map(lua_State* L)
  1446. {
  1447. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1448. lua_pushnumber(L, ch->GetWarMap() ? ch->GetWarMap()->GetMapIndex() : 0);
  1449. return 1;
  1450. }
  1451.  
  1452. int pc_have_pos_scroll(lua_State* L)
  1453. {
  1454. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1455.  
  1456. if (!lua_isnumber(L,1) || !lua_isnumber(L,2))
  1457. {
  1458. sys_err("invalid x y position");
  1459. lua_pushboolean(L, 0);
  1460. return 1;
  1461. }
  1462.  
  1463. if (!lua_isnumber(L,2))
  1464. {
  1465. sys_err("invalid radius");
  1466. lua_pushboolean(L, 0);
  1467. return 1;
  1468. }
  1469.  
  1470. int x = (int)lua_tonumber(L, 1);
  1471. int y = (int)lua_tonumber(L, 2);
  1472. float r = (float)lua_tonumber(L, 3);
  1473.  
  1474. bool bFind = false;
  1475. for (int iCell = 0; iCell < INVENTORY_MAX_NUM; iCell++)
  1476. {
  1477. LPITEM item = ch->GetInventoryItem(iCell);
  1478. if (!item)
  1479. continue;
  1480.  
  1481. if (item->GetType() == ITEM_USE &&
  1482. item->GetSubType() == USE_TALISMAN &&
  1483. (item->GetValue(0) == 1 || item->GetValue(0) == 2))
  1484. {
  1485. int item_x = item->GetSocket(0);
  1486. int item_y = item->GetSocket(1);
  1487. if ((x-item_x)*(x-item_x)+(y-item_y)*(y-item_y)<r*r)
  1488. {
  1489. bFind = true;
  1490. break;
  1491. }
  1492. }
  1493. }
  1494.  
  1495. lua_pushboolean(L, bFind);
  1496. return 1;
  1497. }
  1498.  
  1499. int pc_get_equip_refine_level(lua_State* L)
  1500. {
  1501. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1502. int cell = (int) lua_tonumber(L, 1);
  1503. if (cell < 0 || cell >= WEAR_MAX_NUM)
  1504. {
  1505. sys_err("invalid wear position %d", cell);
  1506. lua_pushnumber(L, 0);
  1507. return 1;
  1508. }
  1509.  
  1510. LPITEM item = ch->GetWear(cell);
  1511. if (!item)
  1512. {
  1513. lua_pushnumber(L, 0);
  1514. return 1;
  1515. }
  1516.  
  1517. lua_pushnumber(L, item->GetRefineLevel());
  1518. return 1;
  1519. }
  1520.  
  1521. int pc_refine_equip(lua_State* L)
  1522. {
  1523. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1524. if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
  1525. {
  1526. sys_err("invalid argument");
  1527. lua_pushboolean(L, 0);
  1528. return 1;
  1529. }
  1530.  
  1531. int cell = (int) lua_tonumber(L, 1);
  1532. int level_limit = (int) lua_tonumber(L, 2);
  1533. int pct = lua_isnumber(L, 3) ? (int)lua_tonumber(L, 3) : 100;
  1534.  
  1535. LPITEM item = ch->GetWear(cell);
  1536. if (!item)
  1537. {
  1538. lua_pushboolean(L, 0);
  1539. return 1;
  1540. }
  1541.  
  1542. if (item->GetRefinedVnum() == 0)
  1543. {
  1544. lua_pushboolean(L, 0);
  1545. return 1;
  1546. }
  1547.  
  1548. if (item->GetRefineLevel()>level_limit)
  1549. {
  1550. lua_pushboolean(L, 0);
  1551. return 1;
  1552. }
  1553.  
  1554. if (pct == 100 || number(1, 100) <= pct)
  1555. {
  1556. // 개량 성공
  1557. lua_pushboolean(L, 1);
  1558.  
  1559. LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(item->GetRefinedVnum(), 1, 0, false);
  1560.  
  1561. if (pkNewItem)
  1562. {
  1563. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
  1564. if (!item->GetSocket(i))
  1565. break;
  1566. else
  1567. pkNewItem->SetSocket(i, 1);
  1568.  
  1569. int set = 0;
  1570. for (int i=0; i<ITEM_SOCKET_MAX_NUM; i++)
  1571. {
  1572. long socket = item->GetSocket(i);
  1573. if (socket > 2 && socket != 28960)
  1574. {
  1575. pkNewItem->SetSocket(set++, socket);
  1576. }
  1577. }
  1578.  
  1579. item->CopyAttributeTo(pkNewItem);
  1580.  
  1581. ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
  1582.  
  1583. // some tuits need here -_- pkNewItem->AddToCharacter(this, bCell);
  1584. pkNewItem->EquipTo(ch, cell);
  1585.  
  1586. ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
  1587.  
  1588. LogManager::instance().ItemLog(ch, pkNewItem, "REFINE SUCCESS (QUEST)", pkNewItem->GetName());
  1589. }
  1590. }
  1591. else
  1592. {
  1593. // 개량 실패
  1594. lua_pushboolean(L, 0);
  1595. }
  1596.  
  1597. return 1;
  1598. }
  1599.  
  1600. int pc_get_skill_level(lua_State * L)
  1601. {
  1602. if (!lua_isnumber(L, 1))
  1603. {
  1604. sys_err("invalid argument");
  1605. lua_pushnumber(L, 0);
  1606. return 1;
  1607. }
  1608.  
  1609. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1610.  
  1611. DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
  1612. lua_pushnumber(L, ch->GetSkillLevel(dwVnum));
  1613.  
  1614. return 1;
  1615. }
  1616.  
  1617. int pc_give_lotto(lua_State* L)
  1618. {
  1619. CQuestManager& q = CQuestManager::instance();
  1620. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  1621.  
  1622. sys_log(0, "TRY GIVE LOTTO TO pid %u", ch->GetPlayerID());
  1623.  
  1624. DWORD * pdw = M2_NEW DWORD[3];
  1625.  
  1626. pdw[0] = 50001;
  1627. pdw[1] = 1;
  1628. pdw[2] = q.GetEventFlag("lotto_round");
  1629.  
  1630. // 추첨서는 소켓을 설정한다
  1631. DBManager::instance().ReturnQuery(QID_LOTTO, ch->GetPlayerID(), pdw,
  1632. "INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
  1633. get_table_postfix(), ch->GetPlayerID());
  1634.  
  1635. return 0;
  1636. }
  1637.  
  1638. int pc_aggregate_monster(lua_State* L)
  1639. {
  1640. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1641. ch->AggregateMonster();
  1642. return 0;
  1643. }
  1644.  
  1645. int pc_forget_my_attacker(lua_State* L)
  1646. {
  1647. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1648. ch->ForgetMyAttacker();
  1649. return 0;
  1650. }
  1651.  
  1652. int pc_attract_ranger(lua_State* L)
  1653. {
  1654. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1655. ch->AttractRanger();
  1656. return 0;
  1657. }
  1658.  
  1659. int pc_select_pid(lua_State* L)
  1660. {
  1661. DWORD pid = (DWORD) lua_tonumber(L, 1);
  1662.  
  1663. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1664. LPCHARACTER new_ch = CHARACTER_MANAGER::instance().FindByPID(pid);
  1665.  
  1666. if (new_ch)
  1667. {
  1668. CQuestManager::instance().GetPC(new_ch->GetPlayerID());
  1669.  
  1670. lua_pushnumber(L, ch->GetPlayerID());
  1671. }
  1672. else
  1673. {
  1674. lua_pushnumber(L, 0);
  1675. }
  1676.  
  1677. return 1;
  1678. }
  1679.  
  1680. int pc_select_vid(lua_State* L)
  1681. {
  1682. DWORD vid = (DWORD) lua_tonumber(L, 1);
  1683.  
  1684. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1685. LPCHARACTER new_ch = CHARACTER_MANAGER::instance().Find(vid);
  1686.  
  1687. if (new_ch)
  1688. {
  1689. CQuestManager::instance().GetPC(new_ch->GetPlayerID());
  1690.  
  1691. lua_pushnumber(L, (DWORD)ch->GetVID());
  1692. }
  1693. else
  1694. {
  1695. lua_pushnumber(L, 0);
  1696. }
  1697.  
  1698. return 1;
  1699. }
  1700.  
  1701. int pc_get_sex(lua_State* L)
  1702. {
  1703. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1704. lua_pushnumber(L, GET_SEX(ch)); /* 0==MALE, 1==FEMALE */
  1705. return 1;
  1706. }
  1707.  
  1708. int pc_is_engaged(lua_State* L)
  1709. {
  1710. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1711. lua_pushboolean(L, marriage::CManager::instance().IsEngaged(ch->GetPlayerID()));
  1712. return 1;
  1713. }
  1714.  
  1715. int pc_is_married(lua_State* L)
  1716. {
  1717. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1718. lua_pushboolean(L, marriage::CManager::instance().IsMarried(ch->GetPlayerID()));
  1719. return 1;
  1720. }
  1721.  
  1722. int pc_is_engaged_or_married(lua_State* L)
  1723. {
  1724. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1725. lua_pushboolean(L, marriage::CManager::instance().IsEngagedOrMarried(ch->GetPlayerID()));
  1726. return 1;
  1727. }
  1728.  
  1729. int pc_is_gm(lua_State* L)
  1730. {
  1731. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1732. lua_pushboolean(L, ch->GetGMLevel() >= GM_HIGH_WIZARD);
  1733. return 1;
  1734. }
  1735.  
  1736. int pc_get_gm_level(lua_State* L)
  1737. {
  1738. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1739. lua_pushnumber(L, ch->GetGMLevel());
  1740. return 1;
  1741. }
  1742.  
  1743. int pc_mining(lua_State* L)
  1744. {
  1745. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1746. LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
  1747. ch->mining(npc);
  1748. return 0;
  1749. }
  1750.  
  1751. int pc_diamond_refine(lua_State* L)
  1752. {
  1753. if (!lua_isnumber(L, 1))
  1754. {
  1755. lua_pushboolean(L, 0);
  1756. return 1;
  1757. }
  1758.  
  1759. int cost = (int) lua_tonumber(L, 1);
  1760. int pct = (int)lua_tonumber(L, 2);
  1761.  
  1762. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1763. LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
  1764. LPITEM item = CQuestManager::instance().GetCurrentItem();
  1765.  
  1766. if (item)
  1767. lua_pushboolean(L, mining::OreRefine(ch, npc, item, cost, pct, NULL));
  1768. else
  1769. lua_pushboolean(L, 0);
  1770.  
  1771. return 1;
  1772. }
  1773.  
  1774. int pc_ore_refine(lua_State* L)
  1775. {
  1776. if (!lua_isnumber(L, 1))
  1777. {
  1778. lua_pushboolean(L, 0);
  1779. return 1;
  1780. }
  1781.  
  1782. int cost = (int) lua_tonumber(L, 1);
  1783. int pct = (int)lua_tonumber(L, 2);
  1784. int metinstone_cell = (int)lua_tonumber(L, 3);
  1785.  
  1786. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1787. LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr();
  1788. LPITEM item = CQuestManager::instance().GetCurrentItem();
  1789.  
  1790. LPITEM metinstone_item = ch->GetInventoryItem(metinstone_cell);
  1791.  
  1792. if (item && metinstone_item)
  1793. lua_pushboolean(L, mining::OreRefine(ch, npc, item, cost, pct, metinstone_item));
  1794. else
  1795. lua_pushboolean(L, 0);
  1796.  
  1797. return 1;
  1798. }
  1799.  
  1800. int pc_clear_skill(lua_State* L)
  1801. {
  1802. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1803. if ( ch == NULL ) return 0;
  1804.  
  1805. ch->ClearSkill();
  1806.  
  1807. return 0;
  1808. }
  1809.  
  1810. int pc_clear_sub_skill(lua_State* L)
  1811. {
  1812. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1813. if ( ch == NULL ) return 0;
  1814.  
  1815. ch->ClearSubSkill();
  1816.  
  1817. return 0;
  1818. }
  1819.  
  1820. int pc_set_skill_point(lua_State* L)
  1821. {
  1822. if (!lua_isnumber(L, 1))
  1823. {
  1824. return 0;
  1825. }
  1826.  
  1827. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1828. int newPoint = (int) lua_tonumber(L, 1);
  1829.  
  1830. ch->SetRealPoint(POINT_SKILL, newPoint);
  1831. ch->SetPoint(POINT_SKILL, ch->GetRealPoint(POINT_SKILL));
  1832. ch->PointChange(POINT_SKILL, 0);
  1833. ch->ComputePoints();
  1834. ch->PointsPacket();
  1835.  
  1836. return 0;
  1837. }
  1838.  
  1839. // RESET_ONE_SKILL
  1840. int pc_clear_one_skill(lua_State* L)
  1841. {
  1842. int vnum = (int)lua_tonumber(L, 1);
  1843. sys_log(0, "%d skill clear", vnum);
  1844.  
  1845. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1846. if ( ch == NULL )
  1847. {
  1848. sys_log(0, "skill clear fail");
  1849. lua_pushnumber(L, 0);
  1850. return 1;
  1851. }
  1852.  
  1853. sys_log(0, "%d skill clear", vnum);
  1854.  
  1855. ch->ResetOneSkill(vnum);
  1856.  
  1857. return 0;
  1858. }
  1859. // END_RESET_ONE_SKILL
  1860.  
  1861. int pc_is_clear_skill_group(lua_State* L)
  1862. {
  1863. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1864.  
  1865. lua_pushboolean(L, ch->GetQuestFlag("skill_group_clear.clear") == 1);
  1866.  
  1867. return 1;
  1868. }
  1869.  
  1870. int pc_save_exit_location(lua_State* L)
  1871. {
  1872. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1873.  
  1874. ch->SaveExitLocation();
  1875.  
  1876. return 0;
  1877. }
  1878.  
  1879. //텔레포트
  1880. int pc_teleport ( lua_State * L )
  1881. {
  1882. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1883. int x=0,y=0;
  1884. if ( lua_isnumber(L, 1) )
  1885. {
  1886. // 지역명 워프
  1887. const int TOWN_NUM = 10;
  1888. struct warp_by_town_name
  1889. {
  1890. const char* name;
  1891. DWORD x;
  1892. DWORD y;
  1893. } ws[TOWN_NUM] =
  1894. {
  1895. {"영안읍성", 4743, 9548},
  1896. {"임지곡", 3235, 9086},
  1897. {"자양현", 3531, 8829},
  1898. {"조안읍성", 638, 1664},
  1899. {"승룡곡", 1745, 1909},
  1900. {"복정현", 1455, 2400},
  1901. {"평무읍성", 9599, 2692},
  1902. {"방산곡", 8036, 2984},
  1903. {"박라현", 8639, 2460},
  1904. {"서한산", 4350, 2143},
  1905. };
  1906. int idx = (int)lua_tonumber(L, 1);
  1907.  
  1908. x = ws[idx].x;
  1909. y = ws[idx].y;
  1910. goto teleport_area;
  1911. }
  1912.  
  1913. else
  1914. {
  1915. const char * arg1 = lua_tostring(L, 1);
  1916.  
  1917. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  1918.  
  1919. if (!tch)
  1920. {
  1921. const CCI* pkCCI = P2P_MANAGER::instance().Find(arg1);
  1922.  
  1923. if (pkCCI)
  1924. {
  1925. if (pkCCI->bChannel != g_bChannel)
  1926. {
  1927. ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
  1928. }
  1929. else
  1930. {
  1931.  
  1932. PIXEL_POSITION pos;
  1933.  
  1934. if (!SECTREE_MANAGER::instance().GetCenterPositionOfMap(pkCCI->lMapIndex, pos))
  1935. {
  1936. ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map (index %d)", pkCCI->lMapIndex);
  1937. }
  1938. else
  1939. {
  1940. ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", pos.x, pos.y);
  1941. ch->WarpSet(pos.x, pos.y);
  1942. lua_pushnumber(L, 1 );
  1943. }
  1944. }
  1945. }
  1946. else if (NULL == CHARACTER_MANAGER::instance().FindPC(arg1))
  1947. {
  1948. ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
  1949. }
  1950.  
  1951. lua_pushnumber(L, 0 );
  1952.  
  1953. return 1;
  1954. }
  1955. else
  1956. {
  1957. x = tch->GetX() / 100;
  1958. y = tch->GetY() / 100;
  1959. }
  1960. }
  1961.  
  1962. teleport_area:
  1963.  
  1964. x *= 100;
  1965. y *= 100;
  1966.  
  1967. ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
  1968. ch->WarpSet(x,y);
  1969. ch->Stop();
  1970. lua_pushnumber(L, 1 );
  1971. return 1;
  1972. }
  1973.  
  1974. int pc_set_skill_level(lua_State* L)
  1975. {
  1976. DWORD dwVnum = (DWORD)lua_tonumber(L, 1);
  1977. BYTE byLev = (BYTE)lua_tonumber(L, 2);
  1978.  
  1979. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1980. ch->SetSkillLevel(dwVnum, byLev);
  1981.  
  1982. ch->SkillLevelPacket();
  1983.  
  1984. return 0;
  1985. }
  1986.  
  1987. int pc_give_polymorph_book(lua_State* L)
  1988. {
  1989. if ( lua_isnumber(L, 1) != true && lua_isnumber(L, 2) != true && lua_isnumber(L, 3) != true && lua_isnumber(L, 4) != true )
  1990. {
  1991. sys_err("Wrong Quest Function Arguments: pc_give_polymorph_book");
  1992. return 0;
  1993. }
  1994.  
  1995. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  1996.  
  1997. CPolymorphUtils::instance().GiveBook(ch, (DWORD)lua_tonumber(L, 1), (DWORD)lua_tonumber(L, 2), (BYTE)lua_tonumber(L, 3), (BYTE)lua_tonumber(L, 4));
  1998.  
  1999. return 0;
  2000. }
  2001.  
  2002. int pc_upgrade_polymorph_book(lua_State* L)
  2003. {
  2004. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2005. LPITEM pItem = CQuestManager::instance().GetCurrentItem();
  2006.  
  2007. bool ret = CPolymorphUtils::instance().BookUpgrade(ch, pItem);
  2008.  
  2009. lua_pushboolean(L, ret);
  2010.  
  2011. return 1;
  2012. }
  2013.  
  2014. int pc_get_premium_remain_sec(lua_State* L)
  2015. {
  2016. int remain_seconds = 0;
  2017. int premium_type = 0;
  2018. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2019.  
  2020. if (!lua_isnumber(L, 1))
  2021. {
  2022. sys_err("wrong premium index (is not number)");
  2023. return 0;
  2024. }
  2025.  
  2026. premium_type = (int)lua_tonumber(L,1);
  2027. switch (premium_type)
  2028. {
  2029. case PREMIUM_EXP:
  2030. case PREMIUM_ITEM:
  2031. case PREMIUM_SAFEBOX:
  2032. case PREMIUM_AUTOLOOT:
  2033. case PREMIUM_FISH_MIND:
  2034. case PREMIUM_MARRIAGE_FAST:
  2035. case PREMIUM_GOLD:
  2036. break;
  2037.  
  2038. default:
  2039. sys_err("wrong premium index %d", premium_type);
  2040. return 0;
  2041. }
  2042.  
  2043. remain_seconds = ch->GetPremiumRemainSeconds(premium_type);
  2044.  
  2045. lua_pushnumber(L, remain_seconds);
  2046. return 1;
  2047. }
  2048.  
  2049. int pc_send_block_mode(lua_State* L)
  2050. {
  2051. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2052.  
  2053. ch->SetBlockModeForce((BYTE)lua_tonumber(L, 1));
  2054.  
  2055. return 0;
  2056. }
  2057.  
  2058. int pc_change_empire(lua_State* L)
  2059. {
  2060. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2061.  
  2062. lua_pushnumber(L, ch->ChangeEmpire((unsigned char)lua_tonumber(L, 1)));
  2063.  
  2064. return 1;
  2065. }
  2066.  
  2067. int pc_get_change_empire_count(lua_State* L)
  2068. {
  2069. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2070.  
  2071. lua_pushnumber(L, ch->GetChangeEmpireCount());
  2072.  
  2073. return 1;
  2074. }
  2075.  
  2076. int pc_set_change_empire_count(lua_State* L)
  2077. {
  2078. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2079.  
  2080. ch->SetChangeEmpireCount();
  2081.  
  2082. return 0;
  2083. }
  2084.  
  2085. int pc_change_name(lua_State* L)
  2086. {
  2087. // 리턴값
  2088. // 0: 새이름을 설정한 뒤 로그아웃을 안했음
  2089. // 1: 스크립트에서 문자열이 넘어오지 않았음
  2090. // 2: check_name 을 통과하지 못했음
  2091. // 3: 이미 같은 이름이 사용중
  2092. // 4: 성공
  2093. // 5: 해당 기능 지원하지 않음
  2094. if ( LC_IsEurope() )
  2095. {
  2096. lua_pushnumber(L, 5);
  2097. return 1;
  2098. }
  2099.  
  2100. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2101.  
  2102. if ( ch->GetNewName().size() != 0 )
  2103. {
  2104. lua_pushnumber(L, 0);
  2105. return 1;
  2106. }
  2107.  
  2108. if ( lua_isstring(L, 1) != true )
  2109. {
  2110. lua_pushnumber(L, 1);
  2111. return 1;
  2112. }
  2113.  
  2114. const char * szName = lua_tostring(L, 1);
  2115.  
  2116. if ( check_name(szName) == false )
  2117. {
  2118. lua_pushnumber(L, 2);
  2119. return 1;
  2120. }
  2121.  
  2122. char szQuery[1024];
  2123. snprintf(szQuery, sizeof(szQuery), "SELECT COUNT(*) FROM player%s WHERE name='%s'", get_table_postfix(), szName);
  2124. std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery(szQuery));
  2125.  
  2126. if ( pmsg->Get()->uiNumRows > 0 )
  2127. {
  2128. MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
  2129.  
  2130. int count = 0;
  2131. str_to_number(count, row[0]);
  2132.  
  2133. // 이미 해당 이름을 가진 캐릭터가 있음
  2134. if ( count != 0 )
  2135. {
  2136. lua_pushnumber(L, 3);
  2137. return 1;
  2138. }
  2139. }
  2140.  
  2141. DWORD pid = ch->GetPlayerID();
  2142. db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
  2143. db_clientdesc->Packet(&pid, sizeof(DWORD));
  2144.  
  2145. /* delete messenger list */
  2146. MessengerManager::instance().RemoveAllList(ch->GetName());
  2147.  
  2148. /* change_name_log */
  2149. LogManager::instance().ChangeNameLog(pid, ch->GetName(), szName, ch->GetDesc()->GetHostName());
  2150.  
  2151. snprintf(szQuery, sizeof(szQuery), "UPDATE player%s SET name='%s' WHERE id=%u", get_table_postfix(), szName, pid);
  2152. SQLMsg * msg = DBManager::instance().DirectQuery(szQuery);
  2153. M2_DELETE(msg);
  2154.  
  2155. ch->SetNewName(szName);
  2156. lua_pushnumber(L, 4);
  2157. return 1;
  2158. }
  2159.  
  2160. int pc_is_dead(lua_State* L)
  2161. {
  2162. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2163.  
  2164. if ( ch != NULL )
  2165. {
  2166. lua_pushboolean(L, ch->IsDead());
  2167. return 1;
  2168. }
  2169.  
  2170. lua_pushboolean(L, true);
  2171.  
  2172. return 1;
  2173. }
  2174.  
  2175. int pc_reset_status( lua_State* L )
  2176. {
  2177. if ( lua_isnumber(L, 1) == true )
  2178. {
  2179. int idx = (int)lua_tonumber(L, 1);
  2180.  
  2181. if ( idx >= 0 && idx < 4 )
  2182. {
  2183. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2184. int point = POINT_NONE;
  2185. char buf[128];
  2186.  
  2187. switch ( idx )
  2188. {
  2189. case 0 : point = POINT_HT; break;
  2190. case 1 : point = POINT_IQ; break;
  2191. case 2 : point = POINT_ST; break;
  2192. case 3 : point = POINT_DX; break;
  2193. default : lua_pushboolean(L, false); return 1;
  2194. }
  2195.  
  2196. int old_val = ch->GetRealPoint(point);
  2197. int old_stat = ch->GetRealPoint(POINT_STAT);
  2198.  
  2199. ch->SetRealPoint(point, 1);
  2200. ch->SetPoint(point, ch->GetRealPoint(point));
  2201.  
  2202. ch->PointChange(POINT_STAT, old_val-1);
  2203.  
  2204. if ( point == POINT_HT )
  2205. {
  2206. BYTE job = ch->GetJob();
  2207. ch->SetRandomHP((ch->GetLevel()-1) * number(JobInitialPoints[job].hp_per_lv_begin, JobInitialPoints[job].hp_per_lv_end));
  2208. }
  2209. else if ( point == POINT_IQ )
  2210. {
  2211. BYTE job = ch->GetJob();
  2212. ch->SetRandomSP((ch->GetLevel()-1) * number(JobInitialPoints[job].sp_per_lv_begin, JobInitialPoints[job].sp_per_lv_end));
  2213. }
  2214.  
  2215. ch->ComputePoints();
  2216. ch->PointsPacket();
  2217.  
  2218. if ( point == POINT_HT )
  2219. {
  2220. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  2221. }
  2222. else if ( point == POINT_IQ )
  2223. {
  2224. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  2225. }
  2226.  
  2227. switch ( idx )
  2228. {
  2229. case 0 :
  2230. snprintf(buf, sizeof(buf), "reset ht(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
  2231. break;
  2232. case 1 :
  2233. snprintf(buf, sizeof(buf), "reset iq(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
  2234. break;
  2235. case 2 :
  2236. snprintf(buf, sizeof(buf), "reset st(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
  2237. break;
  2238. case 3 :
  2239. snprintf(buf, sizeof(buf), "reset dx(%d)->1 stat_point(%d)->(%d)", old_val, old_stat, ch->GetRealPoint(POINT_STAT));
  2240. break;
  2241. }
  2242.  
  2243. LogManager::instance().CharLog(ch, 0, "RESET_ONE_STATUS", buf);
  2244.  
  2245. lua_pushboolean(L, true);
  2246. return 1;
  2247. }
  2248. }
  2249.  
  2250. lua_pushboolean(L, false);
  2251. return 1;
  2252. }
  2253.  
  2254. int pc_get_ht( lua_State* L )
  2255. {
  2256. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2257. lua_pushnumber(L, ch->GetRealPoint(POINT_HT));
  2258. return 1;
  2259. }
  2260.  
  2261. int pc_set_ht( lua_State* L )
  2262. {
  2263. if ( lua_isnumber(L, 1) == false )
  2264. return 1;
  2265.  
  2266. int newPoint = (int)lua_tonumber(L, 1);
  2267.  
  2268. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2269. int usedPoint = newPoint - ch->GetRealPoint(POINT_HT);
  2270. ch->SetRealPoint(POINT_HT, newPoint);
  2271. ch->PointChange(POINT_HT, 0);
  2272. ch->PointChange(POINT_STAT, -usedPoint);
  2273. ch->ComputePoints();
  2274. ch->PointsPacket();
  2275. return 1;
  2276. }
  2277.  
  2278. int pc_get_iq( lua_State* L )
  2279. {
  2280. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2281. lua_pushnumber(L, ch->GetRealPoint(POINT_IQ));
  2282. return 1;
  2283. }
  2284.  
  2285. int pc_set_iq( lua_State* L )
  2286. {
  2287. if ( lua_isnumber(L, 1) == false )
  2288. return 1;
  2289.  
  2290. int newPoint = (int)lua_tonumber(L, 1);
  2291.  
  2292. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2293. int usedPoint = newPoint - ch->GetRealPoint(POINT_IQ);
  2294. ch->SetRealPoint(POINT_IQ, newPoint);
  2295. ch->PointChange(POINT_IQ, 0);
  2296. ch->PointChange(POINT_STAT, -usedPoint);
  2297. ch->ComputePoints();
  2298. ch->PointsPacket();
  2299. return 1;
  2300. }
  2301.  
  2302. int pc_get_st( lua_State* L )
  2303. {
  2304. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2305. lua_pushnumber(L, ch->GetRealPoint(POINT_ST));
  2306. return 1;
  2307. }
  2308.  
  2309. int pc_set_st( lua_State* L )
  2310. {
  2311. if ( lua_isnumber(L, 1) == false )
  2312. return 1;
  2313.  
  2314. int newPoint = (int)lua_tonumber(L, 1);
  2315.  
  2316. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2317. int usedPoint = newPoint - ch->GetRealPoint(POINT_ST);
  2318. ch->SetRealPoint(POINT_ST, newPoint);
  2319. ch->PointChange(POINT_ST, 0);
  2320. ch->PointChange(POINT_STAT, -usedPoint);
  2321. ch->ComputePoints();
  2322. ch->PointsPacket();
  2323. return 1;
  2324. }
  2325.  
  2326. int pc_get_dx( lua_State* L )
  2327. {
  2328. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2329. lua_pushnumber(L, ch->GetRealPoint(POINT_DX));
  2330. return 1;
  2331. }
  2332.  
  2333. int pc_set_dx( lua_State* L )
  2334. {
  2335. if ( lua_isnumber(L, 1) == false )
  2336. return 1;
  2337.  
  2338. int newPoint = (int)lua_tonumber(L, 1);
  2339.  
  2340. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2341. int usedPoint = newPoint - ch->GetRealPoint(POINT_DX);
  2342. ch->SetRealPoint(POINT_DX, newPoint);
  2343. ch->PointChange(POINT_DX, 0);
  2344. ch->PointChange(POINT_STAT, -usedPoint);
  2345. ch->ComputePoints();
  2346. ch->PointsPacket();
  2347. return 1;
  2348. }
  2349.  
  2350. int pc_is_near_vid( lua_State* L )
  2351. {
  2352. if ( lua_isnumber(L, 1) != true || lua_isnumber(L, 2) != true )
  2353. {
  2354. lua_pushboolean(L, false);
  2355. }
  2356. else
  2357. {
  2358. LPCHARACTER pMe = CQuestManager::instance().GetCurrentCharacterPtr();
  2359. LPCHARACTER pOther = CHARACTER_MANAGER::instance().Find( (DWORD)lua_tonumber(L, 1) );
  2360.  
  2361. if ( pMe != NULL && pOther != NULL )
  2362. {
  2363. lua_pushboolean(L, (DISTANCE_APPROX(pMe->GetX() - pOther->GetX(), pMe->GetY() - pOther->GetY()) < (int)lua_tonumber(L, 2)*100));
  2364. }
  2365. else
  2366. {
  2367. lua_pushboolean(L, false);
  2368. }
  2369. }
  2370.  
  2371. return 1;
  2372. }
  2373.  
  2374. int pc_get_socket_items( lua_State* L )
  2375. {
  2376. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2377.  
  2378. lua_newtable( L );
  2379.  
  2380. if ( pChar == NULL ) return 1;
  2381.  
  2382. int idx = 1;
  2383.  
  2384. // 용혼석 슬롯은 할 필요 없을 듯.
  2385. // 이 함수는 탈석서용 함수인 듯 하다.
  2386. for ( int i=0; i < INVENTORY_MAX_NUM + WEAR_MAX_NUM; i++ )
  2387. {
  2388. LPITEM pItem = pChar->GetInventoryItem(i);
  2389.  
  2390. if ( pItem != NULL )
  2391. {
  2392. if ( pItem->IsEquipped() == false )
  2393. {
  2394. int j = 0;
  2395. for (; j < ITEM_SOCKET_MAX_NUM; j++ )
  2396. {
  2397. long socket = pItem->GetSocket(j);
  2398.  
  2399. if ( socket > 2 && socket != ITEM_BROKEN_METIN_VNUM )
  2400. {
  2401. TItemTable* pItemInfo = ITEM_MANAGER::instance().GetTable( socket );
  2402. if ( pItemInfo != NULL )
  2403. {
  2404. if ( pItemInfo->bType == ITEM_METIN ) break;
  2405. }
  2406. }
  2407. }
  2408.  
  2409. if ( j >= ITEM_SOCKET_MAX_NUM ) continue;
  2410.  
  2411. lua_newtable( L );
  2412.  
  2413. {
  2414. lua_pushstring( L, pItem->GetName() );
  2415. lua_rawseti( L, -2, 1 );
  2416.  
  2417. lua_pushnumber( L, i );
  2418. lua_rawseti( L, -2, 2 );
  2419. }
  2420.  
  2421. lua_rawseti( L, -2, idx++ );
  2422. }
  2423. }
  2424. }
  2425.  
  2426. return 1;
  2427. }
  2428.  
  2429. int pc_get_empty_inventory_count( lua_State* L )
  2430. {
  2431. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2432.  
  2433. if ( pChar != NULL )
  2434. {
  2435. lua_pushnumber(L, pChar->CountEmptyInventory());
  2436. }
  2437. else
  2438. {
  2439. lua_pushnumber(L, 0);
  2440. }
  2441.  
  2442. return 1;
  2443. }
  2444.  
  2445. int pc_get_logoff_interval( lua_State* L )
  2446. {
  2447. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2448.  
  2449. if ( pChar != NULL )
  2450. {
  2451. lua_pushnumber(L, pChar->GetLogOffInterval());
  2452. }
  2453. else
  2454. {
  2455. lua_pushnumber(L, 0);
  2456. }
  2457.  
  2458. return 1;
  2459. }
  2460.  
  2461. int pc_get_player_id( lua_State* L )
  2462. {
  2463. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2464.  
  2465. if ( pChar != NULL )
  2466. {
  2467. lua_pushnumber( L, pChar->GetPlayerID() );
  2468. }
  2469. else
  2470. {
  2471. lua_pushnumber( L, 0 );
  2472. }
  2473.  
  2474. return 1;
  2475. }
  2476.  
  2477. int pc_get_account_id( lua_State* L )
  2478. {
  2479. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2480.  
  2481. if ( pChar != NULL )
  2482. {
  2483. if ( pChar->GetDesc() != NULL )
  2484. {
  2485. lua_pushnumber( L, pChar->GetDesc()->GetAccountTable().id );
  2486. return 1;
  2487. }
  2488. }
  2489.  
  2490. lua_pushnumber( L, 0 );
  2491. return 1;
  2492. }
  2493.  
  2494. int pc_get_account( lua_State* L )
  2495. {
  2496. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2497.  
  2498. if( NULL != pChar )
  2499. {
  2500. if( NULL != pChar->GetDesc() )
  2501. {
  2502. lua_pushstring( L, pChar->GetDesc()->GetAccountTable().login );
  2503. return 1;
  2504. }
  2505. }
  2506.  
  2507. lua_pushstring( L, "" );
  2508. return 1;
  2509. }
  2510.  
  2511. int pc_is_riding(lua_State* L)
  2512. {
  2513. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2514.  
  2515. if( NULL != pChar )
  2516. {
  2517. bool is_riding = pChar->IsRiding();
  2518.  
  2519. lua_pushboolean(L, is_riding);
  2520.  
  2521. return 1;
  2522. }
  2523.  
  2524. lua_pushboolean(L, false);
  2525. return 1;
  2526. }
  2527.  
  2528. int pc_get_special_ride_vnum(lua_State* L)
  2529. {
  2530. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2531.  
  2532. if (NULL != pChar)
  2533. {
  2534. LPITEM Unique1 = pChar->GetWear(WEAR_UNIQUE1);
  2535. LPITEM Unique2 = pChar->GetWear(WEAR_UNIQUE2);
  2536. LPITEM Unique3 = pChar->GetWear(WEAR_COSTUME_MOUNT);
  2537.  
  2538. if (NULL != Unique1)
  2539. {
  2540. if (UNIQUE_GROUP_SPECIAL_RIDE == Unique1->GetSpecialGroup())
  2541. {
  2542. lua_pushnumber(L, Unique1->GetVnum());
  2543. lua_pushnumber(L, Unique1->GetSocket(2));
  2544. return 2;
  2545. }
  2546. }
  2547.  
  2548. if (NULL != Unique2)
  2549. {
  2550. if (UNIQUE_GROUP_SPECIAL_RIDE == Unique2->GetSpecialGroup())
  2551. {
  2552. lua_pushnumber(L, Unique2->GetVnum());
  2553. lua_pushnumber(L, Unique2->GetSocket(2));
  2554. return 2;
  2555. }
  2556. }
  2557.  
  2558. if (NULL != Unique3)
  2559. {
  2560. if (UNIQUE_GROUP_SPECIAL_RIDE == Unique3->GetSpecialGroup())
  2561. {
  2562. lua_pushnumber(L, Unique3->GetVnum());
  2563. lua_pushnumber(L, Unique3->GetSocket(2));
  2564. return 2;
  2565. }
  2566. }
  2567. }
  2568.  
  2569. lua_pushnumber(L, 0);
  2570. lua_pushnumber(L, 0);
  2571.  
  2572. return 2;
  2573. }
  2574.  
  2575. int pc_can_warp(lua_State* L)
  2576. {
  2577. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2578.  
  2579. if (NULL != pChar)
  2580. {
  2581. lua_pushboolean(L, pChar->CanWarp());
  2582. }
  2583. else
  2584. {
  2585. lua_pushboolean(L, false);
  2586. }
  2587.  
  2588. return 1;
  2589. }
  2590.  
  2591. int pc_dec_skill_point(lua_State* L)
  2592. {
  2593. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2594.  
  2595. if (NULL != pChar)
  2596. {
  2597. pChar->PointChange(POINT_SKILL, -1);
  2598. }
  2599.  
  2600. return 0;
  2601. }
  2602.  
  2603. int pc_get_skill_point(lua_State* L)
  2604. {
  2605. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2606.  
  2607. if (NULL != pChar)
  2608. {
  2609. lua_pushnumber(L, pChar->GetPoint(POINT_SKILL));
  2610. }
  2611. else
  2612. {
  2613. lua_pushnumber(L, 0);
  2614. }
  2615.  
  2616. return 1;
  2617. }
  2618.  
  2619. int pc_get_channel_id(lua_State* L)
  2620. {
  2621. lua_pushnumber(L, g_bChannel);
  2622.  
  2623. return 1;
  2624. }
  2625.  
  2626. int pc_give_poly_marble(lua_State* L)
  2627. {
  2628. const int dwVnum = lua_tonumber(L, 1);
  2629.  
  2630. const CMob* MobInfo = CMobManager::instance().Get(dwVnum);
  2631.  
  2632. if (NULL == MobInfo)
  2633. {
  2634. lua_pushboolean(L, false);
  2635. return 1;
  2636. }
  2637.  
  2638. if (0 == MobInfo->m_table.dwPolymorphItemVnum)
  2639. {
  2640. lua_pushboolean(L, false);
  2641. return 1;
  2642. }
  2643.  
  2644. LPITEM item = ITEM_MANAGER::instance().CreateItem( MobInfo->m_table.dwPolymorphItemVnum );
  2645.  
  2646. if (NULL == item)
  2647. {
  2648. lua_pushboolean(L, false);
  2649. return 1;
  2650. }
  2651.  
  2652. item->SetSocket(0, dwVnum);
  2653.  
  2654. const LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2655.  
  2656. int iEmptyCell = ch->GetEmptyInventory(item->GetSize());
  2657.  
  2658. if (-1 == iEmptyCell)
  2659. {
  2660. M2_DESTROY_ITEM(item);
  2661. lua_pushboolean(L, false);
  2662. return 1;
  2663. }
  2664.  
  2665. item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyCell));
  2666.  
  2667. const PC* pPC = CQuestManager::instance().GetCurrentPC();
  2668.  
  2669. LogManager::instance().QuestRewardLog(pPC->GetCurrentQuestName().c_str(), ch->GetPlayerID(), ch->GetLevel(), MobInfo->m_table.dwPolymorphItemVnum, dwVnum);
  2670.  
  2671. lua_pushboolean(L, true);
  2672.  
  2673. return 1;
  2674. }
  2675.  
  2676. int pc_get_sig_items (lua_State* L)
  2677. {
  2678. DWORD group_vnum = (DWORD)lua_tonumber (L, 1);
  2679. const LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2680. int count = 0;
  2681. for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
  2682. {
  2683. if (ch->GetInventoryItem(i) != NULL && ch->GetInventoryItem(i)->GetSIGVnum() == group_vnum)
  2684. {
  2685. lua_pushnumber(L, ch->GetInventoryItem(i)->GetID());
  2686. count++;
  2687. }
  2688. }
  2689.  
  2690. return count;
  2691. }
  2692.  
  2693. int pc_charge_cash(lua_State * L)
  2694. {
  2695. TRequestChargeCash packet;
  2696.  
  2697. int amount = lua_isnumber(L, 1) ? (int)lua_tonumber(L, 1) : 0;
  2698. std::string strChargeType = lua_isstring(L, 2) ? lua_tostring(L, 2) : "";
  2699.  
  2700. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2701.  
  2702. if (NULL == ch || NULL == ch->GetDesc() || 1 > amount || 50000 < amount)
  2703. {
  2704. lua_pushboolean(L, 0);
  2705. return 1;
  2706. }
  2707.  
  2708. packet.dwAID = ch->GetDesc()->GetAccountTable().id;
  2709. packet.dwAmount = (DWORD)amount;
  2710. packet.eChargeType = ERequestCharge_Cash;
  2711.  
  2712. if (0 < strChargeType.length())
  2713. std::transform(strChargeType.begin(), strChargeType.end(), strChargeType.begin(), (int(*)(int))std::tolower);
  2714.  
  2715. if ("mileage" == strChargeType)
  2716. packet.eChargeType = ERequestCharge_Mileage;
  2717.  
  2718. db_clientdesc->DBPacketHeader(HEADER_GD_REQUEST_CHARGE_CASH, 0, sizeof(TRequestChargeCash));
  2719. db_clientdesc->Packet(&packet, sizeof(packet));
  2720.  
  2721. lua_pushboolean(L, 1);
  2722. return 1;
  2723. }
  2724.  
  2725. int pc_give_award(lua_State* L)
  2726. {
  2727. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2728.  
  2729. if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isstring(L, 3) )
  2730. {
  2731. sys_err("QUEST give award call error : wrong argument");
  2732. lua_pushnumber (L, 0);
  2733. return 1;
  2734. }
  2735.  
  2736. DWORD dwVnum = (int) lua_tonumber(L, 1);
  2737.  
  2738. int icount = (int) lua_tonumber(L, 2);
  2739.  
  2740. sys_log(0, "QUEST [award] item %d to login %s", dwVnum, ch->GetDesc()->GetAccountTable().login);
  2741.  
  2742. DBManager::instance().Query("INSERT INTO item_award (login, vnum, count, given_time, why, mall)select '%s', %d, %d, now(), '%s', 1 from DUAL where not exists (select login, why from item_award where login = '%s' and why = '%s') ;",
  2743. ch->GetDesc()->GetAccountTable().login,
  2744. dwVnum,
  2745. icount,
  2746. lua_tostring(L,3),
  2747. ch->GetDesc()->GetAccountTable().login,
  2748. lua_tostring(L,3));
  2749.  
  2750. lua_pushnumber (L, 0);
  2751. return 1;
  2752. }
  2753. int pc_give_award_socket(lua_State* L)
  2754. {
  2755. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2756.  
  2757. if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isstring(L, 3) || !lua_isstring(L, 4) || !lua_isstring(L, 5) || !lua_isstring(L, 6) )
  2758. {
  2759. sys_err("QUEST give award call error : wrong argument");
  2760. lua_pushnumber (L, 0);
  2761. return 1;
  2762. }
  2763.  
  2764. DWORD dwVnum = (int) lua_tonumber(L, 1);
  2765.  
  2766. int icount = (int) lua_tonumber(L, 2);
  2767.  
  2768. sys_log(0, "QUEST [award] item %d to login %s", dwVnum, ch->GetDesc()->GetAccountTable().login);
  2769.  
  2770. DBManager::instance().Query("INSERT INTO item_award (login, vnum, count, given_time, why, mall, socket0, socket1, socket2)select '%s', %d, %d, now(), '%s', 1, %s, %s, %s from DUAL where not exists (select login, why from item_award where login = '%s' and why = '%s') ;",
  2771. ch->GetDesc()->GetAccountTable().login,
  2772. dwVnum,
  2773. icount,
  2774. lua_tostring(L,3),
  2775. lua_tostring(L,4),
  2776. lua_tostring(L,5),
  2777. lua_tostring(L,6),
  2778. ch->GetDesc()->GetAccountTable().login,
  2779. lua_tostring(L,3));
  2780.  
  2781. lua_pushnumber (L, 0);
  2782. return 1;
  2783. }
  2784.  
  2785. int pc_get_informer_type(lua_State* L) //독일 선물 기능
  2786. {
  2787. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2788.  
  2789. if( pChar != NULL )
  2790. {
  2791. //sys_err("quest cmd test %s", pChar->GetItemAward_cmd() );
  2792. lua_pushstring(L, pChar->GetItemAward_cmd() );
  2793. }
  2794. else
  2795. lua_pushstring(L, "" );
  2796.  
  2797. return 1;
  2798. }
  2799.  
  2800. int pc_get_informer_item(lua_State* L)
  2801. {
  2802. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2803.  
  2804. if( pChar != NULL )
  2805. {
  2806. lua_pushnumber(L, pChar->GetItemAward_vnum() );
  2807. }
  2808. else
  2809. lua_pushnumber(L,0);
  2810.  
  2811. return 1;
  2812. }
  2813.  
  2814. int pc_get_killee_drop_pct(lua_State* L)
  2815. {
  2816. LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr();
  2817. LPCHARACTER pKillee = pChar->GetQuestNPC();
  2818.  
  2819. int iDeltaPercent, iRandRange;
  2820. if (NULL == pKillee || !ITEM_MANAGER::instance().GetDropPct(pKillee, pChar, iDeltaPercent, iRandRange))
  2821. {
  2822. sys_err("killee is null");
  2823. lua_pushnumber(L, -1);
  2824. lua_pushnumber(L, -1);
  2825.  
  2826. return 2;
  2827. }
  2828.  
  2829. lua_pushnumber(L, iDeltaPercent);
  2830. lua_pushnumber(L, iRandRange);
  2831.  
  2832. return 2;
  2833. }
  2834.  
  2835. int pc_get_skill_list(lua_State* L)
  2836. {
  2837. lua_newtable(L);
  2838.  
  2839. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2840. if (!ch)
  2841. return 1;
  2842.  
  2843. const DWORD* pSkillVnums = ch->GetUsableSkillList();
  2844. if (!pSkillVnums)
  2845. return 1;
  2846.  
  2847. int iCount = 0;
  2848. for (int i = 0; i < CHARACTER_SKILL_COUNT; ++i)
  2849. {
  2850. if (!pSkillVnums[i])
  2851. continue;
  2852.  
  2853. lua_pushnumber(L, pSkillVnums[i]);
  2854. lua_rawseti(L, -2, ++iCount);
  2855. }
  2856.  
  2857. return 1;
  2858. }
  2859.  
  2860. #ifdef __SASH_SYSTEM__
  2861. int pc_open_sash(lua_State * L)
  2862. {
  2863. if (lua_isboolean(L, 1))
  2864. {
  2865. CQuestManager & qMgr = CQuestManager::instance();
  2866. LPCHARACTER pkChar = qMgr.GetCurrentCharacterPtr();
  2867. if (pkChar)
  2868. pkChar->OpenSash(lua_toboolean(L, 1));
  2869. }
  2870. else
  2871. sys_err("Invalid argument: arg1 must be boolean.");
  2872.  
  2873. return 0;
  2874. }
  2875. #endif
  2876.  
  2877. int _block_exp(lua_State* L)
  2878. {
  2879. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2880. ch->block_exp = true;
  2881. return 0;
  2882. }
  2883.  
  2884. int _unblock_exp(lua_State* L)
  2885. {
  2886. LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  2887. ch->block_exp = false;
  2888. return 0;
  2889. }
  2890.  
  2891. #ifdef __TITLE_SYSTEM__
  2892. int pc_set_title(lua_State * L)
  2893. {
  2894. bool _to_return = false;
  2895. if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
  2896. {
  2897. sys_err("Invalid argument.");
  2898. lua_pushboolean(L, _to_return);
  2899. return 1;
  2900. }
  2901.  
  2902. CQuestManager& q = CQuestManager::instance();
  2903. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  2904. if (!ch)
  2905. {
  2906. lua_pushboolean(L, _to_return);
  2907. return 1;
  2908. }
  2909.  
  2910. _to_return = true;
  2911. int iTitle = (int)lua_tonumber(L, 1);
  2912. BYTE bValue = (BYTE)lua_tonumber(L, 2);
  2913. ch->SetTitle(iTitle, bValue);
  2914. lua_pushboolean(L, _to_return);
  2915. return 1;
  2916. }
  2917.  
  2918. int pc_get_title(lua_State * L)
  2919. {
  2920. bool _to_return = false;
  2921. if (!lua_isnumber(L, 1))
  2922. {
  2923. sys_err("Invalid argument.");
  2924. lua_pushboolean(L, _to_return);
  2925. return 1;
  2926. }
  2927.  
  2928. CQuestManager& q = CQuestManager::instance();
  2929. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  2930. if (!ch)
  2931. {
  2932. lua_pushboolean(L, _to_return);
  2933. return 1;
  2934. }
  2935.  
  2936. int iTitle = (int)lua_tonumber(L, 1);
  2937. _to_return = ch->GetTitle(iTitle);
  2938. lua_pushboolean(L, _to_return);
  2939. return 1;
  2940. }
  2941.  
  2942. int pc_choose_title(lua_State * L)
  2943. {
  2944. bool _to_return = false;
  2945. if (!lua_isnumber(L, 1))
  2946. {
  2947. sys_err("Invalid argument.");
  2948. lua_pushboolean(L, _to_return);
  2949. return 1;
  2950. }
  2951.  
  2952. CQuestManager& q = CQuestManager::instance();
  2953. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  2954. if (!ch)
  2955. {
  2956. lua_pushboolean(L, _to_return);
  2957. return 1;
  2958. }
  2959.  
  2960. int iTitle = (int)lua_tonumber(L, 1);
  2961. _to_return = ch->ChooseTitle(iTitle);
  2962. lua_pushboolean(L, _to_return);
  2963. return 1;
  2964. }
  2965.  
  2966. int pc_choosed_title(lua_State * L)
  2967. {
  2968. CQuestManager& q = CQuestManager::instance();
  2969. LPCHARACTER ch = q.GetCurrentCharacterPtr();
  2970. if (!ch)
  2971. {
  2972. lua_pushnumber(L, 0);
  2973. return 1;
  2974. }
  2975.  
  2976. int _to_return = ch->ChoosedTitle();
  2977. lua_pushnumber(L, _to_return);
  2978. return 1;
  2979. }
  2980. #endif
  2981.  
  2982. void RegisterPCFunctionTable()
  2983. {
  2984. luaL_reg pc_functions[] =
  2985. {
  2986. { "get_wear", pc_get_wear },
  2987. { "get_player_id", pc_get_player_id },
  2988. { "get_account_id", pc_get_account_id },
  2989. { "get_account", pc_get_account },
  2990. { "get_level", pc_get_level },
  2991. { "set_level", pc_set_level },
  2992. { "get_next_exp", pc_get_next_exp },
  2993. { "get_exp", pc_get_exp },
  2994. { "get_job", pc_get_job },
  2995. { "get_race", pc_get_race },
  2996. { "change_sex", pc_change_sex },
  2997. { "gethp", pc_get_hp },
  2998. { "get_hp", pc_get_hp },
  2999. { "getmaxhp", pc_get_max_hp },
  3000. { "get_max_hp", pc_get_max_hp },
  3001. { "getsp", pc_get_sp },
  3002. { "get_sp", pc_get_sp },
  3003. { "getmaxsp", pc_get_max_sp },
  3004. { "get_max_sp", pc_get_max_sp },
  3005. { "change_sp", pc_change_sp },
  3006. { "getmoney", pc_get_money },
  3007. { "get_money", pc_get_money },
  3008. { "get_real_alignment", pc_get_real_alignment },
  3009. { "get_alignment", pc_get_alignment },
  3010. { "getweapon", pc_get_weapon },
  3011. { "get_weapon", pc_get_weapon },
  3012. { "getarmor", pc_get_armor },
  3013. { "get_armor", pc_get_armor },
  3014. { "getgold", pc_get_money },
  3015. { "get_gold", pc_get_money },
  3016. { "changegold", pc_change_money },
  3017. { "changemoney", pc_change_money },
  3018. { "changealignment", pc_change_alignment },
  3019. { "change_gold", pc_change_money },
  3020. { "change_money", pc_change_money },
  3021. { "change_alignment", pc_change_alignment },
  3022. { "getname", pc_get_name },
  3023. { "get_name", pc_get_name },
  3024. { "get_vid", pc_get_vid },
  3025. { "getplaytime", pc_get_playtime },
  3026. { "get_playtime", pc_get_playtime },
  3027. { "getleadership", pc_get_leadership },
  3028. { "get_leadership", pc_get_leadership },
  3029. { "getqf", pc_get_quest_flag },
  3030. { "setqf", pc_set_quest_flag },
  3031. { "delqf", pc_del_quest_flag },
  3032. { "getf", pc_get_another_quest_flag},
  3033. { "setf", pc_set_another_quest_flag},
  3034. { "get_x", pc_get_x },
  3035. { "get_y", pc_get_y },
  3036. { "getx", pc_get_x },
  3037. { "gety", pc_get_y },
  3038. { "get_local_x", pc_get_local_x },
  3039. { "get_local_y", pc_get_local_y },
  3040. { "getcurrentmapindex", pc_get_current_map_index},
  3041. { "get_map_index", pc_get_current_map_index},
  3042. { "give_exp", pc_give_exp },
  3043. { "give_exp_perc", pc_give_exp_perc },
  3044. { "give_exp2", pc_give_exp2 },
  3045. { "give_item", pc_give_item },
  3046. { "give_item2", pc_give_or_drop_item },
  3047. { "give_item2_select", pc_give_or_drop_item_and_select },
  3048. { "give_gold", pc_give_gold },
  3049. { "count_item", pc_count_item },
  3050. { "remove_item", pc_remove_item },
  3051. { "countitem", pc_count_item },
  3052. { "removeitem", pc_remove_item },
  3053. { "reset_point", pc_reset_point },
  3054. { "has_guild", pc_hasguild },
  3055. { "hasguild", pc_hasguild },
  3056. { "get_guild", pc_getguild },
  3057. { "getguild", pc_getguild },
  3058. { "isguildmaster", pc_isguildmaster },
  3059. { "is_guild_master", pc_isguildmaster },
  3060. { "destroy_guild", pc_destroy_guild },
  3061. { "remove_from_guild", pc_remove_from_guild },
  3062. { "in_dungeon", pc_in_dungeon },
  3063. { "getempire", pc_get_empire },
  3064. { "get_empire", pc_get_empire },
  3065. { "get_skill_group", pc_get_skillgroup },
  3066. { "set_skill_group", pc_set_skillgroup },
  3067. { "warp", pc_warp },
  3068. { "warp_local", pc_warp_local },
  3069. { "warp_exit", pc_warp_exit },
  3070. { "set_warp_location", pc_set_warp_location },
  3071. { "set_warp_location_local",pc_set_warp_location_local },
  3072. { "get_start_location", pc_get_start_location },
  3073. { "has_master_skill", pc_has_master_skill },
  3074. { "set_part", pc_set_part },
  3075. { "get_part", pc_get_part },
  3076. { "is_polymorphed", pc_is_polymorphed },
  3077. { "remove_polymorph", pc_remove_polymorph },
  3078. { "is_mount", pc_is_mount },
  3079. { "polymorph", pc_polymorph },
  3080. { "mount", pc_mount },
  3081. { "mount_bonus", pc_mount_bonus },
  3082. { "unmount", pc_unmount },
  3083. { "warp_to_guild_war_observer_position", pc_warp_to_guild_war_observer_position },
  3084. { "give_item_from_special_item_group", pc_give_item_from_special_item_group },
  3085. { "learn_grand_master_skill", pc_learn_grand_master_skill },
  3086. { "is_skill_book_no_delay", pc_is_skill_book_no_delay},
  3087. { "remove_skill_book_no_delay", pc_remove_skill_book_no_delay},
  3088.  
  3089. { "enough_inventory", pc_enough_inventory },
  3090. { "get_horse_level", pc_get_horse_level }, // TO BE DELETED XXX
  3091. { "is_horse_alive", pc_is_horse_alive }, // TO BE DELETED XXX
  3092. { "revive_horse", pc_revive_horse }, // TO BE DELETED XXX
  3093. { "have_pos_scroll", pc_have_pos_scroll },
  3094. { "have_map_scroll", pc_have_map_scroll },
  3095. { "get_war_map", pc_get_war_map },
  3096. { "get_equip_refine_level", pc_get_equip_refine_level },
  3097. { "refine_equip", pc_refine_equip },
  3098. { "get_skill_level", pc_get_skill_level },
  3099. { "give_lotto", pc_give_lotto },
  3100. { "aggregate_monster", pc_aggregate_monster },
  3101. { "forget_my_attacker", pc_forget_my_attacker },
  3102. { "pc_attract_ranger", pc_attract_ranger },
  3103. { "select", pc_select_vid },
  3104. { "get_sex", pc_get_sex },
  3105. { "is_married", pc_is_married },
  3106. { "is_engaged", pc_is_engaged },
  3107. { "is_engaged_or_married", pc_is_engaged_or_married},
  3108. { "is_gm", pc_is_gm },
  3109. { "get_gm_level", pc_get_gm_level },
  3110. { "mining", pc_mining },
  3111. { "ore_refine", pc_ore_refine },
  3112. { "diamond_refine", pc_diamond_refine },
  3113.  
  3114. // RESET_ONE_SKILL
  3115. { "clear_one_skill", pc_clear_one_skill },
  3116. // END_RESET_ONE_SKILL
  3117.  
  3118. { "clear_skill", pc_clear_skill },
  3119. { "clear_sub_skill", pc_clear_sub_skill },
  3120. { "set_skill_point", pc_set_skill_point },
  3121.  
  3122. { "is_clear_skill_group", pc_is_clear_skill_group },
  3123.  
  3124. { "save_exit_location", pc_save_exit_location },
  3125. { "teleport", pc_teleport },
  3126.  
  3127. { "set_skill_level", pc_set_skill_level },
  3128.  
  3129. { "give_polymorph_book", pc_give_polymorph_book },
  3130. { "upgrade_polymorph_book", pc_upgrade_polymorph_book },
  3131. { "get_premium_remain_sec", pc_get_premium_remain_sec },
  3132.  
  3133. { "send_block_mode", pc_send_block_mode },
  3134.  
  3135. { "change_empire", pc_change_empire },
  3136. { "get_change_empire_count", pc_get_change_empire_count },
  3137. { "set_change_empire_count", pc_set_change_empire_count },
  3138.  
  3139. { "change_name", pc_change_name },
  3140.  
  3141. { "is_dead", pc_is_dead },
  3142.  
  3143. { "reset_status", pc_reset_status },
  3144. { "get_ht", pc_get_ht },
  3145. { "set_ht", pc_set_ht },
  3146. { "get_iq", pc_get_iq },
  3147. { "set_iq", pc_set_iq },
  3148. { "get_st", pc_get_st },
  3149. { "set_st", pc_set_st },
  3150. { "get_dx", pc_get_dx },
  3151. { "set_dx", pc_set_dx },
  3152.  
  3153. { "is_near_vid", pc_is_near_vid },
  3154.  
  3155. { "get_socket_items", pc_get_socket_items },
  3156. { "get_empty_inventory_count", pc_get_empty_inventory_count },
  3157.  
  3158. { "get_logoff_interval", pc_get_logoff_interval },
  3159.  
  3160. { "is_riding", pc_is_riding },
  3161. { "get_special_ride_vnum", pc_get_special_ride_vnum },
  3162.  
  3163. { "can_warp", pc_can_warp },
  3164.  
  3165. { "dec_skill_point", pc_dec_skill_point },
  3166. { "get_skill_point", pc_get_skill_point },
  3167.  
  3168. { "get_channel_id", pc_get_channel_id },
  3169.  
  3170. { "give_poly_marble", pc_give_poly_marble },
  3171. { "get_sig_items", pc_get_sig_items },
  3172.  
  3173. { "charge_cash", pc_charge_cash },
  3174. { "is_afk", pc_is_afk },
  3175. { "set_afk", pc_set_afk },
  3176. { "del_afk", pc_del_afk },
  3177. { "get_informer_type", pc_get_informer_type }, //독일 선물 기능
  3178. { "get_informer_item", pc_get_informer_item },
  3179.  
  3180. { "give_award", pc_give_award },
  3181. { "give_award_socket", pc_give_award_socket },
  3182.  
  3183. { "block_exp", _block_exp },
  3184. { "unblock_exp", _unblock_exp },
  3185.  
  3186. { "get_killee_drop_pct", pc_get_killee_drop_pct },
  3187. { "get_skill_list", pc_get_skill_list },
  3188.  
  3189. { "open_sash", pc_open_sash },
  3190. #ifdef __TITLE_SYSTEM__
  3191. { "set_title", pc_set_title}, // Use (return true or false >> player will learn/unlearn this title): pc.set_title(title number, 0 to unlearn or 1 to learn) >> in length.h check: enum ETitles.
  3192. { "get_title", pc_get_title}, // Use (return true or false >> true in case player can have this title): pc.get_title(title number) >> in length.h check: enum ETitles.
  3193. { "choose_title", pc_choose_title}, // Use (return true or false >> true in case player can want to set this title and can): pc.choose_title(title number) >> in length.h check: enum ETitles.
  3194. { "choosed_title", pc_choosed_title}, // Use (return number of title choosed or 0): pc.choosed_title() >> in length.h check: enum ETitles.
  3195. #endif
  3196. { NULL, NULL }
  3197. };
  3198.  
  3199. CQuestManager::instance().AddLuaFunctionTable("pc", pc_functions);
  3200. }
  3201. };
Advertisement
Add Comment
Please, Sign In to add comment