1. #include "stdafx.h"
  2. #ifdef __FreeBSD__
  3. #include <md5.h>
  4. #else
  5. #include "../../libthecore/include/xmd5.h"
  6. #endif
  7. #include "utils.h"
  8. #include "config.h"
  9. #include "desc_client.h"
  10. #include "desc_manager.h"
  11. #include "char.h"
  12. #include "char_manager.h"
  13. #include "motion.h"
  14. #include "packet.h"
  15. #include "affect.h"
  16. #include "pvp.h"
  17. #include "start_position.h"
  18. #include "party.h"
  19. #include "guild_manager.h"
  20. #include "p2p.h"
  21. #include "dungeon.h"
  22. #include "messenger_manager.h"
  23. #include "war_map.h"
  24. #include "questmanager.h"
  25. #include "item_manager.h"
  26. #include "mob_manager.h"
  27. #include "dev_log.h"
  28. #include "item.h"
  29. #include "arena.h"
  30. #include "buffer_manager.h"
  31. #include "unique_item.h"
  32. #ifdef ENABLE_RONARK_SYSTEM
  33. #include "ronark_map.h"
  34. #endif
  35. #ifdef ENABLE_PLAYTIME_TITLE
  36. #include "PlayTimeTitle.h"
  37. #endif
  38. #include "threeway_war.h"
  39. #include "log.h"
  40. #include "../../common/VnumHelper.h"
  41. #ifdef PK_MODE_FIX
  42. #include "map_manager.h"
  43. #endif
  44. #ifdef ENABLE_ITEM_SHOP_SYSTEM
  45. #include "item_shop.h"
  46. #endif
  47. #include "../../common/service.h"
  48. #ifdef __PET_SYSTEM__
  49. #include "PetSystem.h"
  50. #endif
  51. ACMD(do_user_horse_ride)
  52. {
  53. if (ch->IsObserverMode())
  54. return;
  55. if (ch->IsDead() || ch->IsStun())
  56. return;
  57. if (ch->IsHorseRiding() == false)
  58. {
  59. // ¸»ÀÌ ¾Æ´Ñ ´Ù¸¥Å»°ÍÀ» Ÿ°íÀÖ´Ù.
  60. if (ch->GetMountVnum())
  61. {
  62. ch->ChatInfoTrans(("ÀÌ¹Ì Å»°ÍÀ» ÀÌ¿ëÁßÀÔ´Ï´Ù."));
  63. return;
  64. }
  65. if (ch->GetHorse() == NULL)
  66. {
  67. ch->ChatInfoTrans(("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
  68. return;
  69. }
  70. ch->StartRiding();
  71. }
  72. else
  73. {
  74. ch->StopRiding();
  75. }
  76. }
  77. #ifdef ENABLE_PLAYTIME_TITLE
  78. ACMD(do_load_ptime) {
  79. CPlayTimeTitle::instance().SendToClient(ch);
  80. }
  81. ACMD(do_update_ptime) {
  82. CPlayTimeTitle::instance().UpdateTitle(ch);
  83. }
  84. #endif
  85. ACMD(do_teleportring) //impved
  86. {
  87. LPITEM fakeItem = ch->GetWear(WEAR_UNIQUE1); // null or whatever
  88. quest::CQuestManager::instance().UseItem(ch->GetPlayerID(), fakeItem, false,40004);
  89. }
  90. ACMD(do_user_horse_back)
  91. {
  92. if (ch->GetHorse() != NULL)
  93. {
  94. ch->HorseSummon(false);
  95. ch->ChatInfoTrans(("¸»À» µ¹·Áº¸³Â½À´Ï´Ù."));
  96. }
  97. else if (ch->IsHorseRiding() == true)
  98. {
  99. ch->ChatInfoTrans(("¸»¿¡¼­ ¸ÕÀú ³»·Á¾ß ÇÕ´Ï´Ù."));
  100. }
  101. else
  102. {
  103. ch->ChatInfoTrans(("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
  104. }
  105. }
  106. ACMD(do_user_horse_feed)
  107. {
  108. // °³ÀλóÁ¡À» ¿¬ »óÅ¿¡¼­´Â ¸» ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø´Ù.
  109. if (ch->GetMyShop())
  110. return;
  111. if (ch->GetHorse() == NULL)
  112. {
  113. if (ch->IsHorseRiding() == false)
  114. ch->ChatInfoTrans(("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
  115. else
  116. ch->ChatInfoTrans(("¸»À» ź »óÅ¿¡¼­´Â ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø½À´Ï´Ù."));
  117. return;
  118. }
  119. DWORD dwFood = ch->GetHorseGrade() + 50054 - 1;
  120. if (ch->CountSpecifyItem(dwFood) > 0)
  121. {
  122. ch->RemoveSpecifyItem(dwFood, 1);
  123. ch->FeedHorse();
  124. ch->ChatInfoTrans(("¸»¿¡°Ô %s%s ÁÖ¾ú½À´Ï´Ù."),
  125. ITEM_MANAGER::instance().GetTable(dwFood)->szNameEN,
  126. "");
  127. }
  128. else
  129. {
  130. ch->ChatInfoTrans(("%s ¾ÆÀÌÅÛÀÌ ÇÊ¿äÇÕ´Ï´Ù"), ITEM_MANAGER::instance().GetTable(dwFood)->szNameEN);
  131. }
  132. }
  133. #define MAX_REASON_LEN 128
  134. EVENTINFO(TimedEventInfo)
  135. {
  136. DynamicCharacterPtr ch;
  137. int subcmd;
  138. int left_second;
  139. char szReason[MAX_REASON_LEN];
  140. TimedEventInfo()
  141. : ch()
  142. , subcmd( 0 )
  143. , left_second( 0 )
  144. {
  145. ::memset( szReason, 0, MAX_REASON_LEN );
  146. }
  147. };
  148. struct SendDisconnectFunc
  149. {
  150. void operator () (LPDESC d)
  151. {
  152. if (d->GetCharacter())
  153. {
  154. if (d->GetCharacter()->GetGMLevel() == GM_PLAYER)
  155. d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "quit Shutdown(SendDisconnectFunc)");
  156. }
  157. }
  158. };
  159. struct DisconnectFunc
  160. {
  161. void operator () (LPDESC d)
  162. {
  163. if (d->GetType() == DESC_TYPE_CONNECTOR)
  164. return;
  165. if (d->IsPhase(PHASE_P2P))
  166. return;
  167. if (d->GetCharacter())
  168. d->GetCharacter()->Disconnect("Shutdown(DisconnectFunc)");
  169. d->SetPhase(PHASE_CLOSE);
  170. }
  171. };
  172. /*
  173. EVENTINFO(shutdown_event_data)
  174. {
  175. int seconds;
  176. shutdown_event_data()
  177. : seconds( 0 )
  178. {
  179. }
  180. };
  181. EVENTFUNC(shutdown_event)
  182. {
  183. shutdown_event_data* info = dynamic_cast<shutdown_event_data*>( event->info );
  184. if ( info == NULL )
  185. {
  186. sys_err( "shutdown_event> <Factor> Null pointer" );
  187. return 0;
  188. }
  189. int * pSec = & (info->seconds);
  190. if (*pSec < 0)
  191. {
  192. sys_log(0, "shutdown_event sec %d", *pSec);
  193. if (--*pSec == -10)
  194. {
  195. const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
  196. std::for_each(c_set_desc.begin(), c_set_desc.end(), DisconnectFunc());
  197. return passes_per_sec;
  198. }
  199. else if (*pSec < -10)
  200. return 0;
  201. return passes_per_sec;
  202. }
  203. else if (*pSec == 0)
  204. {
  205. const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
  206. std::for_each(c_set_desc.begin(), c_set_desc.end(), SendDisconnectFunc());
  207. g_bNoMoreClient = true;
  208. --*pSec;
  209. return passes_per_sec;
  210. }
  211. else
  212. {
  213. char buf[64];
  214. snprintf(buf, sizeof(buf), LC_TEXT("¼Ë´Ù¿îÀÌ %dÃÊ ³²¾Ò½À´Ï´Ù."), *pSec);
  215. SendNotice(buf);
  216. --*pSec;
  217. return passes_per_sec;
  218. }
  219. }
  220. void Shutdown(int iSec)
  221. {
  222. if (g_bNoMoreClient)
  223. {
  224. thecore_shutdown();
  225. return;
  226. }
  227. CWarMapManager::instance().OnShutdown();
  228. char buf[64];
  229. snprintf(buf, sizeof(buf), LC_TEXT("%dÃÊ ÈÄ °ÔÀÓÀÌ ¼Ë´Ù¿î µË´Ï´Ù."), iSec);
  230. SendNotice(buf);
  231. shutdown_event_data* info = AllocEventInfo<shutdown_event_data>();
  232. info->seconds = iSec;
  233. event_create(shutdown_event, info, 1);
  234. }
  235. ACMD(do_shutdown)
  236. {
  237. if (NULL == ch)
  238. {
  239. sys_err("Accept shutdown command from %s.", ch->GetName());
  240. }
  241. TPacketGGShutdown p;
  242. p.bHeader = HEADER_GG_SHUTDOWN;
  243. P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown));
  244. Shutdown(10);
  245. }
  246. */
  247. EVENTFUNC(timed_event)
  248. {
  249. TimedEventInfo * info = dynamic_cast<TimedEventInfo *>( event->info );
  250. if ( info == NULL )
  251. {
  252. sys_err( "timed_event> <Factor> Null pointer" );
  253. return 0;
  254. }
  255. LPCHARACTER ch = info->ch;
  256. if (ch == NULL) { // <Factor>
  257. return 0;
  258. }
  259. LPDESC d = ch->GetDesc();
  260. if (info->left_second <= 0)
  261. {
  262. ch->m_pkTimedEvent = NULL;
  263. switch (info->subcmd)
  264. {
  265. case SCMD_LOGOUT:
  266. case SCMD_QUIT:
  267. case SCMD_PHASE_SELECT:
  268. {
  269. TPacketNeedLoginLogInfo acc_info;
  270. acc_info.dwPlayerID = ch->GetDesc()->GetAccountTable().id;
  271. db_clientdesc->DBPacket( HEADER_GD_VALID_LOGOUT, 0, &acc_info, sizeof(acc_info) );
  272. LogManager::instance().DetailLoginLog( false, ch );
  273. #ifdef __INVENTORY_PROTECT_SYSTEM__
  274. if (ch->GetQuestFlag("abs.INVENTORY_LOCK") == 0)
  275. ch->SetQuestFlag("abs.INVENTORY_LOCK", 1);
  276. #endif
  277. }
  278. break;
  279. }
  280. switch (info->subcmd)
  281. {
  282. case SCMD_LOGOUT:
  283. if (d)
  284. d->SetPhase(PHASE_CLOSE);
  285. break;
  286. case SCMD_QUIT:
  287. ch->ChatPacket(CHAT_TYPE_COMMAND, "quit");
  288. break;
  289. case SCMD_PHASE_SELECT:
  290. {
  291. ch->Disconnect("timed_event - SCMD_PHASE_SELECT");
  292. if (d)
  293. {
  294. d->SetPhase(PHASE_SELECT);
  295. }
  296. }
  297. break;
  298. }
  299. return 0;
  300. }
  301. else
  302. {
  303. ch->ChatInfoTrans(("%dÃÊ ³²¾Ò½À´Ï´Ù."), info->left_second);
  304. --info->left_second;
  305. }
  306. return PASSES_PER_SEC(1);
  307. }
  308. ACMD(do_cmd)
  309. {
  310. /* RECALL_DELAY
  311. if (ch->m_pkRecallEvent != NULL)
  312. {
  313. ch->ChatInfoTrans(("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
  314. event_cancel(&ch->m_pkRecallEvent);
  315. return;
  316. }
  317. // END_OF_RECALL_DELAY */
  318. if (ch->m_pkTimedEvent)
  319. {
  320. ch->ChatInfoTrans(("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
  321. event_cancel(&ch->m_pkTimedEvent);
  322. return;
  323. }
  324. switch (subcmd)
  325. {
  326. case SCMD_LOGOUT:
  327. ch->ChatInfoTrans(("·Î±×ÀÎ È­¸éÀ¸·Î µ¹¾Æ °©´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
  328. break;
  329. case SCMD_QUIT:
  330. ch->ChatInfoTrans(("°ÔÀÓÀ» Á¾·á ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
  331. break;
  332. case SCMD_PHASE_SELECT:
  333. ch->ChatInfoTrans(("ij¸¯Å͸¦ Àüȯ ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
  334. break;
  335. }
  336. int nExitLimitTime = 10;
  337. if (ch->IsHack(false, true, nExitLimitTime) &&
  338. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()) &&
  339. (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
  340. {
  341. return;
  342. }
  343. switch (subcmd)
  344. {
  345. case SCMD_LOGOUT:
  346. case SCMD_QUIT:
  347. case SCMD_PHASE_SELECT:
  348. {
  349. TimedEventInfo* info = AllocEventInfo<TimedEventInfo>();
  350. {
  351. if (ch->IsPosition(POS_FIGHTING))
  352. info->left_second = 10;
  353. else
  354. info->left_second = 3;
  355. }
  356. info->ch = ch;
  357. info->subcmd = subcmd;
  358. strlcpy(info->szReason, argument, sizeof(info->szReason));
  359. ch->m_pkTimedEvent = event_create(timed_event, info, 1);
  360. }
  361. break;
  362. }
  363. }
  364. ACMD(do_mount)
  365. {
  366. /*
  367. char arg1[256];
  368. struct action_mount_param param;
  369. // ÀÌ¹Ì Å¸°í ÀÖÀ¸¸é
  370. if (ch->GetMountingChr())
  371. {
  372. char arg2[256];
  373. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  374. if (!*arg1 || !*arg2)
  375. return;
  376. param.x = atoi(arg1);
  377. param.y = atoi(arg2);
  378. param.vid = ch->GetMountingChr()->GetVID();
  379. param.is_unmount = true;
  380. float distance = DISTANCE_SQRT(param.x - (DWORD) ch->GetX(), param.y - (DWORD) ch->GetY());
  381. if (distance > 600.0f)
  382. {
  383. ch->ChatInfoTrans(("Á» ´õ °¡±îÀÌ °¡¼­ ³»¸®¼¼¿ä."));
  384. return;
  385. }
  386. action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
  387. return;
  388. }
  389. one_argument(argument, arg1, sizeof(arg1));
  390. if (!*arg1)
  391. return;
  392. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(atoi(arg1));
  393. if (!tch->IsNPC() || !tch->IsMountable())
  394. {
  395. ch->ChatInfoTrans(("°Å±â¿¡´Â Å» ¼ö ¾ø¾î¿ä."));
  396. return;
  397. }
  398. float distance = DISTANCE_SQRT(tch->GetX() - ch->GetX(), tch->GetY() - ch->GetY());
  399. if (distance > 600.0f)
  400. {
  401. ch->ChatInfoTrans(("Á» ´õ °¡±îÀÌ °¡¼­ Ÿ¼¼¿ä."));
  402. return;
  403. }
  404. param.vid = tch->GetVID();
  405. param.is_unmount = false;
  406. action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
  407. */
  408. }
  409. ACMD(do_fishing)
  410. {
  411. char arg1[256];
  412. one_argument(argument, arg1, sizeof(arg1));
  413. if (!*arg1)
  414. return;
  415. ch->SetRotation(atof(arg1));
  416. ch->fishing();
  417. }
  418. ACMD(do_console)
  419. {
  420. ch->ChatPacket(CHAT_TYPE_COMMAND, "ConsoleEnable");
  421. }
  422. ACMD(do_restart)
  423. {
  424. if (false == ch->IsDead())
  425. {
  426. ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
  427. ch->StartRecoveryEvent();
  428. return;
  429. }
  430. if (NULL == ch->m_pkDeadEvent)
  431. return;
  432. int iTimeToDead = (event_time(ch->m_pkDeadEvent) / passes_per_sec);
  433. if (subcmd != SCMD_RESTART_TOWN && (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
  434. {
  435. if (!test_server)
  436. {
  437. if (ch->IsHack())
  438. {
  439. //¼ºÁö ¸ÊÀϰæ¿ì¿¡´Â üũ ÇÏÁö ¾Ê´Â´Ù.
  440. if (false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  441. {
  442. ch->ChatInfoTrans(("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
  443. return;
  444. }
  445. }
  446. #define eFRS_HERESEC 180 // editedd 180 to 177 3 saniye dogma suresi
  447. if (iTimeToDead > eFRS_HERESEC)
  448. {
  449. ch->ChatInfoTrans(("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - eFRS_HERESEC);
  450. return;
  451. }
  452. }
  453. }
  454. //PREVENT_HACK
  455. //DESC : â°í, ±³È¯ â ÈÄ Æ÷Å»À» »ç¿ëÇÏ´Â ¹ö±×¿¡ ÀÌ¿ëµÉ¼ö À־
  456. // ÄğŸÀÓÀ» Ãß°¡
  457. if (subcmd == SCMD_RESTART_TOWN)
  458. {
  459. if (ch->IsHack())
  460. {
  461. //±æµå¸Ê, ¼ºÁö¸Ê¿¡¼­´Â üũ ÇÏÁö ¾Ê´Â´Ù.
  462. if ((!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG) ||
  463. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  464. {
  465. ch->ChatInfoTrans(("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
  466. return;
  467. }
  468. }
  469. #define eFRS_TOWNSEC 173
  470. if (iTimeToDead > eFRS_TOWNSEC)
  471. {
  472. ch->ChatInfoTrans(("¾ÆÁ÷ ¸¶À»¿¡¼­ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%d ÃÊ ³²À½)"), iTimeToDead - eFRS_TOWNSEC);
  473. return;
  474. }
  475. }
  476. //END_PREVENT_HACK
  477. ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
  478. ch->GetDesc()->SetPhase(PHASE_GAME);
  479. ch->SetPosition(POS_STANDING);
  480. ch->StartRecoveryEvent();
  481. //FORKED_LOAD
  482. //DESC: »ï°Å¸® ÀüÅõ½Ã ºÎȰÀ» ÇÒ°æ¿ì ¸ÊÀÇ ÀÔ±¸°¡ ¾Æ´Ñ »ï°Å¸® ÀüÅõÀÇ ½ÃÀÛÁöÁ¡À¸·Î À̵¿ÇÏ°Ô µÈ´Ù.
  483. if (1 == quest::CQuestManager::instance().GetEventFlag("threeway_war"))
  484. {
  485. if (subcmd == SCMD_RESTART_TOWN || subcmd == SCMD_RESTART_HERE)
  486. {
  487. if (true == CThreeWayWar::instance().IsThreeWayWarMapIndex(ch->GetMapIndex()) &&
  488. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  489. {
  490. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  491. ch->ReviveInvisible(5);
  492. #ifdef __PET_SYSTEM__
  493. ch->CheckPet();
  494. #endif
  495. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  496. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  497. return;
  498. }
  499. //¼ºÁö
  500. if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  501. {
  502. if (CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) <= 0)
  503. {
  504. ch->ChatInfoTrans(("¼ºÁö¿¡¼­ ºÎȰ ±âȸ¸¦ ¸ğµÎ ÀÒ¾ú½À´Ï´Ù! ¸¶À»·Î À̵¿ÇÕ´Ï´Ù!"));
  505. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  506. }
  507. else
  508. {
  509. ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire()));
  510. }
  511. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  512. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  513. ch->ReviveInvisible(5);
  514. #ifdef __PET_SYSTEM__
  515. ch->CheckPet();
  516. #endif
  517. return;
  518. }
  519. }
  520. }
  521. //END_FORKED_LOAD
  522. if (ch->GetDungeon())
  523. ch->GetDungeon()->UseRevive(ch);
  524. if (ch->GetWarMap() && !ch->IsObserverMode())
  525. {
  526. CWarMap * pMap = ch->GetWarMap();
  527. DWORD dwGuildOpponent = pMap ? pMap->GetGuildOpponent(ch) : 0;
  528. if (dwGuildOpponent)
  529. {
  530. switch (subcmd)
  531. {
  532. case SCMD_RESTART_TOWN:
  533. sys_log(0, "do_restart: restart town");
  534. PIXEL_POSITION pos;
  535. if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos))
  536. ch->Show(ch->GetMapIndex(), pos.x, pos.y);
  537. else
  538. ch->ExitToSavedLocation();
  539. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  540. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  541. ch->ReviveInvisible(5);
  542. #ifdef __PET_SYSTEM__
  543. ch->CheckPet();
  544. #endif
  545. break;
  546. case SCMD_RESTART_HERE:
  547. sys_log(0, "do_restart: restart here");
  548. ch->RestartAtSamePos();
  549. //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  550. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  551. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  552. ch->ReviveInvisible(5);
  553. #ifdef __PET_SYSTEM__
  554. ch->CheckPet();
  555. #endif
  556. break;
  557. }
  558. return;
  559. }
  560. }
  561. switch (subcmd)
  562. {
  563. case SCMD_RESTART_TOWN:
  564. sys_log(0, "do_restart: restart town");
  565. PIXEL_POSITION pos;
  566. if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(ch->GetMapIndex(), ch->GetEmpire(), pos))
  567. ch->WarpSet(pos.x, pos.y);
  568. else
  569. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  570. ch->PointChange(POINT_HP, 50 - ch->GetHP());
  571. ch->DeathPenalty(1);
  572. break;
  573. case SCMD_RESTART_HERE:
  574. sys_log(0, "do_restart: restart here");
  575. ch->RestartAtSamePos();
  576. //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  577. #ifdef FULL_HP_BORN
  578. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  579. #else
  580. ch->PointChange(POINT_HP, 50 - ch->GetHP());
  581. #endif
  582. #ifdef ENABLE_RONARK_SYSTEM
  583. if (CRonarkMapManager::instance().IsRonarkMap(ch->GetMapIndex()))
  584. {
  585. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  586. }
  587. #endif
  588. ch->DeathPenalty(0);
  589. ch->ReviveInvisible(5);
  590. #ifdef __PET_SYSTEM__
  591. ch->CheckPet();
  592. #endif
  593. break;
  594. }
  595. }
  596. #define MAX_STAT g_iStatusPointSetMaxValue
  597. ACMD(do_stat_reset)
  598. {
  599. ch->PointChange(POINT_STAT_RESET_COUNT, 12 - ch->GetPoint(POINT_STAT_RESET_COUNT));
  600. }
  601. ACMD(do_stat_minus)
  602. {
  603. char arg1[256];
  604. one_argument(argument, arg1, sizeof(arg1));
  605. if (!*arg1)
  606. return;
  607. if (ch->IsPolymorphed())
  608. {
  609. ch->ChatInfoTrans(("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
  610. return;
  611. }
  612. if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0)
  613. return;
  614. if (!strcmp(arg1, "st"))
  615. {
  616. if (ch->GetRealPoint(POINT_ST) <= JobInitialPoints[ch->GetJob()].st)
  617. return;
  618. ch->SetRealPoint(POINT_ST, ch->GetRealPoint(POINT_ST) - 1);
  619. ch->SetPoint(POINT_ST, ch->GetPoint(POINT_ST) - 1);
  620. ch->ComputePoints();
  621. ch->PointChange(POINT_ST, 0);
  622. }
  623. else if (!strcmp(arg1, "dx"))
  624. {
  625. if (ch->GetRealPoint(POINT_DX) <= JobInitialPoints[ch->GetJob()].dx)
  626. return;
  627. ch->SetRealPoint(POINT_DX, ch->GetRealPoint(POINT_DX) - 1);
  628. ch->SetPoint(POINT_DX, ch->GetPoint(POINT_DX) - 1);
  629. ch->ComputePoints();
  630. ch->PointChange(POINT_DX, 0);
  631. }
  632. else if (!strcmp(arg1, "ht"))
  633. {
  634. if (ch->GetRealPoint(POINT_HT) <= JobInitialPoints[ch->GetJob()].ht)
  635. return;
  636. ch->SetRealPoint(POINT_HT, ch->GetRealPoint(POINT_HT) - 1);
  637. ch->SetPoint(POINT_HT, ch->GetPoint(POINT_HT) - 1);
  638. ch->ComputePoints();
  639. ch->PointChange(POINT_HT, 0);
  640. ch->PointChange(POINT_MAX_HP, 0);
  641. }
  642. else if (!strcmp(arg1, "iq"))
  643. {
  644. if (ch->GetRealPoint(POINT_IQ) <= JobInitialPoints[ch->GetJob()].iq)
  645. return;
  646. ch->SetRealPoint(POINT_IQ, ch->GetRealPoint(POINT_IQ) - 1);
  647. ch->SetPoint(POINT_IQ, ch->GetPoint(POINT_IQ) - 1);
  648. ch->ComputePoints();
  649. ch->PointChange(POINT_IQ, 0);
  650. ch->PointChange(POINT_MAX_SP, 0);
  651. }
  652. else
  653. return;
  654. ch->PointChange(POINT_STAT, +1);
  655. ch->PointChange(POINT_STAT_RESET_COUNT, -1);
  656. ch->ComputePoints();
  657. }
  658. #ifdef ENABLE_HIZLI_STATU
  659. ACMD(do_stat_val)
  660. {
  661. char arg1[256], arg2[256];
  662. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  663. int val = 0;
  664. str_to_number(val, arg2);
  665. if (!*arg1 || val <= 0)
  666. return;
  667. if (ch->IsPolymorphed())
  668. {
  669. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot change your state as long as you are transformed."));
  670. return;
  671. }
  672. if (ch->GetPoint(POINT_STAT) <= 0)
  673. return;
  674. BYTE idx = 0;
  675. if (!strcmp(arg1, "st"))
  676. idx = POINT_ST;
  677. else if (!strcmp(arg1, "dx"))
  678. idx = POINT_DX;
  679. else if (!strcmp(arg1, "ht"))
  680. idx = POINT_HT;
  681. else if (!strcmp(arg1, "iq"))
  682. idx = POINT_IQ;
  683. else
  684. return;
  685. if (ch->GetRealPoint(idx) >= MAX_STAT)
  686. return;
  687. if (val > ch->GetPoint(POINT_STAT))
  688. val = ch->GetPoint(POINT_STAT);
  689. if (ch->GetRealPoint(idx) + val > MAX_STAT)
  690. val = MAX_STAT - ch->GetRealPoint(idx);
  691. ch->SetRealPoint(idx, ch->GetRealPoint(idx) + val);
  692. ch->SetPoint(idx, ch->GetPoint(idx) + val);
  693. ch->ComputePoints();
  694. ch->PointChange(idx, 0);
  695. if (idx == POINT_IQ)
  696. ch->PointChange(POINT_MAX_HP, 0);
  697. else if (idx == POINT_HT)
  698. ch->PointChange(POINT_MAX_SP, 0);
  699. ch->PointChange(POINT_STAT, -val);
  700. ch->ComputePoints();
  701. }
  702. #endif
  703. ACMD(do_stat)
  704. {
  705. char arg1[256];
  706. one_argument(argument, arg1, sizeof(arg1));
  707. if (!*arg1)
  708. return;
  709. if (ch->IsPolymorphed())
  710. {
  711. ch->ChatInfoTrans(("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
  712. return;
  713. }
  714. if (ch->GetPoint(POINT_STAT) <= 0)
  715. return;
  716. BYTE idx = 0;
  717. if (!strcmp(arg1, "st"))
  718. idx = POINT_ST;
  719. else if (!strcmp(arg1, "dx"))
  720. idx = POINT_DX;
  721. else if (!strcmp(arg1, "ht"))
  722. idx = POINT_HT;
  723. else if (!strcmp(arg1, "iq"))
  724. idx = POINT_IQ;
  725. else
  726. return;
  727. // ch->ChatPacket(CHAT_TYPE_INFO, "%s GRP(%d) idx(%u), MAX_STAT(%d), expr(%d)", __FUNCTION__, ch->GetRealPoint(idx), idx, MAX_STAT, ch->GetRealPoint(idx) >= MAX_STAT);
  728. if (ch->GetRealPoint(idx) >= MAX_STAT)
  729. return;
  730. ch->SetRealPoint(idx, ch->GetRealPoint(idx) + 1);
  731. ch->SetPoint(idx, ch->GetPoint(idx) + 1);
  732. ch->ComputePoints();
  733. ch->PointChange(idx, 0);
  734. if (idx == POINT_IQ)
  735. {
  736. ch->PointChange(POINT_MAX_HP, 0);
  737. }
  738. else if (idx == POINT_HT)
  739. {
  740. ch->PointChange(POINT_MAX_SP, 0);
  741. }
  742. ch->PointChange(POINT_STAT, -1);
  743. ch->ComputePoints();
  744. }
  745. ACMD(do_pvp)
  746. {
  747. if (ch->GetArena() != NULL || CArenaManager::instance().IsArenaMap(ch->GetMapIndex()) == true)
  748. {
  749. ch->ChatInfoTrans(("´ë·ÃÀå¿¡¼­ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
  750. return;
  751. }
  752. char arg1[256];
  753. one_argument(argument, arg1, sizeof(arg1));
  754. DWORD vid = 0;
  755. str_to_number(vid, arg1);
  756. LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);
  757. if (!pkVictim)
  758. return;
  759. if (pkVictim->IsNPC())
  760. return;
  761. if (pkVictim->GetArena() != NULL)
  762. {
  763. pkVictim->ChatInfoTrans(("»ó´ë¹æÀÌ ´ë·ÃÁßÀÔ´Ï´Ù."));
  764. return;
  765. }
  766. CPVPManager::instance().Insert(ch, pkVictim);
  767. }
  768. ACMD(do_guildskillup)
  769. {
  770. char arg1[256];
  771. one_argument(argument, arg1, sizeof(arg1));
  772. if (!*arg1)
  773. return;
  774. if (!ch->GetGuild())
  775. {
  776. ch->ChatInfoTrans(("<±æµå> ±æµå¿¡ ¼ÓÇØÀÖÁö ¾Ê½À´Ï´Ù."));
  777. return;
  778. }
  779. CGuild* g = ch->GetGuild();
  780. TGuildMember* gm = g->GetMember(ch->GetPlayerID());
  781. if (gm->grade == GUILD_LEADER_GRADE)
  782. {
  783. DWORD vnum = 0;
  784. str_to_number(vnum, arg1);
  785. g->SkillLevelUp(vnum);
  786. }
  787. else
  788. {
  789. ch->ChatInfoTrans(("<±æµå> ±æµå ½ºÅ³ ·¹º§À» º¯°æÇÒ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
  790. }
  791. }
  792. ACMD(do_skillup)
  793. {
  794. char arg1[256];
  795. one_argument(argument, arg1, sizeof(arg1));
  796. if (!*arg1)
  797. return;
  798. DWORD vnum = 0;
  799. str_to_number(vnum, arg1);
  800. if (true == ch->CanUseSkill(vnum))
  801. {
  802. ch->SkillLevelUp(vnum);
  803. }
  804. else
  805. {
  806. switch(vnum)
  807. {
  808. case SKILL_HORSE_WILDATTACK:
  809. case SKILL_HORSE_CHARGE:
  810. case SKILL_HORSE_ESCAPE:
  811. case SKILL_HORSE_WILDATTACK_RANGE:
  812. case SKILL_7_A_ANTI_TANHWAN:
  813. case SKILL_7_B_ANTI_AMSEOP:
  814. case SKILL_7_C_ANTI_SWAERYUNG:
  815. case SKILL_7_D_ANTI_YONGBI:
  816. case SKILL_8_A_ANTI_GIGONGCHAM:
  817. case SKILL_8_B_ANTI_YEONSA:
  818. case SKILL_8_C_ANTI_MAHWAN:
  819. case SKILL_8_D_ANTI_BYEURAK:
  820. case SKILL_ADD_HP:
  821. case SKILL_RESIST_PENETRATE:
  822. ch->SkillLevelUp(vnum);
  823. break;
  824. }
  825. }
  826. }
  827. //
  828. // @version 05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
  829. //
  830. ACMD(do_safebox_close)
  831. {
  832. ch->CloseSafebox();
  833. }
  834. //
  835. // @version 05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
  836. //
  837. ACMD(do_safebox_password)
  838. {
  839. char arg1[256];
  840. one_argument(argument, arg1, sizeof(arg1));
  841. ch->ReqSafeboxLoad(arg1);
  842. }
  843. ACMD(do_safebox_change_password)
  844. {
  845. char arg1[256];
  846. char arg2[256];
  847. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  848. if (!*arg1 || strlen(arg1)>6)
  849. {
  850. ch->ChatInfoTrans(("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
  851. return;
  852. }
  853. if (!*arg2 || strlen(arg2)>6)
  854. {
  855. ch->ChatInfoTrans(("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
  856. return;
  857. }
  858. TSafeboxChangePasswordPacket p;
  859. p.dwID = ch->GetDesc()->GetAccountTable().id;
  860. strlcpy(p.szOldPassword, arg1, sizeof(p.szOldPassword));
  861. strlcpy(p.szNewPassword, arg2, sizeof(p.szNewPassword));
  862. db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_CHANGE_PASSWORD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
  863. }
  864. ACMD(do_mall_password)
  865. {
  866. char arg1[256];
  867. one_argument(argument, arg1, sizeof(arg1));
  868. if (!*arg1 || strlen(arg1) > 6)
  869. {
  870. ch->ChatInfoTrans(("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
  871. return;
  872. }
  873. int iPulse = thecore_pulse();
  874. if (ch->GetMall())
  875. {
  876. ch->ChatInfoTrans(("<â°í> â°í°¡ ÀÌ¹Ì ¿­·ÁÀÖ½À´Ï´Ù."));
  877. return;
  878. }
  879. if (iPulse - ch->GetMallLoadTime() < passes_per_sec * 10) // 10ÃÊ¿¡ Çѹø¸¸ ¿äû °¡´É
  880. {
  881. ch->ChatInfoTrans(("<â°í> â°í¸¦ ´İÀºÁö 10ÃÊ ¾È¿¡´Â ¿­ ¼ö ¾ø½À´Ï´Ù."));
  882. return;
  883. }
  884. ch->SetMallLoadTime(iPulse);
  885. TSafeboxLoadPacket p;
  886. p.dwID = ch->GetDesc()->GetAccountTable().id;
  887. strlcpy(p.szLogin, ch->GetDesc()->GetAccountTable().login, sizeof(p.szLogin));
  888. strlcpy(p.szPassword, arg1, sizeof(p.szPassword));
  889. db_clientdesc->DBPacket(HEADER_GD_MALL_LOAD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
  890. }
  891. ACMD(do_mall_close)
  892. {
  893. if (ch->GetMall())
  894. {
  895. ch->SetMallLoadTime(thecore_pulse());
  896. ch->CloseMall();
  897. ch->Save();
  898. }
  899. }
  900. ACMD(do_ungroup)
  901. {
  902. if (!ch->GetParty())
  903. return;
  904. if (!CPartyManager::instance().IsEnablePCParty())
  905. {
  906. ch->ChatInfoTrans(("<ÆÄƼ> ¼­¹ö ¹®Á¦·Î ÆÄƼ °ü·Ã 󸮸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  907. return;
  908. }
  909. if (ch->GetDungeon())
  910. {
  911. ch->ChatInfoTrans(("<ÆÄƼ> ´øÀü ¾È¿¡¼­´Â ÆÄƼ¿¡¼­ ³ª°¥ ¼ö ¾ø½À´Ï´Ù."));
  912. return;
  913. }
  914. LPPARTY pParty = ch->GetParty();
  915. if (pParty->GetMemberCount() == 2)
  916. {
  917. // party disband
  918. CPartyManager::instance().DeleteParty(pParty);
  919. }
  920. else
  921. {
  922. ch->ChatInfoTrans(("<ÆÄƼ> ÆÄƼ¿¡¼­ ³ª°¡¼Ì½À´Ï´Ù."));
  923. //pParty->SendPartyRemoveOneToAll(ch);
  924. pParty->Quit(ch->GetPlayerID());
  925. //pParty->SendPartyRemoveAllToOne(ch);
  926. }
  927. }
  928. ACMD(do_close_shop)
  929. {
  930. if (ch->GetMyShop())
  931. {
  932. ch->CloseMyShop();
  933. return;
  934. }
  935. }
  936. ACMD(do_set_walk_mode)
  937. {
  938. ch->SetNowWalking(true);
  939. ch->SetWalking(true);
  940. }
  941. ACMD(do_set_run_mode)
  942. {
  943. ch->SetNowWalking(false);
  944. ch->SetWalking(false);
  945. }
  946. ACMD(do_war)
  947. {
  948. //³» ±æµå Á¤º¸¸¦ ¾ò¾î¿À°í
  949. CGuild* g = ch->GetGuild();
  950. if (!g)
  951. return;
  952. //ÀüÀïÁßÀÎÁö üũÇѹø!
  953. if (g->UnderAnyWar())
  954. {
  955. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ´Ù¸¥ ÀüÀï¿¡ ÂüÀü Áß ÀÔ´Ï´Ù."));
  956. return;
  957. }
  958. //ÆÄ¶ó¸ŞÅ͸¦ µÎ¹è·Î ³ª´©°í
  959. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  960. char arg1[256], arg2[256], arg3[256], arg4[256];
  961. one_argument(three_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2), arg3, sizeof(arg3)), arg4, sizeof(arg4));
  962. #else
  963. char arg1[256], arg2[256];
  964. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  965. #endif
  966. DWORD type = GUILD_WAR_TYPE_FIELD; //@fixme101
  967. if (!*arg1)
  968. return;
  969. if (*arg2)
  970. {
  971. str_to_number(type, arg2);
  972. if (type >= GUILD_WAR_TYPE_MAX_NUM)
  973. type = GUILD_WAR_TYPE_FIELD;
  974. if (type < 0)// @fixme146
  975. return;
  976. }
  977. //±æµåÀÇ ¸¶½ºÅÍ ¾ÆÀ̵𸦠¾ò¾î¿ÂµÚ
  978. DWORD gm_pid = g->GetMasterPID();
  979. //¸¶½ºÅÍÀÎÁö üũ(±æÀüÀº ±æµåÀ常ÀÌ °¡´É)
  980. if (gm_pid != ch->GetPlayerID())
  981. {
  982. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
  983. return;
  984. }
  985. //»ó´ë ±æµå¸¦ ¾ò¾î¿À°í
  986. CGuild* opp_g = CGuildManager::instance().FindGuildByName(arg1);
  987. if (!opp_g)
  988. {
  989. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
  990. return;
  991. }
  992. //»ó´ë±æµå¿ÍÀÇ »óÅ üũ
  993. switch (g->GetGuildWarState(opp_g->GetID()))
  994. {
  995. case GUILD_WAR_NONE:
  996. {
  997. if (opp_g->UnderAnyWar())
  998. {
  999. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
  1000. return;
  1001. }
  1002. int iWarPrice = KOR_aGuildWarInfo[type].iWarPrice;
  1003. if (g->GetGuildMoney() < iWarPrice)
  1004. {
  1005. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1006. return;
  1007. }
  1008. if (opp_g->GetGuildMoney() < iWarPrice)
  1009. {
  1010. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1011. return;
  1012. }
  1013. }
  1014. break;
  1015. case GUILD_WAR_SEND_DECLARE:
  1016. {
  1017. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì ¼±ÀüÆ÷°í ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
  1018. return;
  1019. }
  1020. break;
  1021. case GUILD_WAR_RECV_DECLARE:
  1022. {
  1023. if (opp_g->UnderAnyWar())
  1024. {
  1025. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
  1026. g->RequestRefuseWar(opp_g->GetID()
  1027. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1028. , 0, 0, 0
  1029. #endif
  1030. );
  1031. return;
  1032. }
  1033. }
  1034. break;
  1035. case GUILD_WAR_RESERVE:
  1036. {
  1037. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀïÀÌ ¿¹¾àµÈ ±æµå ÀÔ´Ï´Ù."));
  1038. return;
  1039. }
  1040. break;
  1041. case GUILD_WAR_END:
  1042. return;
  1043. default:
  1044. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀï ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
  1045. g->RequestRefuseWar(opp_g->GetID()
  1046. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1047. , 0, 0, 0
  1048. #endif
  1049. );
  1050. return;
  1051. }
  1052. if (!g->CanStartWar(type))
  1053. {
  1054. // ±æµåÀüÀ» ÇÒ ¼ö ÀÖ´Â Á¶°ÇÀ» ¸¸Á·ÇÏÁö¾Ê´Â´Ù.
  1055. if (g->GetLadderPoint() == 0)
  1056. {
  1057. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼­ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1058. sys_log(0, "GuildWar.StartError.NEED_LADDER_POINT");
  1059. }
  1060. else if (g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
  1061. {
  1062. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀüÀ» Çϱâ À§Çؼ± ÃÖ¼ÒÇÑ %d¸íÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù."), GUILD_WAR_MIN_MEMBER_COUNT);
  1063. sys_log(0, "GuildWar.StartError.NEED_MINIMUM_MEMBER[%d]", GUILD_WAR_MIN_MEMBER_COUNT);
  1064. }
  1065. else
  1066. {
  1067. sys_log(0, "GuildWar.StartError.UNKNOWN_ERROR");
  1068. }
  1069. return;
  1070. }
  1071. // ÇʵåÀü üũ¸¸ ÇÏ°í ¼¼¼¼ÇÑ Ã¼Å©´Â »ó´ë¹æÀÌ ½Â³«ÇÒ¶§ ÇÑ´Ù.
  1072. if (!opp_g->CanStartWar(GUILD_WAR_TYPE_FIELD))
  1073. {
  1074. if (opp_g->GetLadderPoint() == 0)
  1075. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼­ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1076. else if (opp_g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
  1077. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµå¿ø ¼ö°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1078. return;
  1079. }
  1080. do
  1081. {
  1082. if (g->GetMasterCharacter() != NULL)
  1083. break;
  1084. CCI* pCCI = P2P_MANAGER::instance().FindByPID(g->GetMasterPID());
  1085. if (pCCI != NULL)
  1086. break;
  1087. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
  1088. g->RequestRefuseWar(opp_g->GetID()
  1089. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1090. , 0, 0, 0
  1091. #endif
  1092. );
  1093. return;
  1094. } while (false);
  1095. do
  1096. {
  1097. if (opp_g->GetMasterCharacter() != NULL)
  1098. break;
  1099. CCI* pCCI = P2P_MANAGER::instance().FindByPID(opp_g->GetMasterPID());
  1100. if (pCCI != NULL)
  1101. break;
  1102. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
  1103. g->RequestRefuseWar(opp_g->GetID()
  1104. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1105. , 0, 0, 0
  1106. #endif
  1107. );
  1108. return;
  1109. } while (false);
  1110. // #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1111. // int iMaxPlayer = 0;
  1112. // if (!*arg3) iMaxPlayer = 1000;
  1113. // else str_to_number(iMaxPlayer, arg3);
  1114. // if (iMaxPlayer < 1) iMaxPlayer = 1000;
  1115. // int iMaxScore = 0;
  1116. // if (!*arg4) iMaxScore = KOR_aGuildWarInfo[type].iEndScore;
  1117. // else str_to_number(iMaxScore, arg4);
  1118. // if (iMaxScore < 1) iMaxScore = KOR_aGuildWarInfo[type].iEndScore;
  1119. // g->RequestDeclareWar(opp_g->GetID(), type, iMaxPlayer, iMaxScore);
  1120. // #else
  1121. // g->RequestDeclareWar(opp_g->GetID(), type);
  1122. // #endif
  1123. }
  1124. ACMD(do_nowar)
  1125. {
  1126. CGuild* g = ch->GetGuild();
  1127. if (!g)
  1128. return;
  1129. char arg1[256];
  1130. one_argument(argument, arg1, sizeof(arg1));
  1131. if (!*arg1)
  1132. return;
  1133. DWORD gm_pid = g->GetMasterPID();
  1134. if (gm_pid != ch->GetPlayerID())
  1135. {
  1136. ch->ChatInfoTrans(("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
  1137. return;
  1138. }
  1139. CGuild* opp_g = CGuildManager::instance().FindGuildByName(arg1);
  1140. if (!opp_g)
  1141. {
  1142. ch->ChatInfoTrans(("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
  1143. return;
  1144. }
  1145. g->RequestRefuseWar(opp_g->GetID()
  1146. #ifdef ENABLE_IMPROVED_GUILD_WAR_SYSTEM
  1147. , 0, 0, 0
  1148. #endif
  1149. );
  1150. }
  1151. ACMD(do_detaillog)
  1152. {
  1153. ch->DetailLog();
  1154. }
  1155. ACMD(do_monsterlog)
  1156. {
  1157. ch->ToggleMonsterLog();
  1158. }
  1159. ACMD(do_pkmode)
  1160. {
  1161. char arg1[256];
  1162. one_argument(argument, arg1, sizeof(arg1));
  1163. if (!*arg1)
  1164. return;
  1165. if (!ch->IsGM() && ch->GetMapIndex() == 64)
  1166. {
  1167. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1168. return;
  1169. }
  1170. if (!ch->IsGM() && ch->GetMapIndex() == 28)
  1171. {
  1172. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1173. return;
  1174. }
  1175. if (!ch->IsGM() && ch->GetMapIndex() == 512)
  1176. {
  1177. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1178. return;
  1179. }
  1180. if (!ch->IsGM() && ch->GetMapIndex() == 73)
  1181. {
  1182. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1183. return;
  1184. }
  1185. if (!ch->IsGM() && ch->GetMapIndex() == 241)
  1186. {
  1187. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1188. return;
  1189. }
  1190. {
  1191. ch->ChatPacket(CHAT_TYPE_INFO, "Yalnizca GameMaster'lar serbest moduna alabilirler!");
  1192. return;
  1193. }
  1194. if (!ch->IsGM() && ch->GetMapIndex() == 515)
  1195. {
  1196. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yalnizca GameMaster'lar serbest moduna alabilirler!"));
  1197. return;
  1198. }
  1199. if (!ch->IsGM() && ch->GetMapIndex() == 510)
  1200. {
  1201. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yalnizca GameMaster'lar serbest moduna alabilirler!"));
  1202. return;
  1203. }
  1204. #ifdef PK_MODE_FIX
  1205. if (MapManager::instance().IsPvpMapp(ch))
  1206. {
  1207. ch->ChatInfoTrans(("Bu haritada bu ozelligi kullanamam."));
  1208. return;
  1209. }
  1210. #endif
  1211. BYTE mode = 0;
  1212. str_to_number(mode, arg1);
  1213. if (mode == PK_MODE_PROTECT)
  1214. return;
  1215. if (ch->GetLevel() < PK_PROTECT_LEVEL && mode != 0)
  1216. return;
  1217. ch->SetPKMode(mode);
  1218. }
  1219. ACMD(do_messenger_auth)
  1220. {
  1221. if (ch->GetArena())
  1222. {
  1223. ch->ChatInfoTrans(("´ë·ÃÀå¿¡¼­ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
  1224. return;
  1225. }
  1226. char arg1[256], arg2[256];
  1227. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1228. if (!*arg1 || !*arg2)
  1229. return;
  1230. char answer = LOWER(*arg1);
  1231. // @fixme130 AuthToAdd void -> bool
  1232. bool bIsDenied = answer != 'y';
  1233. bool bIsAdded = MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, bIsDenied); // DENY
  1234. if (bIsAdded && bIsDenied)
  1235. {
  1236. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2);
  1237. if (tch)
  1238. tch->ChatInfoTrans(("%s ´ÔÀ¸·Î ºÎÅÍ Ä£±¸ µî·ÏÀ» °ÅºÎ ´çÇß½À´Ï´Ù."), ch->GetStringName().c_str());
  1239. }
  1240. }
  1241. ACMD(do_setblockmode)
  1242. {
  1243. char arg1[256];
  1244. one_argument(argument, arg1, sizeof(arg1));
  1245. if (*arg1)
  1246. {
  1247. BYTE flag = 0;
  1248. str_to_number(flag, arg1);
  1249. ch->SetBlockMode(flag);
  1250. }
  1251. }
  1252. ACMD(do_unmount)
  1253. {
  1254. if (true == ch->UnEquipSpecialRideUniqueItem())
  1255. {
  1256. ch->RemoveAffect(AFFECT_MOUNT);
  1257. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  1258. if (ch->IsHorseRiding())
  1259. {
  1260. ch->StopRiding();
  1261. }
  1262. }
  1263. else
  1264. {
  1265. ch->ChatInfoTrans(("Àκ¥Å丮°¡ ²Ë Â÷¼­ ³»¸± ¼ö ¾ø½À´Ï´Ù."));
  1266. }
  1267. }
  1268. ACMD(do_observer_exit)
  1269. {
  1270. if (ch->IsObserverMode())
  1271. {
  1272. if (ch->GetWarMap())
  1273. ch->SetWarMap(NULL);
  1274. if (ch->GetArena() != NULL || ch->GetArenaObserverMode() == true)
  1275. {
  1276. ch->SetArenaObserverMode(false);
  1277. if (ch->GetArena() != NULL)
  1278. ch->GetArena()->RemoveObserver(ch->GetPlayerID());
  1279. ch->SetArena(NULL);
  1280. ch->WarpSet(ARENA_RETURN_POINT_X(ch->GetEmpire()), ARENA_RETURN_POINT_Y(ch->GetEmpire()));
  1281. }
  1282. else
  1283. {
  1284. ch->ExitToSavedLocation();
  1285. }
  1286. ch->SetObserverMode(false);
  1287. }
  1288. }
  1289. ACMD(do_view_equip)
  1290. {
  1291. if (ch->GetGMLevel() <= GM_PLAYER)
  1292. return;
  1293. char arg1[256];
  1294. one_argument(argument, arg1, sizeof(arg1));
  1295. if (*arg1)
  1296. {
  1297. DWORD vid = 0;
  1298. str_to_number(vid, arg1);
  1299. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  1300. if (!tch)
  1301. return;
  1302. if (!tch->IsPC())
  1303. return;
  1304. /*
  1305. int iSPCost = ch->GetMaxSP() / 3;
  1306. if (ch->GetSP() < iSPCost)
  1307. {
  1308. ch->ChatInfoTrans(("Á¤½Å·ÂÀÌ ºÎÁ·ÇÏ¿© ´Ù¸¥ »ç¶÷ÀÇ Àåºñ¸¦ º¼ ¼ö ¾ø½À´Ï´Ù."));
  1309. return;
  1310. }
  1311. ch->PointChange(POINT_SP, -iSPCost);
  1312. */
  1313. tch->SendEquipment(ch);
  1314. }
  1315. }
  1316. ACMD(do_party_request)
  1317. {
  1318. if (ch->GetArena())
  1319. {
  1320. ch->ChatInfoTrans(("´ë·ÃÀå¿¡¼­ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
  1321. return;
  1322. }
  1323. if (ch->GetParty())
  1324. {
  1325. ch->ChatInfoTrans(("ÀÌ¹Ì ÆÄƼ¿¡ ¼ÓÇØ ÀÖÀ¸¹Ç·Î °¡ÀÔ½ÅûÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
  1326. return;
  1327. }
  1328. char arg1[256];
  1329. one_argument(argument, arg1, sizeof(arg1));
  1330. if (!*arg1)
  1331. return;
  1332. DWORD vid = 0;
  1333. str_to_number(vid, arg1);
  1334. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  1335. if (tch)
  1336. if (!ch->RequestToParty(tch))
  1337. ch->ChatPacket(CHAT_TYPE_COMMAND, "PartyRequestDenied");
  1338. }
  1339. ACMD(do_party_request_accept)
  1340. {
  1341. char arg1[256];
  1342. one_argument(argument, arg1, sizeof(arg1));
  1343. if (!*arg1)
  1344. return;
  1345. DWORD vid = 0;
  1346. str_to_number(vid, arg1);
  1347. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  1348. if (tch)
  1349. ch->AcceptToParty(tch);
  1350. }
  1351. ACMD(do_party_request_deny)
  1352. {
  1353. char arg1[256];
  1354. one_argument(argument, arg1, sizeof(arg1));
  1355. if (!*arg1)
  1356. return;
  1357. DWORD vid = 0;
  1358. str_to_number(vid, arg1);
  1359. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  1360. if (tch)
  1361. ch->DenyToParty(tch);
  1362. }
  1363. // LUA_ADD_GOTO_INFO
  1364. struct GotoInfo
  1365. {
  1366. std::string st_name;
  1367. BYTE empire;
  1368. int mapIndex;
  1369. DWORD x, y;
  1370. GotoInfo()
  1371. {
  1372. st_name = "";
  1373. empire = 0;
  1374. mapIndex = 0;
  1375. x = 0;
  1376. y = 0;
  1377. }
  1378. GotoInfo(const GotoInfo& c_src)
  1379. {
  1380. __copy__(c_src);
  1381. }
  1382. void operator = (const GotoInfo& c_src)
  1383. {
  1384. __copy__(c_src);
  1385. }
  1386. void __copy__(const GotoInfo& c_src)
  1387. {
  1388. st_name = c_src.st_name;
  1389. empire = c_src.empire;
  1390. mapIndex = c_src.mapIndex;
  1391. x = c_src.x;
  1392. y = c_src.y;
  1393. }
  1394. };
  1395. static const char* FN_point_string(int apply_number)
  1396. {
  1397. switch (apply_number)
  1398. {
  1399. case POINT_MAX_HP: return LC_TEXT_TRANS("ÃÖ´ë »ı¸í·Â +%d", "en");
  1400. case POINT_MAX_SP: return LC_TEXT_TRANS("ÃÖ´ë Á¤½Å·Â +%d", "en");
  1401. case POINT_HT: return LC_TEXT_TRANS("ü·Â +%d", "en");
  1402. case POINT_IQ: return LC_TEXT_TRANS("Áö´É +%d", "en");
  1403. case POINT_ST: return LC_TEXT_TRANS("±Ù·Â +%d", "en");
  1404. case POINT_DX: return LC_TEXT_TRANS("¹Îø +%d", "en");
  1405. case POINT_ATT_SPEED: return LC_TEXT_TRANS("°ø°İ¼Óµµ +%d", "en");
  1406. case POINT_MOV_SPEED: return LC_TEXT_TRANS("À̵¿¼Óµµ %d", "en");
  1407. case POINT_CASTING_SPEED: return LC_TEXT_TRANS("ÄğŸÀÓ -%d", "en");
  1408. case POINT_HP_REGEN: return LC_TEXT_TRANS("»ı¸í·Â ȸº¹ +%d", "en");
  1409. case POINT_SP_REGEN: return LC_TEXT_TRANS("Á¤½Å·Â ȸº¹ +%d", "en");
  1410. case POINT_POISON_PCT: return LC_TEXT_TRANS("µ¶°ø°İ %d", "en");
  1411. #ifdef ENABLE_WOLFMAN_CHARACTER
  1412. case POINT_BLEEDING_PCT: return LC_TEXT_TRANS("µ¶°ø°İ %d", "en");
  1413. #endif
  1414. case POINT_STUN_PCT: return LC_TEXT_TRANS("½ºÅÏ +%d", "en");
  1415. case POINT_SLOW_PCT: return LC_TEXT_TRANS("½½·Î¿ì +%d", "en");
  1416. case POINT_CRITICAL_PCT: return LC_TEXT_TRANS("%d%% È®·ü·Î Ä¡¸íŸ °ø°İ", "en");
  1417. case POINT_RESIST_CRITICAL: return LC_TEXT_TRANS("»ó´ëÀÇ Ä¡¸íŸ È®·ü %d%% °¨¼Ò", "en");
  1418. case POINT_PENETRATE_PCT: return LC_TEXT_TRANS("%d%% È®·ü·Î °üÅë °ø°İ", "en");
  1419. case POINT_RESIST_PENETRATE: return LC_TEXT_TRANS("»ó´ëÀÇ °üÅë °ø°İ È®·ü %d%% °¨¼Ò", "en");
  1420. case POINT_ATTBONUS_HUMAN: return LC_TEXT_TRANS("Àΰ£·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%", "en");
  1421. case POINT_ATTBONUS_ANIMAL: return LC_TEXT_TRANS("µ¿¹°·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%", "en");
  1422. case POINT_ATTBONUS_ORC: return LC_TEXT_TRANS("¿õ±ÍÁ· Ÿ°İÄ¡ +%d%%", "en");
  1423. case POINT_ATTBONUS_MILGYO: return LC_TEXT_TRANS("¹Ğ±³·ù Ÿ°İÄ¡ +%d%%", "en");
  1424. case POINT_ATTBONUS_UNDEAD: return LC_TEXT_TRANS("½Ãü·ù Ÿ°İÄ¡ +%d%%", "en");
  1425. case POINT_ATTBONUS_DEVIL: return LC_TEXT_TRANS("¾Ç¸¶·ù Ÿ°İÄ¡ +%d%%", "en");
  1426. case POINT_STEAL_HP: return LC_TEXT_TRANS("Ÿ°İÄ¡ %d%% ¸¦ »ı¸í·ÂÀ¸·Î Èí¼ö", "en");
  1427. case POINT_STEAL_SP: return LC_TEXT_TRANS("Ÿ·ÂÄ¡ %d%% ¸¦ Á¤½Å·ÂÀ¸·Î Èí¼ö", "en");
  1428. case POINT_MANA_BURN_PCT: return LC_TEXT_TRANS("%d%% È®·ü·Î Ÿ°İ½Ã »ó´ë Àü½Å·Â ¼Ò¸ğ", "en");
  1429. case POINT_DAMAGE_SP_RECOVER: return LC_TEXT_TRANS("%d%% È®·ü·Î ÇÇÇØ½Ã Á¤½Å·Â ȸº¹", "en");
  1430. case POINT_BLOCK: return LC_TEXT_TRANS("¹°¸®Å¸°İ½Ã ºí·° È®·ü %d%%", "en");
  1431. case POINT_DODGE: return LC_TEXT_TRANS("Ȱ °ø°İ ȸÇÇ È®·ü %d%%", "en");
  1432. case POINT_RESIST_SWORD: return LC_TEXT_TRANS("ÇÑ¼Õ°Ë ¹æ¾î %d%%", "en");
  1433. case POINT_RESIST_TWOHAND: return LC_TEXT_TRANS("¾ç¼Õ°Ë ¹æ¾î %d%%", "en");
  1434. case POINT_RESIST_DAGGER: return LC_TEXT_TRANS("µÎ¼Õ°Ë ¹æ¾î %d%%", "en");
  1435. case POINT_RESIST_BELL: return LC_TEXT_TRANS("¹æ¿ï ¹æ¾î %d%%", "en");
  1436. case POINT_RESIST_FAN: return LC_TEXT_TRANS("ºÎä ¹æ¾î %d%%", "en");
  1437. case POINT_RESIST_BOW: return LC_TEXT_TRANS("Ȱ°ø°İ ÀúÇ× %d%%", "en");
  1438. #ifdef ENABLE_WOLFMAN_CHARACTER
  1439. case POINT_RESIST_CLAW: return LC_TEXT_TRANS("µÎ¼Õ°Ë ¹æ¾î %d%%", "en");
  1440. #endif
  1441. case POINT_RESIST_FIRE: return LC_TEXT_TRANS("È­¿° ÀúÇ× %d%%", "en");
  1442. case POINT_RESIST_ELEC: return LC_TEXT_TRANS("Àü±â ÀúÇ× %d%%", "en");
  1443. case POINT_RESIST_MAGIC: return LC_TEXT_TRANS("¸¶¹ı ÀúÇ× %d%%", "en");
  1444. #ifdef ENABLE_MAGIC_REDUCTION_SYSTEM
  1445. case POINT_RESIST_MAGIC_REDUCTION: return LC_TEXT_TRANS("¸¶¹ı ÀúÇ× %d%%", "en");
  1446. #endif
  1447. case POINT_RESIST_WIND: return LC_TEXT_TRANS("¹Ù¶÷ ÀúÇ× %d%%", "en");
  1448. case POINT_RESIST_ICE: return LC_TEXT_TRANS("³Ã±â ÀúÇ× %d%%", "en");
  1449. case POINT_RESIST_EARTH: return LC_TEXT_TRANS("´ëÁö ÀúÇ× %d%%", "en");
  1450. case POINT_RESIST_DARK: return LC_TEXT_TRANS("¾îµÒ ÀúÇ× %d%%", "en");
  1451. case POINT_REFLECT_MELEE: return LC_TEXT_TRANS("Á÷Á¢ Ÿ°İÄ¡ ¹İ»ç È®·ü : %d%%", "en");
  1452. case POINT_REFLECT_CURSE: return LC_TEXT_TRANS("ÀúÁÖ µÇµ¹¸®±â È®·ü %d%%", "en");
  1453. case POINT_POISON_REDUCE: return LC_TEXT_TRANS("µ¶ ÀúÇ× %d%%", "en");
  1454. #ifdef ENABLE_WOLFMAN_CHARACTER
  1455. case POINT_BLEEDING_REDUCE: return LC_TEXT_TRANS("µ¶ ÀúÇ× %d%%", "en");
  1456. #endif
  1457. case POINT_KILL_SP_RECOVER: return LC_TEXT_TRANS("%d%% È®·ü·Î ÀûÅğÄ¡½Ã Á¤½Å·Â ȸº¹", "en");
  1458. case POINT_EXP_DOUBLE_BONUS: return LC_TEXT_TRANS("%d%% È®·ü·Î ÀûÅğÄ¡½Ã °æÇèÄ¡ Ãß°¡ »ó½Â", "en");
  1459. case POINT_GOLD_DOUBLE_BONUS: return LC_TEXT_TRANS("%d%% È®·ü·Î ÀûÅğÄ¡½Ã µ· 2¹è µå·Ó", "en");
  1460. case POINT_ITEM_DROP_BONUS: return LC_TEXT_TRANS("%d%% È®·ü·Î ÀûÅğÄ¡½Ã ¾ÆÀÌÅÛ 2¹è µå·Ó", "en");
  1461. case POINT_POTION_BONUS: return LC_TEXT_TRANS("¹°¾à »ç¿ë½Ã %d%% ¼º´É Áõ°¡", "en");
  1462. case POINT_KILL_HP_RECOVERY: return LC_TEXT_TRANS("%d%% È®·ü·Î ÀûÅğÄ¡½Ã »ı¸í·Â ȸº¹", "en");
  1463. // case POINT_IMMUNE_STUN: return LC_TEXT_TRANS("±âÀıÇÏÁö ¾ÊÀ½ %d%%");
  1464. // case POINT_IMMUNE_SLOW: return LC_TEXT_TRANS("´À·ÁÁöÁö ¾ÊÀ½ %d%%");
  1465. // case POINT_IMMUNE_FALL: return LC_TEXT_TRANS("³Ñ¾îÁöÁö ¾ÊÀ½ %d%%");
  1466. // case POINT_SKILL: return LC_TEXT_TRANS("");
  1467. // case POINT_BOW_DISTANCE: return LC_TEXT_TRANS("");
  1468. case POINT_ATT_GRADE_BONUS: return LC_TEXT_TRANS("°ø°İ·Â +%d", "en");
  1469. case POINT_DEF_GRADE_BONUS: return LC_TEXT_TRANS("¹æ¾î·Â +%d", "en");
  1470. case POINT_MAGIC_ATT_GRADE: return LC_TEXT_TRANS("¸¶¹ı °ø°İ·Â +%d", "en");
  1471. case POINT_MAGIC_DEF_GRADE: return LC_TEXT_TRANS("¸¶¹ı ¹æ¾î·Â +%d", "en");
  1472. // case POINT_CURSE_PCT: return LC_TEXT_TRANS("");
  1473. case POINT_MAX_STAMINA: return LC_TEXT_TRANS("ÃÖ´ë Áö±¸·Â +%d", "en");
  1474. case POINT_ATTBONUS_WARRIOR: return LC_TEXT_TRANS("¹«»ç¿¡°Ô °­ÇÔ +%d%%", "en");
  1475. case POINT_ATTBONUS_ASSASSIN: return LC_TEXT_TRANS("ÀÚ°´¿¡°Ô °­ÇÔ +%d%%", "en");
  1476. case POINT_ATTBONUS_SURA: return LC_TEXT_TRANS("¼ö¶ó¿¡°Ô °­ÇÔ +%d%%", "en");
  1477. case POINT_ATTBONUS_SHAMAN: return LC_TEXT_TRANS("¹«´ç¿¡°Ô °­ÇÔ +%d%%", "en");
  1478. #ifdef ENABLE_WOLFMAN_CHARACTER
  1479. case POINT_ATTBONUS_WOLFMAN: return LC_TEXT_TRANS("¹«´ç¿¡°Ô °­ÇÔ +%d%%", "en");
  1480. #endif
  1481. case POINT_ATTBONUS_MONSTER: return LC_TEXT_TRANS("¸ó½ºÅÍ¿¡°Ô °­ÇÔ +%d%%", "en");
  1482. case POINT_MALL_ATTBONUS: return LC_TEXT_TRANS("°ø°İ·Â +%d%%", "en");
  1483. case POINT_MALL_DEFBONUS: return LC_TEXT_TRANS("¹æ¾î·Â +%d%%", "en");
  1484. case POINT_MALL_EXPBONUS: return LC_TEXT_TRANS("°æÇèÄ¡ %d%%", "en");
  1485. case POINT_MALL_ITEMBONUS: return LC_TEXT_TRANS("¾ÆÀÌÅÛ µå·ÓÀ² %.1f¹è", "en");
  1486. case POINT_MALL_GOLDBONUS: return LC_TEXT_TRANS("µ· µå·ÓÀ² %.1f¹è", "en");
  1487. case POINT_MAX_HP_PCT: return LC_TEXT_TRANS("ÃÖ´ë »ı¸í·Â +%d%%", "en");
  1488. case POINT_MAX_SP_PCT: return LC_TEXT_TRANS("ÃÖ´ë Á¤½Å·Â +%d%%", "en");
  1489. case POINT_SKILL_DAMAGE_BONUS: return LC_TEXT_TRANS("½ºÅ³ µ¥¹ÌÁö %d%%", "en");
  1490. case POINT_NORMAL_HIT_DAMAGE_BONUS: return LC_TEXT_TRANS("ÆòŸ µ¥¹ÌÁö %d%%", "en");
  1491. case POINT_SKILL_DEFEND_BONUS: return LC_TEXT_TRANS("½ºÅ³ µ¥¹ÌÁö ÀúÇ× %d%%", "en");
  1492. case POINT_NORMAL_HIT_DEFEND_BONUS: return LC_TEXT_TRANS("ÆòŸ µ¥¹ÌÁö ÀúÇ× %d%%", "en");
  1493. // case POINT_PC_BANG_EXP_BONUS: return LC_TEXT_TRANS("");
  1494. // case POINT_PC_BANG_DROP_BONUS: return LC_TEXT_TRANS("");
  1495. // case POINT_EXTRACT_HP_PCT: return LC_TEXT_TRANS("");
  1496. case POINT_RESIST_WARRIOR: return LC_TEXT_TRANS("¹«»ç°ø°İ¿¡ %d%% ÀúÇ×", "en");
  1497. case POINT_RESIST_ASSASSIN: return LC_TEXT_TRANS("ÀÚ°´°ø°İ¿¡ %d%% ÀúÇ×", "en");
  1498. case POINT_RESIST_SURA: return LC_TEXT_TRANS("¼ö¶ó°ø°İ¿¡ %d%% ÀúÇ×", "en");
  1499. case POINT_RESIST_SHAMAN: return LC_TEXT_TRANS("¹«´ç°ø°İ¿¡ %d%% ÀúÇ×", "en");
  1500. #ifdef ENABLE_WOLFMAN_CHARACTER
  1501. case POINT_RESIST_WOLFMAN: return LC_TEXT_TRANS("¹«´ç°ø°İ¿¡ %d%% ÀúÇ×","en");
  1502. #endif
  1503. default: return NULL;
  1504. }
  1505. }
  1506. static bool FN_hair_affect_string(LPCHARACTER ch, char *buf, size_t bufsiz)
  1507. {
  1508. if (NULL == ch || NULL == buf)
  1509. return false;
  1510. CAffect* aff = NULL;
  1511. time_t expire = 0;
  1512. struct tm ltm;
  1513. int year, mon, day;
  1514. int offset = 0;
  1515. aff = ch->FindAffect(AFFECT_HAIR);
  1516. if (NULL == aff)
  1517. return false;
  1518. expire = ch->GetQuestFlag("hair.limit_time");
  1519. if (expire < get_global_time())
  1520. return false;
  1521. // set apply string
  1522. offset = snprintf(buf, bufsiz, FN_point_string(aff->bApplyOn), aff->lApplyValue);
  1523. if (offset < 0 || offset >= (int) bufsiz)
  1524. offset = bufsiz - 1;
  1525. localtime_r(&expire, &ltm);
  1526. year = ltm.tm_year + 1900;
  1527. mon = ltm.tm_mon + 1;
  1528. day = ltm.tm_mday;
  1529. snprintf(buf + offset, bufsiz - offset, LC_TEXT_TRANS(" (¸¸·áÀÏ : %d³â %d¿ù %dÀÏ)","en"), year, mon, day);
  1530. return true;
  1531. }
  1532. ACMD(do_costume)
  1533. {
  1534. char buf[512];
  1535. const size_t bufferSize = sizeof(buf);
  1536. char arg1[256];
  1537. one_argument(argument, arg1, sizeof(arg1));
  1538. CItem* pBody = ch->GetWear(WEAR_COSTUME_BODY);
  1539. CItem* pHair = ch->GetWear(WEAR_COSTUME_HAIR);
  1540. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  1541. CItem* pMount = ch->GetWear(WEAR_COSTUME_MOUNT);
  1542. #endif
  1543. #ifdef ENABLE_ACCE_COSTUME_SYSTEM
  1544. CItem* pAcce = ch->GetWear(WEAR_COSTUME_ACCE);
  1545. #endif
  1546. #ifdef ENABLE_WEAPON_COSTUME_SYSTEM
  1547. CItem* pWeapon = ch->GetWear(WEAR_COSTUME_WEAPON);
  1548. #endif
  1549. ch->ChatPacket(CHAT_TYPE_INFO, "COSTUME status:");
  1550. if (pHair)
  1551. {
  1552. const char* itemName = pHair->GetLocaleName(ch);
  1553. ch->ChatPacket(CHAT_TYPE_INFO, " HAIR : %s", itemName);
  1554. for (int i = 0; i < pHair->GetAttributeCount(); ++i)
  1555. {
  1556. const TPlayerItemAttribute& attr = pHair->GetAttribute(i);
  1557. if (0 < attr.bType)
  1558. {
  1559. snprintf(buf, bufferSize, FN_point_string(attr.bType), attr.sValue);
  1560. ch->ChatPacket(CHAT_TYPE_INFO, " %s", buf);
  1561. }
  1562. }
  1563. if (pHair->IsEquipped() && arg1[0] == 'h')
  1564. ch->UnequipItem(pHair);
  1565. }
  1566. if (pBody)
  1567. {
  1568. const char* itemName = pBody->GetLocaleName(ch);
  1569. ch->ChatPacket(CHAT_TYPE_INFO, " BODY : %s", itemName);
  1570. if (pBody->IsEquipped() && arg1[0] == 'b')
  1571. ch->UnequipItem(pBody);
  1572. }
  1573. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  1574. if (pMount)
  1575. {
  1576. const char* itemName = pMount->GetName();
  1577. ch->ChatPacket(CHAT_TYPE_INFO, " MOUNT : %s", itemName);
  1578. if (pMount->IsEquipped() && arg1[0] == 'm')
  1579. ch->UnequipItem(pMount);
  1580. }
  1581. #endif
  1582. #ifdef ENABLE_ACCE_COSTUME_SYSTEM
  1583. if (pAcce)
  1584. {
  1585. const char* itemName = pAcce->GetName();
  1586. ch->ChatPacket(CHAT_TYPE_INFO, " ACCE : %s", itemName);
  1587. if (pAcce->IsEquipped() && arg1[0] == 'a')
  1588. ch->UnequipItem(pMount);
  1589. }
  1590. #endif
  1591. #ifdef ENABLE_WEAPON_COSTUME_SYSTEM
  1592. if (pWeapon)
  1593. {
  1594. const char* itemName = pWeapon->GetName();
  1595. ch->ChatPacket(CHAT_TYPE_INFO, " WEAPON : %s", itemName);
  1596. if (pWeapon->IsEquipped() && arg1[0] == 'w')
  1597. ch->UnequipItem(pMount);
  1598. }
  1599. #endif
  1600. }
  1601. ACMD(do_hair)
  1602. {
  1603. char buf[256];
  1604. if (false == FN_hair_affect_string(ch, buf, sizeof(buf)))
  1605. return;
  1606. ch->ChatPacket(CHAT_TYPE_INFO, buf);
  1607. }
  1608. ACMD(do_inventory)
  1609. {
  1610. int index = 0;
  1611. int count = 1;
  1612. char arg1[256];
  1613. char arg2[256];
  1614. LPITEM item;
  1615. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1616. if (!*arg1)
  1617. {
  1618. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: inventory <start_index> <count>");
  1619. return;
  1620. }
  1621. if (!*arg2)
  1622. {
  1623. index = 0;
  1624. str_to_number(count, arg1);
  1625. }
  1626. else
  1627. {
  1628. str_to_number(index, arg1); index = MIN(index, INVENTORY_MAX_NUM);
  1629. str_to_number(count, arg2); count = MIN(count, INVENTORY_MAX_NUM);
  1630. }
  1631. for (int i = 0; i < count; ++i)
  1632. {
  1633. if (index >= INVENTORY_MAX_NUM)
  1634. break;
  1635. item = ch->GetInventoryItem(index);
  1636. ch->ChatPacket(CHAT_TYPE_INFO, "inventory [%d] = %s",
  1637. index, item ? item->GetLocaleName(ch) : "<NONE>");
  1638. ++index;
  1639. }
  1640. }
  1641. //gift notify quest command
  1642. ACMD(do_gift)
  1643. {
  1644. ch->ChatPacket(CHAT_TYPE_COMMAND, "gift");
  1645. }
  1646. ACMD(do_cube)
  1647. {
  1648. if (!ch->CanDoCube())
  1649. return;
  1650. dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->GetName(), argument);
  1651. int cube_index = 0, inven_index = 0;
  1652. const char *line;
  1653. char arg1[256], arg2[256], arg3[256];
  1654. line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1655. one_argument(line, arg3, sizeof(arg3));
  1656. if (0 == arg1[0])
  1657. {
  1658. // print usage
  1659. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
  1660. ch->ChatPacket(CHAT_TYPE_INFO, " cube close");
  1661. ch->ChatPacket(CHAT_TYPE_INFO, " cube add <inveltory_index>");
  1662. ch->ChatPacket(CHAT_TYPE_INFO, " cube delete <cube_index>");
  1663. ch->ChatPacket(CHAT_TYPE_INFO, " cube list");
  1664. ch->ChatPacket(CHAT_TYPE_INFO, " cube cancel");
  1665. ch->ChatPacket(CHAT_TYPE_INFO, " cube make [all]");
  1666. return;
  1667. }
  1668. const std::string& strArg1 = std::string(arg1);
  1669. // r_info (request information)
  1670. // /cube r_info ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé ¼ö ÀÖ´Â ·¹½ÃÇÇ ¿äû
  1671. // (Server -> Client) /cube r_list npcVNUM resultCOUNT 123,1/125,1/128,1/130,5
  1672. //
  1673. // /cube r_info 3 ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ ¿äû
  1674. // /cube r_info 3 5 ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛºÎÅÍ ÀÌÈÄ 5°³ÀÇ ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Àç·á Á¤º¸¸¦ ¿äû
  1675. // (Server -> Client) /cube m_info startIndex count 125,1|126,2|127,2|123,5&555,5&555,4/120000@125,1|126,2|127,2|123,5&555,5&555,4/120000
  1676. //
  1677. if (strArg1 == "r_info")
  1678. {
  1679. if (0 == arg2[0])
  1680. Cube_request_result_list(ch);
  1681. else
  1682. {
  1683. if (isdigit(*arg2))
  1684. {
  1685. int listIndex = 0, requestCount = 1;
  1686. str_to_number(listIndex, arg2);
  1687. if (0 != arg3[0] && isdigit(*arg3))
  1688. str_to_number(requestCount, arg3);
  1689. Cube_request_material_info(ch, listIndex, requestCount);
  1690. }
  1691. }
  1692. return;
  1693. }
  1694. switch (LOWER(arg1[0]))
  1695. {
  1696. case 'o': // open
  1697. Cube_open(ch);
  1698. break;
  1699. case 'c': // close
  1700. Cube_close(ch);
  1701. break;
  1702. case 'l': // list
  1703. Cube_show_list(ch);
  1704. break;
  1705. case 'a': // add cue_index inven_index
  1706. {
  1707. if (0 == arg2[0] || !isdigit(*arg2) ||
  1708. 0 == arg3[0] || !isdigit(*arg3))
  1709. return;
  1710. str_to_number(cube_index, arg2);
  1711. str_to_number(inven_index, arg3);
  1712. Cube_add_item (ch, cube_index, inven_index);
  1713. }
  1714. break;
  1715. case 'd': // delete
  1716. {
  1717. if (0 == arg2[0] || !isdigit(*arg2))
  1718. return;
  1719. str_to_number(cube_index, arg2);
  1720. Cube_delete_item (ch, cube_index);
  1721. }
  1722. break;
  1723. case 'm': // make
  1724. if (0 != arg2[0])
  1725. {
  1726. while (true == Cube_make(ch))
  1727. dev_log (LOG_DEB0, "cube make success");
  1728. }
  1729. else
  1730. Cube_make(ch);
  1731. break;
  1732. default:
  1733. return;
  1734. }
  1735. }
  1736. // ÁÖ»çÀ§
  1737. ACMD(do_dice)
  1738. {
  1739. char arg1[256], arg2[256];
  1740. int start = 1, end = 100;
  1741. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1742. if (*arg1 && *arg2)
  1743. {
  1744. start = atoi(arg1);
  1745. end = atoi(arg2);
  1746. }
  1747. else if (*arg1 && !*arg2)
  1748. {
  1749. start = 1;
  1750. end = atoi(arg1);
  1751. }
  1752. end = MAX(start, end);
  1753. start = MIN(start, end);
  1754. int n = number(start, end);
  1755. if (ch->GetParty())
  1756. ch->GetParty()->ChatPacketToAllMember(CHAT_TYPE_INFO, LC_TEXT_TRANS("%s´ÔÀÌ ÁÖ»çÀ§¸¦ ±¼·Á %d°¡ ³ª¿Ô½À´Ï´Ù. (%d-%d)", "en"), ch->GetName(), n, start, end);
  1757. else
  1758. ch->ChatInfoTrans(("´ç½ÅÀÌ ÁÖ»çÀ§¸¦ ±¼·Á %d°¡ ³ª¿Ô½À´Ï´Ù. (%d-%d)"), n, start, end);
  1759. }
  1760. #ifdef ENABLE_NEWSTUFF
  1761. ACMD(do_click_safebox)
  1762. {
  1763. ch->SetSafeboxOpenPosition();
  1764. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeSafeboxPassword");
  1765. }
  1766. ACMD(do_force_logout)
  1767. {
  1768. LPDESC pDesc=DESC_MANAGER::instance().FindByCharacterName(ch->GetName());
  1769. if (!pDesc)
  1770. return;
  1771. pDesc->DelayedDisconnect(0);
  1772. }
  1773. #endif
  1774. ACMD(do_click_mall)
  1775. {
  1776. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeMallPassword");
  1777. }
  1778. ACMD(do_ride)
  1779. {
  1780. dev_log(LOG_DEB0, "[DO_RIDE] start");
  1781. if (ch->IsDead() || ch->IsStun())
  1782. return;
  1783. #ifdef FIX_HORSE_SPAM
  1784. int CalcLastMoveSec = (get_dword_time() - ch->GetLastMountTime()) / 1000 + 0.5;
  1785. if (CalcLastMoveSec < 2)
  1786. {
  1787. ch->ChatPacket(CHAT_TYPE_INFO, "<Spam> Bu kadar hizli yapamazsin, %d saniye beklemelisin.",(2-CalcLastMoveSec));
  1788. return;
  1789. }
  1790. #endif
  1791. // ³»¸®±â
  1792. {
  1793. if (ch->IsHorseRiding())
  1794. {
  1795. dev_log(LOG_DEB0, "[DO_RIDE] stop riding");
  1796. ch->StopRiding();
  1797. return;
  1798. }
  1799. if (ch->GetMountVnum())
  1800. {
  1801. dev_log(LOG_DEB0, "[DO_RIDE] unmount");
  1802. do_unmount(ch, NULL, 0, 0);
  1803. return;
  1804. }
  1805. }
  1806. // Ÿ±â
  1807. {
  1808. if (ch->GetHorse() != NULL)
  1809. {
  1810. dev_log(LOG_DEB0, "[DO_RIDE] start riding");
  1811. ch->StartRiding();
  1812. return;
  1813. }
  1814. for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i)
  1815. {
  1816. LPITEM item = ch->GetInventoryItem(i);
  1817. if (NULL == item)
  1818. continue;
  1819. // À¯´ÏÅ© Å»°Í ¾ÆÀÌÅÛ
  1820. if (item->IsRideItem())
  1821. {
  1822. if (
  1823. NULL==ch->GetWear(WEAR_UNIQUE1)
  1824. || NULL==ch->GetWear(WEAR_UNIQUE2)
  1825. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  1826. || NULL==ch->GetWear(WEAR_COSTUME_MOUNT)
  1827. #endif
  1828. )
  1829. {
  1830. dev_log(LOG_DEB0, "[DO_RIDE] USE UNIQUE ITEM");
  1831. //ch->EquipItem(item);
  1832. ch->UseItem(TItemPos (INVENTORY, i));
  1833. return;
  1834. }
  1835. }
  1836. // ÀÏ¹İ Å»°Í ¾ÆÀÌÅÛ
  1837. // TODO : Å»°Í¿ë SubType Ãß°¡
  1838. switch (item->GetVnum())
  1839. {
  1840. case 71114: // Àú½ÅÀÌ¿ë±Ç
  1841. case 71116: // »ê°ß½ÅÀÌ¿ë±Ç
  1842. case 71118: // ÅõÁö¹üÀÌ¿ë±Ç
  1843. case 71120: // »çÀÚ¿ÕÀÌ¿ë±Ç
  1844. dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
  1845. ch->UseItem(TItemPos (INVENTORY, i));
  1846. return;
  1847. }
  1848. // GF mantis #113524, 52001~52090 ¹ø Å»°Í
  1849. if( (item->GetVnum() > 52000) && (item->GetVnum() < 52091) ) {
  1850. dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
  1851. ch->UseItem(TItemPos (INVENTORY, i));
  1852. return;
  1853. }
  1854. }
  1855. }
  1856. // Ÿ°Å³ª ³»¸± ¼ö ¾øÀ»¶§
  1857. ch->ChatInfoTrans(("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
  1858. }
  1859. #ifdef __INVENTORY_PROTECT_SYSTEM__
  1860. ACMD(do_inventory_change_password)
  1861. {
  1862. char arg1[256], arg2[256];
  1863. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1864. if (*arg1 && *arg2)
  1865. {
  1866. if (ch->GetInventoryPassword(arg1))
  1867. {
  1868. if (ch->SetInventoryPassword(arg2))
  1869. {
  1870. ch->ChatInfoTrans(("Parola a fost schimbata."));
  1871. return;
  1872. }
  1873. }
  1874. else
  1875. {
  1876. ch->ChatInfoTrans(("Parola este gresita."));
  1877. return;
  1878. }
  1879. }
  1880. }
  1881. ACMD(do_inventory_password)
  1882. {
  1883. if (ch->GetQuestFlag("abs.INVENTORY_LOCK"))
  1884. {
  1885. ch->SendInventoryAsk(0);
  1886. return;
  1887. }
  1888. else if (!ch->GetQuestFlag("abs.INVENTORY_LOCK"))
  1889. {
  1890. ch->SendInventoryAsk(1);
  1891. return;
  1892. }
  1893. }
  1894. ACMD(do_inventory_change_state)
  1895. {
  1896. char arg1[256];
  1897. one_argument(argument, arg1, sizeof(arg1));
  1898. if (*arg1)
  1899. {
  1900. if (ch->GetInventoryPassword(arg1))
  1901. {
  1902. if (ch->GetQuestFlag("abs.INVENTORY_LOCK"))
  1903. {
  1904. ch->SetQuestFlag("abs.INVENTORY_LOCK", 0);
  1905. ch->ChatInfoTrans(("Inventarul este deblocat."));
  1906. ch->SendInventoryUnlock();
  1907. return;
  1908. }
  1909. else if (!ch->GetQuestFlag("abs.INVENTORY_LOCK"))
  1910. {
  1911. ch->SetQuestFlag("abs.INVENTORY_LOCK", 1);
  1912. ch->ChatInfoTrans(("<Sistem> Envanter kilitli durumda"));
  1913. ch->SendInventoryLock();
  1914. return;
  1915. }
  1916. }
  1917. else
  1918. {
  1919. ch->ChatInfoTrans(("Parola este gresita."));
  1920. return;
  1921. }
  1922. }
  1923. else
  1924. {
  1925. ch->ChatInfoTrans(("Parola este gresita."));
  1926. }
  1927. }
  1928. #endif
  1929. ACMD(do_daily_reward_reload){
  1930. if (!ch)
  1931. return;
  1932. ch->ChatPacket(CHAT_TYPE_COMMAND, "ManagerGiftSystem DeleteRewards|");
  1933. char* time = "";
  1934. char* rewards = "";
  1935. char* items;
  1936. char* counts;
  1937. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT UNIX_TIMESTAMP(time),reward from player.daily_reward_status where pid = %u",ch->GetPlayerID()));
  1938. SQLResult * pRes = pkMsg->Get();
  1939. if (pRes->uiNumRows > 0){
  1940. SQLMsg * pkMsg9(DBManager::instance().DirectQuery("SELECT UNIX_TIMESTAMP(time),reward from player.daily_reward_status where pid = %u and (time + INTERVAL 1 DAY < NOW()) limit 1;", ch->GetPlayerID()));
  1941. SQLResult * pRes9 = pkMsg9->Get();
  1942. if (pRes9->uiNumRows > 0){
  1943. DBManager::Instance().DirectQuery("DELETE FROM player.daily_reward_status where pid = %u", ch->GetPlayerID());
  1944. DBManager::Instance().DirectQuery("INSERT INTO player.daily_reward_status (pid,time,reward,total_rewards) VALUES(%u,NOW(),0,0)", ch->GetPlayerID());
  1945. ch->ChatPacket(CHAT_TYPE_INFO, "You didnt take the item in the last 24h, so the reward will be the first one.");
  1946. SQLMsg * pkMsg8(DBManager::instance().DirectQuery("SELECT UNIX_TIMESTAMP(time), reward from player.daily_reward_status where pid = %u", ch->GetPlayerID()));
  1947. SQLResult * pRes8 = pkMsg8->Get();
  1948. if (pRes8->uiNumRows > 0){
  1949. MYSQL_ROW row;
  1950. while ((row = mysql_fetch_row(pRes8->pSQLResult)) != NULL){
  1951. time = row[0];
  1952. rewards = row[1];
  1953. }
  1954. }
  1955. }
  1956. else{
  1957. SQLMsg * pkMsg2(DBManager::instance().DirectQuery("SELECT UNIX_TIMESTAMP(time), reward from player.daily_reward_status where pid = %u", ch->GetPlayerID()));
  1958. SQLResult * pRes2 = pkMsg2->Get();
  1959. if (pRes2->uiNumRows > 0){
  1960. MYSQL_ROW row;
  1961. while ((row = mysql_fetch_row(pRes2->pSQLResult)) != NULL){
  1962. time = row[0];
  1963. rewards = row[1];
  1964. }
  1965. }
  1966. }
  1967. }
  1968. else{
  1969. DBManager::Instance().DirectQuery("INSERT INTO player.daily_reward_status (pid,time,reward,total_rewards) VALUES(%u,NOW(),0,0)", ch->GetPlayerID());
  1970. SQLMsg * pkMsg2(DBManager::instance().DirectQuery("SELECT UNIX_TIMESTAMP(time), reward from player.daily_reward_status where pid = %u",ch->GetPlayerID()));
  1971. SQLResult * pRes2 = pkMsg2->Get();
  1972. if (pRes2->uiNumRows > 0){
  1973. MYSQL_ROW row;
  1974. while ((row = mysql_fetch_row(pRes2->pSQLResult)) != NULL){
  1975. time = row[0];
  1976. rewards = row[1];
  1977. }
  1978. }
  1979. }
  1980. SQLMsg * pkMsg3(DBManager::instance().DirectQuery("SELECT items, count from player.daily_reward_items where reward = '%s'",rewards));
  1981. SQLResult * pRes3 = pkMsg3->Get();
  1982. if (pRes3->uiNumRows > 0){
  1983. MYSQL_ROW row;
  1984. while ((row = mysql_fetch_row(pRes3->pSQLResult)) != NULL){
  1985. items = row[0];
  1986. counts = row[1];
  1987. ch->ChatPacket(CHAT_TYPE_COMMAND, "ManagerGiftSystem SetReward|%s|%s",items,counts);
  1988. }
  1989. }
  1990. ch->ChatPacket(CHAT_TYPE_COMMAND, "ManagerGiftSystem SetTime|%s",time);
  1991. ch->ChatPacket(CHAT_TYPE_COMMAND, "ManagerGiftSystem SetDailyReward|%s", rewards);
  1992. ch->ChatPacket(CHAT_TYPE_COMMAND, "ManagerGiftSystem SetRewardDone|");
  1993. }
  1994. ACMD(do_daily_reward_get_reward){
  1995. if (!ch)
  1996. return;
  1997. char* items;
  1998. char* counts;
  1999. DWORD item;
  2000. DWORD count;
  2001. bool reward = false;
  2002. char* rewards;
  2003. // and (NOW() - interval 30 minute > time)
  2004. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT reward from player.daily_reward_status where (NOW() > time) and pid = %u", ch->GetPlayerID()));
  2005. SQLResult * pRes = pkMsg->Get();
  2006. if (pRes->uiNumRows > 0){
  2007. MYSQL_ROW row;
  2008. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL){
  2009. rewards = row[0];
  2010. }
  2011. reward = true;
  2012. }
  2013. if (reward){
  2014. SQLMsg * pkMsg2(DBManager::instance().DirectQuery("SELECT items, count from player.daily_reward_items where reward = '%s' ORDER BY RAND() limit 1",rewards));
  2015. SQLResult * pRes2 = pkMsg2->Get();
  2016. if (pRes2->uiNumRows > 0){
  2017. MYSQL_ROW row;
  2018. while ((row = mysql_fetch_row(pRes2->pSQLResult)) != NULL){
  2019. items = row[0];
  2020. counts = row[1];
  2021. }
  2022. }
  2023. str_to_number(item, items);
  2024. str_to_number(count, counts);
  2025. ch->AutoGiveItem(item, count);
  2026. // ch->ChatPacket(CHAT_TYPE_INFO, "recompensa: %s",items);
  2027. DBManager::Instance().DirectQuery("UPDATE daily_reward_status SET reward = CASE WHEN reward = 0 THEN '1' WHEN reward = 1 THEN '2' WHEN reward = 2 THEN '3' WHEN reward = 3 THEN '4' WHEN reward = 4 THEN '5' WHEN reward = 5 THEN '6' WHEN reward = 6 THEN '0' END, total_rewards = total_rewards +1, time = (NOW() + interval 1 day) WHERE pid = %u", ch->GetPlayerID());
  2028. }
  2029. else{
  2030. ch->ChatInfoTrans(("Usted aun no puede obtener la recompensa"));
  2031. }
  2032. }
  2033. #ifdef ENABLE_GUILD_SPY_SYSTEM
  2034. ACMD(do_savasat)
  2035. {
  2036. char arg1[256];
  2037. one_argument(argument, arg1, sizeof(arg1));
  2038. if (!*arg1)
  2039. {
  2040. ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Gereksiz islem yapmayin.");
  2041. return;
  2042. }
  2043. if (!ch->GetWarMap())
  2044. return;
  2045. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  2046. if (!tch)
  2047. return;
  2048. if (!tch->IsPC())
  2049. return;
  2050. if (ch == tch)
  2051. return;
  2052. if (!tch->GetGuild())
  2053. return;
  2054. if (!ch->GetGuild())
  2055. return;
  2056. if (tch->GetGuild()->GetID() != ch->GetGuild()->GetID())
  2057. return;
  2058. CGuild* loncam = CGuildManager::instance().FindGuild(ch->GetGuild()->GetID());
  2059. CGuild* loncan = CGuildManager::instance().FindGuild(tch->GetGuild()->GetID());
  2060. if ((loncam == NULL) || (loncan == NULL))
  2061. {
  2062. ch->ChatPacket(CHAT_TYPE_INFO, "Loncan yok");
  2063. }
  2064. else
  2065. {
  2066. if (loncan->GetMasterPID() == ch->GetPlayerID())
  2067. {
  2068. if (loncam->RequestRemoveMember(tch->GetPlayerID()))
  2069. {
  2070. ch->ChatPacket(CHAT_TYPE_GUILD, "%s ajan olarak secilip kovuldu.", tch->GetName());
  2071. tch->GoHome();
  2072. return;
  2073. }
  2074. else
  2075. {
  2076. ch->ChatPacket(CHAT_TYPE_INFO, "Hata.");
  2077. return;
  2078. }
  2079. }
  2080. else
  2081. {
  2082. ch->ChatPacket(CHAT_TYPE_INFO, "Lonca Lideri Olman Gerekiyor");
  2083. return;
  2084. }
  2085. }
  2086. return;
  2087. }
  2088. #endif
  2089. #ifdef ENABLE_GUILD_MEETING
  2090. ACMD(do_loncatoplantisi)
  2091. {
  2092. if (quest::CQuestManager::instance().GetEventFlag("lonca_toplantisi_disable") == 1)
  2093. {
  2094. ch->ChatPacket(CHAT_TYPE_INFO, "Sistem suan icin devre disi!");
  2095. return;
  2096. }
  2097. int iPulse = thecore_pulse();
  2098. if (iPulse - ch->GetLastLoncaToplantiLastTime() < passes_per_sec * 10)
  2099. {
  2100. ch->ChatPacket(CHAT_TYPE_INFO, "10 Saniye beklemelisin!");
  2101. return;
  2102. }
  2103. ch->SetLastLoncaToplantiLastTime(iPulse);
  2104. if (!ch->GetGuild())
  2105. return;
  2106. if (ch->GetMapIndex() != 1 &&
  2107. ch->GetMapIndex() != 3 &&
  2108. ch->GetMapIndex() != 21 &&
  2109. ch->GetMapIndex() != 23 &&
  2110. ch->GetMapIndex() != 41 &&
  2111. ch->GetMapIndex() != 43)
  2112. {
  2113. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("map_engel_lonca_toplantisi"));
  2114. ch->ChatPacket(CHAT_TYPE_INFO, "Sadece 1 ve 2.koylerde toplanti yapabilirsin!");
  2115. return;
  2116. }
  2117. CGuild* g = ch->GetGuild();
  2118. if (!g)
  2119. return;
  2120. TGuildMember* gm = g->GetMember(ch->GetPlayerID());
  2121. if (!gm || gm->grade != GUILD_LEADER_GRADE)
  2122. {
  2123. ch->ChatPacket(CHAT_TYPE_INFO, "Lider degilsin!");
  2124. return;
  2125. }
  2126. std::unique_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pid FROM player.guild_member WHERE guild_id = %u", g->GetID()));
  2127. if (pMsg->Get()->uiNumRows != 0)
  2128. {
  2129. MYSQL_ROW row;
  2130. while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  2131. {
  2132. DWORD Player = 0;
  2133. str_to_number(Player, row[0]);
  2134. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindByPID(Player);
  2135. if (tch && ch != tch)
  2136. {
  2137. tch->ChatPacket(CHAT_TYPE_COMMAND, "loncatoplantisi");
  2138. }
  2139. }
  2140. }
  2141. ch->ChatPacket(CHAT_TYPE_INFO, "<Lonca> Toplanti istegi lonca uyelerine goderildi.");
  2142. }
  2143. ACMD(do_loncatoplantievet)
  2144. {
  2145. if (quest::CQuestManager::instance().GetEventFlag("lonca_toplantisi_disable") == 1)
  2146. {
  2147. ch->ChatPacket(CHAT_TYPE_INFO, "Sistem suan icin devre disi!");
  2148. return;
  2149. }
  2150. if (!ch->GetGuild())
  2151. {
  2152. ch->ChatPacket(CHAT_TYPE_INFO, "Loncan uyesi degilsin!");
  2153. return;
  2154. }
  2155. CGuild* g = ch->GetGuild();
  2156. if (!g)
  2157. {
  2158. ch->ChatPacket(CHAT_TYPE_INFO, "Loncan uyesi degilsin!");
  2159. return;
  2160. }
  2161. LPCHARACTER master = g->GetMasterCharacter();
  2162. if (!master)
  2163. {
  2164. ch->ChatPacket(CHAT_TYPE_INFO, "Lonca baskani suan aktif degil!");
  2165. return;
  2166. }
  2167. if (master->GetMapIndex() != 1 &&
  2168. master->GetMapIndex() != 3 &&
  2169. master->GetMapIndex() != 21 &&
  2170. master->GetMapIndex() != 23 &&
  2171. master->GetMapIndex() != 41 &&
  2172. master->GetMapIndex() != 43)
  2173. {
  2174. ch->ChatPacket(CHAT_TYPE_INFO, "Lonca baskani toplantiya uygun olmayan bir mapta!");
  2175. ch->ChatPacket(CHAT_TYPE_INFO, "Sadece 1 ve 2.koylerde toplanti yapabilir!");
  2176. return;
  2177. }
  2178. ch->WarpSet(master->GetX(), master->GetY(), master->GetMapIndex());
  2179. }
  2180. #endif
  2181. #ifdef ENABLE_HIDE_COSTUME_SYSTEM
  2182. ACMD (do_costume_hide)
  2183. {
  2184. char arg1[256];
  2185. one_argument (argument, arg1, sizeof(arg1));
  2186. if (0 == arg1[0])
  2187. return;
  2188. int slot = atoi(arg1);
  2189. ch->FuncHideCostume(slot);
  2190. }
  2191. #endif
  2192. #ifdef ENABLE_ITEM_SHOP_SYSTEM
  2193. ACMD(do_nesne_market)
  2194. {
  2195. if (!ch)
  2196. return;
  2197. if (!ch->GetDesc())
  2198. return;
  2199. if (!ch->IsPC())
  2200. return;
  2201. if (ch->IsStun())
  2202. return;
  2203. if (ch->IsHack())
  2204. return;
  2205. #ifdef _AURA_SYSTEM
  2206. if (ch->isAuraOpened(true) || ch->isAuraOpened(false))
  2207. {
  2208. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShopSearchOpen 1");
  2209. return;
  2210. }
  2211. #endif
  2212. #ifdef __ENABLE_NEW_OFFLINESHOP__
  2213. if (ch->GetOfflineShopGuest() != NULL || ch->GetAuctionGuest() != NULL)
  2214. {
  2215. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("PLEASE_BEFORE_CLOSE_WINDOW_AND_USE_THIS_FUNCTION"));
  2216. return;
  2217. }
  2218. #endif
  2219. #ifdef ENABLE_ACCE_SYSTEM
  2220. if (ch->isAcceOpened(true) || ch->isAcceOpened(false))
  2221. {
  2222. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("PLEASE_BEFORE_CLOSE_WINDOW_AND_USE_THIS_FUNCTION"));
  2223. return;
  2224. }
  2225. #endif
  2226. if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen() || ch->IsDead())
  2227. {
  2228. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShopSearchOpen 1");
  2229. return;
  2230. }
  2231. if (quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID())->IsRunning() == true)
  2232. return;
  2233. char arg1[256], arg2[256];
  2234. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2235. DWORD id = 0;
  2236. DWORD count = 0;
  2237. if (!*arg1 || !*arg2)
  2238. return;
  2239. str_to_number(id, arg1);
  2240. str_to_number(count, arg2);
  2241. bool bRes = CItemShopManager::instance().Buy(ch, id, count); // buy func
  2242. if (bRes)
  2243. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("nesnemarketbasarili"));
  2244. }
  2245. ACMD(do_nesneyenile)
  2246. {
  2247. if (!ch)
  2248. return;
  2249. if (!ch->GetDesc())
  2250. return;
  2251. if (!ch->IsPC())
  2252. return;
  2253. if (ch->IsStun())
  2254. return;
  2255. if (ch->IsHack())
  2256. return;
  2257. #ifdef _AURA_SYSTEM
  2258. if (ch->isAuraOpened(true) || ch->isAuraOpened(false))
  2259. {
  2260. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShopSearchOpen 1");
  2261. return;
  2262. }
  2263. #endif
  2264. #ifdef __ENABLE_NEW_OFFLINESHOP__
  2265. if (ch->GetOfflineShopGuest() != NULL || ch->GetAuctionGuest() != NULL)
  2266. {
  2267. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("PLEASE_BEFORE_CLOSE_WINDOW_AND_USE_THIS_FUNCTION"));
  2268. return;
  2269. }
  2270. #endif
  2271. #ifdef ENABLE_ACCE_SYSTEM
  2272. if (ch->isAcceOpened(true) || ch->isAcceOpened(false))
  2273. {
  2274. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("PLEASE_BEFORE_CLOSE_WINDOW_AND_USE_THIS_FUNCTION"));
  2275. return;
  2276. }
  2277. #endif
  2278. if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen() || ch->IsDead())
  2279. {
  2280. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShopSearchOpen 1");
  2281. return;
  2282. }
  2283. if (quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID())->IsRunning() == true)
  2284. return;
  2285. CItemShopManager::instance().SendClientPacket(ch); // buy func
  2286. }
  2287. #endif
  2288. #ifdef AUTO_PICKUP_RENEWAL
  2289. ACMD(do_auto_pickup)
  2290. {
  2291. char arg1[256];
  2292. one_argument(argument, arg1, sizeof(arg1));
  2293. if (!*arg1)
  2294. {
  2295. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Usage: Activate <0-1>"));
  2296. return;
  2297. }
  2298. int activate;
  2299. str_to_number(activate, arg1);
  2300. if (0 == activate)
  2301. {
  2302. CAffect* affect = ch->FindAffect(AFFECT_AUTO_PICKUP);
  2303. if (!affect)
  2304. {
  2305. ch->ChatPacket(CHAT_TYPE_INFO, "Affect is already deactive!");
  2306. return;
  2307. }
  2308. ch->RemoveAffect(affect);
  2309. }
  2310. else if (1 == activate)
  2311. {
  2312. CAffect* affect = ch->FindAffect(AFFECT_AUTO_PICKUP);
  2313. if(affect!=NULL)
  2314. {
  2315. ch->ChatPacket(CHAT_TYPE_INFO, "Affect is already active!");
  2316. return;
  2317. }
  2318. ch->AddAffect(AFFECT_AUTO_PICKUP, POINT_NONE, 0, AFF_PICKUP, INFINITE_AFFECT_DURATION, 0, 0, false);
  2319. }
  2320. else
  2321. {
  2322. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Usage: Activate <0-1>"));
  2323. return;
  2324. }
  2325. }
  2326. #endif
  2327. ACMD(do_costum_effect)
  2328. {
  2329. char arg1[256];
  2330. char arg2[256];
  2331. char arg3[256];
  2332. one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  2333. if (!*arg1 || !*arg2 || !*arg3)
  2334. return;
  2335. if (ch->IsOpenSafebox() || ch->GetExchange() || ch->GetMyShop() || ch->IsCubeOpen())
  2336. {
  2337. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Ã¢ÀÌ ¿­¸°»óÅ¿¡¼­´Â »óÁ¡°Å·¡¸¦ ÇÒ¼ö °¡ ¾ø½À´Ï´Ù."));
  2338. return;
  2339. }
  2340. DWORD dwVnum = 0;
  2341. str_to_number(dwVnum, arg1);
  2342. if (dwVnum < 0 || dwVnum >= INVENTORY_MAX_NUM)
  2343. return;
  2344. DWORD dwVnumSlot = 0;
  2345. str_to_number(dwVnumSlot, arg3);
  2346. if (dwVnumSlot < 0 || dwVnumSlot >= INVENTORY_MAX_NUM)
  2347. return;
  2348. int BStat = 0;
  2349. str_to_number(BStat, arg2);
  2350. if (BStat <= 0 || BStat > 7)
  2351. return;
  2352. LPITEM item2 = ch->GetInventoryItem(dwVnumSlot);
  2353. if (!item2 || item2->IsExchanging() || item2->GetVnum() != 50512)
  2354. return;
  2355. LPITEM item = ch->GetInventoryItem(dwVnum);
  2356. if (!item || item->IsExchanging() || item->IsEquipped())
  2357. return;
  2358. if (item->GetType() != ITEM_COSTUME || item->GetSubType() != COSTUME_BODY)
  2359. return;
  2360. item->SetSocket(1, BStat);
  2361. item2->SetCount(item->GetCount() - 1);
  2362. }