Advertisement
Guest User

Untitled

a guest
Jan 1st, 2015
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 103.07 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "utils.h"
  3. #include "config.h"
  4. #include "desc_client.h"
  5. #include "desc_manager.h"
  6. #include "char.h"
  7. #include "char_manager.h"
  8. #include "item_manager.h"
  9. #include "sectree_manager.h"
  10. #include "mob_manager.h"
  11. #include "packet.h"
  12. #include "cmd.h"
  13. #include "regen.h"
  14. #include "guild.h"
  15. #include "guild_manager.h"
  16. #include "p2p.h"
  17. #include "buffer_manager.h"
  18. #include "fishing.h"
  19. #include "mining.h"
  20. #include "questmanager.h"
  21. #include "vector.h"
  22. #include "affect.h"
  23. #include "db.h"
  24. #include "priv_manager.h"
  25. #include "building.h"
  26. #include "battle.h"
  27. #include "arena.h"
  28. #include "start_position.h"
  29. #include "party.h"
  30. #include "monarch.h"
  31. #include "castle.h"
  32. #include "BattleArena.h"
  33. #include "xmas_event.h"
  34. #include "log.h"
  35. #include "pcbang.h"
  36. #include "threeway_war.h"
  37. #include "unique_item.h"
  38. #include "DragonSoul.h"
  39.  
  40. extern bool DropEvent_RefineBox_SetValue(const std::string& name, int value);
  41.  
  42. // ADD_COMMAND_SLOW_STUN
  43. enum
  44. {
  45. COMMANDAFFECT_STUN,
  46. COMMANDAFFECT_SLOW,
  47. };
  48.  
  49. void Command_ApplyAffect(LPCHARACTER ch, const char* argument, const char* affectName, int cmdAffect)
  50. {
  51. char arg1[256];
  52. one_argument(argument, arg1, sizeof(arg1));
  53.  
  54. sys_log(0, arg1);
  55.  
  56. if (!*arg1)
  57. {
  58. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: %s <name>", affectName);
  59. return;
  60. }
  61.  
  62. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  63. if (!tch)
  64. {
  65. ch->ChatPacket(CHAT_TYPE_INFO, "%s is not in same map", arg1);
  66. return;
  67. }
  68.  
  69. switch (cmdAffect)
  70. {
  71. case COMMANDAFFECT_STUN:
  72. SkillAttackAffect(tch, 1000, IMMUNE_STUN, AFFECT_STUN, POINT_NONE, 0, AFF_STUN, 30, "GM_STUN");
  73. break;
  74. case COMMANDAFFECT_SLOW:
  75. SkillAttackAffect(tch, 1000, IMMUNE_SLOW, AFFECT_SLOW, POINT_MOV_SPEED, -30, AFF_SLOW, 30, "GM_SLOW");
  76. break;
  77. }
  78.  
  79. sys_log(0, "%s %s", arg1, affectName);
  80.  
  81. ch->ChatPacket(CHAT_TYPE_INFO, "%s %s", arg1, affectName);
  82. }
  83. // END_OF_ADD_COMMAND_SLOW_STUN
  84.  
  85. ACMD(do_pcbang_update)
  86. {
  87. char arg1[256];
  88. one_argument(argument, arg1, sizeof(arg1));
  89.  
  90. unsigned long PCBangID = 0;
  91.  
  92. if (*arg1 == '\0')
  93. PCBangID = 0;
  94. else
  95. str_to_number(PCBangID, arg1);
  96.  
  97. if (PCBangID == 0)
  98. {
  99. CPCBangManager::instance().RequestUpdateIPList(0);
  100. ch->ChatPacket(CHAT_TYPE_INFO, "PCBang Info Update For All");
  101. }
  102. else
  103. {
  104. CPCBangManager::instance().RequestUpdateIPList(PCBangID);
  105. ch->ChatPacket(CHAT_TYPE_INFO, "PCBang Info Update For %u", PCBangID);
  106. }
  107.  
  108. TPacketPCBangUpdate packet;
  109. packet.bHeader = HEADER_GG_PCBANG_UPDATE;
  110. packet.ulPCBangID = PCBangID;
  111.  
  112. P2P_MANAGER::instance().Send(&packet, sizeof(TPacketPCBangUpdate));
  113.  
  114. }
  115.  
  116. ACMD(do_pcbang_check)
  117. {
  118. char arg1[256];
  119. one_argument(argument, arg1, sizeof(arg1));
  120.  
  121. if (CPCBangManager::instance().IsPCBangIP(arg1) == true)
  122. {
  123. ch->ChatPacket(CHAT_TYPE_INFO, "%s is a PCBang IP", arg1);
  124. }
  125. else
  126. {
  127. ch->ChatPacket(CHAT_TYPE_INFO, "%s is not a PCBang IP", arg1);
  128. }
  129. }
  130.  
  131. ACMD(do_stun)
  132. {
  133. Command_ApplyAffect(ch, argument, "stun", COMMANDAFFECT_STUN);
  134. }
  135.  
  136. ACMD(do_slow)
  137. {
  138. Command_ApplyAffect(ch, argument, "slow", COMMANDAFFECT_SLOW);
  139. }
  140.  
  141. ACMD(do_transfer)
  142. {
  143. char arg1[256];
  144. one_argument(argument, arg1, sizeof(arg1));
  145.  
  146. if (!*arg1)
  147. {
  148. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: transfer <name>");
  149. return;
  150. }
  151.  
  152. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  153. if (!tch)
  154. {
  155. CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
  156.  
  157. if (pkCCI)
  158. {
  159. if (pkCCI->bChannel != g_bChannel)
  160. {
  161. ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
  162. return;
  163. }
  164.  
  165. TPacketGGTransfer pgg;
  166.  
  167. pgg.bHeader = HEADER_GG_TRANSFER;
  168. strlcpy(pgg.szName, arg1, sizeof(pgg.szName));
  169. pgg.lX = ch->GetX();
  170. pgg.lY = ch->GetY();
  171.  
  172. P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGTransfer));
  173. ch->ChatPacket(CHAT_TYPE_INFO, "Transfer requested.");
  174. }
  175. else
  176. ch->ChatPacket(CHAT_TYPE_INFO, "There is no character by that name");
  177.  
  178. return;
  179. }
  180.  
  181. if (ch == tch)
  182. {
  183. ch->ChatPacket(CHAT_TYPE_INFO, "Transfer me?!?");
  184. return;
  185. }
  186.  
  187. //tch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
  188. tch->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
  189. }
  190.  
  191. // LUA_ADD_GOTO_INFO
  192. struct GotoInfo
  193. {
  194. std::string st_name;
  195.  
  196. BYTE empire;
  197. int mapIndex;
  198. DWORD x, y;
  199.  
  200. GotoInfo()
  201. {
  202. st_name = "";
  203. empire = 0;
  204. mapIndex = 0;
  205.  
  206. x = 0;
  207. y = 0;
  208. }
  209. GotoInfo(const GotoInfo& c_src)
  210. {
  211. __copy__(c_src);
  212. }
  213. void operator = (const GotoInfo& c_src)
  214. {
  215. __copy__(c_src);
  216. }
  217. void __copy__(const GotoInfo& c_src)
  218. {
  219. st_name = c_src.st_name;
  220. empire = c_src.empire;
  221. mapIndex = c_src.mapIndex;
  222.  
  223. x = c_src.x;
  224. y = c_src.y;
  225. }
  226. };
  227.  
  228. static std::vector<GotoInfo> gs_vec_gotoInfo;
  229.  
  230. void CHARACTER_AddGotoInfo(const std::string& c_st_name, BYTE empire, int mapIndex, DWORD x, DWORD y)
  231. {
  232. GotoInfo newGotoInfo;
  233. newGotoInfo.st_name = c_st_name;
  234. newGotoInfo.empire = empire;
  235. newGotoInfo.mapIndex = mapIndex;
  236. newGotoInfo.x = x;
  237. newGotoInfo.y = y;
  238. gs_vec_gotoInfo.push_back(newGotoInfo);
  239.  
  240. sys_log(0, "AddGotoInfo(name=%s, empire=%d, mapIndex=%d, pos=(%d, %d))", c_st_name.c_str(), empire, mapIndex, x, y);
  241. }
  242.  
  243. bool FindInString(const char * c_pszFind, const char * c_pszIn)
  244. {
  245. const char * c = c_pszIn;
  246. const char * p;
  247.  
  248. p = strchr(c, '|');
  249.  
  250. if (!p)
  251. return (0 == strncasecmp(c_pszFind, c_pszIn, strlen(c_pszFind)));
  252. else
  253. {
  254. char sz[64 + 1];
  255.  
  256. do
  257. {
  258. strlcpy(sz, c, MIN(sizeof(sz), (p - c) + 1));
  259.  
  260. if (!strncasecmp(c_pszFind, sz, strlen(c_pszFind)))
  261. return true;
  262.  
  263. c = p + 1;
  264. } while ((p = strchr(c, '|')));
  265.  
  266. strlcpy(sz, c, sizeof(sz));
  267.  
  268. if (!strncasecmp(c_pszFind, sz, strlen(c_pszFind)))
  269. return true;
  270. }
  271.  
  272. return false;
  273. }
  274.  
  275. bool CHARACTER_GoToName(LPCHARACTER ch, BYTE empire, int mapIndex, const char* gotoName)
  276. {
  277. std::vector<GotoInfo>::iterator i;
  278. for (i = gs_vec_gotoInfo.begin(); i != gs_vec_gotoInfo.end(); ++i)
  279. {
  280. const GotoInfo& c_eachGotoInfo = *i;
  281.  
  282. if (mapIndex != 0)
  283. {
  284. if (mapIndex != c_eachGotoInfo.mapIndex)
  285. continue;
  286. }
  287. else if (!FindInString(gotoName, c_eachGotoInfo.st_name.c_str()))
  288. continue;
  289.  
  290. if (c_eachGotoInfo.empire == 0 || c_eachGotoInfo.empire == empire)
  291. {
  292. int x = c_eachGotoInfo.x * 100;
  293. int y = c_eachGotoInfo.y * 100;
  294.  
  295. ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
  296. ch->WarpSet(x, y);
  297. ch->Stop();
  298. return true;
  299. }
  300. }
  301. return false;
  302. }
  303.  
  304. // END_OF_LUA_ADD_GOTO_INFO
  305.  
  306. /*
  307. = {
  308. { "A1|영안읍성", 0, 1, 4693, 9642 },
  309. { "A3|자양현", 0, 3, 3608, 8776 },
  310.  
  311. { "B1|조안읍성", 0, 21, 557, 1579 },
  312. { "B3|복정현", 0, 23, 1385, 2349 },
  313.  
  314. { "C1|평무읍성", 0, 41, 9696, 2784 },
  315. { "C3|박라현", 0, 43, 8731, 2426 },
  316.  
  317. // Snow
  318. { "Snow|서한산", 1, 61, 4342, 2906 },
  319. { "Snow|서한산", 2, 61, 3752, 1749 },
  320. { "Snow|서한산", 3, 61, 4918, 1736 },
  321.  
  322. // Flame
  323. { "Flame|도염화지|화염", 1, 62, 5994, 7563 },
  324. { "Flame|도염화지|화염", 2, 62, 5978, 6222 },
  325. { "Flame|도염화지|화염", 3, 62, 7307, 6898 },
  326.  
  327. // Desert
  328. { "Desert|영비사막|사막", 1, 63, 2178, 6272 },
  329. { "Desert|영비사막|사막", 2, 63, 2219, 5027 },
  330. { "Desert|영비사막|사막", 3, 63, 3440, 5025 },
  331.  
  332. // Threeway
  333. { "Three|승룡곡", 1, 64, 4021, 6739 },
  334. { "Three|승룡곡", 2, 64, 2704, 7399 },
  335. { "Three|승룡곡", 3, 64, 3213, 8080 },
  336.  
  337. // 밀교사원
  338. { "Milgyo|밀교사원", 1, 65, 5536, 1436 },
  339. { "Milgyo|밀교사원", 2, 65, 5536, 1436 },
  340. { "Milgyo|밀교사원", 3, 65, 5536, 1436 },
  341.  
  342. // 사귀타워입구
  343. { "사귀타워입구", 1, 65, 5905, 1108 },
  344. { "사귀타워입구", 2, 65, 5905, 1108 },
  345. { "사귀타워입구", 3, 65, 5905, 1108 },
  346.  
  347. { NULL, 0, 0, 0, 0 },
  348. };
  349. */
  350.  
  351.  
  352. ACMD(do_goto)
  353. {
  354. char arg1[256], arg2[256];
  355. int x = 0, y = 0, z = 0;
  356.  
  357. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  358.  
  359. if (!*arg1 && !*arg2)
  360. {
  361. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: goto <x meter> <y meter>");
  362. return;
  363. }
  364.  
  365. if (isnhdigit(*arg1) && isnhdigit(*arg2))
  366. {
  367. str_to_number(x, arg1);
  368. str_to_number(y, arg2);
  369.  
  370. PIXEL_POSITION p;
  371.  
  372. if (SECTREE_MANAGER::instance().GetMapBasePosition(ch->GetX(), ch->GetY(), p))
  373. {
  374. x += p.x / 100;
  375. y += p.y / 100;
  376. }
  377.  
  378. ch->ChatPacket(CHAT_TYPE_INFO, "You goto ( %d, %d )", x, y);
  379. }
  380. else
  381. {
  382. int mapIndex = 0;
  383. BYTE empire = 0;
  384.  
  385. if (*arg1 == '#')
  386. str_to_number(mapIndex, (arg1 + 1));
  387.  
  388. if (*arg2 && isnhdigit(*arg2))
  389. {
  390. str_to_number(empire, arg2);
  391. empire = MINMAX(1, empire, 3);
  392. }
  393. else
  394. empire = ch->GetEmpire();
  395.  
  396. if (CHARACTER_GoToName(ch, empire, mapIndex, arg1))
  397. {
  398. ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map command syntax: /goto <mapname> [empire]");
  399. return;
  400. }
  401.  
  402. return;
  403.  
  404. /*
  405. int iMapIndex = 0;
  406. for (int i = 0; aWarpInfo[i].c_pszName != NULL; ++i)
  407. {
  408. if (iMapIndex != 0)
  409. {
  410. if (iMapIndex != aWarpInfo[i].iMapIndex)
  411. continue;
  412. }
  413. else if (!FindInString(arg1, aWarpInfo[i].c_pszName))
  414. continue;
  415.  
  416. if (aWarpInfo[i].bEmpire == 0 || aWarpInfo[i].bEmpire == bEmpire)
  417. {
  418. x = aWarpInfo[i].x * 100;
  419. y = aWarpInfo[i].y * 100;
  420.  
  421. ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
  422. ch->WarpSet(x, y);
  423. ch->Stop();
  424. return;
  425. }
  426. }
  427. */
  428.  
  429. }
  430.  
  431. x *= 100;
  432. y *= 100;
  433.  
  434. ch->Show(ch->GetMapIndex(), x, y, z);
  435. ch->Stop();
  436. }
  437.  
  438. ACMD(do_warp)
  439. {
  440. char arg1[256], arg2[256];
  441.  
  442. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  443.  
  444. if (!*arg1)
  445. {
  446. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: warp <character name> | <x meter> <y meter>");
  447. return;
  448. }
  449.  
  450. int x = 0, y = 0;
  451.  
  452. if (isnhdigit(*arg1) && isnhdigit(*arg2))
  453. {
  454. str_to_number(x, arg1);
  455. str_to_number(y, arg2);
  456. }
  457. else
  458. {
  459. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  460.  
  461. if (NULL == tch)
  462. {
  463. const CCI* pkCCI = P2P_MANAGER::instance().Find(arg1);
  464.  
  465. if (NULL != pkCCI)
  466. {
  467. if (pkCCI->bChannel != g_bChannel)
  468. {
  469. ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
  470. return;
  471. }
  472.  
  473. ch->WarpToPID( pkCCI->dwPID );
  474. }
  475. else
  476. {
  477. ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
  478. }
  479.  
  480. return;
  481. }
  482. else
  483. {
  484. x = tch->GetX() / 100;
  485. y = tch->GetY() / 100;
  486. }
  487. }
  488.  
  489. x *= 100;
  490. y *= 100;
  491.  
  492. ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
  493. ch->WarpSet(x, y);
  494. ch->Stop();
  495. }
  496.  
  497. ACMD(do_item)
  498. {
  499. char arg1[256], arg2[256];
  500. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  501.  
  502. if (!*arg1)
  503. {
  504. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: item <item vnum>");
  505. return;
  506. }
  507.  
  508. int iCount = 1;
  509.  
  510. if (*arg2)
  511. {
  512. str_to_number(iCount, arg2);
  513. iCount = MINMAX(1, iCount, ITEM_MAX_COUNT);
  514. }
  515.  
  516. DWORD dwVnum;
  517.  
  518. if (isnhdigit(*arg1))
  519. str_to_number(dwVnum, arg1);
  520. else
  521. {
  522. if (!ITEM_MANAGER::instance().GetVnum(arg1, dwVnum))
  523. {
  524. ch->ChatPacket(CHAT_TYPE_INFO, "#%u item not exist by that vnum.", dwVnum);
  525. return;
  526. }
  527. }
  528.  
  529. LPITEM item = ITEM_MANAGER::instance().CreateItem(dwVnum, iCount, 0, true);
  530.  
  531. if (item)
  532. {
  533. if (item->IsDragonSoul())
  534. {
  535. int iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
  536.  
  537. if (iEmptyPos != -1)
  538. {
  539. item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
  540. LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
  541. }
  542. else
  543. {
  544. M2_DESTROY_ITEM(item);
  545. if (!ch->DragonSoul_IsQualified())
  546. {
  547. ch->ChatPacket(CHAT_TYPE_INFO, "인벤이 활성화 되지 않음.");
  548. }
  549. else
  550. ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
  551. }
  552. }
  553. else
  554. {
  555. int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
  556.  
  557. if (iEmptyPos != -1)
  558. {
  559. item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
  560. LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
  561. }
  562. else
  563. {
  564. M2_DESTROY_ITEM(item);
  565. ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
  566. }
  567. }
  568. }
  569. else
  570. {
  571. ch->ChatPacket(CHAT_TYPE_INFO, "#%u item not exist by that vnum.", dwVnum);
  572. }
  573. }
  574.  
  575. ACMD(do_group_random)
  576. {
  577. char arg1[256];
  578. one_argument(argument, arg1, sizeof(arg1));
  579.  
  580. if (!*arg1)
  581. {
  582. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: grrandom <group vnum>");
  583. return;
  584. }
  585.  
  586. DWORD dwVnum = 0;
  587. str_to_number(dwVnum, arg1);
  588. CHARACTER_MANAGER::instance().SpawnGroupGroup(dwVnum, ch->GetMapIndex(), ch->GetX() - 500, ch->GetY() - 500, ch->GetX() + 500, ch->GetY() + 500);
  589. }
  590.  
  591. ACMD(do_group)
  592. {
  593. char arg1[256];
  594. one_argument(argument, arg1, sizeof(arg1));
  595.  
  596. if (!*arg1)
  597. {
  598. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: group <group vnum>");
  599. return;
  600. }
  601.  
  602. DWORD dwVnum = 0;
  603. str_to_number(dwVnum, arg1);
  604.  
  605. if (test_server)
  606. sys_log(0, "COMMAND GROUP SPAWN %u at %u %u %u", dwVnum, ch->GetMapIndex(), ch->GetX(), ch->GetY());
  607.  
  608. CHARACTER_MANAGER::instance().SpawnGroup(dwVnum, ch->GetMapIndex(), ch->GetX() - 500, ch->GetY() - 500, ch->GetX() + 500, ch->GetY() + 500);
  609. }
  610.  
  611. ACMD(do_mob_coward)
  612. {
  613. char arg1[256], arg2[256];
  614. DWORD vnum = 0;
  615. LPCHARACTER tch;
  616.  
  617. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  618.  
  619. if (!*arg1)
  620. {
  621. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mc <vnum>");
  622. return;
  623. }
  624.  
  625. const CMob * pkMob;
  626.  
  627. if (isdigit(*arg1))
  628. {
  629. str_to_number(vnum, arg1);
  630.  
  631. if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
  632. vnum = 0;
  633. }
  634. else
  635. {
  636. pkMob = CMobManager::Instance().Get(arg1, true);
  637.  
  638. if (pkMob)
  639. vnum = pkMob->m_table.dwVnum;
  640. }
  641.  
  642. if (vnum == 0)
  643. {
  644. ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
  645. return;
  646. }
  647.  
  648. int iCount = 0;
  649.  
  650. if (*arg2)
  651. str_to_number(iCount, arg2);
  652. else
  653. iCount = 1;
  654.  
  655. iCount = MIN(20, iCount);
  656.  
  657. while (iCount--)
  658. {
  659. tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
  660. ch->GetMapIndex(),
  661. ch->GetX() - number(200, 750),
  662. ch->GetY() - number(200, 750),
  663. ch->GetX() + number(200, 750),
  664. ch->GetY() + number(200, 750),
  665. true,
  666. pkMob->m_table.bType == CHAR_TYPE_STONE);
  667. if (tch)
  668. tch->SetCoward();
  669. }
  670. }
  671.  
  672. ACMD(do_mob_map)
  673. {
  674. char arg1[256];
  675. one_argument(argument, arg1, sizeof(arg1));
  676.  
  677. if (!*arg1)
  678. {
  679. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: mm <vnum>");
  680. return;
  681. }
  682.  
  683. DWORD vnum = 0;
  684. str_to_number(vnum, arg1);
  685. LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition(vnum, ch->GetMapIndex());
  686.  
  687. if (tch)
  688. ch->ChatPacket(CHAT_TYPE_INFO, "%s spawned in %dx%d", tch->GetName(), tch->GetX(), tch->GetY());
  689. else
  690. ch->ChatPacket(CHAT_TYPE_INFO, "Spawn failed.");
  691. }
  692.  
  693. ACMD(do_mob_aggresive)
  694. {
  695. char arg1[256], arg2[256];
  696. DWORD vnum = 0;
  697. LPCHARACTER tch;
  698.  
  699. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  700.  
  701. if (!*arg1)
  702. {
  703. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
  704. return;
  705. }
  706.  
  707. const CMob * pkMob;
  708.  
  709. if (isdigit(*arg1))
  710. {
  711. str_to_number(vnum, arg1);
  712.  
  713. if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
  714. vnum = 0;
  715. }
  716. else
  717. {
  718. pkMob = CMobManager::Instance().Get(arg1, true);
  719.  
  720. if (pkMob)
  721. vnum = pkMob->m_table.dwVnum;
  722. }
  723.  
  724. if (vnum == 0)
  725. {
  726. ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
  727. return;
  728. }
  729.  
  730. int iCount = 0;
  731.  
  732. if (*arg2)
  733. str_to_number(iCount, arg2);
  734. else
  735. iCount = 1;
  736.  
  737. iCount = MIN(20, iCount);
  738.  
  739. while (iCount--)
  740. {
  741. tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
  742. ch->GetMapIndex(),
  743. ch->GetX() - number(200, 750),
  744. ch->GetY() - number(200, 750),
  745. ch->GetX() + number(200, 750),
  746. ch->GetY() + number(200, 750),
  747. true,
  748. pkMob->m_table.bType == CHAR_TYPE_STONE);
  749. if (tch)
  750. tch->SetAggressive();
  751. }
  752. }
  753.  
  754. ACMD(do_mob)
  755. {
  756. char arg1[256], arg2[256];
  757. DWORD vnum = 0;
  758.  
  759. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  760.  
  761. if (!*arg1)
  762. {
  763. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
  764. return;
  765. }
  766.  
  767. const CMob* pkMob = NULL;
  768.  
  769. if (isnhdigit(*arg1))
  770. {
  771. str_to_number(vnum, arg1);
  772.  
  773. if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
  774. vnum = 0;
  775. }
  776. else
  777. {
  778. pkMob = CMobManager::Instance().Get(arg1, true);
  779.  
  780. if (pkMob)
  781. vnum = pkMob->m_table.dwVnum;
  782. }
  783.  
  784. if (vnum == 0)
  785. {
  786. ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
  787. return;
  788. }
  789.  
  790. int iCount = 0;
  791.  
  792. if (*arg2)
  793. str_to_number(iCount, arg2);
  794. else
  795. iCount = 1;
  796.  
  797. if (test_server)
  798. iCount = MIN(40, iCount);
  799. else
  800. iCount = MIN(20, iCount);
  801.  
  802. while (iCount--)
  803. {
  804. CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
  805. ch->GetMapIndex(),
  806. ch->GetX() - number(200, 750),
  807. ch->GetY() - number(200, 750),
  808. ch->GetX() + number(200, 750),
  809. ch->GetY() + number(200, 750),
  810. true,
  811. pkMob->m_table.bType == CHAR_TYPE_STONE);
  812. }
  813. }
  814.  
  815. ACMD(do_mob_ld)
  816. {
  817. char arg1[256], arg2[256], arg3[256], arg4[256];
  818. DWORD vnum = 0;
  819.  
  820. two_arguments(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3), arg4, sizeof(arg4));
  821.  
  822. if (!*arg1)
  823. {
  824. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
  825. return;
  826. }
  827.  
  828. const CMob* pkMob = NULL;
  829.  
  830. if (isnhdigit(*arg1))
  831. {
  832. str_to_number(vnum, arg1);
  833.  
  834. if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
  835. vnum = 0;
  836. }
  837. else
  838. {
  839. pkMob = CMobManager::Instance().Get(arg1, true);
  840.  
  841. if (pkMob)
  842. vnum = pkMob->m_table.dwVnum;
  843. }
  844.  
  845. if (vnum == 0)
  846. {
  847. ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
  848. return;
  849. }
  850.  
  851. int dir = 1;
  852. long x,y;
  853.  
  854. if (*arg2)
  855. str_to_number(x, arg2);
  856. if (*arg3)
  857. str_to_number(y, arg3);
  858. if (*arg4)
  859. str_to_number(dir, arg4);
  860.  
  861.  
  862. CHARACTER_MANAGER::instance().SpawnMob(vnum,
  863. ch->GetMapIndex(),
  864. x*100,
  865. y*100,
  866. ch->GetZ(),
  867. pkMob->m_table.bType == CHAR_TYPE_STONE,
  868. dir);
  869. }
  870.  
  871. struct FuncPurge
  872. {
  873. LPCHARACTER m_pkGM;
  874. bool m_bAll;
  875.  
  876. FuncPurge(LPCHARACTER ch) : m_pkGM(ch), m_bAll(false)
  877. {
  878. }
  879.  
  880. void operator () (LPENTITY ent)
  881. {
  882. if (!ent->IsType(ENTITY_CHARACTER))
  883. return;
  884.  
  885. LPCHARACTER pkChr = (LPCHARACTER) ent;
  886.  
  887. int iDist = DISTANCE_APPROX(pkChr->GetX() - m_pkGM->GetX(), pkChr->GetY() - m_pkGM->GetY());
  888.  
  889. if (!m_bAll && iDist >= 1000) // 10미터 이상에 있는 것들은 purge 하지 않는다.
  890. return;
  891.  
  892. sys_log(0, "PURGE: %s %d", pkChr->GetName(), iDist);
  893.  
  894. if (pkChr->IsNPC() && !pkChr->IsPet() && pkChr->GetRider() == NULL)
  895. {
  896. M2_DESTROY_CHARACTER(pkChr);
  897. }
  898. }
  899. };
  900.  
  901. ACMD(do_purge)
  902. {
  903. char arg1[256];
  904. one_argument(argument, arg1, sizeof(arg1));
  905.  
  906. FuncPurge func(ch);
  907.  
  908. if (*arg1 && !strcmp(arg1, "all"))
  909. func.m_bAll = true;
  910.  
  911. LPSECTREE sectree = ch->GetSectree();
  912. if (sectree) // #431
  913. sectree->ForEachAround(func);
  914. else
  915. sys_err("PURGE_ERROR.NULL_SECTREE(mapIndex=%d, pos=(%d, %d)", ch->GetMapIndex(), ch->GetX(), ch->GetY());
  916. }
  917.  
  918. ACMD(do_item_purge)
  919. {
  920. int i;
  921. LPITEM item;
  922.  
  923. for (i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
  924. {
  925. if ((item = ch->GetInventoryItem(i)))
  926. {
  927. ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
  928. ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
  929. }
  930. }
  931. for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
  932. {
  933. if ((item = ch->GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i ))))
  934. {
  935. ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
  936. }
  937. }
  938. }
  939.  
  940. ACMD(do_state)
  941. {
  942. char arg1[256];
  943. LPCHARACTER tch;
  944.  
  945. one_argument(argument, arg1, sizeof(arg1));
  946.  
  947. if (*arg1)
  948. {
  949. if (arg1[0] == '#')
  950. {
  951. tch = CHARACTER_MANAGER::instance().Find(strtoul(arg1+1, NULL, 10));
  952. }
  953. else
  954. {
  955. LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
  956.  
  957. if (!d)
  958. tch = NULL;
  959. else
  960. tch = d->GetCharacter();
  961. }
  962. }
  963. else
  964. tch = ch;
  965.  
  966. if (!tch)
  967. return;
  968.  
  969. char buf[256];
  970.  
  971. snprintf(buf, sizeof(buf), "%s's State: ", tch->GetName());
  972.  
  973. if (tch->IsPosition(POS_FIGHTING))
  974. strlcat(buf, "Battle", sizeof(buf));
  975. else if (tch->IsPosition(POS_DEAD))
  976. strlcat(buf, "Dead", sizeof(buf));
  977. else
  978. strlcat(buf, "Standing", sizeof(buf));
  979.  
  980. if (ch->GetShop())
  981. strlcat(buf, ", Shop", sizeof(buf));
  982.  
  983. if (ch->GetExchange())
  984. strlcat(buf, ", Exchange", sizeof(buf));
  985.  
  986. ch->ChatPacket(CHAT_TYPE_INFO, "%s", buf);
  987.  
  988. int len;
  989. len = snprintf(buf, sizeof(buf), "Coordinate %ldx%ld (%ldx%ld)",
  990. tch->GetX(), tch->GetY(), tch->GetX() / 100, tch->GetY() / 100);
  991.  
  992. if (len < 0 || len >= (int) sizeof(buf))
  993. len = sizeof(buf) - 1;
  994.  
  995. LPSECTREE pSec = SECTREE_MANAGER::instance().Get(tch->GetMapIndex(), tch->GetX(), tch->GetY());
  996.  
  997. if (pSec)
  998. {
  999. TMapSetting& map_setting = SECTREE_MANAGER::instance().GetMap(tch->GetMapIndex())->m_setting;
  1000. snprintf(buf + len, sizeof(buf) - len, " MapIndex %ld Attribute %08X Local Position (%ld x %ld)",
  1001. tch->GetMapIndex(), pSec->GetAttribute(tch->GetX(), tch->GetY()), (tch->GetX() - map_setting.iBaseX)/100, (tch->GetY() - map_setting.iBaseY)/100);
  1002. }
  1003.  
  1004. ch->ChatPacket(CHAT_TYPE_INFO, "%s", buf);
  1005.  
  1006. ch->ChatPacket(CHAT_TYPE_INFO, "LEV %d", tch->GetLevel());
  1007. ch->ChatPacket(CHAT_TYPE_INFO, "HP %d/%d", tch->GetHP(), tch->GetMaxHP());
  1008. ch->ChatPacket(CHAT_TYPE_INFO, "SP %d/%d", tch->GetSP(), tch->GetMaxSP());
  1009. ch->ChatPacket(CHAT_TYPE_INFO, "ATT %d MAGIC_ATT %d SPD %d CRIT %d%% PENE %d%% ATT_BONUS %d%%",
  1010. tch->GetPoint(POINT_ATT_GRADE),
  1011. tch->GetPoint(POINT_MAGIC_ATT_GRADE),
  1012. tch->GetPoint(POINT_ATT_SPEED),
  1013. tch->GetPoint(POINT_CRITICAL_PCT),
  1014. tch->GetPoint(POINT_PENETRATE_PCT),
  1015. tch->GetPoint(POINT_ATT_BONUS));
  1016. ch->ChatPacket(CHAT_TYPE_INFO, "DEF %d MAGIC_DEF %d BLOCK %d%% DODGE %d%% DEF_BONUS %d%%",
  1017. tch->GetPoint(POINT_DEF_GRADE),
  1018. tch->GetPoint(POINT_MAGIC_DEF_GRADE),
  1019. tch->GetPoint(POINT_BLOCK),
  1020. tch->GetPoint(POINT_DODGE),
  1021. tch->GetPoint(POINT_DEF_BONUS));
  1022. ch->ChatPacket(CHAT_TYPE_INFO, "RESISTANCES:");
  1023. ch->ChatPacket(CHAT_TYPE_INFO, " WARR:%3d%% ASAS:%3d%% SURA:%3d%% SHAM:%3d%%",
  1024. tch->GetPoint(POINT_RESIST_WARRIOR),
  1025. tch->GetPoint(POINT_RESIST_ASSASSIN),
  1026. tch->GetPoint(POINT_RESIST_SURA),
  1027. tch->GetPoint(POINT_RESIST_SHAMAN));
  1028. ch->ChatPacket(CHAT_TYPE_INFO, " SWORD:%3d%% THSWORD:%3d%% DAGGER:%3d%% BELL:%3d%% FAN:%3d%% BOW:%3d%%",
  1029. tch->GetPoint(POINT_RESIST_SWORD),
  1030. tch->GetPoint(POINT_RESIST_TWOHAND),
  1031. tch->GetPoint(POINT_RESIST_DAGGER),
  1032. tch->GetPoint(POINT_RESIST_BELL),
  1033. tch->GetPoint(POINT_RESIST_FAN),
  1034. tch->GetPoint(POINT_RESIST_BOW));
  1035. ch->ChatPacket(CHAT_TYPE_INFO, " FIRE:%3d%% ELEC:%3d%% MAGIC:%3d%% WIND:%3d%% CRIT:%3d%% PENE:%3d%%",
  1036. tch->GetPoint(POINT_RESIST_FIRE),
  1037. tch->GetPoint(POINT_RESIST_ELEC),
  1038. tch->GetPoint(POINT_RESIST_MAGIC),
  1039. tch->GetPoint(POINT_RESIST_WIND),
  1040. tch->GetPoint(POINT_RESIST_CRITICAL),
  1041. tch->GetPoint(POINT_RESIST_PENETRATE));
  1042. ch->ChatPacket(CHAT_TYPE_INFO, " ICE:%3d%% EARTH:%3d%% DARK:%3d%%",
  1043. tch->GetPoint(POINT_RESIST_ICE),
  1044. tch->GetPoint(POINT_RESIST_EARTH),
  1045. tch->GetPoint(POINT_RESIST_DARK));
  1046.  
  1047. ch->ChatPacket(CHAT_TYPE_INFO, "MALL:");
  1048. ch->ChatPacket(CHAT_TYPE_INFO, " ATT:%3d%% DEF:%3d%% EXP:%3d%% ITEMx%d GOLDx%d",
  1049. tch->GetPoint(POINT_MALL_ATTBONUS),
  1050. tch->GetPoint(POINT_MALL_DEFBONUS),
  1051. tch->GetPoint(POINT_MALL_EXPBONUS),
  1052. tch->GetPoint(POINT_MALL_ITEMBONUS) / 10,
  1053. tch->GetPoint(POINT_MALL_GOLDBONUS) / 10);
  1054.  
  1055. ch->ChatPacket(CHAT_TYPE_INFO, "BONUS:");
  1056. ch->ChatPacket(CHAT_TYPE_INFO, " SKILL:%3d%% NORMAL:%3d%% SKILL_DEF:%3d%% NORMAL_DEF:%3d%%",
  1057. tch->GetPoint(POINT_SKILL_DAMAGE_BONUS),
  1058. tch->GetPoint(POINT_NORMAL_HIT_DAMAGE_BONUS),
  1059. tch->GetPoint(POINT_SKILL_DEFEND_BONUS),
  1060. tch->GetPoint(POINT_NORMAL_HIT_DEFEND_BONUS));
  1061.  
  1062. ch->ChatPacket(CHAT_TYPE_INFO, " HUMAN:%3d%% ANIMAL:%3d%% ORC:%3d%% MILGYO:%3d%% UNDEAD:%3d%%",
  1063. tch->GetPoint(POINT_ATTBONUS_HUMAN),
  1064. tch->GetPoint(POINT_ATTBONUS_ANIMAL),
  1065. tch->GetPoint(POINT_ATTBONUS_ORC),
  1066. tch->GetPoint(POINT_ATTBONUS_MILGYO),
  1067. tch->GetPoint(POINT_ATTBONUS_UNDEAD));
  1068.  
  1069. ch->ChatPacket(CHAT_TYPE_INFO, " DEVIL:%3d%% INSECT:%3d%% FIRE:%3d%% ICE:%3d%% DESERT:%3d%%",
  1070. tch->GetPoint(POINT_ATTBONUS_DEVIL),
  1071. tch->GetPoint(POINT_ATTBONUS_INSECT),
  1072. tch->GetPoint(POINT_ATTBONUS_FIRE),
  1073. tch->GetPoint(POINT_ATTBONUS_ICE),
  1074. tch->GetPoint(POINT_ATTBONUS_DESERT));
  1075.  
  1076. ch->ChatPacket(CHAT_TYPE_INFO, " TREE:%3d%% MONSTER:%3d%%",
  1077. tch->GetPoint(POINT_ATTBONUS_TREE),
  1078. tch->GetPoint(POINT_ATTBONUS_MONSTER));
  1079.  
  1080. ch->ChatPacket(CHAT_TYPE_INFO, " WARR:%3d%% ASAS:%3d%% SURA:%3d%% SHAM:%3d%%",
  1081. tch->GetPoint(POINT_ATTBONUS_WARRIOR),
  1082. tch->GetPoint(POINT_ATTBONUS_ASSASSIN),
  1083. tch->GetPoint(POINT_ATTBONUS_SURA),
  1084. tch->GetPoint(POINT_ATTBONUS_SHAMAN));
  1085.  
  1086. for (int i = 0; i < MAX_PRIV_NUM; ++i)
  1087. if (CPrivManager::instance().GetPriv(tch, i))
  1088. {
  1089. int iByEmpire = CPrivManager::instance().GetPrivByEmpire(tch->GetEmpire(), i);
  1090. int iByGuild = 0;
  1091.  
  1092. if (tch->GetGuild())
  1093. iByGuild = CPrivManager::instance().GetPrivByGuild(tch->GetGuild()->GetID(), i);
  1094.  
  1095. int iByPlayer = CPrivManager::instance().GetPrivByCharacter(tch->GetPlayerID(), i);
  1096.  
  1097. if (iByEmpire)
  1098. ch->ChatPacket(CHAT_TYPE_INFO, "%s for empire : %d", LC_TEXT(c_apszPrivNames[i]), iByEmpire);
  1099.  
  1100. if (iByGuild)
  1101. ch->ChatPacket(CHAT_TYPE_INFO, "%s for guild : %d", LC_TEXT(c_apszPrivNames[i]), iByGuild);
  1102.  
  1103. if (iByPlayer)
  1104. ch->ChatPacket(CHAT_TYPE_INFO, "%s for player : %d", LC_TEXT(c_apszPrivNames[i]), iByPlayer);
  1105. }
  1106. }
  1107.  
  1108. struct notice_packet_func
  1109. {
  1110. const char * m_str;
  1111.  
  1112. notice_packet_func(const char * str) : m_str(str)
  1113. {
  1114. }
  1115.  
  1116. void operator () (LPDESC d)
  1117. {
  1118. if (!d->GetCharacter())
  1119. return;
  1120.  
  1121. d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
  1122. }
  1123. };
  1124.  
  1125. struct monarch_notice_packet_func
  1126. {
  1127. const char * m_str;
  1128. BYTE m_bEmpire;
  1129.  
  1130. monarch_notice_packet_func(BYTE bEmpire, const char * str) : m_str(str), m_bEmpire(bEmpire)
  1131. {
  1132. }
  1133.  
  1134. void operator () (LPDESC d)
  1135. {
  1136. if (!d->GetCharacter())
  1137. return;
  1138.  
  1139. if (m_bEmpire == d->GetCharacter()->GetEmpire())
  1140. {
  1141. d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
  1142. }
  1143. }
  1144. };
  1145.  
  1146.  
  1147. void SendNotice(const char * c_pszBuf)
  1148. {
  1149. const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
  1150. std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_packet_func(c_pszBuf));
  1151. }
  1152.  
  1153. void SendMonarchNotice(BYTE bEmpire, const char* c_pszBuf)
  1154. {
  1155. const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
  1156. std::for_each(c_ref_set.begin(), c_ref_set.end(), monarch_notice_packet_func(bEmpire, c_pszBuf));
  1157. }
  1158.  
  1159. struct notice_map_packet_func
  1160. {
  1161. const char* m_str;
  1162. int m_mapIndex;
  1163. bool m_bBigFont;
  1164.  
  1165. notice_map_packet_func(const char* str, int idx, bool bBigFont) : m_str(str), m_mapIndex(idx), m_bBigFont(bBigFont)
  1166. {
  1167. }
  1168.  
  1169. void operator() (LPDESC d)
  1170. {
  1171. if (d->GetCharacter() == NULL) return;
  1172. if (d->GetCharacter()->GetMapIndex() != m_mapIndex) return;
  1173.  
  1174. d->GetCharacter()->ChatPacket(m_bBigFont == true ? CHAT_TYPE_BIG_NOTICE : CHAT_TYPE_NOTICE, "%s", m_str);
  1175. }
  1176. };
  1177.  
  1178. void SendNoticeMap(const char* c_pszBuf, int nMapIndex, bool bBigFont)
  1179. {
  1180. const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
  1181. std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_map_packet_func(c_pszBuf, nMapIndex, bBigFont));
  1182. }
  1183.  
  1184. struct log_packet_func
  1185. {
  1186. const char * m_str;
  1187.  
  1188. log_packet_func(const char * str) : m_str(str)
  1189. {
  1190. }
  1191.  
  1192. void operator () (LPDESC d)
  1193. {
  1194. if (!d->GetCharacter())
  1195. return;
  1196.  
  1197. if (d->GetCharacter()->GetGMLevel() > GM_PLAYER)
  1198. d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
  1199. }
  1200. };
  1201.  
  1202.  
  1203. void SendLog(const char * c_pszBuf)
  1204. {
  1205. const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
  1206. std::for_each(c_ref_set.begin(), c_ref_set.end(), log_packet_func(c_pszBuf));
  1207. }
  1208.  
  1209. void BroadcastNotice(const char * c_pszBuf)
  1210. {
  1211. TPacketGGNotice p;
  1212. p.bHeader = HEADER_GG_NOTICE;
  1213. p.lSize = strlen(c_pszBuf) + 1;
  1214.  
  1215. TEMP_BUFFER buf;
  1216. buf.write(&p, sizeof(p));
  1217. buf.write(c_pszBuf, p.lSize);
  1218.  
  1219. P2P_MANAGER::instance().Send(buf.read_peek(), buf.size()); // HEADER_GG_NOTICE
  1220.  
  1221. SendNotice(c_pszBuf);
  1222. }
  1223.  
  1224. void BroadcastMonarchNotice(BYTE bEmpire, const char * c_pszBuf)
  1225. {
  1226. TPacketGGMonarchNotice p;
  1227. p.bHeader = HEADER_GG_MONARCH_NOTICE;
  1228. p.bEmpire = bEmpire;
  1229. p.lSize = strlen(c_pszBuf) + 1;
  1230.  
  1231. TEMP_BUFFER buf;
  1232. buf.write(&p, sizeof(p));
  1233. buf.write(c_pszBuf, p.lSize);
  1234.  
  1235. P2P_MANAGER::instance().Send(buf.read_peek(), buf.size());
  1236.  
  1237. SendMonarchNotice(bEmpire, c_pszBuf);
  1238. }
  1239.  
  1240. ACMD(do_notice)
  1241. {
  1242. BroadcastNotice(argument);
  1243. }
  1244.  
  1245. ACMD(do_map_notice)
  1246. {
  1247. SendNoticeMap(argument, ch->GetMapIndex(), false);
  1248. }
  1249.  
  1250. ACMD(do_big_notice)
  1251. {
  1252. ch->ChatPacket(CHAT_TYPE_BIG_NOTICE, "%s", argument);
  1253. }
  1254.  
  1255. ACMD(do_monarch_notice)
  1256. {
  1257. if (ch->IsMonarch() == true)
  1258. {
  1259. BroadcastMonarchNotice(ch->GetEmpire(), argument);
  1260. }
  1261. else
  1262. {
  1263. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("군주만이 사용 가능한 기능입니다"));
  1264. }
  1265. }
  1266.  
  1267. ACMD(do_who)
  1268. {
  1269. int iTotal;
  1270. int * paiEmpireUserCount;
  1271. int iLocal;
  1272.  
  1273. DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal);
  1274.  
  1275. ch->ChatPacket(CHAT_TYPE_INFO, "Total [%d] %d / %d / %d (this server %d)",
  1276. iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal);
  1277. }
  1278.  
  1279. class user_func
  1280. {
  1281. public:
  1282. LPCHARACTER m_ch;
  1283. static int count;
  1284. static char str[128];
  1285. static int str_len;
  1286.  
  1287. user_func()
  1288. : m_ch(NULL)
  1289. {}
  1290.  
  1291. void initialize(LPCHARACTER ch)
  1292. {
  1293. m_ch = ch;
  1294. str_len = 0;
  1295. count = 0;
  1296. str[0] = '\0';
  1297. }
  1298.  
  1299. void operator () (LPDESC d)
  1300. {
  1301. if (!d->GetCharacter())
  1302. return;
  1303.  
  1304. int len = snprintf(str + str_len, sizeof(str) - str_len, "%-16s ", d->GetCharacter()->GetName());
  1305.  
  1306. if (len < 0 || len >= (int) sizeof(str) - str_len)
  1307. len = (sizeof(str) - str_len) - 1;
  1308.  
  1309. str_len += len;
  1310. ++count;
  1311.  
  1312. if (!(count % 4))
  1313. {
  1314. m_ch->ChatPacket(CHAT_TYPE_INFO, str);
  1315.  
  1316. str[0] = '\0';
  1317. str_len = 0;
  1318. }
  1319. }
  1320. };
  1321.  
  1322. int user_func::count = 0;
  1323. char user_func::str[128] = { 0, };
  1324. int user_func::str_len = 0;
  1325.  
  1326. ACMD(do_user)
  1327. {
  1328. const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
  1329. user_func func;
  1330.  
  1331. func.initialize(ch);
  1332. std::for_each(c_ref_set.begin(), c_ref_set.end(), func);
  1333.  
  1334. if (func.count % 4)
  1335. ch->ChatPacket(CHAT_TYPE_INFO, func.str);
  1336.  
  1337. ch->ChatPacket(CHAT_TYPE_INFO, "Total %d", func.count);
  1338. }
  1339.  
  1340. ACMD(do_disconnect)
  1341. {
  1342. char arg1[256];
  1343. one_argument(argument, arg1, sizeof(arg1));
  1344.  
  1345. if (!*arg1)
  1346. {
  1347. ch->ChatPacket(CHAT_TYPE_INFO, "ex) /dc <player name>");
  1348. return;
  1349. }
  1350.  
  1351. LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
  1352. LPCHARACTER tch = d ? d->GetCharacter() : NULL;
  1353.  
  1354. if (!tch)
  1355. {
  1356. ch->ChatPacket(CHAT_TYPE_INFO, "%s: no such a player.", arg1);
  1357. return;
  1358. }
  1359.  
  1360. if (tch == ch)
  1361. {
  1362. ch->ChatPacket(CHAT_TYPE_INFO, "cannot disconnect myself");
  1363. return;
  1364. }
  1365.  
  1366. DESC_MANAGER::instance().DestroyDesc(d);
  1367. }
  1368.  
  1369. ACMD(do_kill)
  1370. {
  1371. char arg1[256];
  1372. one_argument(argument, arg1, sizeof(arg1));
  1373.  
  1374. if (!*arg1)
  1375. {
  1376. ch->ChatPacket(CHAT_TYPE_INFO, "ex) /kill <player name>");
  1377. return;
  1378. }
  1379.  
  1380. LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
  1381. LPCHARACTER tch = d ? d->GetCharacter() : NULL;
  1382.  
  1383. if (!tch)
  1384. {
  1385. ch->ChatPacket(CHAT_TYPE_INFO, "%s: no such a player", arg1);
  1386. return;
  1387. }
  1388.  
  1389. tch->Dead();
  1390. }
  1391.  
  1392. #define MISC 0
  1393. #define BINARY 1
  1394. #define NUMBER 2
  1395.  
  1396. const struct set_struct
  1397. {
  1398. const char *cmd;
  1399. const char type;
  1400. } set_fields[] = {
  1401. { "gold", NUMBER },
  1402. { "race", BINARY },
  1403. { "sex", BINARY },
  1404. { "exp", NUMBER },
  1405. { "max_hp", NUMBER },
  1406. { "max_sp", NUMBER },
  1407. { "skill", NUMBER },
  1408. { "alignment", NUMBER },
  1409. { "align", NUMBER },
  1410. { "\n", MISC }
  1411. };
  1412.  
  1413. ACMD(do_set)
  1414. {
  1415. char arg1[256], arg2[256], arg3[256];
  1416.  
  1417. LPCHARACTER tch = NULL;
  1418.  
  1419. int i, len;
  1420. const char* line;
  1421.  
  1422. line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1423. one_argument(line, arg3, sizeof(arg3));
  1424.  
  1425. if (!*arg1 || !*arg2 || !*arg3)
  1426. {
  1427. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: set <name> <field> <value>");
  1428. return;
  1429. }
  1430.  
  1431. tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  1432.  
  1433. if (!tch)
  1434. {
  1435. ch->ChatPacket(CHAT_TYPE_INFO, "%s not exist", arg1);
  1436. return;
  1437. }
  1438.  
  1439. len = strlen(arg2);
  1440.  
  1441. for (i = 0; *(set_fields[i].cmd) != '\n'; i++)
  1442. if (!strncmp(arg2, set_fields[i].cmd, len))
  1443. break;
  1444.  
  1445. switch (i)
  1446. {
  1447. case 0: // gold
  1448. {
  1449. int gold = 0;
  1450. str_to_number(gold, arg3);
  1451. DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold);
  1452. tch->PointChange(POINT_GOLD, gold, true);
  1453. }
  1454. break;
  1455.  
  1456. case 1: // race
  1457. break;
  1458.  
  1459. case 2: // sex
  1460. break;
  1461.  
  1462. case 3: // exp
  1463. {
  1464. int amount = 0;
  1465. str_to_number(amount, arg3);
  1466. tch->PointChange(POINT_EXP, amount, true);
  1467. }
  1468. break;
  1469.  
  1470. case 4: // max_hp
  1471. {
  1472. int amount = 0;
  1473. str_to_number(amount, arg3);
  1474. tch->PointChange(POINT_MAX_HP, amount, true);
  1475. }
  1476. break;
  1477.  
  1478. case 5: // max_sp
  1479. {
  1480. int amount = 0;
  1481. str_to_number(amount, arg3);
  1482. tch->PointChange(POINT_MAX_SP, amount, true);
  1483. }
  1484. break;
  1485.  
  1486. case 6: // active skill point
  1487. {
  1488. int amount = 0;
  1489. str_to_number(amount, arg3);
  1490. tch->PointChange(POINT_SKILL, amount, true);
  1491. }
  1492. break;
  1493.  
  1494. case 7: // alignment
  1495. case 8: // alignment
  1496. {
  1497. int amount = 0;
  1498. str_to_number(amount, arg3);
  1499. tch->UpdateAlignment(amount - ch->GetRealAlignment());
  1500. }
  1501. break;
  1502. }
  1503.  
  1504. if (set_fields[i].type == NUMBER)
  1505. {
  1506. int amount = 0;
  1507. str_to_number(amount, arg3);
  1508. ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%d]", tch->GetName(), set_fields[i].cmd, amount);
  1509. }
  1510. }
  1511.  
  1512. ACMD(do_reset)
  1513. {
  1514. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  1515. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  1516. ch->Save();
  1517. }
  1518.  
  1519. ACMD(do_advance)
  1520. {
  1521. char arg1[256], arg2[256];
  1522. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1523.  
  1524. if (!*arg1 || !*arg2)
  1525. {
  1526. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: advance <name> <level>");
  1527. return;
  1528. }
  1529.  
  1530. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  1531.  
  1532. if (!tch)
  1533. {
  1534. ch->ChatPacket(CHAT_TYPE_INFO, "%s not exist", arg1);
  1535. return;
  1536. }
  1537.  
  1538. int level = 0;
  1539. str_to_number(level, arg2);
  1540.  
  1541. tch->ResetPoint(MINMAX(0, level, PLAYER_MAX_LEVEL_CONST));
  1542. }
  1543.  
  1544. ACMD(do_respawn)
  1545. {
  1546. char arg1[256];
  1547. one_argument(argument, arg1, sizeof(arg1));
  1548.  
  1549. if (*arg1 && !strcasecmp(arg1, "all"))
  1550. {
  1551. ch->ChatPacket(CHAT_TYPE_INFO, "Respaw everywhere");
  1552. regen_reset(0, 0);
  1553. }
  1554. else
  1555. {
  1556. ch->ChatPacket(CHAT_TYPE_INFO, "Respaw around");
  1557. regen_reset(ch->GetX(), ch->GetY());
  1558. }
  1559. }
  1560.  
  1561. ACMD(do_safebox_size)
  1562. {
  1563.  
  1564. char arg1[256];
  1565. one_argument(argument, arg1, sizeof(arg1));
  1566.  
  1567. int size = 0;
  1568.  
  1569. if (*arg1)
  1570. str_to_number(size, arg1);
  1571.  
  1572. if (size > 3 || size < 0)
  1573. size = 0;
  1574.  
  1575. ch->ChatPacket(CHAT_TYPE_INFO, "Safebox size set to %d", size);
  1576. ch->ChangeSafeboxSize(size);
  1577. }
  1578.  
  1579. ACMD(do_makeguild)
  1580. {
  1581. if (ch->GetGuild())
  1582. return;
  1583.  
  1584. CGuildManager& gm = CGuildManager::instance();
  1585.  
  1586. char arg1[256];
  1587. one_argument(argument, arg1, sizeof(arg1));
  1588.  
  1589. TGuildCreateParameter cp;
  1590. memset(&cp, 0, sizeof(cp));
  1591.  
  1592. cp.master = ch;
  1593. strlcpy(cp.name, arg1, sizeof(cp.name));
  1594.  
  1595. if (!check_name(cp.name))
  1596. {
  1597. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("적합하지 않은 길드 이름 입니다."));
  1598. return;
  1599. }
  1600.  
  1601. gm.CreateGuild(cp);
  1602. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("(%s) 길드가 생성되었습니다. [임시]"), cp.name);
  1603. }
  1604.  
  1605. ACMD(do_deleteguild)
  1606. {
  1607. if (ch->GetGuild())
  1608. ch->GetGuild()->RequestDisband(ch->GetPlayerID());
  1609. }
  1610.  
  1611. ACMD(do_greset)
  1612. {
  1613. if (ch->GetGuild())
  1614. ch->GetGuild()->Reset();
  1615. }
  1616.  
  1617. // REFINE_ROD_HACK_BUG_FIX
  1618. ACMD(do_refine_rod)
  1619. {
  1620. char arg1[256];
  1621. one_argument(argument, arg1, sizeof(arg1));
  1622.  
  1623. BYTE cell = 0;
  1624. str_to_number(cell, arg1);
  1625. LPITEM item = ch->GetInventoryItem(cell);
  1626. if (item)
  1627. fishing::RealRefineRod(ch, item);
  1628. }
  1629. // END_OF_REFINE_ROD_HACK_BUG_FIX
  1630.  
  1631. // REFINE_PICK
  1632. ACMD(do_refine_pick)
  1633. {
  1634. char arg1[256];
  1635. one_argument(argument, arg1, sizeof(arg1));
  1636.  
  1637. BYTE cell = 0;
  1638. str_to_number(cell, arg1);
  1639. LPITEM item = ch->GetInventoryItem(cell);
  1640. if (item)
  1641. {
  1642. mining::CHEAT_MAX_PICK(ch, item);
  1643. mining::RealRefinePick(ch, item);
  1644. }
  1645. }
  1646.  
  1647. ACMD(do_max_pick)
  1648. {
  1649. char arg1[256];
  1650. one_argument(argument, arg1, sizeof(arg1));
  1651.  
  1652. BYTE cell = 0;
  1653. str_to_number(cell, arg1);
  1654. LPITEM item = ch->GetInventoryItem(cell);
  1655. if (item)
  1656. {
  1657. mining::CHEAT_MAX_PICK(ch, item);
  1658. }
  1659. }
  1660. // END_OF_REFINE_PICK
  1661.  
  1662.  
  1663. ACMD(do_fishing_simul)
  1664. {
  1665. char arg1[256];
  1666. char arg2[256];
  1667. char arg3[256];
  1668. argument = one_argument(argument, arg1, sizeof(arg1));
  1669. two_arguments(argument, arg2, sizeof(arg2), arg3, sizeof(arg3));
  1670.  
  1671. int count = 1000;
  1672. int prob_idx = 0;
  1673. int level = 100;
  1674.  
  1675. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: fishing_simul <level> <prob index> <count>");
  1676.  
  1677. if (*arg1)
  1678. str_to_number(level, arg1);
  1679.  
  1680. if (*arg2)
  1681. str_to_number(prob_idx, arg2);
  1682.  
  1683. if (*arg3)
  1684. str_to_number(count, arg3);
  1685.  
  1686. fishing::Simulation(level, count, prob_idx, ch);
  1687. }
  1688.  
  1689. ACMD(do_invisibility)
  1690. {
  1691. if (ch->IsAffectFlag(AFF_INVISIBILITY))
  1692. {
  1693. ch->RemoveAffect(AFFECT_INVISIBILITY);
  1694. }
  1695. else
  1696. {
  1697. ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
  1698. }
  1699. }
  1700.  
  1701. ACMD(do_event_flag)
  1702. {
  1703. char arg1[256];
  1704. char arg2[256];
  1705.  
  1706. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1707.  
  1708. if (!(*arg1) || !(*arg2))
  1709. return;
  1710.  
  1711. int value = 0;
  1712. str_to_number(value, arg2);
  1713.  
  1714. if (!strcmp(arg1, "mob_item") ||
  1715. !strcmp(arg1, "mob_exp") ||
  1716. !strcmp(arg1, "mob_gold") ||
  1717. !strcmp(arg1, "mob_dam") ||
  1718. !strcmp(arg1, "mob_gold_pct") ||
  1719. !strcmp(arg1, "mob_item_buyer") ||
  1720. !strcmp(arg1, "mob_exp_buyer") ||
  1721. !strcmp(arg1, "mob_gold_buyer") ||
  1722. !strcmp(arg1, "mob_gold_pct_buyer")
  1723. )
  1724. value = MINMAX(0, value, 1000);
  1725.  
  1726. //quest::CQuestManager::instance().SetEventFlag(arg1, atoi(arg2));
  1727. quest::CQuestManager::instance().RequestSetEventFlag(arg1, value);
  1728. ch->ChatPacket(CHAT_TYPE_INFO, "RequestSetEventFlag %s %d", arg1, value);
  1729. sys_log(0, "RequestSetEventFlag %s %d", arg1, value);
  1730. }
  1731.  
  1732. ACMD(do_get_event_flag)
  1733. {
  1734. quest::CQuestManager::instance().SendEventFlagList(ch);
  1735. }
  1736.  
  1737. ACMD(do_private)
  1738. {
  1739. char arg1[256];
  1740. one_argument(argument, arg1, sizeof(arg1));
  1741.  
  1742. if (!*arg1)
  1743. {
  1744. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: private <map index>");
  1745. return;
  1746. }
  1747.  
  1748. long lMapIndex;
  1749. long map_index = 0;
  1750. str_to_number(map_index, arg1);
  1751. if ((lMapIndex = SECTREE_MANAGER::instance().CreatePrivateMap(map_index)))
  1752. {
  1753. ch->SaveExitLocation();
  1754.  
  1755. LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(lMapIndex);
  1756. ch->WarpSet(pkSectreeMap->m_setting.posSpawn.x, pkSectreeMap->m_setting.posSpawn.y, lMapIndex);
  1757. }
  1758. else
  1759. ch->ChatPacket(CHAT_TYPE_INFO, "Can't find map by index %d", map_index);
  1760. }
  1761.  
  1762. ACMD(do_qf)
  1763. {
  1764. char arg1[256];
  1765.  
  1766. one_argument(argument, arg1, sizeof(arg1));
  1767.  
  1768. if (!*arg1)
  1769. return;
  1770.  
  1771. quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
  1772. std::string questname = pPC->GetCurrentQuestName();
  1773.  
  1774. if (!questname.empty())
  1775. {
  1776. int value = quest::CQuestManager::Instance().GetQuestStateIndex(questname, arg1);
  1777.  
  1778. pPC->SetFlag(questname + ".__status", value);
  1779. pPC->ClearTimer();
  1780.  
  1781. quest::PC::QuestInfoIterator it = pPC->quest_begin();
  1782. unsigned int questindex = quest::CQuestManager::instance().GetQuestIndexByName(questname);
  1783.  
  1784. while (it!= pPC->quest_end())
  1785. {
  1786. if (it->first == questindex)
  1787. {
  1788. it->second.st = value;
  1789. break;
  1790. }
  1791.  
  1792. ++it;
  1793. }
  1794.  
  1795. ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag %s %s %d", questname.c_str(), arg1, value);
  1796. }
  1797. else
  1798. {
  1799. ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag failed");
  1800. }
  1801. }
  1802.  
  1803. LPCHARACTER chHori, chForge, chLib, chTemple, chTraining, chTree, chPortal, chBall;
  1804.  
  1805. ACMD(do_b1)
  1806. {
  1807. //호리병 478 579
  1808. chHori = CHARACTER_MANAGER::instance().SpawnMobRange(14017, ch->GetMapIndex(), 304222, 742858, 304222, 742858, true, false);
  1809. chHori->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_CONSTRUCTION_SMALL, 65535, 0, true);
  1810. chHori->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1811.  
  1812. for (int i = 0; i < 30; ++i)
  1813. {
  1814. int rot = number(0, 359);
  1815. float fx, fy;
  1816. GetDeltaByDegree(rot, 800, &fx, &fy);
  1817.  
  1818. LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(number(701, 706),
  1819. ch->GetMapIndex(),
  1820. 304222 + (int)fx,
  1821. 742858 + (int)fy,
  1822. 304222 + (int)fx,
  1823. 742858 + (int)fy,
  1824. true,
  1825. false);
  1826. tch->SetAggressive();
  1827. }
  1828.  
  1829. for (int i = 0; i < 5; ++i)
  1830. {
  1831. int rot = number(0, 359);
  1832. float fx, fy;
  1833. GetDeltaByDegree(rot, 800, &fx, &fy);
  1834.  
  1835. LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(8009,
  1836. ch->GetMapIndex(),
  1837. 304222 + (int)fx,
  1838. 742858 + (int)fy,
  1839. 304222 + (int)fx,
  1840. 742858 + (int)fy,
  1841. true,
  1842. false);
  1843. tch->SetAggressive();
  1844. }
  1845. }
  1846.  
  1847. ACMD(do_b2)
  1848. {
  1849. chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
  1850. }
  1851.  
  1852. ACMD(do_b3)
  1853. {
  1854. // 포지 492 547
  1855. chForge = CHARACTER_MANAGER::instance().SpawnMobRange(14003, ch->GetMapIndex(), 307500, 746300, 307500, 746300, true, false);
  1856. chForge->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1857. //높은탑 509 589 -> 도서관
  1858. chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14007, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
  1859. chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1860. //욕조 513 606 -> 힘의신전
  1861. chTemple = CHARACTER_MANAGER::instance().SpawnMobRange(14004, ch->GetMapIndex(), 307700, 741600, 307700, 741600, true, false);
  1862. chTemple->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1863. //권투장 490 625
  1864. chTraining= CHARACTER_MANAGER::instance().SpawnMobRange(14010, ch->GetMapIndex(), 307100, 739500, 307100, 739500, true, false);
  1865. chTraining->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1866. //나무 466 614
  1867. chTree= CHARACTER_MANAGER::instance().SpawnMobRange(14013, ch->GetMapIndex(), 300800, 741600, 300800, 741600, true, false);
  1868. chTree->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1869. //포탈 439 615
  1870. chPortal= CHARACTER_MANAGER::instance().SpawnMobRange(14001, ch->GetMapIndex(), 300900, 744500, 300900, 744500, true, false);
  1871. chPortal->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1872. // 구슬 436 600
  1873. chBall = CHARACTER_MANAGER::instance().SpawnMobRange(14012, ch->GetMapIndex(), 302500, 746600, 302500, 746600, true, false);
  1874. chBall->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1875. }
  1876.  
  1877. ACMD(do_b4)
  1878. {
  1879. chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_UPGRADE, 65535, 0, true);
  1880.  
  1881. for (int i = 0; i < 30; ++i)
  1882. {
  1883. int rot = number(0, 359);
  1884. float fx, fy;
  1885. GetDeltaByDegree(rot, 1200, &fx, &fy);
  1886.  
  1887. LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(number(701, 706),
  1888. ch->GetMapIndex(),
  1889. 307900 + (int)fx,
  1890. 744500 + (int)fy,
  1891. 307900 + (int)fx,
  1892. 744500 + (int)fy,
  1893. true,
  1894. false);
  1895. tch->SetAggressive();
  1896. }
  1897.  
  1898. for (int i = 0; i < 5; ++i)
  1899. {
  1900. int rot = number(0, 359);
  1901. float fx, fy;
  1902. GetDeltaByDegree(rot, 1200, &fx, &fy);
  1903.  
  1904. LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(8009,
  1905. ch->GetMapIndex(),
  1906. 307900 + (int)fx,
  1907. 744500 + (int)fy,
  1908. 307900 + (int)fx,
  1909. 744500 + (int)fy,
  1910. true,
  1911. false);
  1912. tch->SetAggressive();
  1913. }
  1914.  
  1915. }
  1916.  
  1917. ACMD(do_b5)
  1918. {
  1919. M2_DESTROY_CHARACTER(chLib);
  1920. //chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
  1921. chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14008, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
  1922. chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1923. }
  1924.  
  1925. ACMD(do_b6)
  1926. {
  1927. chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_UPGRADE, 65535, 0, true);
  1928. }
  1929. ACMD(do_b7)
  1930. {
  1931. M2_DESTROY_CHARACTER(chLib);
  1932. //chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
  1933. chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14009, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
  1934. chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
  1935. }
  1936.  
  1937. ACMD(do_book)
  1938. {
  1939. char arg1[256];
  1940.  
  1941. one_argument(argument, arg1, sizeof(arg1));
  1942.  
  1943. CSkillProto * pkProto;
  1944.  
  1945. if (isnhdigit(*arg1))
  1946. {
  1947. DWORD vnum = 0;
  1948. str_to_number(vnum, arg1);
  1949. pkProto = CSkillManager::instance().Get(vnum);
  1950. }
  1951. else
  1952. pkProto = CSkillManager::instance().Get(arg1);
  1953.  
  1954. if (!pkProto)
  1955. {
  1956. ch->ChatPacket(CHAT_TYPE_INFO, "There is no such a skill.");
  1957. return;
  1958. }
  1959.  
  1960. LPITEM item = ch->AutoGiveItem(50300);
  1961. item->SetSocket(0, pkProto->dwVnum);
  1962. }
  1963.  
  1964. ACMD(do_setskillother)
  1965. {
  1966. char arg1[256], arg2[256], arg3[256];
  1967. argument = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1968. one_argument(argument, arg3, sizeof(arg3));
  1969.  
  1970. if (!*arg1 || !*arg2 || !*arg3 || !isdigit(*arg3))
  1971. {
  1972. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setskillother <target> <skillname> <lev>");
  1973. return;
  1974. }
  1975.  
  1976. LPCHARACTER tch;
  1977.  
  1978. tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  1979.  
  1980. if (!tch)
  1981. {
  1982. ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
  1983. return;
  1984. }
  1985.  
  1986. CSkillProto * pk;
  1987.  
  1988. if (isdigit(*arg2))
  1989. {
  1990. DWORD vnum = 0;
  1991. str_to_number(vnum, arg2);
  1992. pk = CSkillManager::instance().Get(vnum);
  1993. }
  1994. else
  1995. pk = CSkillManager::instance().Get(arg2);
  1996.  
  1997. if (!pk)
  1998. {
  1999. ch->ChatPacket(CHAT_TYPE_INFO, "No such a skill by that name.");
  2000. return;
  2001. }
  2002.  
  2003. BYTE level = 0;
  2004. str_to_number(level, arg3);
  2005. tch->SetSkillLevel(pk->dwVnum, level);
  2006. tch->ComputePoints();
  2007. tch->SkillLevelPacket();
  2008. }
  2009.  
  2010. ACMD(do_setskill)
  2011. {
  2012. char arg1[256], arg2[256];
  2013. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2014.  
  2015. if (!*arg1 || !*arg2 || !isdigit(*arg2))
  2016. {
  2017. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setskill <name> <lev>");
  2018. return;
  2019. }
  2020.  
  2021. CSkillProto * pk;
  2022.  
  2023. if (isdigit(*arg1))
  2024. {
  2025. DWORD vnum = 0;
  2026. str_to_number(vnum, arg1);
  2027. pk = CSkillManager::instance().Get(vnum);
  2028. }
  2029.  
  2030. else
  2031. pk = CSkillManager::instance().Get(arg1);
  2032.  
  2033. if (!pk)
  2034. {
  2035. ch->ChatPacket(CHAT_TYPE_INFO, "No such a skill by that name.");
  2036. return;
  2037. }
  2038.  
  2039. BYTE level = 0;
  2040. str_to_number(level, arg2);
  2041. ch->SetSkillLevel(pk->dwVnum, level);
  2042. ch->ComputePoints();
  2043. ch->SkillLevelPacket();
  2044. }
  2045.  
  2046. ACMD(do_set_skill_point)
  2047. {
  2048. char arg1[256];
  2049. one_argument(argument, arg1, sizeof(arg1));
  2050.  
  2051. int skill_point = 0;
  2052. if (*arg1)
  2053. str_to_number(skill_point, arg1);
  2054.  
  2055. ch->SetRealPoint(POINT_SKILL, skill_point);
  2056. ch->SetPoint(POINT_SKILL, ch->GetRealPoint(POINT_SKILL));
  2057. ch->PointChange(POINT_SKILL, 0);
  2058. }
  2059.  
  2060. ACMD(do_set_skill_group)
  2061. {
  2062. char arg1[256];
  2063. one_argument(argument, arg1, sizeof(arg1));
  2064.  
  2065. int skill_group = 0;
  2066. if (*arg1)
  2067. str_to_number(skill_group, arg1);
  2068.  
  2069. ch->SetSkillGroup(skill_group);
  2070.  
  2071. ch->ClearSkill();
  2072. ch->ChatPacket(CHAT_TYPE_INFO, "skill group to %d.", skill_group);
  2073. }
  2074.  
  2075. ACMD(do_reload)
  2076. {
  2077. char arg1[256];
  2078. one_argument(argument, arg1, sizeof(arg1));
  2079.  
  2080. if (*arg1)
  2081. {
  2082. switch (LOWER(*arg1))
  2083. {
  2084. case 'u':
  2085. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading state_user_count.");
  2086. LoadStateUserCount();
  2087. break;
  2088.  
  2089. case 'p':
  2090. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading prototype tables,");
  2091. db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0);
  2092. break;
  2093.  
  2094. case 's':
  2095. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading notice string.");
  2096. DBManager::instance().LoadDBString();
  2097. break;
  2098.  
  2099. case 'q':
  2100. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading quest.");
  2101. quest::CQuestManager::instance().Reload();
  2102. break;
  2103.  
  2104. case 'f':
  2105. fishing::Initialize();
  2106. break;
  2107.  
  2108. //RELOAD_ADMIN
  2109. case 'a':
  2110. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading Admin infomation.");
  2111. db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0);
  2112. sys_log(0, "Reloading admin infomation.");
  2113. break;
  2114. //END_RELOAD_ADMIN
  2115. case 'c': // cube
  2116. // 로컬 프로세스만 갱산한다.
  2117. Cube_init ();
  2118. break;
  2119. }
  2120. }
  2121. else
  2122. {
  2123. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading state_user_count.");
  2124. LoadStateUserCount();
  2125.  
  2126. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading prototype tables,");
  2127. db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0);
  2128.  
  2129. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading notice string.");
  2130. DBManager::instance().LoadDBString();
  2131. }
  2132. }
  2133.  
  2134. ACMD(do_cooltime)
  2135. {
  2136. ch->DisableCooltime();
  2137. }
  2138.  
  2139. ACMD(do_level)
  2140. {
  2141. char arg2[256];
  2142. one_argument(argument, arg2, sizeof(arg2));
  2143.  
  2144. if (!*arg2)
  2145. {
  2146. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: level <level>");
  2147. return;
  2148. }
  2149.  
  2150. int level = 0;
  2151. str_to_number(level, arg2);
  2152. ch->ResetPoint(MINMAX(1, level, PLAYER_MAX_LEVEL_CONST));
  2153.  
  2154. ch->ClearSkill();
  2155. ch->ClearSubSkill();
  2156. }
  2157.  
  2158. ACMD(do_gwlist)
  2159. {
  2160. ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("현재 전쟁중인 길드 입니다"));
  2161. CGuildManager::instance().ShowGuildWarList(ch);
  2162. }
  2163.  
  2164. ACMD(do_stop_guild_war)
  2165. {
  2166. char arg1[256], arg2[256];
  2167. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2168.  
  2169. if (!*arg1 || !*arg2)
  2170. return;
  2171.  
  2172. int id1 = 0, id2 = 0;
  2173.  
  2174. str_to_number(id1, arg1);
  2175. str_to_number(id2, arg2);
  2176.  
  2177. if (!id1 || !id2)
  2178. return;
  2179.  
  2180. if (id1 > id2)
  2181. {
  2182. std::swap(id1, id2);
  2183. }
  2184.  
  2185. ch->ChatPacket(CHAT_TYPE_TALKING, "%d %d", id1, id2);
  2186. CGuildManager::instance().RequestEndWar(id1, id2);
  2187. }
  2188.  
  2189. ACMD(do_cancel_guild_war)
  2190. {
  2191. char arg1[256], arg2[256];
  2192. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2193.  
  2194. int id1 = 0, id2 = 0;
  2195. str_to_number(id1, arg1);
  2196. str_to_number(id2, arg2);
  2197.  
  2198. if (id1 > id2)
  2199. std::swap(id1, id2);
  2200.  
  2201. CGuildManager::instance().RequestCancelWar(id1, id2);
  2202. }
  2203.  
  2204. ACMD(do_guild_state)
  2205. {
  2206. char arg1[256];
  2207. one_argument(argument, arg1, sizeof(arg1));
  2208.  
  2209. CGuild* pGuild = CGuildManager::instance().FindGuildByName(arg1);
  2210. if (pGuild != NULL)
  2211. {
  2212. ch->ChatPacket(CHAT_TYPE_INFO, "GuildID: %d", pGuild->GetID());
  2213. ch->ChatPacket(CHAT_TYPE_INFO, "GuildMasterPID: %d", pGuild->GetMasterPID());
  2214. ch->ChatPacket(CHAT_TYPE_INFO, "IsInWar: %d", pGuild->UnderAnyWar());
  2215. }
  2216. else
  2217. {
  2218. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s: 존재하지 않는 길드 입니다."), arg1);
  2219. }
  2220. }
  2221.  
  2222. struct FuncWeaken
  2223. {
  2224. LPCHARACTER m_pkGM;
  2225. bool m_bAll;
  2226.  
  2227. FuncWeaken(LPCHARACTER ch) : m_pkGM(ch), m_bAll(false)
  2228. {
  2229. }
  2230.  
  2231. void operator () (LPENTITY ent)
  2232. {
  2233. if (!ent->IsType(ENTITY_CHARACTER))
  2234. return;
  2235.  
  2236. LPCHARACTER pkChr = (LPCHARACTER) ent;
  2237.  
  2238. int iDist = DISTANCE_APPROX(pkChr->GetX() - m_pkGM->GetX(), pkChr->GetY() - m_pkGM->GetY());
  2239.  
  2240. if (!m_bAll && iDist >= 1000) // 10미터 이상에 있는 것들은 purge 하지 않는다.
  2241. return;
  2242.  
  2243. if (pkChr->IsNPC())
  2244. pkChr->PointChange(POINT_HP, (10 - pkChr->GetHP()));
  2245. }
  2246. };
  2247.  
  2248. ACMD(do_weaken)
  2249. {
  2250. char arg1[256];
  2251. one_argument(argument, arg1, sizeof(arg1));
  2252.  
  2253. FuncWeaken func(ch);
  2254.  
  2255. if (*arg1 && !strcmp(arg1, "all"))
  2256. func.m_bAll = true;
  2257.  
  2258. ch->GetSectree()->ForEachAround(func);
  2259. }
  2260.  
  2261. ACMD(do_getqf)
  2262. {
  2263. char arg1[256];
  2264.  
  2265. one_argument(argument, arg1, sizeof(arg1));
  2266.  
  2267. LPCHARACTER tch;
  2268.  
  2269. if (!*arg1)
  2270. tch = ch;
  2271. else
  2272. {
  2273. tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  2274.  
  2275. if (!tch)
  2276. {
  2277. ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
  2278. return;
  2279. }
  2280. }
  2281.  
  2282. quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
  2283.  
  2284. if (pPC)
  2285. pPC->SendFlagList(ch);
  2286. }
  2287.  
  2288. ACMD(do_set_state)
  2289. {
  2290. char arg1[256];
  2291. char arg2[256];
  2292.  
  2293. //argument = one_argument(argument, arg1, sizeof(arg1));
  2294. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2295.  
  2296. if (!*arg1 || !*arg2)
  2297. return;
  2298.  
  2299. quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
  2300. std::string questname = arg1;
  2301. std::string statename = arg2;
  2302.  
  2303. if (!questname.empty())
  2304. {
  2305. int value = quest::CQuestManager::Instance().GetQuestStateIndex(questname, statename);
  2306.  
  2307. pPC->SetFlag(questname + ".__status", value);
  2308. pPC->ClearTimer();
  2309.  
  2310. quest::PC::QuestInfoIterator it = pPC->quest_begin();
  2311. unsigned int questindex = quest::CQuestManager::instance().GetQuestIndexByName(questname);
  2312.  
  2313. while (it!= pPC->quest_end())
  2314. {
  2315. if (it->first == questindex)
  2316. {
  2317. it->second.st = value;
  2318. break;
  2319. }
  2320.  
  2321. ++it;
  2322. }
  2323.  
  2324. ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag %s %s %d", questname.c_str(), arg1, value);
  2325. }
  2326. else
  2327. {
  2328. ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag failed");
  2329. }
  2330. }
  2331.  
  2332. ACMD(do_setqf)
  2333. {
  2334. char arg1[256];
  2335. char arg2[256];
  2336. char arg3[256];
  2337.  
  2338. one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  2339.  
  2340. if (!*arg1)
  2341. {
  2342. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setqf <flagname> <value> [<character name>]");
  2343. return;
  2344. }
  2345.  
  2346. LPCHARACTER tch = ch;
  2347.  
  2348. if (*arg3)
  2349. tch = CHARACTER_MANAGER::instance().FindPC(arg3);
  2350.  
  2351. if (!tch)
  2352. {
  2353. ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
  2354. return;
  2355. }
  2356.  
  2357. quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
  2358.  
  2359. if (pPC)
  2360. {
  2361. int value = 0;
  2362. str_to_number(value, arg2);
  2363. pPC->SetFlag(arg1, value);
  2364. ch->ChatPacket(CHAT_TYPE_INFO, "Quest flag set: %s %d", arg1, value);
  2365. }
  2366. }
  2367.  
  2368. ACMD(do_delqf)
  2369. {
  2370. char arg1[256];
  2371. char arg2[256];
  2372.  
  2373. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2374.  
  2375. if (!*arg1)
  2376. {
  2377. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: delqf <flagname> [<character name>]");
  2378. return;
  2379. }
  2380.  
  2381. LPCHARACTER tch = ch;
  2382.  
  2383. if (*arg2)
  2384. tch = CHARACTER_MANAGER::instance().FindPC(arg2);
  2385.  
  2386. if (!tch)
  2387. {
  2388. ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
  2389. return;
  2390. }
  2391.  
  2392. quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
  2393.  
  2394. if (pPC)
  2395. {
  2396. if (pPC->DeleteFlag(arg1))
  2397. ch->ChatPacket(CHAT_TYPE_INFO, "Delete success.");
  2398. else
  2399. ch->ChatPacket(CHAT_TYPE_INFO, "Delete failed. Quest flag does not exist.");
  2400. }
  2401. }
  2402.  
  2403. ACMD(do_forgetme)
  2404. {
  2405. ch->ForgetMyAttacker();
  2406. }
  2407.  
  2408. ACMD(do_aggregate)
  2409. {
  2410. ch->AggregateMonster();
  2411. }
  2412.  
  2413. ACMD(do_attract_ranger)
  2414. {
  2415. ch->AttractRanger();
  2416. }
  2417.  
  2418. ACMD(do_pull_monster)
  2419. {
  2420. ch->PullMonster();
  2421. }
  2422.  
  2423. ACMD(do_polymorph)
  2424. {
  2425. char arg1[256], arg2[256];
  2426.  
  2427. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2428. if (*arg1)
  2429. {
  2430. DWORD dwVnum = 0;
  2431. str_to_number(dwVnum, arg1);
  2432. bool bMaintainStat = false;
  2433. if (*arg2)
  2434. {
  2435. int value = 0;
  2436. str_to_number(value, arg2);
  2437. bMaintainStat = (value>0);
  2438. }
  2439.  
  2440. ch->SetPolymorph(dwVnum, bMaintainStat);
  2441. }
  2442. }
  2443.  
  2444. ACMD(do_polymorph_item)
  2445. {
  2446. char arg1[256];
  2447.  
  2448. one_argument(argument, arg1, sizeof(arg1));
  2449.  
  2450. if (*arg1)
  2451. {
  2452. DWORD dwVnum = 0;
  2453. str_to_number(dwVnum, arg1);
  2454.  
  2455. LPITEM item = ITEM_MANAGER::instance().CreateItem(70104, 1, 0, true);
  2456. if (item)
  2457. {
  2458. item->SetSocket(0, dwVnum);
  2459. int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
  2460.  
  2461. if (iEmptyPos != -1)
  2462. {
  2463. item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
  2464. LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
  2465. }
  2466. else
  2467. {
  2468. M2_DESTROY_ITEM(item);
  2469. ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
  2470. }
  2471. }
  2472. else
  2473. {
  2474. ch->ChatPacket(CHAT_TYPE_INFO, "#%d item not exist by that vnum.", 70103);
  2475. }
  2476. //ch->SetPolymorph(dwVnum, bMaintainStat);
  2477. }
  2478. }
  2479.  
  2480. ACMD(do_priv_empire)
  2481. {
  2482. char arg1[256] = {0};
  2483. char arg2[256] = {0};
  2484. char arg3[256] = {0};
  2485. char arg4[256] = {0};
  2486. int empire = 0;
  2487. int type = 0;
  2488. int value = 0;
  2489. int duration = 0;
  2490.  
  2491. const char* line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2492.  
  2493. if (!*arg1 || !*arg2)
  2494. goto USAGE;
  2495.  
  2496. if (!line)
  2497. goto USAGE;
  2498.  
  2499. two_arguments(line, arg3, sizeof(arg3), arg4, sizeof(arg4));
  2500.  
  2501. if (!*arg3 || !*arg4)
  2502. goto USAGE;
  2503.  
  2504. str_to_number(empire, arg1);
  2505. str_to_number(type, arg2);
  2506. str_to_number(value, arg3);
  2507. value = MINMAX(0, value, 1000);
  2508. str_to_number(duration, arg4);
  2509.  
  2510. if (empire < 0 || 3 < empire)
  2511. goto USAGE;
  2512.  
  2513. if (type < 1 || 4 < type)
  2514. goto USAGE;
  2515.  
  2516. if (value < 0)
  2517. goto USAGE;
  2518.  
  2519. if (duration < 0)
  2520. goto USAGE;
  2521.  
  2522. // 시간 단위로 변경
  2523. duration = duration * (60*60);
  2524.  
  2525. sys_log(0, "_give_empire_privileage(empire=%d, type=%d, value=%d, duration=%d) by command",
  2526. empire, type, value, duration);
  2527. CPrivManager::instance().RequestGiveEmpirePriv(empire, type, value, duration);
  2528. return;
  2529.  
  2530. USAGE:
  2531. ch->ChatPacket(CHAT_TYPE_INFO, "usage : priv_empire <empire> <type> <value> <duration>");
  2532. ch->ChatPacket(CHAT_TYPE_INFO, " <empire> 0 - 3 (0==all)");
  2533. ch->ChatPacket(CHAT_TYPE_INFO, " <type> 1:item_drop, 2:gold_drop, 3:gold10_drop, 4:exp");
  2534. ch->ChatPacket(CHAT_TYPE_INFO, " <value> percent");
  2535. ch->ChatPacket(CHAT_TYPE_INFO, " <duration> hour");
  2536. }
  2537.  
  2538. /**
  2539. * @version 05/06/08 Bang2ni - 길드 보너스 퀘스트 진행 안되는 문제 수정.(스크립트가 작성안됨.)
  2540. * quest/priv_guild.quest 로 부터 스크립트 읽어오게 수정됨
  2541. */
  2542. ACMD(do_priv_guild)
  2543. {
  2544. static const char msg[] = { '\0' };
  2545.  
  2546. char arg1[256];
  2547. one_argument(argument, arg1, sizeof(arg1));
  2548.  
  2549. if (*arg1)
  2550. {
  2551. CGuild * g = CGuildManager::instance().FindGuildByName(arg1);
  2552.  
  2553. if (!g)
  2554. {
  2555. DWORD guild_id = 0;
  2556. str_to_number(guild_id, arg1);
  2557. g = CGuildManager::instance().FindGuild(guild_id);
  2558. }
  2559.  
  2560. if (!g)
  2561. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 이름 또는 번호의 길드가 없습니다."));
  2562. else
  2563. {
  2564. char buf[1024+1];
  2565. snprintf(buf, sizeof(buf), msg, g->GetID());
  2566.  
  2567. using namespace quest;
  2568. PC * pc = CQuestManager::instance().GetPC(ch->GetPlayerID());
  2569. QuestState qs = CQuestManager::instance().OpenState("ADMIN_QUEST", QUEST_FISH_REFINE_STATE_INDEX);
  2570. luaL_loadbuffer(qs.co, buf, strlen(buf), "ADMIN_QUEST");
  2571. pc->SetQuest("ADMIN_QUEST", qs);
  2572.  
  2573. QuestState & rqs = *pc->GetRunningQuestState();
  2574.  
  2575. if (!CQuestManager::instance().RunState(rqs))
  2576. {
  2577. CQuestManager::instance().CloseState(rqs);
  2578. pc->EndRunning();
  2579. return;
  2580. }
  2581. }
  2582. }
  2583. }
  2584.  
  2585. ACMD(do_mount_test)
  2586. {
  2587. char arg1[256];
  2588.  
  2589. one_argument(argument, arg1, sizeof(arg1));
  2590.  
  2591. if (*arg1)
  2592. {
  2593. DWORD vnum = 0;
  2594. str_to_number(vnum, arg1);
  2595. ch->MountVnum(vnum);
  2596. }
  2597. }
  2598.  
  2599. ACMD(do_observer)
  2600. {
  2601. ch->SetObserverMode(!ch->IsObserverMode());
  2602. }
  2603.  
  2604. ACMD(do_socket_item)
  2605. {
  2606. char arg1[256], arg2[256];
  2607. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2608.  
  2609. if (*arg1)
  2610. {
  2611. DWORD dwVnum = 0;
  2612. str_to_number(dwVnum, arg1);
  2613.  
  2614. int iSocketCount = 0;
  2615. str_to_number(iSocketCount, arg2);
  2616.  
  2617. if (!iSocketCount || iSocketCount >= ITEM_SOCKET_MAX_NUM)
  2618. iSocketCount = 3;
  2619.  
  2620. if (!dwVnum)
  2621. {
  2622. if (!ITEM_MANAGER::instance().GetVnum(arg1, dwVnum))
  2623. {
  2624. ch->ChatPacket(CHAT_TYPE_INFO, "#%d item not exist by that vnum.", dwVnum);
  2625. return;
  2626. }
  2627. }
  2628.  
  2629. LPITEM item = ch->AutoGiveItem(dwVnum);
  2630.  
  2631. if (item)
  2632. {
  2633. for (int i = 0; i < iSocketCount; ++i)
  2634. item->SetSocket(i, 1);
  2635. }
  2636. else
  2637. {
  2638. ch->ChatPacket(CHAT_TYPE_INFO, "#%d cannot create item.", dwVnum);
  2639. }
  2640. }
  2641. }
  2642.  
  2643. ACMD(do_xmas)
  2644. {
  2645. char arg1[256];
  2646. one_argument(argument, arg1, sizeof(arg1));
  2647.  
  2648. int flag = 0;
  2649.  
  2650. if (*arg1)
  2651. str_to_number(flag, arg1);
  2652.  
  2653. switch (subcmd)
  2654. {
  2655. case SCMD_XMAS_SNOW:
  2656. quest::CQuestManager::instance().RequestSetEventFlag("xmas_snow", flag);
  2657. break;
  2658.  
  2659. case SCMD_XMAS_BOOM:
  2660. quest::CQuestManager::instance().RequestSetEventFlag("xmas_boom", flag);
  2661. break;
  2662.  
  2663. case SCMD_XMAS_SANTA:
  2664. quest::CQuestManager::instance().RequestSetEventFlag("xmas_santa", flag);
  2665. break;
  2666. }
  2667. }
  2668.  
  2669.  
  2670. // BLOCK_CHAT
  2671. ACMD(do_block_chat_list)
  2672. {
  2673. // GM이 아니거나 block_chat_privilege가 없는 사람은 명령어 사용 불가
  2674. if (!ch || (ch->GetGMLevel() < GM_HIGH_WIZARD && ch->GetQuestFlag("chat_privilege.block") <= 0))
  2675. {
  2676. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다"));
  2677. return;
  2678. }
  2679.  
  2680. DBManager::instance().ReturnQuery(QID_BLOCK_CHAT_LIST, ch->GetPlayerID(), NULL,
  2681. "SELECT p.name, a.lDuration FROM affect%s as a, player%s as p WHERE a.bType = %d AND a.dwPID = p.id",
  2682. get_table_postfix(), get_table_postfix(), AFFECT_BLOCK_CHAT);
  2683. }
  2684.  
  2685. ACMD(do_vote_block_chat)
  2686. {
  2687. return;
  2688.  
  2689. char arg1[256];
  2690. argument = one_argument(argument, arg1, sizeof(arg1));
  2691.  
  2692. if (!*arg1)
  2693. {
  2694. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: vote_block_chat <name>");
  2695. return;
  2696. }
  2697.  
  2698. const char* name = arg1;
  2699. long lBlockDuration = 10;
  2700. sys_log(0, "vote_block_chat %s %d", name, lBlockDuration);
  2701.  
  2702. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(name);
  2703.  
  2704. if (!tch)
  2705. {
  2706. CCI * pkCCI = P2P_MANAGER::instance().Find(name);
  2707.  
  2708. if (pkCCI)
  2709. {
  2710. TPacketGGBlockChat p;
  2711.  
  2712. p.bHeader = HEADER_GG_BLOCK_CHAT;
  2713. strlcpy(p.szName, name, sizeof(p.szName));
  2714. p.lBlockDuration = lBlockDuration;
  2715. P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGBlockChat));
  2716. }
  2717. else
  2718. {
  2719. TPacketBlockChat p;
  2720.  
  2721. strlcpy(p.szName, name, sizeof(p.szName));
  2722. p.lDuration = lBlockDuration;
  2723. db_clientdesc->DBPacket(HEADER_GD_BLOCK_CHAT, ch ? ch->GetDesc()->GetHandle() : 0, &p, sizeof(p));
  2724.  
  2725. }
  2726.  
  2727. if (ch)
  2728. ch->ChatPacket(CHAT_TYPE_INFO, "Chat block requested.");
  2729.  
  2730. return;
  2731. }
  2732.  
  2733. if (tch && ch != tch)
  2734. tch->AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, lBlockDuration, 0, true);
  2735. }
  2736.  
  2737. ACMD(do_block_chat)
  2738. {
  2739. // GM이 아니거나 block_chat_privilege가 없는 사람은 명령어 사용 불가
  2740. if (ch && (ch->GetGMLevel() < GM_HIGH_WIZARD && ch->GetQuestFlag("chat_privilege.block") <= 0))
  2741. {
  2742. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다"));
  2743. return;
  2744. }
  2745.  
  2746. char arg1[256];
  2747. argument = one_argument(argument, arg1, sizeof(arg1));
  2748.  
  2749. if (!*arg1)
  2750. {
  2751. if (ch)
  2752. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: block_chat <name> <time> (0 to off)");
  2753.  
  2754. return;
  2755. }
  2756.  
  2757. const char* name = arg1;
  2758. long lBlockDuration = parse_time_str(argument);
  2759.  
  2760. if (lBlockDuration < 0)
  2761. {
  2762. if (ch)
  2763. {
  2764. ch->ChatPacket(CHAT_TYPE_INFO, "잘못된 형식의 시간입니다. h, m, s를 붙여서 지정해 주십시오.");
  2765. ch->ChatPacket(CHAT_TYPE_INFO, "예) 10s, 10m, 1m 30s");
  2766. }
  2767. return;
  2768. }
  2769.  
  2770. sys_log(0, "BLOCK CHAT %s %d", name, lBlockDuration);
  2771.  
  2772. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(name);
  2773.  
  2774. if (!tch)
  2775. {
  2776. CCI * pkCCI = P2P_MANAGER::instance().Find(name);
  2777.  
  2778. if (pkCCI)
  2779. {
  2780. TPacketGGBlockChat p;
  2781.  
  2782. p.bHeader = HEADER_GG_BLOCK_CHAT;
  2783. strlcpy(p.szName, name, sizeof(p.szName));
  2784. p.lBlockDuration = lBlockDuration;
  2785. P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGBlockChat));
  2786. }
  2787. else
  2788. {
  2789. TPacketBlockChat p;
  2790.  
  2791. strlcpy(p.szName, name, sizeof(p.szName));
  2792. p.lDuration = lBlockDuration;
  2793. db_clientdesc->DBPacket(HEADER_GD_BLOCK_CHAT, ch ? ch->GetDesc()->GetHandle() : 0, &p, sizeof(p));
  2794. }
  2795.  
  2796. if (ch)
  2797. ch->ChatPacket(CHAT_TYPE_INFO, "Chat block requested.");
  2798.  
  2799. return;
  2800. }
  2801.  
  2802. if (tch && ch != tch)
  2803. tch->AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, lBlockDuration, 0, true);
  2804. }
  2805. // END_OF_BLOCK_CHAT
  2806.  
  2807. ACMD(do_ban)
  2808.  
  2809. // Args
  2810. char arg1[256], arg2[256], arg3[256];
  2811.  
  2812. // Local variables
  2813. const char* szName;
  2814. const char* szReason;
  2815. int iDuration;
  2816.  
  2817. one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  2818.  
  2819. // Invalid syntax
  2820. if (!*arg1 || !*arg2 || !*arg3)
  2821. {
  2822. ch->ChatPacket(CHAT_TYPE_INFO, "Invalid Syntax, usage: <player name> <time in hours> <reason> tip: don't use spaces in the reason, use _");
  2823. return;
  2824. }
  2825.  
  2826. szName = arg1;
  2827. iDuration = atoi(arg2);
  2828. szReason = arg3;
  2829.  
  2830. if (iDuration <= 0)
  2831. {
  2832. ch->ChatPacket(CHAT_TYPE_INFO, "Czas nie mo?e wynosi? 0 minut.");
  2833. return;
  2834. }
  2835.  
  2836. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(szName);
  2837.  
  2838. if (!tch)
  2839. {
  2840. ch->ChatPacket(CHAT_TYPE_INFO, "%s nie jest zalogowany", szName);
  2841. return;
  2842. }
  2843.  
  2844. if (!tch->GetDesc())
  2845. {
  2846. ch->ChatPacket(CHAT_TYPE_INFO, "%s don't have desc", szName);
  2847. return;
  2848. }
  2849.  
  2850. if (tch == ch)
  2851. {
  2852. ch->ChatPacket(CHAT_TYPE_INFO, "What's wrong with you? Don't ban yourself");
  2853. return;
  2854. }
  2855.  
  2856. if (tch->GetGMLevel() > GM_PLAYER)
  2857. {
  2858. ch->ChatPacket(CHAT_TYPE_INFO, "Nie zbanujesz GMa");
  2859. return;
  2860. }
  2861.  
  2862. std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("UPDATE account.account SET availDt = FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i), reason = '%s' WHERE id = %d", iDuration * 3600, szReason, tch->GetDesc()->GetAccountTable().id));
  2863.  
  2864. tch->GetDesc()->DelayedDisconnect(5);
  2865.  
  2866. sys_log(0, "%s[%d] Zbanował %s na %i godzin za: %s", ch->GetName(), ch->GetPlayerID(), szName, iDuration, szReason);
  2867.  
  2868. ch->ChatPacket(CHAT_TYPE_INFO, "%s Został zbanowany na %i godzin za: %s", szName, iDuration, szReason);
  2869.  
  2870. // BUILD_BUILDING
  2871. ACMD(do_build)
  2872. {
  2873. using namespace building;
  2874.  
  2875. char arg1[256], arg2[256], arg3[256], arg4[256];
  2876. const char * line = one_argument(argument, arg1, sizeof(arg1));
  2877. BYTE GMLevel = ch->GetGMLevel();
  2878.  
  2879. CLand * pkLand = CManager::instance().FindLand(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  2880.  
  2881. // NOTE: 조건 체크들은 클라이언트와 서버가 함께 하기 때문에 문제가 있을 때는
  2882. // 메세지를 전송하지 않고 에러를 출력한다.
  2883. if (!pkLand)
  2884. {
  2885. sys_err("%s trying to build on not buildable area.", ch->GetName());
  2886. return;
  2887. }
  2888.  
  2889. if (!*arg1)
  2890. {
  2891. ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax: no command");
  2892. return;
  2893. }
  2894.  
  2895. // 건설 권한 체크
  2896. if (GMLevel == GM_PLAYER)
  2897. {
  2898. // 플레이어가 집을 지을 때는 땅이 내껀지 확인해야 한다.
  2899. if ((!ch->GetGuild() || ch->GetGuild()->GetID() != pkLand->GetOwner()))
  2900. {
  2901. sys_err("%s trying to build on not owned land.", ch->GetName());
  2902. return;
  2903. }
  2904.  
  2905. // 내가 길마인가?
  2906. if (ch->GetGuild()->GetMasterPID() != ch->GetPlayerID())
  2907. {
  2908. sys_err("%s trying to build while not the guild master.", ch->GetName());
  2909. return;
  2910. }
  2911. }
  2912.  
  2913. switch (LOWER(*arg1))
  2914. {
  2915. case 'c':
  2916. {
  2917. // /build c vnum x y x_rot y_rot z_rot
  2918. char arg5[256], arg6[256];
  2919. line = one_argument(two_arguments(line, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3)); // vnum x y
  2920. one_argument(two_arguments(line, arg4, sizeof(arg4), arg5, sizeof(arg5)), arg6, sizeof(arg6)); // x_rot y_rot z_rot
  2921.  
  2922. if (!*arg1 || !*arg2 || !*arg3 || !*arg4 || !*arg5 || !*arg6)
  2923. {
  2924. ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax");
  2925. return;
  2926. }
  2927.  
  2928. DWORD dwVnum = 0;
  2929. str_to_number(dwVnum, arg1);
  2930.  
  2931. using namespace building;
  2932.  
  2933. const TObjectProto * t = CManager::instance().GetObjectProto(dwVnum);
  2934. if (!t)
  2935. {
  2936. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("존재하지 않는 건물입니다."));
  2937. return;
  2938. }
  2939.  
  2940. const DWORD BUILDING_MAX_PRICE = 100000000;
  2941.  
  2942. if (t->dwGroupVnum)
  2943. {
  2944. if (pkLand->FindObjectByGroup(t->dwGroupVnum))
  2945. {
  2946. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같이 지을 수 없는 종류의 건물이 지어져 있습니다."));
  2947. return;
  2948. }
  2949. }
  2950.  
  2951. // 건물 종속성 체크 (이 건물이 지어져 있어야함)
  2952. if (t->dwDependOnGroupVnum)
  2953. {
  2954. // const TObjectProto * dependent = CManager::instance().GetObjectProto(dwVnum);
  2955. // if (dependent)
  2956. {
  2957. // 지어져있는가?
  2958. if (!pkLand->FindObjectByGroup(t->dwDependOnGroupVnum))
  2959. {
  2960. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("건설에 필요한 건물이 지어져 있지 않습니다."));
  2961. return;
  2962. }
  2963. }
  2964. }
  2965.  
  2966. if (test_server || GMLevel == GM_PLAYER)
  2967. {
  2968. // GM이 아닐경우만 (테섭에서는 GM도 소모)
  2969. // 건설 비용 체크
  2970. if (t->dwPrice > BUILDING_MAX_PRICE)
  2971. {
  2972. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("건물 비용 정보 이상으로 건설 작업에 실패했습니다."));
  2973. return;
  2974. }
  2975.  
  2976. if (ch->GetGold() < (int)t->dwPrice)
  2977. {
  2978. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("건설 비용이 부족합니다."));
  2979. return;
  2980. }
  2981.  
  2982. // 아이템 자재 개수 체크
  2983.  
  2984. int i;
  2985. for (i = 0; i < OBJECT_MATERIAL_MAX_NUM; ++i)
  2986. {
  2987. DWORD dwItemVnum = t->kMaterials[i].dwItemVnum;
  2988. DWORD dwItemCount = t->kMaterials[i].dwCount;
  2989.  
  2990. if (dwItemVnum == 0)
  2991. break;
  2992.  
  2993. if ((int) dwItemCount > ch->CountSpecifyItem(dwItemVnum))
  2994. {
  2995. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("자재가 부족하여 건설할 수 없습니다."));
  2996. return;
  2997. }
  2998. }
  2999. }
  3000.  
  3001. float x_rot = atof(arg4);
  3002. float y_rot = atof(arg5);
  3003. float z_rot = atof(arg6);
  3004. // 20050811.myevan.건물 회전 기능 봉인 해제
  3005. /*
  3006. if (x_rot != 0.0f || y_rot != 0.0f || z_rot != 0.0f)
  3007. {
  3008. ch->ChatPacket(CHAT_TYPE_INFO, "건물 회전 기능은 아직 제공되지 않습니다");
  3009. return;
  3010. }
  3011. */
  3012.  
  3013. long map_x = 0;
  3014. str_to_number(map_x, arg2);
  3015. long map_y = 0;
  3016. str_to_number(map_y, arg3);
  3017.  
  3018. bool isSuccess = pkLand->RequestCreateObject(dwVnum,
  3019. ch->GetMapIndex(),
  3020. map_x,
  3021. map_y,
  3022. x_rot,
  3023. y_rot,
  3024. z_rot, true);
  3025.  
  3026. if (!isSuccess)
  3027. {
  3028. if (test_server)
  3029. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("건물을 지을 수 없는 위치입니다."));
  3030. return;
  3031. }
  3032.  
  3033. if (test_server || GMLevel == GM_PLAYER)
  3034. // 건설 재료 소모하기 (테섭에서는 GM도 소모)
  3035. {
  3036. // 건설 비용 소모
  3037. ch->PointChange(POINT_GOLD, -t->dwPrice);
  3038.  
  3039. // 아이템 자재 사용하기
  3040. {
  3041. int i;
  3042. for (i = 0; i < OBJECT_MATERIAL_MAX_NUM; ++i)
  3043. {
  3044. DWORD dwItemVnum = t->kMaterials[i].dwItemVnum;
  3045. DWORD dwItemCount = t->kMaterials[i].dwCount;
  3046.  
  3047. if (dwItemVnum == 0)
  3048. break;
  3049.  
  3050. sys_log(0, "BUILD: material %d %u %u", i, dwItemVnum, dwItemCount);
  3051. ch->RemoveSpecifyItem(dwItemVnum, dwItemCount);
  3052. }
  3053. }
  3054. }
  3055. }
  3056. break;
  3057.  
  3058. case 'd' :
  3059. // build (d)elete ObjectID
  3060. {
  3061. one_argument(line, arg1, sizeof(arg1));
  3062.  
  3063. if (!*arg1)
  3064. {
  3065. ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax");
  3066. return;
  3067. }
  3068.  
  3069. DWORD vid = 0;
  3070. str_to_number(vid, arg1);
  3071. pkLand->RequestDeleteObjectByVID(vid);
  3072. }
  3073. break;
  3074.  
  3075. // BUILD_WALL
  3076.  
  3077. // build w n/e/w/s
  3078. case 'w' :
  3079. if (GMLevel > GM_PLAYER)
  3080. {
  3081. int mapIndex = ch->GetMapIndex();
  3082.  
  3083. one_argument(line, arg1, sizeof(arg1));
  3084.  
  3085. sys_log(0, "guild.wall.build map[%d] direction[%s]", mapIndex, arg1);
  3086.  
  3087. switch (arg1[0])
  3088. {
  3089. case 's':
  3090. pkLand->RequestCreateWall(mapIndex, 0.0f);
  3091. break;
  3092. case 'n':
  3093. pkLand->RequestCreateWall(mapIndex, 180.0f);
  3094. break;
  3095. case 'e':
  3096. pkLand->RequestCreateWall(mapIndex, 90.0f);
  3097. break;
  3098. case 'w':
  3099. pkLand->RequestCreateWall(mapIndex, 270.0f);
  3100. break;
  3101. default:
  3102. ch->ChatPacket(CHAT_TYPE_INFO, "guild.wall.build unknown_direction[%s]", arg1);
  3103. sys_err("guild.wall.build unknown_direction[%s]", arg1);
  3104. break;
  3105. }
  3106.  
  3107. }
  3108. break;
  3109.  
  3110. case 'e':
  3111. if (GMLevel > GM_PLAYER)
  3112. {
  3113. pkLand->RequestDeleteWall();
  3114. }
  3115. break;
  3116.  
  3117. case 'W' :
  3118. // 담장 세우기
  3119. // build (w)all 담장번호 담장크기 대문동 대문서 대문남 대문북
  3120.  
  3121. if (GMLevel > GM_PLAYER)
  3122. {
  3123. int setID = 0, wallSize = 0;
  3124. char arg5[256], arg6[256];
  3125. line = two_arguments(line, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3126. line = two_arguments(line, arg3, sizeof(arg3), arg4, sizeof(arg4));
  3127. two_arguments(line, arg5, sizeof(arg5), arg6, sizeof(arg6));
  3128.  
  3129. str_to_number(setID, arg1);
  3130. str_to_number(wallSize, arg2);
  3131.  
  3132. if (setID != 14105 && setID != 14115 && setID != 14125)
  3133. {
  3134. sys_log(0, "BUILD_WALL: wrong wall set id %d", setID);
  3135. break;
  3136. }
  3137. else
  3138. {
  3139. bool door_east = false;
  3140. str_to_number(door_east, arg3);
  3141. bool door_west = false;
  3142. str_to_number(door_west, arg4);
  3143. bool door_south = false;
  3144. str_to_number(door_south, arg5);
  3145. bool door_north = false;
  3146. str_to_number(door_north, arg6);
  3147. pkLand->RequestCreateWallBlocks(setID, ch->GetMapIndex(), wallSize, door_east, door_west, door_south, door_north);
  3148. }
  3149. }
  3150. break;
  3151.  
  3152. case 'E' :
  3153. // 담장 지우기
  3154. // build (e)rase 담장셋ID
  3155. if (GMLevel > GM_PLAYER)
  3156. {
  3157. one_argument(line, arg1, sizeof(arg1));
  3158. DWORD id = 0;
  3159. str_to_number(id, arg1);
  3160. pkLand->RequestDeleteWallBlocks(id);
  3161. }
  3162. break;
  3163.  
  3164. default:
  3165. ch->ChatPacket(CHAT_TYPE_INFO, "Invalid command %s", arg1);
  3166. break;
  3167. }
  3168. }
  3169. // END_OF_BUILD_BUILDING
  3170.  
  3171. ACMD(do_clear_quest)
  3172. {
  3173. char arg1[256];
  3174.  
  3175. one_argument(argument, arg1, sizeof(arg1));
  3176.  
  3177. if (!*arg1)
  3178. return;
  3179.  
  3180. quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
  3181. pPC->ClearQuest(arg1);
  3182. }
  3183.  
  3184. ACMD(do_horse_state)
  3185. {
  3186. ch->ChatPacket(CHAT_TYPE_INFO, "Horse Information:");
  3187. ch->ChatPacket(CHAT_TYPE_INFO, " Level %d", ch->GetHorseLevel());
  3188. ch->ChatPacket(CHAT_TYPE_INFO, " Health %d/%d (%d%%)", ch->GetHorseHealth(), ch->GetHorseMaxHealth(), ch->GetHorseHealth() * 100 / ch->GetHorseMaxHealth());
  3189. ch->ChatPacket(CHAT_TYPE_INFO, " Stam %d/%d (%d%%)", ch->GetHorseStamina(), ch->GetHorseMaxStamina(), ch->GetHorseStamina() * 100 / ch->GetHorseMaxStamina());
  3190. }
  3191.  
  3192. ACMD(do_horse_level)
  3193. {
  3194. char arg1[256] = {0};
  3195. char arg2[256] = {0};
  3196. LPCHARACTER victim;
  3197. int level = 0;
  3198.  
  3199. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3200.  
  3201. if (!*arg1 || !*arg2)
  3202. {
  3203. ch->ChatPacket(CHAT_TYPE_INFO, "usage : /horse_level <name> <level>");
  3204. return;
  3205. }
  3206.  
  3207. victim = CHARACTER_MANAGER::instance().FindPC(arg1);
  3208.  
  3209. if (NULL == victim)
  3210. {
  3211. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("존재하지 않는 캐릭터 입니다."));
  3212. return;
  3213. }
  3214.  
  3215. str_to_number(level, arg2);
  3216. level = MINMAX(0, level, HORSE_MAX_LEVEL);
  3217.  
  3218. ch->ChatPacket(CHAT_TYPE_INFO, "horse level set (%s: %d)", victim->GetName(), level);
  3219.  
  3220. victim->SetHorseLevel(level);
  3221. victim->ComputePoints();
  3222. victim->SkillLevelPacket();
  3223. return;
  3224.  
  3225. /*-----
  3226. char arg1[256];
  3227. one_argument(argument, arg1, sizeof(arg1));
  3228.  
  3229. int level = MINMAX(0, atoi(arg1), HORSE_MAX_LEVEL);
  3230.  
  3231. ch->ChatPacket(CHAT_TYPE_INFO, "horse level set to %d.", level);
  3232. ch->SetHorseLevel(level);
  3233. ch->ComputePoints();
  3234. ch->SkillLevelPacket();
  3235. return;
  3236. -----*/
  3237. }
  3238.  
  3239. ACMD(do_horse_ride)
  3240. {
  3241. if (ch->IsHorseRiding())
  3242. ch->StopRiding();
  3243. else
  3244. ch->StartRiding();
  3245. }
  3246.  
  3247. ACMD(do_horse_summon)
  3248. {
  3249. ch->HorseSummon(true, true);
  3250. }
  3251.  
  3252. ACMD(do_horse_unsummon)
  3253. {
  3254. ch->HorseSummon(false, true);
  3255. }
  3256.  
  3257. ACMD(do_horse_set_stat)
  3258. {
  3259. char arg1[256], arg2[256];
  3260.  
  3261. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3262.  
  3263. if (*arg1 && *arg2)
  3264. {
  3265. int hp = 0;
  3266. str_to_number(hp, arg1);
  3267. int stam = 0;
  3268. str_to_number(stam, arg2);
  3269. ch->UpdateHorseHealth(hp - ch->GetHorseHealth());
  3270. ch->UpdateHorseStamina(stam - ch->GetHorseStamina());
  3271. }
  3272. else
  3273. {
  3274. ch->ChatPacket(CHAT_TYPE_INFO, "Usage : /horse_set_stat <hp> <stamina>");
  3275. }
  3276. }
  3277.  
  3278. ACMD(do_save_attribute_to_image) // command "/saveati" for alias
  3279. {
  3280. char szFileName[256];
  3281. char szMapIndex[256];
  3282.  
  3283. two_arguments(argument, szMapIndex, sizeof(szMapIndex), szFileName, sizeof(szFileName));
  3284.  
  3285. if (!*szMapIndex || !*szFileName)
  3286. {
  3287. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /saveati <map_index> <filename>");
  3288. return;
  3289. }
  3290.  
  3291. long lMapIndex = 0;
  3292. str_to_number(lMapIndex, szMapIndex);
  3293.  
  3294. if (SECTREE_MANAGER::instance().SaveAttributeToImage(lMapIndex, szFileName))
  3295. ch->ChatPacket(CHAT_TYPE_INFO, "Save done.");
  3296. else
  3297. ch->ChatPacket(CHAT_TYPE_INFO, "Save failed.");
  3298. }
  3299.  
  3300. ACMD(do_affect_remove)
  3301. {
  3302. char arg1[256];
  3303. char arg2[256];
  3304.  
  3305. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3306.  
  3307. if (!*arg1 || !*arg2)
  3308. {
  3309. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /affect_remove <player name>");
  3310. ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /affect_remove <type> <point>");
  3311.  
  3312. LPCHARACTER tch = ch;
  3313.  
  3314. if (*arg1)
  3315. if (!(tch = CHARACTER_MANAGER::instance().FindPC(arg1)))
  3316. tch = ch;
  3317.  
  3318. ch->ChatPacket(CHAT_TYPE_INFO, "-- Affect List of %s -------------------------------", tch->GetName());
  3319. ch->ChatPacket(CHAT_TYPE_INFO, "Type Point Modif Duration Flag");
  3320.  
  3321. const std::list<CAffect *> & cont = tch->GetAffectContainer();
  3322.  
  3323. itertype(cont) it = cont.begin();
  3324.  
  3325. while (it != cont.end())
  3326. {
  3327. CAffect * pkAff = *it++;
  3328.  
  3329. ch->ChatPacket(CHAT_TYPE_INFO, "%4d %5d %5d %8d %u",
  3330. pkAff->dwType, pkAff->bApplyOn, pkAff->lApplyValue, pkAff->lDuration, pkAff->dwFlag);
  3331. }
  3332. return;
  3333. }
  3334.  
  3335. bool removed = false;
  3336.  
  3337. CAffect * af;
  3338.  
  3339. DWORD type = 0;
  3340. str_to_number(type, arg1);
  3341. BYTE point = 0;
  3342. str_to_number(point, arg2);
  3343. while ((af = ch->FindAffect(type, point)))
  3344. {
  3345. ch->RemoveAffect(af);
  3346. removed = true;
  3347. }
  3348.  
  3349. if (removed)
  3350. ch->ChatPacket(CHAT_TYPE_INFO, "Affect successfully removed.");
  3351. else
  3352. ch->ChatPacket(CHAT_TYPE_INFO, "Not affected by that type and point.");
  3353. }
  3354.  
  3355. ACMD(do_change_attr)
  3356. {
  3357. LPITEM weapon = ch->GetWear(WEAR_WEAPON);
  3358. if (weapon)
  3359. weapon->ChangeAttribute();
  3360. }
  3361.  
  3362. ACMD(do_add_attr)
  3363. {
  3364. LPITEM weapon = ch->GetWear(WEAR_WEAPON);
  3365. if (weapon)
  3366. weapon->AddAttribute();
  3367. }
  3368.  
  3369. ACMD(do_add_socket)
  3370. {
  3371. LPITEM weapon = ch->GetWear(WEAR_WEAPON);
  3372. if (weapon)
  3373. weapon->AddSocket();
  3374. }
  3375.  
  3376. ACMD(do_show_arena_list)
  3377. {
  3378. CArenaManager::instance().SendArenaMapListTo(ch);
  3379. }
  3380.  
  3381. ACMD(do_end_all_duel)
  3382. {
  3383. CArenaManager::instance().EndAllDuel();
  3384. }
  3385.  
  3386. ACMD(do_end_duel)
  3387. {
  3388. char szName[256];
  3389.  
  3390. one_argument(argument, szName, sizeof(szName));
  3391.  
  3392. LPCHARACTER pChar = CHARACTER_MANAGER::instance().FindPC(szName);
  3393. if (pChar == NULL)
  3394. {
  3395. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("존재하지 않는 캐릭터 입니다."));
  3396. return;
  3397. }
  3398.  
  3399. if (CArenaManager::instance().EndDuel(pChar->GetPlayerID()) == false)
  3400. {
  3401. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련 강제 종료 실패"));
  3402. }
  3403. else
  3404. {
  3405. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련 강제 종료 성공"));
  3406. }
  3407. }
  3408.  
  3409. ACMD(do_duel)
  3410. {
  3411. char szName1[256];
  3412. char szName2[256];
  3413. char szSet[256];
  3414. char szMinute[256];
  3415. int set = 0;
  3416. int minute = 0;
  3417.  
  3418. argument = two_arguments(argument, szName1, sizeof(szName1), szName2, sizeof(szName2));
  3419. two_arguments(argument, szSet, sizeof(szSet), szMinute, sizeof(szMinute));
  3420.  
  3421. str_to_number(set, szSet);
  3422.  
  3423. if (set < 0) set = 1;
  3424. if (set > 5) set = 5;
  3425.  
  3426. if (!str_to_number(minute, szMinute))
  3427. {
  3428. // 캐나다는 기본 10분.
  3429. if (LC_IsCanada() == true)
  3430. {
  3431. minute = 10;
  3432. }
  3433. else
  3434. {
  3435. minute = 5;
  3436. }
  3437. }
  3438. if (minute < 5)
  3439. minute = 5;
  3440.  
  3441. LPCHARACTER pChar1 = CHARACTER_MANAGER::instance().FindPC(szName1);
  3442. LPCHARACTER pChar2 = CHARACTER_MANAGER::instance().FindPC(szName2);
  3443.  
  3444. if (pChar1 != NULL && pChar2 != NULL)
  3445. {
  3446. pChar1->RemoveGoodAffect();
  3447. pChar2->RemoveGoodAffect();
  3448.  
  3449. pChar1->RemoveBadAffect();
  3450. pChar2->RemoveBadAffect();
  3451.  
  3452. LPPARTY pParty = pChar1->GetParty();
  3453. if (pParty != NULL)
  3454. {
  3455. if (pParty->GetMemberCount() == 2)
  3456. {
  3457. CPartyManager::instance().DeleteParty(pParty);
  3458. }
  3459. else
  3460. {
  3461. pChar1->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<파티> 파티에서 나가셨습니다."));
  3462. pParty->Quit(pChar1->GetPlayerID());
  3463. }
  3464. }
  3465.  
  3466. pParty = pChar2->GetParty();
  3467. if (pParty != NULL)
  3468. {
  3469. if (pParty->GetMemberCount() == 2)
  3470. {
  3471. CPartyManager::instance().DeleteParty(pParty);
  3472. }
  3473. else
  3474. {
  3475. pChar2->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<파티> 파티에서 나가셨습니다."));
  3476. pParty->Quit(pChar2->GetPlayerID());
  3477. }
  3478. }
  3479.  
  3480. if (CArenaManager::instance().StartDuel(pChar1, pChar2, set, minute) == true)
  3481. {
  3482. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련이 성공적으로 시작 되었습니다."));
  3483. }
  3484. else
  3485. {
  3486. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련 시작에 문제가 있습니다."));
  3487. }
  3488. }
  3489. else
  3490. {
  3491. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련자가 없습니다."));
  3492. }
  3493. }
  3494.  
  3495. ACMD(do_stat_plus_amount)
  3496. {
  3497. char szPoint[256];
  3498.  
  3499. one_argument(argument, szPoint, sizeof(szPoint));
  3500.  
  3501. if (*szPoint == '\0')
  3502. return;
  3503.  
  3504. if (ch->IsPolymorphed())
  3505. {
  3506. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑 중에는 능력을 올릴 수 없습니다."));
  3507. return;
  3508. }
  3509.  
  3510. int nRemainPoint = ch->GetPoint(POINT_STAT);
  3511.  
  3512. if (nRemainPoint <= 0)
  3513. {
  3514. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("남은 스탯 포인트가 없습니다."));
  3515. return;
  3516. }
  3517.  
  3518. int nPoint = 0;
  3519. str_to_number(nPoint, szPoint);
  3520.  
  3521. if (nRemainPoint < nPoint)
  3522. {
  3523. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("남은 스탯 포인트가 적습니다."));
  3524. return;
  3525. }
  3526.  
  3527. if (nPoint < 0)
  3528. {
  3529. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("값을 잘못 입력하였습니다."));
  3530. return;
  3531. }
  3532.  
  3533. switch (subcmd)
  3534. {
  3535. case POINT_HT : // 체력
  3536. if (nPoint + ch->GetPoint(POINT_HT) > 90)
  3537. {
  3538. nPoint = 90 - ch->GetPoint(POINT_HT);
  3539. }
  3540. break;
  3541.  
  3542. case POINT_IQ : // 지능
  3543. if (nPoint + ch->GetPoint(POINT_IQ) > 90)
  3544. {
  3545. nPoint = 90 - ch->GetPoint(POINT_IQ);
  3546. }
  3547. break;
  3548.  
  3549. case POINT_ST : // 근력
  3550. if (nPoint + ch->GetPoint(POINT_ST) > 90)
  3551. {
  3552. nPoint = 90 - ch->GetPoint(POINT_ST);
  3553. }
  3554. break;
  3555.  
  3556. case POINT_DX : // 민첩
  3557. if (nPoint + ch->GetPoint(POINT_DX) > 90)
  3558. {
  3559. nPoint = 90 - ch->GetPoint(POINT_DX);
  3560. }
  3561. break;
  3562.  
  3563. default :
  3564. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("명령어의 서브 커맨드가 잘못 되었습니다."));
  3565. return;
  3566. break;
  3567. }
  3568.  
  3569. if (nPoint != 0)
  3570. {
  3571. ch->SetRealPoint(subcmd, ch->GetRealPoint(subcmd) + nPoint);
  3572. ch->SetPoint(subcmd, ch->GetPoint(subcmd) + nPoint);
  3573. ch->ComputePoints();
  3574. ch->PointChange(subcmd, 0);
  3575.  
  3576. ch->PointChange(POINT_STAT, -nPoint);
  3577. ch->ComputePoints();
  3578. }
  3579. }
  3580.  
  3581. struct tTwoPID
  3582. {
  3583. int pid1;
  3584. int pid2;
  3585. };
  3586.  
  3587. ACMD(do_break_marriage)
  3588. {
  3589. char arg1[256], arg2[256];
  3590. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3591.  
  3592. tTwoPID pids = { 0, 0 };
  3593.  
  3594. str_to_number(pids.pid1, arg1);
  3595. str_to_number(pids.pid2, arg2);
  3596.  
  3597. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("플레이어 %d 와 플레이어 %d를 파혼시킵니다.."), pids.pid1, pids.pid2);
  3598. db_clientdesc->DBPacket(HEADER_GD_BREAK_MARRIAGE, 0, &pids, sizeof(pids));
  3599. }
  3600.  
  3601. ACMD(do_effect)
  3602. {
  3603. char arg1[256];
  3604.  
  3605. one_argument(argument, arg1, sizeof(arg1));
  3606.  
  3607. int effect_type = 0;
  3608. str_to_number(effect_type, arg1);
  3609. ch->EffectPacket(effect_type);
  3610. }
  3611.  
  3612.  
  3613. struct FCountInMap
  3614. {
  3615. int m_Count[4];
  3616. FCountInMap() { memset(m_Count, 0, sizeof(int) * 4); }
  3617. void operator()(LPENTITY ent)
  3618. {
  3619. if (ent->IsType(ENTITY_CHARACTER))
  3620. {
  3621. LPCHARACTER ch = (LPCHARACTER) ent;
  3622. if (ch && ch->IsPC())
  3623. ++m_Count[ch->GetEmpire()];
  3624. }
  3625. }
  3626. int GetCount(BYTE bEmpire) { return m_Count[bEmpire]; }
  3627. };
  3628.  
  3629. ACMD(do_threeway_war_info)
  3630. {
  3631. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("각제국 진행 정보"));
  3632. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("선택 맵 정보 성지 %d 통로 %d %d %d"), GetSungziMapIndex(), GetPassMapIndex(1), GetPassMapIndex(2), GetPassMapIndex(3));
  3633. ch->ChatPacket(CHAT_TYPE_INFO, "ThreewayPhase %d", CThreeWayWar::instance().GetRegenFlag());
  3634.  
  3635. for (int n = 1; n < 4; ++n)
  3636. {
  3637. LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(GetSungziMapIndex());
  3638.  
  3639. FCountInMap c;
  3640.  
  3641. if (pSecMap)
  3642. {
  3643. pSecMap->for_each(c);
  3644. }
  3645.  
  3646. ch->ChatPacket(CHAT_TYPE_INFO, "%s killscore %d usercount %d",
  3647. EMPIRE_NAME(n),
  3648. CThreeWayWar::instance().GetKillScore(n),
  3649. c.GetCount(n));
  3650. }
  3651. }
  3652.  
  3653. ACMD(do_threeway_war_myinfo)
  3654. {
  3655. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("나의 삼거리 진행정보"));
  3656. ch->ChatPacket(CHAT_TYPE_INFO, "Deadcount %d",
  3657. CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()));
  3658. }
  3659.  
  3660. ACMD(do_rmcandidacy)
  3661. {
  3662. char arg1[256];
  3663.  
  3664. one_argument(argument, arg1, sizeof(arg1));
  3665.  
  3666. if (!*arg1)
  3667. {
  3668. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: rmcandidacy <name>");
  3669. return;
  3670. }
  3671.  
  3672. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  3673.  
  3674. if (!tch)
  3675. {
  3676. CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
  3677.  
  3678. if (pkCCI)
  3679. {
  3680. if (pkCCI->bChannel != g_bChannel)
  3681. {
  3682. ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
  3683. return;
  3684. }
  3685. }
  3686. }
  3687.  
  3688. db_clientdesc->DBPacket(HEADER_GD_RMCANDIDACY, 0, NULL, 32);
  3689. db_clientdesc->Packet(arg1, 32);
  3690. }
  3691.  
  3692. ACMD(do_setmonarch)
  3693. {
  3694. char arg1[256];
  3695.  
  3696. one_argument(argument, arg1, sizeof(arg1));
  3697.  
  3698. if (!*arg1)
  3699. {
  3700. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: setmonarch <name>");
  3701. return;
  3702. }
  3703.  
  3704. db_clientdesc->DBPacket(HEADER_GD_SETMONARCH, 0, NULL, 32);
  3705. db_clientdesc->Packet(arg1, 32);
  3706. }
  3707.  
  3708. ACMD(do_rmmonarch)
  3709. {
  3710. char arg1[256];
  3711.  
  3712. one_argument(argument, arg1, sizeof(arg1));
  3713.  
  3714. if (!*arg1)
  3715. {
  3716. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: rmmonarch <name>");
  3717. return;
  3718. }
  3719.  
  3720. db_clientdesc->DBPacket(HEADER_GD_RMMONARCH, 0, NULL, 32);
  3721. db_clientdesc->Packet(arg1, 32);
  3722. }
  3723.  
  3724. ACMD(do_check_monarch_money)
  3725. {
  3726. char arg1[256];
  3727.  
  3728. one_argument(argument, arg1, sizeof(arg1));
  3729.  
  3730. if (!*arg1)
  3731. return;
  3732.  
  3733. int empire = 0;
  3734. str_to_number(empire, arg1);
  3735. int NationMoney = CMonarch::instance().GetMoney(empire);
  3736.  
  3737. ch->ChatPacket(CHAT_TYPE_INFO, "국고: %d 원", NationMoney);
  3738. }
  3739.  
  3740. ACMD(do_reset_subskill)
  3741. {
  3742. char arg1[256];
  3743.  
  3744. one_argument(argument, arg1, sizeof(arg1));
  3745.  
  3746. if (!*arg1)
  3747. {
  3748. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: reset_subskill <name>");
  3749. return;
  3750. }
  3751.  
  3752. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  3753.  
  3754. if (tch == NULL)
  3755. return;
  3756.  
  3757. tch->ClearSubSkill();
  3758. ch->ChatPacket(CHAT_TYPE_INFO, "Subskill of [%s] was reset", tch->GetName());
  3759. }
  3760.  
  3761. ACMD(do_siege)
  3762. {
  3763. char arg1[256], arg2[256];
  3764. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3765.  
  3766. int empire = strtol(arg1, NULL, 10);
  3767. int tower_count = strtol(arg2, NULL, 10);
  3768.  
  3769. if (empire == 0) empire = number(1, 3);
  3770. if (tower_count < 5 || tower_count > 10) tower_count = number(5, 10);
  3771.  
  3772. TPacketGGSiege packet;
  3773. packet.bHeader = HEADER_GG_SIEGE;
  3774. packet.bEmpire = empire;
  3775. packet.bTowerCount = tower_count;
  3776.  
  3777. P2P_MANAGER::instance().Send(&packet, sizeof(TPacketGGSiege));
  3778.  
  3779. switch (castle_siege(empire, tower_count))
  3780. {
  3781. case 0 :
  3782. ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE FAILED");
  3783. break;
  3784. case 1 :
  3785. ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE START Empire(%d) Tower(%d)", empire, tower_count);
  3786. break;
  3787. case 2 :
  3788. ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE END");
  3789. break;
  3790. }
  3791. }
  3792.  
  3793. ACMD(do_temp)
  3794. {
  3795. if (false == test_server)
  3796. return;
  3797.  
  3798. char arg1[256], arg2[256];
  3799. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3800.  
  3801. if (0 == arg1[0] || 0 == arg2[0])
  3802. {
  3803. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire money");
  3804. return;
  3805. }
  3806.  
  3807. int empire = 0;
  3808. str_to_number(empire, arg1);
  3809. int money = 0;
  3810. str_to_number(money, arg2);
  3811.  
  3812. CMonarch::instance().SendtoDBAddMoney(money, empire, ch);
  3813. }
  3814.  
  3815. ACMD(do_frog)
  3816. {
  3817. char arg1[256];
  3818. one_argument(argument, arg1, sizeof(arg1));
  3819.  
  3820. if (0 == arg1[0])
  3821. {
  3822. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire(1, 2, 3)");
  3823. return;
  3824. }
  3825.  
  3826. int empire = 0;
  3827. str_to_number(empire, arg1);
  3828.  
  3829. switch (empire)
  3830. {
  3831. case 1:
  3832. case 2:
  3833. case 3:
  3834. if (IS_CASTLE_MAP(ch->GetMapIndex()))
  3835. {
  3836. castle_spawn_frog(empire);
  3837. castle_save();
  3838. }
  3839. else
  3840. ch->ChatPacket(CHAT_TYPE_INFO, "You must spawn frog in castle");
  3841. break;
  3842.  
  3843. default:
  3844. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire(1, 2, 3)");
  3845. break;
  3846. }
  3847.  
  3848. }
  3849.  
  3850. ACMD(do_flush)
  3851. {
  3852. char arg1[256];
  3853. one_argument(argument, arg1, sizeof(arg1));
  3854.  
  3855. if (0 == arg1[0])
  3856. {
  3857. ch->ChatPacket(CHAT_TYPE_INFO, "usage : /flush player_id");
  3858. return;
  3859. }
  3860.  
  3861. DWORD pid = (DWORD) strtoul(arg1, NULL, 10);
  3862.  
  3863. db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
  3864. db_clientdesc->Packet(&pid, sizeof(DWORD));
  3865. }
  3866.  
  3867. ACMD(do_eclipse)
  3868. {
  3869. char arg1[256];
  3870. one_argument(argument, arg1, sizeof(arg1));
  3871.  
  3872. if (strtol(arg1, NULL, 10) == 1)
  3873. {
  3874. quest::CQuestManager::instance().RequestSetEventFlag("eclipse", 1);
  3875. }
  3876. else
  3877. {
  3878. quest::CQuestManager::instance().RequestSetEventFlag("eclipse", 0);
  3879. }
  3880. }
  3881.  
  3882. ACMD(do_weeklyevent)
  3883. {
  3884. char arg1[256];
  3885. int empire = 0;
  3886.  
  3887. if (CBattleArena::instance().IsRunning() == false)
  3888. {
  3889. one_argument(argument, arg1, sizeof(arg1));
  3890.  
  3891. empire = strtol(arg1, NULL, 10);
  3892.  
  3893. if (empire == 1 || empire == 2 || empire == 3)
  3894. {
  3895. CBattleArena::instance().Start(empire);
  3896. }
  3897. else
  3898. {
  3899. CBattleArena::instance().Start(rand()%3 + 1);
  3900. }
  3901. ch->ChatPacket(CHAT_TYPE_INFO, "Weekly Event Start");
  3902. }
  3903. else
  3904. {
  3905. CBattleArena::instance().ForceEnd();
  3906. ch->ChatPacket(CHAT_TYPE_INFO, "Weekly Event End");
  3907. }
  3908. }
  3909.  
  3910. ACMD(do_event_helper)
  3911. {
  3912. char arg1[256];
  3913. int mode = 0;
  3914.  
  3915. one_argument(argument, arg1, sizeof(arg1));
  3916. str_to_number(mode, arg1);
  3917.  
  3918. if (mode == 1)
  3919. {
  3920. xmas::SpawnEventHelper(true);
  3921. ch->ChatPacket(CHAT_TYPE_INFO, "Event Helper Spawn");
  3922. }
  3923. else
  3924. {
  3925. xmas::SpawnEventHelper(false);
  3926. ch->ChatPacket(CHAT_TYPE_INFO, "Event Helper Delete");
  3927. }
  3928. }
  3929.  
  3930. struct FMobCounter
  3931. {
  3932. int nCount;
  3933.  
  3934. void operator () (LPENTITY ent)
  3935. {
  3936. if (ent->IsType(ENTITY_CHARACTER))
  3937. {
  3938. LPCHARACTER pChar = static_cast<LPCHARACTER>(ent);
  3939.  
  3940. if (pChar->IsMonster() == true || pChar->IsStone())
  3941. {
  3942. nCount++;
  3943. }
  3944. }
  3945. }
  3946. };
  3947.  
  3948. ACMD(do_get_mob_count)
  3949. {
  3950. LPSECTREE_MAP pSectree = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
  3951.  
  3952. if (pSectree == NULL)
  3953. return;
  3954.  
  3955. FMobCounter f;
  3956. f.nCount = 0;
  3957.  
  3958. pSectree->for_each(f);
  3959.  
  3960. ch->ChatPacket(CHAT_TYPE_INFO, "MapIndex: %d MobCount %d", ch->GetMapIndex(), f.nCount);
  3961. }
  3962.  
  3963. ACMD(do_clear_land)
  3964. {
  3965. const building::CLand* pLand = building::CManager::instance().FindLand(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  3966.  
  3967. if( NULL == pLand )
  3968. {
  3969. return;
  3970. }
  3971.  
  3972. ch->ChatPacket(CHAT_TYPE_INFO, "Guild Land(%d) Cleared", pLand->GetID());
  3973.  
  3974. building::CManager::instance().ClearLand(pLand->GetID());
  3975. }
  3976.  
  3977. ACMD(do_special_item)
  3978. {
  3979. ITEM_MANAGER::instance().ConvSpecialDropItemFile();
  3980. }
  3981.  
  3982. ACMD(do_set_stat)
  3983. {
  3984. char szName [256];
  3985. char szChangeAmount[256];
  3986.  
  3987. two_arguments (argument, szName, sizeof (szName), szChangeAmount, sizeof(szChangeAmount));
  3988.  
  3989. if (*szName == NULL || *szChangeAmount == '\0')
  3990. {
  3991. ch->ChatPacket (CHAT_TYPE_INFO, "Invalid argument.");
  3992. return;
  3993. }
  3994.  
  3995. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(szName);
  3996.  
  3997. if (!tch)
  3998. {
  3999. CCI * pkCCI = P2P_MANAGER::instance().Find(szName);
  4000.  
  4001. if (pkCCI)
  4002. {
  4003. ch->ChatPacket (CHAT_TYPE_INFO, "Cannot find player(%s). %s is not in your game server.", szName, szName);
  4004. return;
  4005. }
  4006. else
  4007. {
  4008. ch->ChatPacket (CHAT_TYPE_INFO, "Cannot find player(%s). Perhaps %s doesn't login or exist.", szName, szName);
  4009. return;
  4010. }
  4011. }
  4012. else
  4013. {
  4014. if (tch->IsPolymorphed())
  4015. {
  4016. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑 중에는 능력을 올릴 수 없습니다."));
  4017. return;
  4018. }
  4019.  
  4020. if (subcmd != POINT_HT && subcmd != POINT_IQ && subcmd != POINT_ST && subcmd != POINT_DX)
  4021. {
  4022. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("명령어의 서브 커맨드가 잘못 되었습니다."));
  4023. return;
  4024. }
  4025. int nRemainPoint = tch->GetPoint(POINT_STAT);
  4026. int nCurPoint = tch->GetRealPoint(subcmd);
  4027. int nChangeAmount = 0;
  4028. str_to_number(nChangeAmount, szChangeAmount);
  4029. int nPoint = nCurPoint + nChangeAmount;
  4030.  
  4031. int n;
  4032. switch (subcmd)
  4033. {
  4034. case POINT_HT:
  4035. if (nPoint < JobInitialPoints[tch->GetJob()].ht)
  4036. {
  4037. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
  4038. return;
  4039. }
  4040. n = 0;
  4041. break;
  4042. case POINT_IQ:
  4043. if (nPoint < JobInitialPoints[tch->GetJob()].iq)
  4044. {
  4045. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
  4046. return;
  4047. }
  4048. n = 1;
  4049. break;
  4050. case POINT_ST:
  4051. if (nPoint < JobInitialPoints[tch->GetJob()].st)
  4052. {
  4053. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
  4054. return;
  4055. }
  4056. n = 2;
  4057. break;
  4058. case POINT_DX:
  4059. if (nPoint < JobInitialPoints[tch->GetJob()].dx)
  4060. {
  4061. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
  4062. return;
  4063. }
  4064. n = 3;
  4065. break;
  4066. }
  4067.  
  4068. if (nPoint > 90)
  4069. {
  4070. nChangeAmount -= nPoint - 90;
  4071. nPoint = 90;
  4072. }
  4073.  
  4074. if (nRemainPoint < nChangeAmount)
  4075. {
  4076. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("남은 스탯 포인트가 적습니다."));
  4077. return;
  4078. }
  4079.  
  4080. tch->SetRealPoint(subcmd, nPoint);
  4081. tch->SetPoint(subcmd, tch->GetPoint(subcmd) + nChangeAmount);
  4082. tch->ComputePoints();
  4083. tch->PointChange(subcmd, 0);
  4084.  
  4085. tch->PointChange(POINT_STAT, -nChangeAmount);
  4086. tch->ComputePoints();
  4087.  
  4088. const char* stat_name[4] = {"con", "int", "str", "dex"};
  4089.  
  4090. ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s change %d to %d", szName, stat_name[n], nCurPoint, nPoint);
  4091. }
  4092. }
  4093.  
  4094. ACMD(do_get_item_id_list)
  4095. {
  4096. for (int i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; i++)
  4097. {
  4098. LPITEM item = ch->GetInventoryItem(i);
  4099. if (item != NULL)
  4100. ch->ChatPacket(CHAT_TYPE_INFO, "cell : %d, name : %s, id : %d", item->GetCell(), item->GetName(), item->GetID());
  4101. }
  4102. }
  4103.  
  4104. ACMD(do_set_socket)
  4105. {
  4106. char arg1 [256];
  4107. char arg2 [256];
  4108. char arg3 [256];
  4109.  
  4110. one_argument (two_arguments (argument, arg1, sizeof (arg1), arg2, sizeof(arg2)), arg3, sizeof (arg3));
  4111.  
  4112. int item_id, socket_num, value;
  4113. if (!str_to_number (item_id, arg1) || !str_to_number (socket_num, arg2) || !str_to_number (value, arg3))
  4114. return;
  4115.  
  4116. LPITEM item = ITEM_MANAGER::instance().Find (item_id);
  4117. if (item)
  4118. item->SetSocket (socket_num, value);
  4119. }
  4120.  
  4121. ACMD (do_can_dead)
  4122. {
  4123. if (subcmd)
  4124. ch->SetArmada();
  4125. else
  4126. ch->ResetArmada();
  4127. }
  4128.  
  4129. ACMD (do_full_set)
  4130. {
  4131. extern void do_all_skill_master(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
  4132. do_all_skill_master(ch, NULL, 0, 0);
  4133. extern void do_item_full_set(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
  4134. do_item_full_set(ch, NULL, 0, 0);
  4135. extern void do_attr_full_set(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
  4136. do_attr_full_set(ch, NULL, 0, 0);
  4137.  
  4138. }
  4139.  
  4140. ACMD (do_all_skill_master)
  4141. {
  4142. ch->SetHorseLevel(SKILL_MAX_LEVEL);
  4143. for (int i = 0; i < SKILL_MAX_NUM; i++)
  4144. {
  4145. if (true == ch->CanUseSkill(i))
  4146. {
  4147. ch->SetSkillLevel(i, SKILL_MAX_LEVEL);
  4148. }
  4149. else
  4150. {
  4151. switch(i)
  4152. {
  4153. case SKILL_HORSE_WILDATTACK:
  4154. case SKILL_HORSE_CHARGE:
  4155. case SKILL_HORSE_ESCAPE:
  4156. case SKILL_HORSE_WILDATTACK_RANGE:
  4157. ch->SetSkillLevel(i, SKILL_MAX_LEVEL);
  4158. break;
  4159. }
  4160. }
  4161. }
  4162. ch->ComputePoints();
  4163. ch->SkillLevelPacket();
  4164. }
  4165.  
  4166. ACMD (do_item_full_set)
  4167. {
  4168. BYTE job = ch->GetJob();
  4169. LPITEM item;
  4170. for (int i = 0; i < 6; i++)
  4171. {
  4172. item = ch->GetWear(i);
  4173. if (item != NULL)
  4174. ch->UnequipItem(item);
  4175. }
  4176. item = ch->GetWear(WEAR_SHIELD);
  4177. if (item != NULL)
  4178. ch->UnequipItem(item);
  4179.  
  4180. switch (job)
  4181. {
  4182. case JOB_SURA:
  4183. {
  4184.  
  4185. item = ITEM_MANAGER::instance().CreateItem(11699);
  4186. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4187. M2_DESTROY_ITEM(item);
  4188. item = ITEM_MANAGER::instance().CreateItem(13049);
  4189. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4190. M2_DESTROY_ITEM(item);
  4191. item = ITEM_MANAGER::instance().CreateItem(15189 );
  4192. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4193. M2_DESTROY_ITEM(item);
  4194. item = ITEM_MANAGER::instance().CreateItem(189 );
  4195. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4196. M2_DESTROY_ITEM(item);
  4197. item = ITEM_MANAGER::instance().CreateItem(12529 );
  4198. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4199. M2_DESTROY_ITEM(item);
  4200. item = ITEM_MANAGER::instance().CreateItem(14109 );
  4201. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4202. M2_DESTROY_ITEM(item);
  4203. item = ITEM_MANAGER::instance().CreateItem(17209 );
  4204. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4205. M2_DESTROY_ITEM(item);
  4206. item = ITEM_MANAGER::instance().CreateItem(16209 );
  4207. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4208. M2_DESTROY_ITEM(item);
  4209. }
  4210. break;
  4211. case JOB_WARRIOR:
  4212. {
  4213.  
  4214. item = ITEM_MANAGER::instance().CreateItem(11299);
  4215. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4216. M2_DESTROY_ITEM(item);
  4217. item = ITEM_MANAGER::instance().CreateItem(13049);
  4218. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4219. M2_DESTROY_ITEM(item);
  4220. item = ITEM_MANAGER::instance().CreateItem(15189 );
  4221. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4222. M2_DESTROY_ITEM(item);
  4223. item = ITEM_MANAGER::instance().CreateItem(3159 );
  4224. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4225. M2_DESTROY_ITEM(item);
  4226. item = ITEM_MANAGER::instance().CreateItem(12249 );
  4227. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4228. M2_DESTROY_ITEM(item);
  4229. item = ITEM_MANAGER::instance().CreateItem(14109 );
  4230. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4231. M2_DESTROY_ITEM(item);
  4232. item = ITEM_MANAGER::instance().CreateItem(17109 );
  4233. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4234. M2_DESTROY_ITEM(item);
  4235. item = ITEM_MANAGER::instance().CreateItem(16109 );
  4236. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4237. M2_DESTROY_ITEM(item);
  4238. }
  4239. break;
  4240. case JOB_SHAMAN:
  4241. {
  4242.  
  4243. item = ITEM_MANAGER::instance().CreateItem(11899);
  4244. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4245. M2_DESTROY_ITEM(item);
  4246. item = ITEM_MANAGER::instance().CreateItem(13049);
  4247. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4248. M2_DESTROY_ITEM(item);
  4249. item = ITEM_MANAGER::instance().CreateItem(15189 );
  4250. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4251. M2_DESTROY_ITEM(item);
  4252. item = ITEM_MANAGER::instance().CreateItem(7159 );
  4253. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4254. M2_DESTROY_ITEM(item);
  4255. item = ITEM_MANAGER::instance().CreateItem(12669 );
  4256. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4257. M2_DESTROY_ITEM(item);
  4258. item = ITEM_MANAGER::instance().CreateItem(14109 );
  4259. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4260. M2_DESTROY_ITEM(item);
  4261. item = ITEM_MANAGER::instance().CreateItem(17209 );
  4262. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4263. M2_DESTROY_ITEM(item);
  4264. item = ITEM_MANAGER::instance().CreateItem(16209 );
  4265. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4266. M2_DESTROY_ITEM(item);
  4267. }
  4268. break;
  4269. case JOB_ASSASSIN:
  4270. {
  4271.  
  4272. item = ITEM_MANAGER::instance().CreateItem(11499);
  4273. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4274. M2_DESTROY_ITEM(item);
  4275. item = ITEM_MANAGER::instance().CreateItem(13049);
  4276. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4277. M2_DESTROY_ITEM(item);
  4278. item = ITEM_MANAGER::instance().CreateItem(15189 );
  4279. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4280. M2_DESTROY_ITEM(item);
  4281. item = ITEM_MANAGER::instance().CreateItem(1139 );
  4282. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4283. M2_DESTROY_ITEM(item);
  4284. item = ITEM_MANAGER::instance().CreateItem(12389 );
  4285. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4286. M2_DESTROY_ITEM(item);
  4287. item = ITEM_MANAGER::instance().CreateItem(14109 );
  4288. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4289. M2_DESTROY_ITEM(item);
  4290. item = ITEM_MANAGER::instance().CreateItem(17189 );
  4291. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4292. M2_DESTROY_ITEM(item);
  4293. item = ITEM_MANAGER::instance().CreateItem(16189 );
  4294. if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
  4295. M2_DESTROY_ITEM(item);
  4296. }
  4297. break;
  4298. }
  4299. }
  4300.  
  4301. ACMD (do_attr_full_set)
  4302. {
  4303. BYTE job = ch->GetJob();
  4304. LPITEM item;
  4305.  
  4306. switch (job)
  4307. {
  4308. case JOB_WARRIOR:
  4309. case JOB_ASSASSIN:
  4310. case JOB_SURA:
  4311. case JOB_SHAMAN:
  4312. {
  4313. // 무사 몸빵 셋팅.
  4314. // 이것만 나와 있어서 임시로 모든 직군 다 이런 속성 따름.
  4315. item = ch->GetWear(WEAR_HEAD);
  4316. if (item != NULL)
  4317. {
  4318. item->ClearAttribute();
  4319. item->SetForceAttribute( 0, APPLY_ATT_SPEED, 8);
  4320. item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
  4321. item->SetForceAttribute( 2, APPLY_SP_REGEN, 30);
  4322. item->SetForceAttribute( 3, APPLY_DODGE, 15);
  4323. item->SetForceAttribute( 4, APPLY_STEAL_SP, 10);
  4324. }
  4325.  
  4326. item = ch->GetWear(WEAR_WEAPON);
  4327. if (item != NULL)
  4328. {
  4329. item->ClearAttribute();
  4330. item->SetForceAttribute( 0, APPLY_CAST_SPEED, 20);
  4331. item->SetForceAttribute( 1, APPLY_CRITICAL_PCT, 10);
  4332. item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
  4333. item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
  4334. item->SetForceAttribute( 4, APPLY_STR, 12);
  4335. }
  4336.  
  4337. item = ch->GetWear(WEAR_SHIELD);
  4338. if (item != NULL)
  4339. {
  4340. item->ClearAttribute();
  4341. item->SetForceAttribute( 0, APPLY_CON, 12);
  4342. item->SetForceAttribute( 1, APPLY_BLOCK, 15);
  4343. item->SetForceAttribute( 2, APPLY_REFLECT_MELEE, 10);
  4344. item->SetForceAttribute( 3, APPLY_IMMUNE_STUN, 1);
  4345. item->SetForceAttribute( 4, APPLY_IMMUNE_SLOW, 1);
  4346. }
  4347.  
  4348. item = ch->GetWear(WEAR_BODY);
  4349. if (item != NULL)
  4350. {
  4351. item->ClearAttribute();
  4352. item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
  4353. item->SetForceAttribute( 1, APPLY_CAST_SPEED, 20);
  4354. item->SetForceAttribute( 2, APPLY_STEAL_HP, 10);
  4355. item->SetForceAttribute( 3, APPLY_REFLECT_MELEE, 10);
  4356. item->SetForceAttribute( 4, APPLY_ATT_GRADE_BONUS, 50);
  4357. }
  4358.  
  4359. item = ch->GetWear(WEAR_FOOTS);
  4360. if (item != NULL)
  4361. {
  4362. item->ClearAttribute();
  4363. item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
  4364. item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
  4365. item->SetForceAttribute( 2, APPLY_MOV_SPEED, 8);
  4366. item->SetForceAttribute( 3, APPLY_ATT_SPEED, 8);
  4367. item->SetForceAttribute( 4, APPLY_CRITICAL_PCT, 10);
  4368. }
  4369.  
  4370. item = ch->GetWear(WEAR_WRIST);
  4371. if (item != NULL)
  4372. {
  4373. item->ClearAttribute();
  4374. item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
  4375. item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
  4376. item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
  4377. item->SetForceAttribute( 3, APPLY_STEAL_HP, 10);
  4378. item->SetForceAttribute( 4, APPLY_MANA_BURN_PCT, 10);
  4379. }
  4380. item = ch->GetWear(WEAR_NECK);
  4381. if (item != NULL)
  4382. {
  4383. item->ClearAttribute();
  4384. item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
  4385. item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
  4386. item->SetForceAttribute( 2, APPLY_CRITICAL_PCT, 10);
  4387. item->SetForceAttribute( 3, APPLY_PENETRATE_PCT, 10);
  4388. item->SetForceAttribute( 4, APPLY_STEAL_SP, 10);
  4389. }
  4390. item = ch->GetWear(WEAR_EAR);
  4391. if (item != NULL)
  4392. {
  4393. item->ClearAttribute();
  4394. item->SetForceAttribute( 0, APPLY_MOV_SPEED, 20);
  4395. item->SetForceAttribute( 1, APPLY_MANA_BURN_PCT, 10);
  4396. item->SetForceAttribute( 2, APPLY_POISON_REDUCE, 5);
  4397. item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
  4398. item->SetForceAttribute( 4, APPLY_ATTBONUS_UNDEAD, 20);
  4399. }
  4400. }
  4401. break;
  4402. }
  4403. }
  4404.  
  4405. ACMD (do_use_item)
  4406. {
  4407. char arg1 [256];
  4408.  
  4409. one_argument (argument, arg1, sizeof (arg1));
  4410.  
  4411. int cell;
  4412. str_to_number(cell, arg1);
  4413.  
  4414. LPITEM item = ch->GetInventoryItem(cell);
  4415. if (item)
  4416. {
  4417. ch->UseItem(TItemPos (INVENTORY, cell));
  4418. }
  4419. else
  4420. {
  4421. ch->ChatPacket(CHAT_TYPE_INFO, "아이템이 없어서 착용할 수 없어.");
  4422. }
  4423. }
  4424.  
  4425. ACMD (do_clear_affect)
  4426. {
  4427. ch->ClearAffect(true);
  4428. }
  4429.  
  4430. ACMD (do_dragon_soul)
  4431. {
  4432. char arg1[512];
  4433. const char* rest = one_argument (argument, arg1, sizeof(arg1));
  4434. switch (arg1[0])
  4435. {
  4436. case 'a':
  4437. {
  4438. one_argument (rest, arg1, sizeof(arg1));
  4439. int deck_idx;
  4440. if (str_to_number(deck_idx, arg1) == false)
  4441. {
  4442. return;
  4443. }
  4444. ch->DragonSoul_ActivateDeck(deck_idx);
  4445. }
  4446. break;
  4447. case 'd':
  4448. {
  4449. ch->DragonSoul_DeactivateAll();
  4450. }
  4451. break;
  4452. }
  4453. }
  4454.  
  4455. ACMD (do_ds_list)
  4456. {
  4457. for (int i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; i++)
  4458. {
  4459. TItemPos cell(DRAGON_SOUL_INVENTORY, i);
  4460.  
  4461. LPITEM item = ch->GetItem(cell);
  4462. if (item != NULL)
  4463. ch->ChatPacket(CHAT_TYPE_INFO, "cell : %d, name : %s, id : %d", item->GetCell(), item->GetName(), item->GetID());
  4464. }
  4465. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement