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