Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 116.16 KB | None | 0 0
  1. #include "stdafx.h"
  2. #ifdef __FreeBSD__
  3. #include <md5.h>
  4. #else
  5. #include "../../libthecore/include/xmd5.h"
  6. #endif
  7.  
  8. #include "utils.h"
  9. #include "config.h"
  10. #include "desc_client.h"
  11. #include "desc_manager.h"
  12. #include "char.h"
  13. #include "char_manager.h"
  14. #include "motion.h"
  15. #include "packet.h"
  16. #include "affect.h"
  17. #include "pvp.h"
  18. #include "start_position.h"
  19. #include "party.h"
  20. #include "guild_manager.h"
  21. #include "p2p.h"
  22. #include "dungeon.h"
  23. #include "messenger_manager.h"
  24. #include "war_map.h"
  25. #include "questmanager.h"
  26. #include "item_manager.h"
  27. #include "monarch.h"
  28. #include "mob_manager.h"
  29. #include "dev_log.h"
  30. #include "item.h"
  31. #include "arena.h"
  32. #include "buffer_manager.h"
  33. #include "unique_item.h"
  34. #include "threeway_war.h"
  35. #include "log.h"
  36. #include "../../common/VnumHelper.h"
  37. #ifdef __AUCTION__
  38. #include "auction_manager.h"
  39. #endif
  40. #include "../../common/service.h"
  41. #ifdef __NEW_SKILLTREE__
  42. #include "constants.h"
  43. #endif
  44. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  45. #include "MountSystem.h"
  46. #endif
  47.  
  48. extern int g_server_id;
  49.  
  50. extern int g_nPortalLimitTime;
  51.  
  52. ACMD(do_user_horse_ride)
  53. {
  54. if (ch->IsObserverMode())
  55. return;
  56.  
  57. if (ch->IsDead() || ch->IsStun())
  58. return;
  59.  
  60. if (ch->IsHorseRiding() == false)
  61. {
  62. // ˘¬ˇíAI ¨ú¨ˇ˘ĄN ˘ĄU˘¬ˇÍAˇíˇĆIAˇí A˘¬ˇĆiAO˘ĄU.
  63. if (ch->GetMountVnum())
  64. {
  65. LPITEM item = ch->GetWear(WEAR_COSTUME_MOUNT);
  66.  
  67. if (item && item->IsRideItem())
  68. ch->UnequipItem(item);
  69.  
  70. if (ch->UnEquipSpecialRideUniqueItem())
  71. {
  72. ch->RemoveAffect(AFFECT_MOUNT);
  73. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  74. }
  75.  
  76. //ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("AI©öI AˇíˇĆIAˇí AI˘ŻeA©¬AO˘ĄI˘ĄU."));
  77. return;
  78. }
  79.  
  80. if (ch->GetQuestFlag("HORSE.CHECKER") && get_global_time() < ch->GetQuestFlag("HORSE.CHECKER"))
  81. {
  82. ch->ChatPacket(CHAT_TYPE_INFO, "<Kon> Odczekaj %d sekund.", (ch->GetQuestFlag("HORSE.CHECKER") - get_global_time()) % 180);
  83. return;
  84. }
  85.  
  86. if (ch->GetHorse() == NULL)
  87. {
  88. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» ¸ŐŔú ĽŇČŻÇŘÁÖĽĽżä."));
  89. return;
  90. }
  91.  
  92. ch->SetQuestFlag("HORSE.CHECKER", get_global_time() + 3);
  93. ch->StartRiding();
  94. }
  95. else
  96. {
  97. ch->StopRiding();
  98. }
  99. }
  100.  
  101. ACMD(do_user_horse_back)
  102. {
  103. if (ch->GetHorse() != NULL)
  104. {
  105. if (ch->GetQuestFlag("HORSE.CHECKER") && get_global_time() < ch->GetQuestFlag("HORSE.CHECKER"))
  106. {
  107. ch->ChatPacket(CHAT_TYPE_INFO, "<Kon> Odczekaj %d sekund.", (ch->GetQuestFlag("HORSE.CHECKER") - get_global_time()) % 180);
  108. return;
  109. }
  110. ch->SetQuestFlag("HORSE.CHECKER", get_global_time() + 3);
  111. ch->HorseSummon(false);
  112. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» µą·Áş¸łÂ˝Ŕ´Ď´Ů."));
  113. }
  114. else if (ch->IsHorseRiding() == true)
  115. {
  116. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»żˇĽ­ ¸ŐŔú ł»·Áľß ÇŐ´Ď´Ů."));
  117. }
  118. else
  119. {
  120. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» ¸ŐŔú ĽŇČŻÇŘÁÖĽĽżä."));
  121. }
  122. }
  123.  
  124. ACMD(do_user_horse_feed)
  125. {
  126. // °łŔλóÁˇŔ» ż¬ »óĹÂżˇĽ­´Â ¸» ¸ÔŔ̸¦ ÁŮ Ľö ľř´Ů.
  127. if (ch->GetMyShop())
  128. return;
  129.  
  130. if (ch->GetHorse() == NULL)
  131. {
  132. if (ch->IsHorseRiding() == false)
  133. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» ¸ŐŔú ĽŇČŻÇŘÁÖĽĽżä."));
  134. else
  135. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» Ĺş »óĹÂżˇĽ­´Â ¸ÔŔ̸¦ ÁŮ Ľö ľř˝Ŕ´Ď´Ů."));
  136. return;
  137. }
  138.  
  139. DWORD dwFood = ch->GetHorseGrade() + 50054 - 1;
  140.  
  141. if (ch->CountSpecifyItem(dwFood) > 0)
  142. {
  143. ch->RemoveSpecifyItem(dwFood, 1);
  144. ch->FeedHorse();
  145. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»żˇ°Ô %s%s ÁÖľú˝Ŕ´Ď´Ů."),
  146. ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName,
  147. g_iUseLocale ? "" : under_han(ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName) ? LC_TEXT("Ŕ»") : LC_TEXT("¸¦"));
  148. }
  149. else
  150. {
  151. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ľĆŔĚĹŰŔĚ ÇĘżäÇŐ´Ď´Ů"), ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName);
  152. }
  153. }
  154.  
  155. #define MAX_REASON_LEN 128
  156.  
  157. EVENTINFO(TimedEventInfo)
  158. {
  159. DynamicCharacterPtr ch;
  160. int subcmd;
  161. int left_second;
  162. char szReason[MAX_REASON_LEN];
  163.  
  164. TimedEventInfo()
  165. : ch()
  166. , subcmd( 0 )
  167. , left_second( 0 )
  168. {
  169. ::memset( szReason, 0, MAX_REASON_LEN );
  170. }
  171. };
  172.  
  173. struct SendDisconnectFunc
  174. {
  175. void operator () (LPDESC d)
  176. {
  177. if (d->GetCharacter())
  178. {
  179. if (d->GetCharacter()->GetGMLevel() == GM_PLAYER)
  180. d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "quit Shutdown(SendDisconnectFunc)");
  181. }
  182. }
  183. };
  184.  
  185. struct DisconnectFunc
  186. {
  187. void operator () (LPDESC d)
  188. {
  189. if (d->GetType() == DESC_TYPE_CONNECTOR)
  190. return;
  191.  
  192. if (d->IsPhase(PHASE_P2P))
  193. return;
  194.  
  195. if (d->GetCharacter())
  196. d->GetCharacter()->Disconnect("Shutdown(DisconnectFunc)");
  197.  
  198. d->SetPhase(PHASE_CLOSE);
  199. }
  200. };
  201.  
  202. EVENTINFO(shutdown_event_data)
  203. {
  204. int seconds;
  205.  
  206. shutdown_event_data()
  207. : seconds( 0 )
  208. {
  209. }
  210. };
  211.  
  212. EVENTFUNC(shutdown_event)
  213. {
  214. shutdown_event_data* info = dynamic_cast<shutdown_event_data*>( event->info );
  215.  
  216. if ( info == NULL )
  217. {
  218. sys_err( "shutdown_event> <Factor> Null pointer" );
  219. return 0;
  220. }
  221.  
  222. int * pSec = & (info->seconds);
  223.  
  224. if (*pSec < 0)
  225. {
  226. sys_log(0, "shutdown_event sec %d", *pSec);
  227.  
  228. if (--*pSec == -10)
  229. {
  230. const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
  231. std::for_each(c_set_desc.begin(), c_set_desc.end(), DisconnectFunc());
  232. return passes_per_sec;
  233. }
  234. else if (*pSec < -10)
  235. return 0;
  236.  
  237. return passes_per_sec;
  238. }
  239. else if (*pSec == 0)
  240. {
  241. const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
  242. std::for_each(c_set_desc.begin(), c_set_desc.end(), SendDisconnectFunc());
  243. g_bNoMoreClient = true;
  244. --*pSec;
  245. return passes_per_sec;
  246. }
  247. else
  248. {
  249. char buf[64];
  250. snprintf(buf, sizeof(buf), LC_TEXT("ĽË´ŮżîŔĚ %dĂĘ ł˛ľŇ˝Ŕ´Ď´Ů."), *pSec);
  251. SendNotice(buf);
  252.  
  253. --*pSec;
  254. return passes_per_sec;
  255. }
  256. }
  257.  
  258. void Shutdown(int iSec)
  259. {
  260. if (g_bNoMoreClient)
  261. {
  262. thecore_shutdown();
  263. return;
  264. }
  265.  
  266. CWarMapManager::instance().OnShutdown();
  267.  
  268. char buf[64];
  269. snprintf(buf, sizeof(buf), LC_TEXT("%dĂĘ ČÄ °ÔŔÓŔĚ ĽË´Ůżî µË´Ď´Ů."), iSec);
  270.  
  271. SendNotice(buf);
  272.  
  273. shutdown_event_data* info = AllocEventInfo<shutdown_event_data>();
  274. info->seconds = iSec;
  275.  
  276. event_create(shutdown_event, info, 1);
  277. }
  278.  
  279. ACMD(do_shutdown)
  280. {
  281. if (!ch->IsGM())
  282. return;
  283.  
  284. if (NULL == ch)
  285. {
  286. sys_err("Accept shutdown command from %s.", ch->GetName());
  287. }
  288. TPacketGGShutdown p;
  289. p.bHeader = HEADER_GG_SHUTDOWN;
  290. P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown));
  291.  
  292. Shutdown(10);
  293. }
  294.  
  295. EVENTFUNC(timed_event)
  296. {
  297. TimedEventInfo * info = dynamic_cast<TimedEventInfo *>( event->info );
  298.  
  299. if ( info == NULL )
  300. {
  301. sys_err( "timed_event> <Factor> Null pointer" );
  302. return 0;
  303. }
  304.  
  305. LPCHARACTER ch = info->ch;
  306. if (ch == NULL) { // <Factor>
  307. return 0;
  308. }
  309. LPDESC d = ch->GetDesc();
  310.  
  311. if (info->left_second <= 0)
  312. {
  313. ch->m_pkTimedEvent = NULL;
  314.  
  315. if (true == LC_IsEurope() || true == LC_IsYMIR() || true == LC_IsKorea())
  316. {
  317. switch (info->subcmd)
  318. {
  319. case SCMD_LOGOUT:
  320. case SCMD_QUIT:
  321. case SCMD_PHASE_SELECT:
  322. {
  323. TPacketNeedLoginLogInfo acc_info;
  324. acc_info.dwPlayerID = ch->GetDesc()->GetAccountTable().id;
  325.  
  326. db_clientdesc->DBPacket( HEADER_GD_VALID_LOGOUT, 0, &acc_info, sizeof(acc_info) );
  327.  
  328. LogManager::instance().DetailLoginLog( false, ch );
  329. }
  330. break;
  331. }
  332. }
  333.  
  334. switch (info->subcmd)
  335. {
  336. case SCMD_LOGOUT:
  337. if (d)
  338. d->SetPhase(PHASE_CLOSE);
  339. break;
  340.  
  341. case SCMD_QUIT:
  342. ch->ChatPacket(CHAT_TYPE_COMMAND, "quit");
  343. break;
  344.  
  345. case SCMD_PHASE_SELECT:
  346. {
  347. ch->Disconnect("timed_event - SCMD_PHASE_SELECT");
  348.  
  349. if (d)
  350. {
  351. d->SetPhase(PHASE_SELECT);
  352. }
  353. }
  354. break;
  355. }
  356.  
  357. return 0;
  358. }
  359. else
  360. {
  361. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dĂĘ ł˛ľŇ˝Ŕ´Ď´Ů."), info->left_second);
  362. --info->left_second;
  363. }
  364.  
  365. return PASSES_PER_SEC(1);
  366. }
  367.  
  368. #ifdef __NEW_SKILLTREE__
  369. ACMD (do_stat_skill)//tree
  370. {
  371. if (!ch)
  372. return;
  373.  
  374. char arg1[256];
  375. one_argument (argument, arg1, sizeof(arg1));
  376. if (!*arg1)
  377. return;
  378.  
  379. DWORD dwBonus = atoi(arg1);
  380. if (ch->GetPoint(POINT_SKILL_TREE) <= 0)
  381. {
  382. ch->ChatPacket(CHAT_TYPE_INFO, "Nie masz punktów umiejętności!");
  383. return;
  384. }
  385. if (ch->GetPoint(dwBonus) > 15)
  386. {
  387. ch->ChatPacket(CHAT_TYPE_INFO, "Masz już tę umiejętność na najwyższym poziomie!");
  388. return;
  389. }
  390. if (ch->IsDead())
  391. {
  392. ch->ChatPacket(CHAT_TYPE_INFO, "Nie możesz użyć skilla, jeśli nie żyjesz!");
  393. return;
  394. }
  395. bool bCanSkill = false;
  396. for (int i = POINT_SKILL_TREE_SKILL1; i <= POINT_SKILL_TREE_SKILL5; i++)
  397. {
  398. if (dwBonus == i)
  399. {
  400. bCanSkill = true;
  401. break;
  402. }
  403. }
  404. if (!bCanSkill)
  405. return;
  406.  
  407. int old = ch->GetPoint(dwBonus);
  408. DWORD affect = NULL;
  409. if (dwBonus == POINT_SKILL_TREE_SKILL1)
  410. {
  411. affect = AFFECT_SKILL_TREE_SKILL1;
  412. }
  413. else if (dwBonus == POINT_SKILL_TREE_SKILL2)
  414. {
  415. affect = AFFECT_SKILL_TREE_SKILL2;
  416. }
  417. else if (dwBonus == POINT_SKILL_TREE_SKILL3)
  418. {
  419. affect = AFFECT_SKILL_TREE_SKILL3;
  420. }
  421. else if (dwBonus == POINT_SKILL_TREE_SKILL4)
  422. {
  423. affect = AFFECT_SKILL_TREE_SKILL4;
  424. }
  425. else if (dwBonus == POINT_SKILL_TREE_SKILL5)
  426. {
  427. affect = AFFECT_SKILL_TREE_SKILL5;
  428. }
  429.  
  430. TSkillTreeSkill* skill = &map_skill_tree[dwBonus];
  431. if (!skill)
  432. return;
  433.  
  434. ch->PointChange(POINT_SKILL_TREE, -1);
  435. ch->PointChange(dwBonus, 1);
  436. CAffect* pkAffect = ch->FindAffect(affect);
  437. if (pkAffect)
  438. ch->RemoveAffect(pkAffect);
  439.  
  440. ch->AddAffect(affect, aApplyInfo[skill->apply].bPointType, (skill->step_add*ch->GetPoint(dwBonus)), 0, INFINITE_AFFECT_DURATION, 0, true);
  441. ch->ChatPacket(CHAT_TYPE_COMMAND, "RefreshSkillTree ");
  442. }
  443. #endif
  444.  
  445. ACMD(do_cmd)
  446. {
  447. /* RECALL_DELAY
  448. if (ch->m_pkRecallEvent != NULL)
  449. {
  450. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĂëĽŇ µÇľú˝Ŕ´Ď´Ů."));
  451. event_cancel(&ch->m_pkRecallEvent);
  452. return;
  453. }
  454. // END_OF_RECALL_DELAY */
  455.  
  456. if (ch->m_pkTimedEvent)
  457. {
  458. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĂëĽŇ µÇľú˝Ŕ´Ď´Ů."));
  459. event_cancel(&ch->m_pkTimedEvent);
  460. return;
  461. }
  462.  
  463. switch (subcmd)
  464. {
  465. case SCMD_LOGOUT:
  466. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·Î±×ŔÎ Č­¸éŔ¸·Î µąľĆ °©´Ď´Ů. Ŕá˝Ă¸¸ ±â´Ů¸®ĽĽżä."));
  467. break;
  468.  
  469. case SCMD_QUIT:
  470. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ÔŔÓŔ» Áľ·á ÇŐ´Ď´Ů. Ŕá˝Ă¸¸ ±â´Ů¸®ĽĽżä."));
  471. break;
  472.  
  473. case SCMD_PHASE_SELECT:
  474. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Äł¸ŻĹ͸¦ ŔüČŻ ÇŐ´Ď´Ů. Ŕá˝Ă¸¸ ±â´Ů¸®ĽĽżä."));
  475. break;
  476. }
  477.  
  478. int nExitLimitTime = 10;
  479.  
  480. if (ch->IsHack(false, true, nExitLimitTime) &&
  481. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()) &&
  482. (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
  483. {
  484. return;
  485. }
  486.  
  487. switch (subcmd)
  488. {
  489. case SCMD_LOGOUT:
  490. case SCMD_QUIT:
  491. case SCMD_PHASE_SELECT:
  492. {
  493. TimedEventInfo* info = AllocEventInfo<TimedEventInfo>();
  494.  
  495. {
  496. if (ch->IsPosition(POS_FIGHTING))
  497. info->left_second = 10;
  498. else
  499. info->left_second = 3;
  500. }
  501.  
  502. info->ch = ch;
  503. info->subcmd = subcmd;
  504. strlcpy(info->szReason, argument, sizeof(info->szReason));
  505.  
  506. ch->m_pkTimedEvent = event_create(timed_event, info, 1);
  507. }
  508. break;
  509. }
  510. }
  511.  
  512. ACMD(do_mount)
  513. {
  514. /*
  515. char arg1[256];
  516. struct action_mount_param param;
  517.  
  518. // ŔĚąĚ Ĺ¸°í ŔÖŔ¸¸é
  519. if (ch->GetMountingChr())
  520. {
  521. char arg2[256];
  522. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  523.  
  524. if (!*arg1 || !*arg2)
  525. return;
  526.  
  527. param.x = atoi(arg1);
  528. param.y = atoi(arg2);
  529. param.vid = ch->GetMountingChr()->GetVID();
  530. param.is_unmount = true;
  531.  
  532. float distance = DISTANCE_SQRT(param.x - (DWORD) ch->GetX(), param.y - (DWORD) ch->GetY());
  533.  
  534. if (distance > 600.0f)
  535. {
  536. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´ő °ˇ±îŔĚ °ˇĽ­ ł»¸®ĽĽżä."));
  537. return;
  538. }
  539.  
  540. action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
  541. return;
  542. }
  543.  
  544. one_argument(argument, arg1, sizeof(arg1));
  545.  
  546. if (!*arg1)
  547. return;
  548.  
  549. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(atoi(arg1));
  550.  
  551. if (!tch->IsNPC() || !tch->IsMountable())
  552. {
  553. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Ĺ±âżˇ´Â Ĺ» Ľö ľřľîżä."));
  554. return;
  555. }
  556.  
  557. float distance = DISTANCE_SQRT(tch->GetX() - ch->GetX(), tch->GetY() - ch->GetY());
  558.  
  559. if (distance > 600.0f)
  560. {
  561. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´ő °ˇ±îŔĚ °ˇĽ­ ŸĽĽżä."));
  562. return;
  563. }
  564.  
  565. param.vid = tch->GetVID();
  566. param.is_unmount = false;
  567.  
  568. action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
  569. */
  570. }
  571.  
  572. ACMD(do_fishing)
  573. {
  574. char arg1[256];
  575. one_argument(argument, arg1, sizeof(arg1));
  576.  
  577. if (!*arg1)
  578. return;
  579.  
  580. ch->SetRotation(atof(arg1));
  581. ch->fishing();
  582. }
  583.  
  584. ACMD(do_console)
  585. {
  586. ch->ChatPacket(CHAT_TYPE_COMMAND, "ConsoleEnable");
  587. }
  588.  
  589. ACMD(do_restart)
  590. {
  591. if (false == ch->IsDead())
  592. {
  593. ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
  594. ch->StartRecoveryEvent();
  595. return;
  596. }
  597.  
  598. if (NULL == ch->m_pkDeadEvent)
  599. return;
  600.  
  601. int iTimeToDead = (event_time(ch->m_pkDeadEvent) / passes_per_sec);
  602.  
  603. if (subcmd != SCMD_RESTART_TOWN && (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
  604. {
  605. if (!test_server)
  606. {
  607. if (ch->IsHack())
  608. {
  609. //ĽşÁö ¸ĘŔĎ°ćżěżˇ´Â ĂĽĹ© ÇĎÁö ľĘ´Â´Ů.
  610. if (false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  611. {
  612. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆÁ÷ Ŕç˝ĂŔŰ ÇŇ Ľö ľř˝Ŕ´Ď´Ů. (%dĂĘ ł˛Ŕ˝)"), iTimeToDead - (180 - g_nPortalLimitTime));
  613. return;
  614. }
  615. }
  616.  
  617. if (iTimeToDead > 179)
  618. {
  619. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆÁ÷ Ŕç˝ĂŔŰ ÇŇ Ľö ľř˝Ŕ´Ď´Ů. (%dĂĘ ł˛Ŕ˝)"), iTimeToDead - 170);
  620. return;
  621. }
  622. }
  623. }
  624.  
  625. //PREVENT_HACK
  626. //DESC : â°í, ±łČŻ â ČÄ Ć÷Ĺ»Ŕ» »çżëÇĎ´Â ąö±×żˇ ŔĚżëµÉĽö Ŕ־
  627. // ÄđŸŔÓŔ» Ăß°ˇ
  628. if (subcmd == SCMD_RESTART_TOWN)
  629. {
  630. if (ch->IsHack())
  631. {
  632. //±ćµĺ¸Ę, ĽşÁö¸ĘżˇĽ­´Â ĂĽĹ© ÇĎÁö ľĘ´Â´Ů.
  633. if ((!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG) ||
  634. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  635. {
  636. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆÁ÷ Ŕç˝ĂŔŰ ÇŇ Ľö ľř˝Ŕ´Ď´Ů. (%dĂĘ ł˛Ŕ˝)"), iTimeToDead - (180 - g_nPortalLimitTime));
  637. return;
  638. }
  639. }
  640.  
  641. if (iTimeToDead > 179)
  642. {
  643. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆÁ÷ ¸¶Ŕ»żˇĽ­ Ŕç˝ĂŔŰ ÇŇ Ľö ľř˝Ŕ´Ď´Ů. (%d ĂĘ ł˛Ŕ˝)"), iTimeToDead - 173);
  644. return;
  645. }
  646. }
  647. //END_PREVENT_HACK
  648.  
  649. ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
  650.  
  651. ch->GetDesc()->SetPhase(PHASE_GAME);
  652. ch->SetPosition(POS_STANDING);
  653. ch->StartRecoveryEvent();
  654.  
  655. //FORKED_LOAD
  656. //DESC: »ď°Ĺ¸® ŔüĹő˝Ă şÎČ°Ŕ» ÇŇ°ćżě ¸ĘŔÇ ŔÔ±¸°ˇ ľĆ´Ń »ď°Ĺ¸® ŔüĹőŔÇ ˝ĂŔŰÁöÁˇŔ¸·Î Ŕ̵żÇĎ°Ô µČ´Ů.
  657. if (1 == quest::CQuestManager::instance().GetEventFlag("threeway_war"))
  658. {
  659. if (subcmd == SCMD_RESTART_TOWN || subcmd == SCMD_RESTART_HERE)
  660. {
  661. if (true == CThreeWayWar::instance().IsThreeWayWarMapIndex(ch->GetMapIndex()) &&
  662. false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  663. {
  664. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  665.  
  666. ch->ReviveInvisible(5);
  667. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  668. ch->CheckMount();
  669. #endif
  670. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  671. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  672.  
  673. return;
  674. }
  675.  
  676. //ĽşÁö
  677. if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
  678. {
  679. if (CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) <= 0)
  680. {
  681. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĽşÁöżˇĽ­ şÎČ° ±âȸ¸¦ ¸đµÎ ŔŇľú˝Ŕ´Ď´Ů! ¸¶Ŕ»·Î Ŕ̵żÇŐ´Ď´Ů!"));
  682. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  683. }
  684. else
  685. {
  686. ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire()));
  687. }
  688.  
  689. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  690. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  691. ch->ReviveInvisible(5);
  692. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  693. ch->CheckMount();
  694. #endif
  695. return;
  696. }
  697. }
  698. }
  699. //END_FORKED_LOAD
  700.  
  701. if (ch->GetDungeon())
  702. ch->GetDungeon()->UseRevive(ch);
  703.  
  704. if (ch->GetWarMap() && !ch->IsObserverMode())
  705. {
  706. CWarMap * pMap = ch->GetWarMap();
  707. DWORD dwGuildOpponent = pMap ? pMap->GetGuildOpponent(ch) : 0;
  708.  
  709. if (dwGuildOpponent)
  710. {
  711. switch (subcmd)
  712. {
  713. case SCMD_RESTART_TOWN:
  714. sys_log(0, "do_restart: restart town");
  715. PIXEL_POSITION pos;
  716.  
  717. if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos))
  718. ch->Show(ch->GetMapIndex(), pos.x, pos.y);
  719. else
  720. ch->ExitToSavedLocation();
  721.  
  722. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  723. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  724. ch->ReviveInvisible(5);
  725. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  726. ch->CheckMount();
  727. #endif
  728. break;
  729.  
  730. case SCMD_RESTART_HERE:
  731. sys_log(0, "do_restart: restart here");
  732. ch->RestartAtSamePos();
  733. //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  734. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  735. ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
  736. ch->ReviveInvisible(5);
  737. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  738. ch->CheckMount();
  739. #endif
  740. break;
  741. }
  742.  
  743. return;
  744. }
  745. }
  746.  
  747. switch (subcmd)
  748. {
  749. case SCMD_RESTART_TOWN:
  750. sys_log(0, "do_restart: restart town");
  751. PIXEL_POSITION pos;
  752.  
  753. if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(ch->GetMapIndex(), ch->GetEmpire(), pos))
  754. ch->WarpSet(pos.x, pos.y);
  755. else
  756. ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
  757.  
  758. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  759. ch->DeathPenalty(1);
  760. break;
  761.  
  762. case SCMD_RESTART_HERE:
  763. sys_log(0, "do_restart: restart here");
  764. ch->RestartAtSamePos();
  765. //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
  766. ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
  767. ch->DeathPenalty(0);
  768. ch->ReviveInvisible(5);
  769. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  770. ch->CheckMount();
  771. #endif
  772. break;
  773. }
  774. }
  775.  
  776. #define MAX_STAT 128
  777.  
  778. ACMD(do_stat_reset)
  779. {
  780. ch->PointChange(POINT_STAT_RESET_COUNT, 12 - ch->GetPoint(POINT_STAT_RESET_COUNT));
  781. }
  782.  
  783. ACMD(do_stat_minus)
  784. {
  785. char arg1[256];
  786. one_argument(argument, arg1, sizeof(arg1));
  787.  
  788. if (!*arg1)
  789. return;
  790.  
  791. if (ch->IsPolymorphed())
  792. {
  793. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĐ°© Áßżˇ´Â ´É·ÂŔ» żĂ¸± Ľö ľř˝Ŕ´Ď´Ů."));
  794. return;
  795. }
  796.  
  797. if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0)
  798. return;
  799.  
  800. if (!strcmp(arg1, "st"))
  801. {
  802. if (ch->GetRealPoint(POINT_ST) <= JobInitialPoints[ch->GetJob()].st)
  803. return;
  804.  
  805. ch->SetRealPoint(POINT_ST, ch->GetRealPoint(POINT_ST) - 1);
  806. ch->SetPoint(POINT_ST, ch->GetPoint(POINT_ST) - 1);
  807. ch->ComputePoints();
  808. ch->PointChange(POINT_ST, 0);
  809. }
  810. else if (!strcmp(arg1, "dx"))
  811. {
  812. if (ch->GetRealPoint(POINT_DX) <= JobInitialPoints[ch->GetJob()].dx)
  813. return;
  814.  
  815. ch->SetRealPoint(POINT_DX, ch->GetRealPoint(POINT_DX) - 1);
  816. ch->SetPoint(POINT_DX, ch->GetPoint(POINT_DX) - 1);
  817. ch->ComputePoints();
  818. ch->PointChange(POINT_DX, 0);
  819. }
  820. else if (!strcmp(arg1, "ht"))
  821. {
  822. if (ch->GetRealPoint(POINT_HT) <= JobInitialPoints[ch->GetJob()].ht)
  823. return;
  824.  
  825. ch->SetRealPoint(POINT_HT, ch->GetRealPoint(POINT_HT) - 1);
  826. ch->SetPoint(POINT_HT, ch->GetPoint(POINT_HT) - 1);
  827. ch->ComputePoints();
  828. ch->PointChange(POINT_HT, 0);
  829. ch->PointChange(POINT_MAX_HP, 0);
  830. }
  831. else if (!strcmp(arg1, "iq"))
  832. {
  833. if (ch->GetRealPoint(POINT_IQ) <= JobInitialPoints[ch->GetJob()].iq)
  834. return;
  835.  
  836. ch->SetRealPoint(POINT_IQ, ch->GetRealPoint(POINT_IQ) - 1);
  837. ch->SetPoint(POINT_IQ, ch->GetPoint(POINT_IQ) - 1);
  838. ch->ComputePoints();
  839. ch->PointChange(POINT_IQ, 0);
  840. ch->PointChange(POINT_MAX_SP, 0);
  841. }
  842. else
  843. return;
  844.  
  845. ch->PointChange(POINT_STAT, +1);
  846. ch->PointChange(POINT_STAT_RESET_COUNT, -1);
  847. ch->ComputePoints();
  848. }
  849.  
  850. ACMD(do_stat)
  851. {
  852. char arg1[256];
  853. one_argument(argument, arg1, sizeof(arg1));
  854.  
  855. if (!*arg1)
  856. return;
  857.  
  858. if (ch->IsPolymorphed())
  859. {
  860. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĐ°© Áßżˇ´Â ´É·ÂŔ» żĂ¸± Ľö ľř˝Ŕ´Ď´Ů."));
  861. return;
  862. }
  863.  
  864. if (ch->GetPoint(POINT_STAT) <= 0)
  865. return;
  866.  
  867. BYTE idx = 0;
  868.  
  869. if (!strcmp(arg1, "st"))
  870. idx = POINT_ST;
  871. else if (!strcmp(arg1, "dx"))
  872. idx = POINT_DX;
  873. else if (!strcmp(arg1, "ht"))
  874. idx = POINT_HT;
  875. else if (!strcmp(arg1, "iq"))
  876. idx = POINT_IQ;
  877. else
  878. return;
  879.  
  880. if (ch->GetRealPoint(idx) >= MAX_STAT)
  881. return;
  882.  
  883. ch->SetRealPoint(idx, ch->GetRealPoint(idx) + 1);
  884. ch->SetPoint(idx, ch->GetPoint(idx) + 1);
  885. ch->ComputePoints();
  886. ch->PointChange(idx, 0);
  887.  
  888. if (idx == POINT_IQ)
  889. {
  890. ch->PointChange(POINT_MAX_HP, 0);
  891. }
  892. else if (idx == POINT_HT)
  893. {
  894. ch->PointChange(POINT_MAX_SP, 0);
  895. }
  896.  
  897. ch->PointChange(POINT_STAT, -1);
  898. ch->ComputePoints();
  899. }
  900.  
  901. #ifdef ENABLE_PVP_ADVANCED
  902. #include <string>
  903. #include <algorithm>
  904. #include <boost/algorithm/string/replace.hpp>
  905. const char* m_nDuelTranslate[] = /* You can translate here */
  906. {
  907. "[Ty] Pieniądze musza być w liczbach",
  908. "[Ty] Wprowadzona ilość jest mniejsza niż 0.",
  909. "[Ty] Wprowadzona kwota jest równa maksymalnej możliwej wartości w ekwipunku.",
  910. "[Ty] Wprowadzona kwota jest mniejsza niż kwota, którą posiadasz w ekwipunku.",
  911. "[Ty] Wprowadzona kwota + środki bieżące jest większa niż maksymalna możliwa kwota w ekwipunku.",
  912. "[Gracz] Wprowadzona kwota + środki bieżące jest większa niż maksymalna możliwa kwota w ekwipunku.",
  913. "[Gracz] Wprowadzona kwota jest mniejsza niż kwota, którą gracz posiada w ekwipunku.",
  914. "Jesteś w Pojedynku.",
  915. "Gracz był już w pojedynku, nie możesz wysłać mu zaproszenia.",
  916. "Podgląd Ekwipunku Zablokowany.",
  917. "Podgląd Ekwipunku Zablokowany, Nikt nie będzie wstanie zobaczyć twojego ekwipunku",
  918. "Podgląd Ekwipunku Odblokowany, Wszyscy będą mogli go zobaczyć.",
  919. "Podgląd Ekwipunku Odblokowany."
  920. };
  921.  
  922. const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};
  923.  
  924. void Duel_SendMessage(LPCHARACTER ch, const char* msg)
  925. {
  926. if (!ch)
  927. return;
  928.  
  929. std::string textLine;
  930.  
  931. textLine = msg;
  932. boost::algorithm::replace_all(textLine, " ", "$");
  933.  
  934. char buf[512+1];
  935. snprintf(buf, sizeof(buf), "BINARY_Duel_SendMessage %s", textLine.c_str());
  936. ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
  937. }
  938.  
  939. ACMD(do_pvp)
  940. {
  941. if (!ch)
  942. return;
  943.  
  944. if (ch->GetArena() != NULL || CArenaManager::instance().IsArenaMap(ch->GetMapIndex()) == true)
  945. {
  946. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ĂŔ忡Ľ­ »çżëÇĎ˝Ç Ľö ľř˝Ŕ´Ď´Ů."));
  947. return;
  948. }
  949.  
  950. char arg1[256], arg2[256], arg3[256], arg4[256], arg5[256], arg6[256], arg7[256], arg8[256], arg9[256], arg10[256];
  951.  
  952. pvp_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2), arg3, sizeof(arg3), arg4, sizeof(arg4), arg5, sizeof(arg5), arg6, sizeof(arg6), arg7, sizeof(arg7), arg8, sizeof(arg8), arg9, sizeof(arg9), arg10, sizeof(arg10));
  953.  
  954. DWORD vid = 0;
  955. str_to_number(vid, arg1);
  956. LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);
  957.  
  958. if (!pkVictim)
  959. return;
  960.  
  961. if (pkVictim->IsNPC())
  962. return;
  963.  
  964. if (pkVictim->GetArena() != NULL)
  965. {
  966. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("???? ??????."));
  967. return;
  968. }
  969.  
  970. if (ch->GetExchange() || pkVictim->GetExchange())
  971. {
  972. CPVPManager::instance().Decline(ch, pkVictim);
  973. CPVPManager::instance().Decline(pkVictim, ch);
  974. return;
  975. }
  976.  
  977. if (*arg2 && !strcmp(arg2, "accept"))
  978. {
  979. int chA_nBetMoney = ch->GetQuestFlag(szTableStaticPvP[8]);
  980. int chB_nBetMoney = pkVictim->GetQuestFlag(szTableStaticPvP[8]);
  981.  
  982. if ((ch->GetGold() < chA_nBetMoney) || (pkVictim->GetGold() < chB_nBetMoney))
  983. {
  984. ch->ChatPacket(CHAT_TYPE_INFO, "<PvP> Can't start duel because something is wrong with bet money.");
  985. pkVictim->ChatPacket(CHAT_TYPE_INFO, "<PvP> Can't start duel because something is wrong with bet money.");
  986. CPVPManager::instance().Decline(ch, pkVictim);
  987. CPVPManager::instance().Decline(pkVictim, ch);
  988. return;
  989. }
  990.  
  991. ch->SetDuel("IsFight", 1);
  992. pkVictim->SetDuel("IsFight", 1);
  993.  
  994. if (chA_nBetMoney > 0 && chA_nBetMoney > 0)
  995. {
  996. ch->PointChange(POINT_GOLD, - chA_nBetMoney, true);
  997. pkVictim->PointChange(POINT_GOLD, - chB_nBetMoney, true);
  998. }
  999.  
  1000. CPVPManager::instance().Insert(ch, pkVictim);
  1001. return;
  1002. }
  1003.  
  1004. int m_BlockChangeItem = 0, m_BlockBuff = 0, m_BlockPotion = 0, m_BlockRide = 0, m_BlockPet = 0, m_BlockPoly = 0, m_BlockParty = 0, m_BlockExchange = 0, m_BetMoney = 0;
  1005.  
  1006. str_to_number(m_BlockChangeItem, arg2);
  1007. str_to_number(m_BlockBuff, arg3);
  1008. str_to_number(m_BlockPotion, arg4);
  1009. str_to_number(m_BlockRide, arg5);
  1010. str_to_number(m_BlockPet, arg6);
  1011. str_to_number(m_BlockPoly, arg7);
  1012. str_to_number(m_BlockParty, arg8);
  1013. str_to_number(m_BlockExchange, arg9);
  1014. str_to_number(m_BetMoney, arg10);
  1015.  
  1016. if (!isdigit(*arg2) && !isdigit(*arg3) && !isdigit(*arg4) && !isdigit(*arg5) && !isdigit(*arg6) && !isdigit(*arg7) && !isdigit(*arg8) && !isdigit(*arg9) && !isdigit(*arg10))
  1017. {
  1018. Duel_SendMessage(ch, m_nDuelTranslate[0]);
  1019. return;
  1020. }
  1021.  
  1022. if (m_BetMoney < 0)
  1023. {
  1024. Duel_SendMessage(ch, m_nDuelTranslate[1]);
  1025. return;
  1026. }
  1027.  
  1028. if (m_BetMoney >= GOLD_MAX)
  1029. {
  1030. Duel_SendMessage(ch, m_nDuelTranslate[2]);
  1031. return;
  1032. }
  1033.  
  1034. if (ch->GetGold() < GOLD_MAX)
  1035. {
  1036. Duel_SendMessage(ch, m_nDuelTranslate[3]);
  1037. return;
  1038. }
  1039.  
  1040. if ((ch->GetGold() + m_BetMoney) > GOLD_MAX)
  1041. {
  1042. Duel_SendMessage(ch, m_nDuelTranslate[4]);
  1043. return;
  1044. }
  1045.  
  1046. if ((pkVictim->GetGold() + m_BetMoney) > GOLD_MAX)
  1047. {
  1048. Duel_SendMessage(ch, m_nDuelTranslate[5]);
  1049. return;
  1050. }
  1051.  
  1052. if (pkVictim->GetGold() < m_BetMoney)
  1053. {
  1054. Duel_SendMessage(ch, m_nDuelTranslate[6]);
  1055. return;
  1056. }
  1057.  
  1058. if (*arg1 && *arg2 && *arg3 && *arg4 && *arg5 && *arg6 && *arg7 && *arg8 && *arg9 && *arg10)
  1059. {
  1060. ch->SetDuel("BlockChangeItem", m_BlockChangeItem); ch->SetDuel("BlockBuff", m_BlockBuff);
  1061. ch->SetDuel("BlockPotion", m_BlockPotion); ch->SetDuel("BlockRide", m_BlockRide);
  1062. ch->SetDuel("BlockPet", m_BlockPet); ch->SetDuel("BlockPoly", m_BlockPoly);
  1063. ch->SetDuel("BlockParty", m_BlockParty); ch->SetDuel("BlockExchange", m_BlockExchange);
  1064. ch->SetDuel("BetMoney", m_BetMoney);
  1065.  
  1066. pkVictim->SetDuel("BlockChangeItem", m_BlockChangeItem); pkVictim->SetDuel("BlockBuff", m_BlockBuff);
  1067. pkVictim->SetDuel("BlockPotion", m_BlockPotion); pkVictim->SetDuel("BlockRide", m_BlockRide);
  1068. pkVictim->SetDuel("BlockPet", m_BlockPet); pkVictim->SetDuel("BlockPoly", m_BlockPoly);
  1069. pkVictim->SetDuel("BlockParty", m_BlockParty); pkVictim->SetDuel("BlockExchange", m_BlockExchange);
  1070. pkVictim->SetDuel("BetMoney", m_BetMoney);
  1071.  
  1072. CPVPManager::instance().Insert(ch, pkVictim);
  1073. }
  1074. }
  1075.  
  1076. ACMD(do_pvp_advanced)
  1077. {
  1078. if (!ch)
  1079. return;
  1080.  
  1081. if (ch->GetArena() != NULL || CArenaManager::instance().IsArenaMap(ch->GetMapIndex()) == true)
  1082. {
  1083. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("????? ???? ? ????."));
  1084. return;
  1085. }
  1086.  
  1087. char arg1[256];
  1088. one_argument(argument, arg1, sizeof(arg1));
  1089.  
  1090. DWORD vid = 0;
  1091. str_to_number(vid, arg1);
  1092. LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);
  1093.  
  1094. if (!pkVictim)
  1095. return;
  1096.  
  1097. if (pkVictim->IsNPC())
  1098. return;
  1099.  
  1100. if (pkVictim->GetArena() != NULL)
  1101. {
  1102. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("???? ??????."));
  1103. return;
  1104. }
  1105.  
  1106. if (ch->GetQuestFlag(szTableStaticPvP[9]) > 0)
  1107. {
  1108. Duel_SendMessage(ch, m_nDuelTranslate[7]);
  1109. return;
  1110. }
  1111.  
  1112. if (pkVictim->GetQuestFlag(szTableStaticPvP[9]) > 0)
  1113. {
  1114. Duel_SendMessage(ch, m_nDuelTranslate[8]);
  1115. return;
  1116. }
  1117.  
  1118. int statusEq = pkVictim->GetQuestFlag(BLOCK_EQUIPMENT_);
  1119.  
  1120. CGuild * g = pkVictim->GetGuild();
  1121.  
  1122. const char* m_Name = pkVictim->GetName();
  1123. const char* m_GuildName = "-";
  1124.  
  1125. int m_Vid = pkVictim->GetVID();
  1126. int m_Level = pkVictim->GetLevel();
  1127. int m_PlayTime = pkVictim->GetRealPoint(POINT_PLAYTIME);
  1128. int m_MaxHP = pkVictim->GetMaxHP();
  1129. int m_MaxSP = pkVictim->GetMaxSP();
  1130.  
  1131. DWORD m_Race = pkVictim->GetRaceNum();
  1132.  
  1133. if (g)
  1134. {
  1135. ch->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_Duel_GetInfo %d %s %s %d %d %d %d %d", m_Vid, m_Name, g->GetName(), m_Level, m_Race, m_PlayTime, m_MaxHP, m_MaxSP);
  1136.  
  1137. if (statusEq < 1)
  1138. pkVictim->SendEquipment(ch);
  1139. }
  1140. else
  1141. ch->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_Duel_GetInfo %d %s %s %d %d %d %d %d", m_Vid, m_Name, m_GuildName, m_Level, m_Race, m_PlayTime, m_MaxHP, m_MaxSP);
  1142.  
  1143. if (statusEq < 1)
  1144. pkVictim->SendEquipment(ch);
  1145. }
  1146.  
  1147. ACMD(do_decline_pvp)
  1148. {
  1149. if (!ch)
  1150. return;
  1151.  
  1152. char arg1[256];
  1153. one_argument(argument, arg1, sizeof(arg1));
  1154.  
  1155. if (!*arg1)
  1156. return;
  1157.  
  1158. DWORD vid = 0;
  1159. str_to_number(vid, arg1);
  1160.  
  1161. LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);
  1162.  
  1163. if (!pkVictim)
  1164. return;
  1165.  
  1166. if (pkVictim->IsNPC())
  1167. return;
  1168.  
  1169. CPVPManager::instance().Decline(ch, pkVictim);
  1170. }
  1171.  
  1172. ACMD(do_block_equipment)
  1173. {
  1174. if (!ch)
  1175. return;
  1176.  
  1177. char arg1[256];
  1178. one_argument (argument, arg1, sizeof(arg1));
  1179.  
  1180. if (!ch->IsPC() || NULL == ch)
  1181. return;
  1182.  
  1183. int statusEq = ch->GetQuestFlag(BLOCK_EQUIPMENT_);
  1184.  
  1185. if (!strcmp(arg1, "BLOCK"))
  1186. {
  1187. if (statusEq > 0)
  1188. {
  1189. Duel_SendMessage(ch, m_nDuelTranslate[9]);
  1190. return;
  1191. }
  1192. else
  1193. ch->SetQuestFlag(BLOCK_EQUIPMENT_, 1);
  1194. Duel_SendMessage(ch, m_nDuelTranslate[10]);
  1195. }
  1196.  
  1197. if (!strcmp(arg1, "UNBLOCK"))
  1198. {
  1199. if (statusEq == 0)
  1200. {
  1201. Duel_SendMessage(ch, m_nDuelTranslate[12]);
  1202. return;
  1203. }
  1204. else
  1205. ch->SetQuestFlag(BLOCK_EQUIPMENT_, 0);
  1206. Duel_SendMessage(ch, m_nDuelTranslate[11]);
  1207. }
  1208. }
  1209. #endif
  1210.  
  1211. ACMD(do_guildskillup)
  1212. {
  1213. char arg1[256];
  1214. one_argument(argument, arg1, sizeof(arg1));
  1215.  
  1216. if (!*arg1)
  1217. return;
  1218.  
  1219. if (!ch->GetGuild())
  1220. {
  1221. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±ćµĺżˇ ĽÓÇŘŔÖÁö ľĘ˝Ŕ´Ď´Ů."));
  1222. return;
  1223. }
  1224.  
  1225. CGuild* g = ch->GetGuild();
  1226. TGuildMember* gm = g->GetMember(ch->GetPlayerID());
  1227. if (gm->grade == GUILD_LEADER_GRADE)
  1228. {
  1229. DWORD vnum = 0;
  1230. str_to_number(vnum, arg1);
  1231. g->SkillLevelUp(vnum);
  1232. }
  1233. else
  1234. {
  1235. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±ćµĺ ˝şĹł ·ąş§Ŕ» şŻ°ćÇŇ ±ÇÇŃŔĚ ľř˝Ŕ´Ď´Ů."));
  1236. }
  1237. }
  1238.  
  1239. ACMD(do_skillup)
  1240. {
  1241. char arg1[256];
  1242. one_argument(argument, arg1, sizeof(arg1));
  1243.  
  1244. if (!*arg1)
  1245. return;
  1246.  
  1247. DWORD vnum = 0;
  1248. str_to_number(vnum, arg1);
  1249.  
  1250. if (true == ch->CanUseSkill(vnum))
  1251. {
  1252. ch->SkillLevelUp(vnum);
  1253. }
  1254. else
  1255. {
  1256. switch(vnum)
  1257. {
  1258. case SKILL_HORSE_WILDATTACK:
  1259. case SKILL_HORSE_CHARGE:
  1260. case SKILL_HORSE_ESCAPE:
  1261. case SKILL_HORSE_WILDATTACK_RANGE:
  1262.  
  1263. case SKILL_7_A_ANTI_TANHWAN:
  1264. case SKILL_7_B_ANTI_AMSEOP:
  1265. case SKILL_7_C_ANTI_SWAERYUNG:
  1266. case SKILL_7_D_ANTI_YONGBI:
  1267.  
  1268. case SKILL_8_A_ANTI_GIGONGCHAM:
  1269. case SKILL_8_B_ANTI_YEONSA:
  1270. case SKILL_8_C_ANTI_MAHWAN:
  1271. case SKILL_8_D_ANTI_BYEURAK:
  1272.  
  1273. case SKILL_ADD_HP:
  1274. case SKILL_RESIST_PENETRATE:
  1275. ch->SkillLevelUp(vnum);
  1276. break;
  1277. }
  1278. }
  1279. }
  1280.  
  1281. //
  1282. // @version 05/06/20 Bang2ni - Äż¸Çµĺ Ăł¸® Delegate to CHARACTER class
  1283. //
  1284. ACMD(do_safebox_close)
  1285. {
  1286. ch->CloseSafebox();
  1287. }
  1288.  
  1289. //
  1290. // @version 05/06/20 Bang2ni - Äż¸Çµĺ Ăł¸® Delegate to CHARACTER class
  1291. //
  1292. ACMD(do_safebox_password)
  1293. {
  1294. char arg1[256];
  1295. one_argument(argument, arg1, sizeof(arg1));
  1296. ch->ReqSafeboxLoad(arg1);
  1297. }
  1298.  
  1299. ACMD(do_safebox_change_password)
  1300. {
  1301. char arg1[256];
  1302. char arg2[256];
  1303.  
  1304. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1305.  
  1306. if (!*arg1 || strlen(arg1)>6)
  1307. {
  1308. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> Ŕ߸řµČ ľĎČŁ¸¦ ŔÔ·ÂÇĎĽĚ˝Ŕ´Ď´Ů."));
  1309. return;
  1310. }
  1311.  
  1312. if (!*arg2 || strlen(arg2)>6)
  1313. {
  1314. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> Ŕ߸řµČ ľĎČŁ¸¦ ŔÔ·ÂÇĎĽĚ˝Ŕ´Ď´Ů."));
  1315. return;
  1316. }
  1317.  
  1318. if (LC_IsBrazil() == true)
  1319. {
  1320. for (int i = 0; i < 6; ++i)
  1321. {
  1322. if (arg2[i] == '\0')
  1323. break;
  1324.  
  1325. if (isalpha(arg2[i]) == false)
  1326. {
  1327. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> şńąĐąřČŁ´Â żµą®ŔÚ¸¸ °ˇ´ÉÇŐ´Ď´Ů."));
  1328. return;
  1329. }
  1330. }
  1331. }
  1332.  
  1333. TSafeboxChangePasswordPacket p;
  1334.  
  1335. p.dwID = ch->GetDesc()->GetAccountTable().id;
  1336. strlcpy(p.szOldPassword, arg1, sizeof(p.szOldPassword));
  1337. strlcpy(p.szNewPassword, arg2, sizeof(p.szNewPassword));
  1338.  
  1339. db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_CHANGE_PASSWORD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
  1340. }
  1341.  
  1342. ACMD(do_mall_password)
  1343. {
  1344. char arg1[256];
  1345. one_argument(argument, arg1, sizeof(arg1));
  1346.  
  1347. if (!*arg1 || strlen(arg1) > 6)
  1348. {
  1349. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> Ŕ߸řµČ ľĎČŁ¸¦ ŔÔ·ÂÇĎĽĚ˝Ŕ´Ď´Ů."));
  1350. return;
  1351. }
  1352.  
  1353. int iPulse = thecore_pulse();
  1354.  
  1355. if (ch->GetMall())
  1356. {
  1357. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í°ˇ ŔĚąĚ ż­·ÁŔÖ˝Ŕ´Ď´Ů."));
  1358. return;
  1359. }
  1360.  
  1361. if (iPulse - ch->GetMallLoadTime() < passes_per_sec * 10) // 10ĂĘżˇ ÇŃąř¸¸ żäĂ» °ˇ´É
  1362. {
  1363. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í¸¦ ´ÝŔşÁö 10ĂĘ ľČżˇ´Â ż­ Ľö ľř˝Ŕ´Ď´Ů."));
  1364. return;
  1365. }
  1366.  
  1367. ch->SetMallLoadTime(iPulse);
  1368.  
  1369. TSafeboxLoadPacket p;
  1370. p.dwID = ch->GetDesc()->GetAccountTable().id;
  1371. strlcpy(p.szLogin, ch->GetDesc()->GetAccountTable().login, sizeof(p.szLogin));
  1372. strlcpy(p.szPassword, arg1, sizeof(p.szPassword));
  1373.  
  1374. db_clientdesc->DBPacket(HEADER_GD_MALL_LOAD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
  1375. }
  1376.  
  1377. ACMD(do_mall_close)
  1378. {
  1379. if (ch->GetMall())
  1380. {
  1381. ch->SetMallLoadTime(thecore_pulse());
  1382. ch->CloseMall();
  1383. ch->Save();
  1384. }
  1385. }
  1386.  
  1387. ACMD(do_ungroup)
  1388. {
  1389. if (!ch->GetParty())
  1390. return;
  1391.  
  1392. if (!CPartyManager::instance().IsEnablePCParty())
  1393. {
  1394. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ĆÄĆĽ> Ľ­ąö ą®Á¦·Î ĆÄĆĽ °ü·Ă Ăł¸®¸¦ ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  1395. return;
  1396. }
  1397.  
  1398. if (ch->GetDungeon())
  1399. {
  1400. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ĆÄĆĽ> ´řŔü ľČżˇĽ­´Â ĆÄĆĽżˇĽ­ łŞ°Ą Ľö ľř˝Ŕ´Ď´Ů."));
  1401. return;
  1402. }
  1403.  
  1404. LPPARTY pParty = ch->GetParty();
  1405.  
  1406. if (pParty->GetMemberCount() == 2)
  1407. {
  1408. // party disband
  1409. CPartyManager::instance().DeleteParty(pParty);
  1410. }
  1411. else
  1412. {
  1413. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ĆÄĆĽ> ĆÄĆĽżˇĽ­ łŞ°ˇĽĚ˝Ŕ´Ď´Ů."));
  1414. //pParty->SendPartyRemoveOneToAll(ch);
  1415. pParty->Quit(ch->GetPlayerID());
  1416. //pParty->SendPartyRemoveAllToOne(ch);
  1417. }
  1418. }
  1419.  
  1420. #ifdef GIFT_SYSTEM
  1421. #include "db.h"
  1422. #include <string>
  1423. #include <boost/algorithm/string.hpp>
  1424.  
  1425. ACMD(do_gift_show)
  1426. {
  1427. ch->ChatPacket(CHAT_TYPE_COMMAND, "gift_show");
  1428. }
  1429. bool GetGift(LPCHARACTER ch, DWORD id,bool all=false)
  1430. {
  1431. char szSockets[1024] = { '\0' };
  1432. char *tempSockets = szSockets;
  1433. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
  1434. {
  1435. tempSockets += sprintf(tempSockets, "socket%d", i);
  1436.  
  1437. if (i<ITEM_SOCKET_MAX_NUM - 1)
  1438. tempSockets += sprintf(tempSockets, ",");
  1439. }
  1440. char szAttrs[1024] = { '\0' };
  1441. char *tempAttrs = szAttrs;
  1442. for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; i++)
  1443. {
  1444. if (i < 7)
  1445. tempAttrs += sprintf(tempAttrs, "attrtype%d,attrvalue%d", i, i);
  1446. else
  1447. tempAttrs += sprintf(tempAttrs, "applytype%d,applyvalue%d", i - 7, i - 7);
  1448. if (i<ITEM_ATTRIBUTE_MAX_NUM - 1)
  1449. tempAttrs += sprintf(tempAttrs, ",");
  1450. }
  1451. char query[8192];
  1452. if (!all)
  1453. snprintf(query, sizeof(query), "SELECT id,vnum,count,%s,%s from player_gift where id='%d' and owner_id=%d and status='WAIT'", szSockets, szAttrs, id, ch->GetPlayerID());
  1454. else
  1455. snprintf(query, sizeof(query), "SELECT id,vnum,count,%s,%s from player_gift where owner_id=%d and status='WAIT'", szSockets, szAttrs, ch->GetPlayerID());
  1456. SQLMsg * pkMsg(DBManager::instance().DirectQuery(query));
  1457. SQLResult * pRes = pkMsg->Get();
  1458. if (pRes->uiNumRows > 0)
  1459. {
  1460. ch->SetQuestFlag("gift.time", get_global_time()+(1*pRes->uiNumRows)+2);
  1461. MYSQL_ROW row;
  1462. bool force = false;
  1463. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  1464. {
  1465. DWORD vnum, socket[ITEM_SOCKET_MAX_NUM], attr[ITEM_ATTRIBUTE_MAX_NUM][2];
  1466. int col = 0;
  1467. long long count = 0;
  1468. str_to_number(id, row[col++]);
  1469. str_to_number(vnum, row[col++]);
  1470. str_to_number(count, row[col++]);
  1471. if (vnum == 1)
  1472. {
  1473. #ifndef FULL_YANG
  1474. long long nTotalMoney = ch->GetGold()+count;
  1475.  
  1476. if (GOLD_MAX <= nTotalMoney)
  1477. {
  1478. sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", ch->GetPlayerID(), ch->GetName());
  1479. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» ż­Ľö°ˇ ľř˝Ŕ´Ď´Ů"));
  1480. return true;
  1481. }
  1482. #endif
  1483. #ifdef FULL_YANG_OWN
  1484. ch->ChangeGold(count);
  1485. #else
  1486. ch->PointChange(POINT_GOLD, count, false);
  1487. #endif
  1488.  
  1489. }
  1490. else {
  1491. if (force)
  1492. continue;
  1493. for (int s = 0; s < ITEM_SOCKET_MAX_NUM; s++)
  1494. str_to_number(socket[s], row[col++]);
  1495.  
  1496. for (int a = 0; a < ITEM_ATTRIBUTE_MAX_NUM; a++)
  1497. {
  1498. str_to_number(attr[a][0], row[col++]);
  1499. str_to_number(attr[a][1], row[col++]);
  1500. }
  1501. LPITEM item = ITEM_MANAGER::instance().CreateItem(vnum, count, 0, true);
  1502. if (item)
  1503. {
  1504. for (int s = 0; s < ITEM_SOCKET_MAX_NUM; s++)
  1505. item->SetSocket(s, socket[s], false);
  1506. item->ClearAttribute();
  1507. for (int a = 0; a < ITEM_ATTRIBUTE_MAX_NUM; a++)
  1508. item->SetForceAttribute(a, attr[a][0], attr[a][1]);
  1509.  
  1510.  
  1511. if (item->IsDragonSoul())
  1512. {
  1513. int iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
  1514.  
  1515. if (iEmptyPos != -1)
  1516. {
  1517. item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
  1518. }
  1519. else
  1520. {
  1521. M2_DESTROY_ITEM(item);
  1522. if (!ch->DragonSoul_IsQualified())
  1523. {
  1524. ch->ChatPacket(CHAT_TYPE_INFO, "<Gift> %s #3", LC_TEXT( "UNKNOW_ERROR"));
  1525. force = true;
  1526. continue;
  1527. }
  1528. else {
  1529. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "INVENTORY_FULL_ERROR"));
  1530. force = true;
  1531. continue;
  1532. }
  1533. }
  1534. }
  1535. else
  1536. {
  1537. int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
  1538.  
  1539. if (iEmptyPos != -1)
  1540. {
  1541. item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
  1542. }
  1543. else
  1544. {
  1545. M2_DESTROY_ITEM(item);
  1546. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "INVENTORY_FULL_ERROR"));
  1547. force = true;
  1548. continue;
  1549. }
  1550. }
  1551. }
  1552. else
  1553. {
  1554. ch->ChatPacket(CHAT_TYPE_INFO, "<Gift> %s #4", LC_TEXT( "UNKNOW_ERROR"));
  1555. force = true;
  1556. continue;
  1557. }
  1558.  
  1559. }
  1560. DBManager::instance().DirectQuery("UPDATE player_gift SET status='OK',date_get=NOW() where id=%d;", id);
  1561. }
  1562. if (force)
  1563. return true;
  1564. if (all)
  1565. ch->ChatPacket(CHAT_TYPE_INFO,LC_TEXT("GIFT_ADD_ALL_SUCCESS"));
  1566. else
  1567. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "GIFT_ADD_SUCCESS"));
  1568. ch->SetQuestFlag("gift.time", get_global_time()+2);
  1569. return true;
  1570. }
  1571. return false;
  1572. }
  1573. ACMD(do_gift_get)
  1574. {
  1575. if(ch->GetQuestFlag("gift.time") > get_global_time())
  1576. return;
  1577. char arg1[256];
  1578. one_argument(argument, arg1, sizeof(arg1));
  1579. bool full = !isdigit(*arg1);
  1580. DWORD id;
  1581. str_to_number(id, arg1);
  1582. if (GetGift(ch, id,full))
  1583. {
  1584. ch->RefreshGift();
  1585. ch->LoadGiftPage(ch->GetLastGiftPage());
  1586. }
  1587.  
  1588. }
  1589. ACMD(do_gift_refresh)
  1590. {
  1591. char arg1[256];
  1592. one_argument(argument, arg1, sizeof(arg1));
  1593. if (!*arg1)
  1594. {
  1595. if (ch->GetGiftPages() > 0)
  1596. ch->ChatPacket(CHAT_TYPE_COMMAND, "gift_info %d", ch->GetGiftPages());
  1597. }
  1598. else{
  1599. int page;
  1600. str_to_number(page, arg1);
  1601. ch->LoadGiftPage(page);
  1602.  
  1603. }
  1604.  
  1605.  
  1606. }
  1607. #endif
  1608.  
  1609. #ifdef OFFLINE_SHOP
  1610. void DeleteShop(DWORD id)
  1611. {
  1612. CharacterVectorInteractor i;
  1613. if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))
  1614. {
  1615. CharacterVectorInteractor::iterator it = i.begin();
  1616.  
  1617. while (it != i.end()) {
  1618. LPCHARACTER pc = *it++;
  1619. if (pc)
  1620. if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == id) {
  1621. pc->DeleteMyShop();
  1622. return;
  1623. }
  1624.  
  1625.  
  1626. }
  1627. }
  1628. TPacketShopClose packet;
  1629. packet.shop_id = id;
  1630. packet.pid = 0;
  1631. db_clientdesc->DBPacket(HEADER_GD_SHOP_CLOSE, 0, &packet, sizeof(packet));
  1632. }
  1633.  
  1634. ACMD(do_close_shop)
  1635. {
  1636. #ifdef ACCOUNT_SHIELD
  1637. if (ch->IsBlockAccount())
  1638. return;
  1639. #endif
  1640. if (ch->IsObserverMode() || ch->GetExchange())
  1641. return;
  1642. DWORD id;
  1643. char arg1[256];
  1644. one_argument(argument, arg1, sizeof(arg1));
  1645. if (!*arg1)
  1646. {
  1647. ch->CloseMyShop();
  1648. }else{
  1649. str_to_number(id, arg1);
  1650. char pid[4096];
  1651. sprintf(pid, "and player_id=%d", ch->GetPlayerID());
  1652. if (id > 0)
  1653. {
  1654. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT player_id,channel from player_shop WHERE id = %d %s", id, (ch->GetGMLevel() >= SHOP_GM_PRIVILEGES ? "" : pid)));
  1655. SQLResult * pRes = pkMsg->Get();
  1656. if (pRes->uiNumRows > 0)
  1657. DeleteShop(id);
  1658. }
  1659.  
  1660.  
  1661.  
  1662. }
  1663. }
  1664. #include "banword.h"
  1665. ACMD(do_set_name_shop)
  1666. {
  1667. #ifdef ACCOUNT_SHIELD
  1668. if (ch->IsBlockAccount())
  1669. return;
  1670. #endif
  1671. if (ch->IsObserverMode() || ch->GetExchange())
  1672. return;
  1673. DWORD id;
  1674. char arg1[256];
  1675. char arg2[256];
  1676. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  1677. if (!*arg1 || !*arg2)
  1678. return;
  1679. str_to_number(id, arg1);
  1680. char pid[4096];
  1681. sprintf(pid, "and player_id=%d", ch->GetPlayerID());
  1682. std::string m_stShopSign(arg2);
  1683. boost::algorithm::replace_all(m_stShopSign, "\\", " ");
  1684. boost::algorithm::replace_all(m_stShopSign, "%", "%%");
  1685. if (m_stShopSign.length()>SHOP_SIGN_MAX_LEN)
  1686. m_stShopSign.resize(SHOP_SIGN_MAX_LEN);
  1687. if (m_stShopSign.length()<1) {
  1688. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("şńĽÓľîłŞ Ŕşľî°ˇ Ć÷ÇÔµČ »óÁˇ Ŕ̸§Ŕ¸·Î »óÁˇŔ» ż­ Ľö ľř˝Ŕ´Ď´Ů."));
  1689. return;
  1690. }
  1691. #ifdef STRING_PROTECTION
  1692. if (CBanwordManager::instance().CheckString(m_stShopSign.c_str(), m_stShopSign.length()) != "")
  1693. {
  1694. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("şńĽÓľîłŞ Ŕşľî°ˇ Ć÷ÇÔµČ »óÁˇ Ŕ̸§Ŕ¸·Î »óÁˇŔ» ż­ Ľö ľř˝Ŕ´Ď´Ů."));
  1695. return;
  1696. }
  1697. #else
  1698.  
  1699. if (CBanwordManager::instance().CheckString(m_stShopSign.c_str(), m_stShopSign.length()))
  1700. {
  1701. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("şńĽÓľîłŞ Ŕşľî°ˇ Ć÷ÇÔµČ »óÁˇ Ŕ̸§Ŕ¸·Î »óÁˇŔ» ż­ Ľö ľř˝Ŕ´Ď´Ů."));
  1702. return;
  1703. }
  1704. #endif
  1705. if (id>0)
  1706. {
  1707. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id,player_id,channel from player_shop WHERE id = %d %s", id, (ch->GetGMLevel() >= SHOP_GM_PRIVILEGES ? "" : pid)));
  1708. SQLResult * pRes = pkMsg->Get();
  1709. if (pRes->uiNumRows > 0)
  1710. {
  1711. char szName[256];
  1712. DBManager::instance().EscapeString(szName, 256, m_stShopSign.c_str(), m_stShopSign.length());
  1713. DBManager::Instance().DirectQuery("UPDATE player_shop SET name='%s' WHERE id=%d", szName, id);
  1714. ch->LoadPrivShops();
  1715. CharacterVectorInteractor i;
  1716. if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))
  1717. {
  1718. CharacterVectorInteractor::iterator it = i.begin();
  1719.  
  1720. while (it != i.end()) {
  1721. LPCHARACTER pc = *it++;
  1722. if (pc)
  1723. if (pc->GetMyShop() && pc->GetPrivShop() == id) {
  1724. pc->SetShopSign(m_stShopSign.c_str());
  1725. return;
  1726. }
  1727.  
  1728.  
  1729. }
  1730. }
  1731. TPacketShopName packet;
  1732. packet.shop_id = id;
  1733. strlcpy(packet.szSign, m_stShopSign.c_str(), sizeof(packet.szSign) - 1);
  1734. db_clientdesc->DBPacket(HEADER_GD_SHOP_NAME, 0, &packet, sizeof(packet));
  1735.  
  1736.  
  1737. }
  1738. }
  1739. }
  1740.  
  1741. ACMD(do_shop_refresh)
  1742. {
  1743. ch->SendShops();
  1744. }
  1745. ACMD(do_gowno_yang)
  1746. {
  1747. if (ch->IsObserverMode() || ch->GetExchange())
  1748. return;
  1749. DWORD id;
  1750. char arg1[256];
  1751. one_argument(argument, arg1, sizeof(arg1));
  1752. if (!*arg1)
  1753. return;
  1754. str_to_number(id, arg1);
  1755. if (*arg1)
  1756. {
  1757. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT gold from player_shop WHERE id = %d and player_id=%d", id,ch->GetPlayerID()));
  1758. SQLResult * pRes = pkMsg->Get();
  1759. if (pRes->uiNumRows>0)
  1760. {
  1761. MYSQL_ROW row;
  1762. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  1763. {
  1764. long long gold;
  1765. str_to_number(gold, row[0]);
  1766. if (gold >0)
  1767. {
  1768. #ifndef FULL_YANG
  1769. long long nTotalMoney = ch->GetGold() + gold;
  1770.  
  1771. if (GOLD_MAX <= nTotalMoney)
  1772. {
  1773. sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", ch->GetPlayerID(), ch->GetName());
  1774. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» ż­Ľö°ˇ ľř˝Ŕ´Ď´Ů"));
  1775. return;
  1776. }
  1777. #endif
  1778. #ifdef FULL_YANG_OWN
  1779. ch->ChangeGold(gold);
  1780. #else
  1781. ch->PointChange(POINT_GOLD,gold, false);
  1782. #endif
  1783.  
  1784. TPrivShop s = ch->GetPrivShopTable(id);
  1785. s.gold = s.gold - gold;
  1786. s.rest_count = s.item_count - 1;
  1787. ch->UpdatePrivShopTable(s.shop_id, s);
  1788. ch->SendShops();
  1789. DBManager::instance().DirectQuery("UPDATE player_shop SET gold=gold - %lld WHERE id = %d", gold, id);
  1790. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("SHOP_YANG_ADD"));
  1791. }
  1792. }
  1793. }
  1794. }
  1795. }
  1796. #include <boost/algorithm/string.hpp>
  1797. ACMD(do_shop_update_item)
  1798. {
  1799.  
  1800. if (ch->IsObserverMode() || ch->GetExchange() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->IsCubeOpen() || ch->GetMyShop())
  1801. return;
  1802. char arg1[256];
  1803. one_argument(argument, arg1, sizeof(arg1));
  1804. if (!*arg1)
  1805. return;
  1806. std::vector<std::string> args;
  1807. boost::split(args, arg1, boost::is_any_of("|"));
  1808. if (args.size()<3) {
  1809. return;
  1810. }
  1811. DWORD shop_id;
  1812. str_to_number(shop_id, args[1].c_str());
  1813. bool myShop=false;
  1814. {
  1815. CharacterVectorInteractor i;
  1816. if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))
  1817. {
  1818. CharacterVectorInteractor::iterator it = i.begin();
  1819. while (it != i.end()) {
  1820. LPCHARACTER pc = *it++;
  1821. if (pc)
  1822. if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == shop_id) {
  1823. myShop=true;
  1824. break;
  1825. }
  1826.  
  1827.  
  1828. }
  1829. }
  1830. }
  1831. if(!myShop)
  1832. {
  1833. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id from player_shop WHERE id = %d and player_id=%d", shop_id, ch->GetPlayerID()));
  1834. SQLResult * pRes = pkMsg->Get();
  1835. myShop=pRes->uiNumRows>0;
  1836. }
  1837. if (myShop)
  1838. {
  1839.  
  1840. {
  1841. TPacketShopUpdateItem packet;
  1842. packet.shop_id = shop_id;
  1843. packet.shop_locked = true;
  1844. db_clientdesc->DBPacket(HEADER_GD_SHOP_UPDATE_ITEM, 0, &packet, sizeof(packet));
  1845. }
  1846. /*
  1847. /update_shop_item price|%d|%d|%d)
  1848. /update_shop_item remove|%d|%d
  1849. /update_shop_item add|%d|%d|%d|%d|%s
  1850.  
  1851. */
  1852. if (args.size() == 4)
  1853. {
  1854. DWORD item_id;
  1855. str_to_number(item_id, args[2].c_str());
  1856. long long price;
  1857. str_to_number(price, args[3].c_str());
  1858. if (price <= 0 || item_id <= 0)
  1859. return;
  1860. {
  1861. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id from player_shop_items WHERE id = %d and shop_id=%d", item_id, shop_id));
  1862. SQLResult * pRes = pkMsg->Get();
  1863. if (pRes->uiNumRows > 0)
  1864. DBManager::instance().DirectQuery("UPDATE player_shop_items SET price=%lld WHERE id = %d and shop_id=%d", price, item_id, shop_id);
  1865.  
  1866.  
  1867.  
  1868. }
  1869. }
  1870. else if (args.size() == 3)
  1871. {
  1872. DWORD item_id;
  1873. str_to_number(item_id, args[2].c_str());
  1874. if (item_id <= 0)
  1875. return;
  1876. {
  1877.  
  1878. std::string shop_name(LC_TEXT( "SHOP_NAME"));
  1879. boost::replace_all(shop_name, "#PLAYER_NAME#", ch->GetName());
  1880. boost::replace_all(shop_name, "#ID#", "");
  1881.  
  1882.  
  1883. char szSockets[1024] = { '\0' };
  1884. char *tempSockets = szSockets;
  1885. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
  1886. {
  1887. tempSockets += sprintf(tempSockets, "socket%d", i);
  1888.  
  1889. if (i<ITEM_SOCKET_MAX_NUM - 1)
  1890. tempSockets += sprintf(tempSockets, ",");
  1891. }
  1892. char szAttrs[1024] = { '\0' };
  1893. char *tempAttrs = szAttrs;
  1894. for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; i++)
  1895. {
  1896. if (i < 7)
  1897. tempAttrs += sprintf(tempAttrs, "attrtype%d,attrvalue%d", i, i);
  1898. else
  1899. tempAttrs += sprintf(tempAttrs, "applytype%d,applyvalue%d", i - 7, i - 7);
  1900. if (i<ITEM_ATTRIBUTE_MAX_NUM - 1)
  1901. tempAttrs += sprintf(tempAttrs, ",");
  1902. }
  1903.  
  1904. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT vnum,count,%s,%s from player_shop_items where shop_id='%d' and id=%d", szSockets,szAttrs,shop_id, item_id));
  1905. SQLResult * pRes = pkMsg->Get();
  1906. if (pRes->uiNumRows>0)
  1907. {
  1908. MYSQL_ROW row;
  1909. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  1910. {
  1911.  
  1912. int col = 0;
  1913. char query[8192];
  1914. sprintf(query, "INSERT INTO player_gift SET owner_id=%d,reason='%s',`from`=replace(\"%s\",' ','_'),status='WAIT',date_add=NOW()", ch->GetPlayerID(), LC_TEXT( "SHOP_ITEM_REASON"), shop_name.c_str());
  1915. sprintf(query, "%s, vnum='%s'", query, row[col++]);
  1916. sprintf(query, "%s, count='%s'", query, row[col++]);
  1917. for (int s = 0; s < ITEM_SOCKET_MAX_NUM; s++)
  1918. sprintf(query, "%s, socket%d='%s'", query, s, row[col++]);
  1919.  
  1920. for (int ia = 0; ia < ITEM_ATTRIBUTE_MAX_NUM; ia++)
  1921. {
  1922. if (ia < 7)
  1923. {
  1924. sprintf(query, "%s, attrtype%d='%s'", query, ia, row[col++]);
  1925. sprintf(query, "%s, attrvalue%d='%s'", query, ia, row[col++]);
  1926. }
  1927. else
  1928. {
  1929. sprintf(query, "%s, applytype%d='%s'", query, ia-7,row[col++]);
  1930. sprintf(query, "%s, applyvalue%d='%s'", query, ia-7,row[col++]);
  1931. }
  1932. }
  1933. SQLMsg * pkMsg(DBManager::instance().DirectQuery(query));
  1934. SQLResult * pRes = pkMsg->Get();
  1935. DWORD gift_id = pRes->uiInsertID;
  1936. if (gift_id > 0)
  1937. GetGift(ch, gift_id);
  1938.  
  1939. DBManager::instance().DirectQuery("delete from player_shop_items where id='%d'", item_id);
  1940. DBManager::instance().DirectQuery("UPDATE player_shop SET item_count=item_count-1 WHERE id = %d", shop_id);
  1941. }
  1942. }
  1943.  
  1944. }
  1945. }
  1946.  
  1947. else if (args.size() == 6)
  1948. {
  1949. BYTE display_pos;
  1950. str_to_number(display_pos, args[2].c_str());
  1951.  
  1952. if (display_pos < 0)
  1953. return;
  1954. WORD pos;
  1955. str_to_number(pos, args[3].c_str());
  1956. if (pos < 0)
  1957. return;
  1958.  
  1959. BYTE window_type;
  1960. str_to_number(window_type, args[4].c_str());
  1961. if (window_type < 0)
  1962. return;
  1963.  
  1964. #ifdef ACCE_LENNT_FIX
  1965. if(ch->IsAcceOpen())
  1966. Acce_close(ch);
  1967. #endif
  1968. long long price;
  1969.  
  1970. str_to_number(price, args[5].c_str());
  1971. if (price <= 0)
  1972. return;
  1973. #ifndef FULL_YANG
  1974. {
  1975. long long nTotalMoney=price;
  1976. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT price from player_shop_items where shop_id='%d'", shop_id));
  1977. SQLResult * pRes = pkMsg->Get();
  1978. if (pRes->uiNumRows>0)
  1979. {
  1980. MYSQL_ROW row;
  1981. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  1982. {
  1983. long long temp;
  1984. str_to_number(temp,row[0]);
  1985. nTotalMoney+=temp;
  1986. }
  1987. }
  1988. if (GOLD_MAX <= nTotalMoney)
  1989. {
  1990. sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", ch->GetPlayerID(), ch->GetName());
  1991. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» ż­Ľö°ˇ ľř˝Ŕ´Ď´Ů"));
  1992. return;
  1993. }
  1994. }
  1995. #endif
  1996. LPITEM item = ch->GetItem(TItemPos(window_type, pos));
  1997. if (item)
  1998. {
  1999. const TItemTable * item_table = item->GetProto();
  2000.  
  2001. if (item_table && (IS_SET(item_table->dwAntiFlags, ITEM_ANTIFLAG_GIVE | ITEM_ANTIFLAG_MYSHOP)))
  2002. {
  2003. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "ŔŻ·áČ­ ľĆŔĚĹŰŔş °łŔλóÁˇżˇĽ­ ĆǸĹÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2004. return;
  2005. }
  2006.  
  2007. if (item->IsEquipped())
  2008. {
  2009. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "ŔĺşńÁßŔÎ ľĆŔĚĹŰŔş °łŔλóÁˇżˇĽ­ ĆǸĹÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2010. return;
  2011. }
  2012.  
  2013. if (item->isLocked())
  2014. {
  2015. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "»çżëÁßŔÎ ľĆŔĚĹŰŔş °łŔλóÁˇżˇĽ­ ĆǸĹÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2016. return;
  2017. }
  2018. if (item->GetOwner() != ch)
  2019. {
  2020. return;
  2021. }
  2022. #ifdef SOULBIND_SYSTEM
  2023. if (item->IsSoulBind())
  2024. {
  2025. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT( "You can't sell in private shop item with soul bind."));
  2026. return;
  2027. }
  2028. #endif
  2029. char query[1024];
  2030. sprintf(query, "INSERT INTO player_shop_items SET");
  2031. sprintf(query, "%s player_id='%d'", query, ch->GetPlayerID());
  2032. sprintf(query, "%s, shop_id='%d'", query, shop_id);
  2033. sprintf(query, "%s, vnum='%d'", query, item->GetVnum());
  2034. sprintf(query, "%s, count='%d'", query, item->GetCount());
  2035. sprintf(query, "%s, price='%lld'", query, price);
  2036.  
  2037. sprintf(query, "%s, display_pos='%u'", query, display_pos);
  2038. for (int s = 0; s < ITEM_SOCKET_MAX_NUM; s++)
  2039. {
  2040. sprintf(query, "%s, socket%d='%ld'", query, s, item->GetSocket(s));
  2041.  
  2042. }
  2043.  
  2044. for (int ia = 0; ia < ITEM_ATTRIBUTE_MAX_NUM; ia++)
  2045. {
  2046. const TPlayerItemAttribute& attr = item->GetAttribute(ia);
  2047. if (ia < 7)
  2048. {
  2049. sprintf(query, "%s, attrtype%d='%u'", query, ia, attr.bType);
  2050. sprintf(query, "%s, attrvalue%d='%d'", query, ia, attr.sValue);
  2051. }
  2052. else
  2053. {
  2054. sprintf(query, "%s, applytype%d='%u'", query, ia-7, attr.bType);
  2055. sprintf(query, "%s, applyvalue%d='%d'", query, ia-7, attr.sValue);
  2056. }
  2057. }
  2058.  
  2059. DBManager::instance().DirectQuery(query);
  2060. ITEM_MANAGER::Instance().RemoveItem(item, "Priv shop");
  2061. DBManager::instance().DirectQuery("UPDATE player_shop SET item_count=item_count +1 WHERE id = %d", shop_id);
  2062. }
  2063. else
  2064. return;
  2065.  
  2066.  
  2067.  
  2068. }
  2069. else
  2070. return;
  2071. ch->LoadPrivShops();
  2072. char buf[32];
  2073. sprintf(buf, "refresh_shop_items %d", shop_id);
  2074. interpret_command(ch, buf, strlen(buf));
  2075. CharacterVectorInteractor i;
  2076. if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))
  2077. {
  2078. CharacterVectorInteractor::iterator it = i.begin();
  2079. while (it != i.end()) {
  2080. LPCHARACTER pc = *it++;
  2081. if (pc)
  2082. if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == shop_id) {
  2083. pc->UpdateShopItems();
  2084. return;
  2085. }
  2086.  
  2087.  
  2088. }
  2089. }
  2090.  
  2091. TPacketShopUpdateItem packet;
  2092. packet.shop_id = shop_id;
  2093. packet.shop_locked = false;
  2094. db_clientdesc->DBPacket(HEADER_GD_SHOP_UPDATE_ITEM, 0, &packet, sizeof(packet));
  2095. }
  2096. }
  2097.  
  2098. ACMD(do_shop_refresh_items)
  2099. {
  2100. if (ch->IsObserverMode() || ch->GetExchange() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->IsCubeOpen() || ch->GetMyShop())
  2101. {
  2102.  
  2103. ch->ChatPacket(CHAT_TYPE_COMMAND, "shop_item_clear");
  2104. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't edit shop while you have opened normal shop."));
  2105. return;
  2106. }
  2107.  
  2108. DWORD id;
  2109. char arg1[256];
  2110. one_argument(argument, arg1, sizeof(arg1));
  2111. if (!*arg1)
  2112. return;
  2113. str_to_number(id, arg1);
  2114. char szSockets[1024] = { '\0' };
  2115. char *tempSockets = szSockets;
  2116. for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
  2117. {
  2118. tempSockets += sprintf(tempSockets, "socket%d", i);
  2119.  
  2120. if (i<ITEM_SOCKET_MAX_NUM - 1)
  2121. tempSockets += sprintf(tempSockets, ",");
  2122. }
  2123. char szAttrs[1024] = { '\0' };
  2124. char *tempAttrs = szAttrs;
  2125. for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; i++)
  2126. {
  2127. if (i < 7)
  2128. tempAttrs += sprintf(tempAttrs, "attrtype%d,attrvalue%d", i, i);
  2129. else
  2130. tempAttrs += sprintf(tempAttrs, "applytype%d,applyvalue%d", i - 7, i - 7);
  2131. if (i<ITEM_ATTRIBUTE_MAX_NUM - 1)
  2132. tempAttrs += sprintf(tempAttrs, ",");
  2133. }
  2134. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id,vnum,count,display_pos,price,%s,%s from player_shop_items where shop_id='%d'", szSockets,szAttrs,id));
  2135.  
  2136. SQLResult * pRes = pkMsg->Get();
  2137. BYTE bItemCount = pRes->uiNumRows;
  2138. std::vector<TShopItemTable *> map_shop;
  2139. ch->ChatPacket(CHAT_TYPE_COMMAND, "shop_item_clear");
  2140. if (bItemCount>0)
  2141. {
  2142. bItemCount = 0;
  2143. MYSQL_ROW row;
  2144. int c = 0;
  2145. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  2146. {
  2147. int col = 5;
  2148. char attrs[1024] = { '\0' };
  2149. char sockets[1024] = { '\0' };
  2150. for (int i = 0; i<ITEM_SOCKET_MAX_NUM; i++)
  2151. sprintf(sockets, "%s%s%s", sockets, row[col++], (i<ITEM_SOCKET_MAX_NUM-1 ? "|" : ""));
  2152. //col--;
  2153.  
  2154. for (int i = 0; i<ITEM_ATTRIBUTE_MAX_NUM; i++)
  2155. sprintf(attrs, "%s%s,%s%s", attrs, row[col++], row[col++], (i<ITEM_ATTRIBUTE_MAX_NUM-1 ? "|" : ""));
  2156. ch->ChatPacket(CHAT_TYPE_COMMAND, "shop_item %s#%s#%s#%s#%s#%s#%s", row[0], row[1], row[2], row[3], row[4], sockets, attrs);
  2157. }
  2158. }
  2159.  
  2160. }
  2161. ACMD(do_shop_update)
  2162. {
  2163. if (ch->IsObserverMode() || ch->GetExchange())
  2164. return;
  2165.  
  2166. DWORD id;
  2167. char arg1[256];
  2168. one_argument(argument, arg1, sizeof(arg1));
  2169. if (!*arg1)
  2170. return;
  2171. str_to_number(id, arg1);
  2172. if (*arg1)
  2173. {
  2174. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT player_id from player_shop WHERE id = %d", id));
  2175. SQLResult * pRes = pkMsg->Get();
  2176. if (pRes->uiNumRows>0)
  2177. {
  2178. ch->ChatPacket(CHAT_TYPE_INFO, "Shop %s has been updated", arg1);
  2179. CharacterVectorInteractor i;
  2180. if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))
  2181. {
  2182. CharacterVectorInteractor::iterator it = i.begin();
  2183.  
  2184. while (it != i.end()) {
  2185. LPCHARACTER pc = *it++;
  2186. if (pc)
  2187. if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == id) {
  2188. pc->UpdateShopItems();
  2189. return;
  2190. }
  2191.  
  2192.  
  2193. }
  2194. }
  2195. TPacketShopUpdateItem packet;
  2196. packet.shop_id = id;
  2197. db_clientdesc->DBPacket(HEADER_GD_SHOP_UPDATE_ITEM, 0, &packet, sizeof(packet));
  2198. }
  2199. else
  2200. ch->ChatPacket(CHAT_TYPE_INFO, "Shop %s does exists", arg1);
  2201. }
  2202. }
  2203. ACMD(do_shop_delete)
  2204. {
  2205. if (ch->IsObserverMode() || ch->GetExchange())
  2206. return;
  2207. char arg1[256];
  2208. char arg2[256];
  2209. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2210. if (!*arg1 || !*arg2)
  2211. {
  2212. ch->ChatPacket(CHAT_TYPE_INFO, "Usage:");
  2213. ch->ChatPacket(CHAT_TYPE_INFO, "/delete_shop <type> <arg> ");
  2214. ch->ChatPacket(CHAT_TYPE_INFO, "Types:");
  2215. ch->ChatPacket(CHAT_TYPE_INFO, " shopid - Delete shop using ID");
  2216. ch->ChatPacket(CHAT_TYPE_INFO, " player - Delete all player shops by player name");
  2217. ch->ChatPacket(CHAT_TYPE_INFO, "Example:");
  2218. ch->ChatPacket(CHAT_TYPE_INFO, " /delete_shop player Best4ever");
  2219. ch->ChatPacket(CHAT_TYPE_INFO, " /delete_shop shopid 1");
  2220. return;
  2221. }
  2222. if (!strcmp(arg1, "player"))
  2223. {
  2224. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id from player_shop WHERE player_id=(select id from player where name='%s')", arg2));
  2225. SQLResult * pRes = pkMsg->Get();
  2226. if (pRes->uiNumRows>0)
  2227. {
  2228. MYSQL_ROW row;
  2229. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  2230. {
  2231. DWORD id;
  2232. str_to_number(id, row[0]);
  2233. DeleteShop(id);
  2234. }
  2235. }
  2236. else
  2237. ch->ChatPacket(CHAT_TYPE_INFO, "Player %s does have any shop", arg2);
  2238. }
  2239. if (!strcmp(arg1, "shopid"))
  2240. {
  2241. SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id from player_shop WHERE id='%s'", arg2));
  2242. SQLResult * pRes = pkMsg->Get();
  2243. if (pRes->uiNumRows>0)
  2244. {
  2245. MYSQL_ROW row;
  2246. while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  2247. {
  2248. DWORD id;
  2249. str_to_number(id, arg2);
  2250. DeleteShop(id);
  2251. }
  2252. }
  2253. else
  2254. ch->ChatPacket(CHAT_TYPE_INFO, "Shop %s does exists", arg2);
  2255. }
  2256. }
  2257. #else
  2258.  
  2259. ACMD(do_close_shop)
  2260. {
  2261. if (ch->IsObserverMode())
  2262. return;
  2263. if (ch->GetMyShop())
  2264. {
  2265. ch->CloseMyShop();
  2266. return;
  2267. }
  2268. }
  2269. #endif
  2270.  
  2271. ACMD(do_set_walk_mode)
  2272. {
  2273. ch->SetNowWalking(true);
  2274. ch->SetWalking(true);
  2275. }
  2276.  
  2277. ACMD(do_ch)
  2278. {
  2279. char arg1[256];
  2280. one_argument(argument, arg1, sizeof(arg1));
  2281.  
  2282. if (!*arg1)
  2283. return;
  2284.  
  2285. int new_ch;
  2286. str_to_number(new_ch, arg1);
  2287.  
  2288. if (!ch)
  2289. ch->ChatPacket(CHAT_TYPE_INFO, "[Change Channel] Kanal jest Offline!");
  2290. return;
  2291.  
  2292. if (ch->GetExchange())
  2293. ch->ChatPacket(CHAT_TYPE_INFO, "[Change Channel] Zamknij okno handlu aby zmienic Channel!");
  2294. return;
  2295.  
  2296.  
  2297. if (ch->IsDead())
  2298. ch->ChatPacket(CHAT_TYPE_INFO, "[Change Channel] Nie zyjesz, nie mozesz zmienic kanalu!");
  2299. return;
  2300.  
  2301.  
  2302. if (ch->GetShop())
  2303. ch->ChatPacket(CHAT_TYPE_INFO, "[Change Channel] Zamknij Okno Handlu aby zmienic Channel!");
  2304. return;
  2305.  
  2306.  
  2307. if (ch->GetMyShop())
  2308. ch->ChatPacket(CHAT_TYPE_INFO, "[Change Channel] Zamknij Okno Handlu aby zmienic Channel!");
  2309. return ;
  2310.  
  2311. if (!ch->IsPC())
  2312. return;
  2313.  
  2314. if( new_ch <1 || new_ch >4)
  2315. return;
  2316.  
  2317. ch->ChannelSwitch(new_ch);
  2318. }
  2319.  
  2320. ACMD(do_set_run_mode)
  2321. {
  2322. ch->SetNowWalking(false);
  2323. ch->SetWalking(false);
  2324. }
  2325.  
  2326. ACMD(do_war)
  2327. {
  2328. //ł» ±ćµĺ Á¤ş¸¸¦ ľňľîżŔ°í
  2329. CGuild * g = ch->GetGuild();
  2330.  
  2331. if (!g)
  2332. return;
  2333.  
  2334. //ŔüŔďÁßŔÎÁö ĂĽĹ©ÇŃąř!
  2335. if (g->UnderAnyWar())
  2336. {
  2337. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ŔĚąĚ ´Ů¸Ą ŔüŔ£ ÂüŔü Áß ŔÔ´Ď´Ů."));
  2338. return;
  2339. }
  2340.  
  2341. //ĆĶó¸ŢĹ͸¦ µÎąč·Î łŞ´©°í
  2342. char arg1[256], arg2[256];
  2343. unsigned int type = GUILD_WAR_TYPE_FIELD;
  2344. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2345.  
  2346. if (!*arg1)
  2347. return;
  2348.  
  2349. if (*arg2)
  2350. {
  2351. str_to_number(type, arg2);
  2352.  
  2353. if (type >= GUILD_WAR_TYPE_MAX_NUM || type < 0)
  2354. type = GUILD_WAR_TYPE_FIELD;
  2355. }
  2356.  
  2357. //±ćµĺŔÇ ¸¶˝şĹÍ ľĆŔ̵𸦠ľňľîżÂµÚ
  2358. DWORD gm_pid = g->GetMasterPID();
  2359.  
  2360. //¸¶˝şĹÍŔÎÁö ĂĽĹ©(±ćŔüŔş ±ćµĺŔ常ŔĚ °ˇ´É)
  2361. if (gm_pid != ch->GetPlayerID())
  2362. {
  2363. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±ćµĺŔüżˇ ´ëÇŃ ±ÇÇŃŔĚ ľř˝Ŕ´Ď´Ů."));
  2364. return;
  2365. }
  2366.  
  2367. //»ó´ë ±ćµĺ¸¦ ľňľîżŔ°í
  2368. CGuild * opp_g = CGuildManager::instance().FindGuildByName(arg1);
  2369.  
  2370. if (!opp_g)
  2371. {
  2372. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±×·± ±ćµĺ°ˇ ľř˝Ŕ´Ď´Ů."));
  2373. return;
  2374. }
  2375.  
  2376. //»ó´ë±ćµĺżÍŔÇ »óĹ üũ
  2377. switch (g->GetGuildWarState(opp_g->GetID()))
  2378. {
  2379. case GUILD_WAR_NONE:
  2380. {
  2381. if (opp_g->UnderAnyWar())
  2382. {
  2383. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺ°ˇ ŔĚąĚ ŔüŔď Áß ŔÔ´Ď´Ů."));
  2384. return;
  2385. }
  2386.  
  2387. int iWarPrice = KOR_aGuildWarInfo[type].iWarPrice;
  2388.  
  2389. if (g->GetGuildMoney() < iWarPrice)
  2390. {
  2391. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> Ŕüşń°ˇ şÎÁ·ÇĎż© ±ćµĺŔüŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2392. return;
  2393. }
  2394.  
  2395. if (opp_g->GetGuildMoney() < iWarPrice)
  2396. {
  2397. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺŔÇ Ŕüşń°ˇ şÎÁ·ÇĎż© ±ćµĺŔüŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2398. return;
  2399. }
  2400. }
  2401. break;
  2402.  
  2403. case GUILD_WAR_SEND_DECLARE:
  2404. {
  2405. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŔĚąĚ Ľ±ŔüĆ÷°í ÁßŔÎ ±ćµĺŔÔ´Ď´Ů."));
  2406. return;
  2407. }
  2408. break;
  2409.  
  2410. case GUILD_WAR_RECV_DECLARE:
  2411. {
  2412. if (opp_g->UnderAnyWar())
  2413. {
  2414. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺ°ˇ ŔĚąĚ ŔüŔď Áß ŔÔ´Ď´Ů."));
  2415. g->RequestRefuseWar(opp_g->GetID());
  2416. return;
  2417. }
  2418. }
  2419. break;
  2420.  
  2421. case GUILD_WAR_RESERVE:
  2422. {
  2423. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ŔĚąĚ ŔüŔďŔĚ żąľŕµČ ±ćµĺ ŔÔ´Ď´Ů."));
  2424. return;
  2425. }
  2426. break;
  2427.  
  2428. case GUILD_WAR_END:
  2429. return;
  2430.  
  2431. default:
  2432. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ŔĚąĚ ŔüŔď ÁßŔÎ ±ćµĺŔÔ´Ď´Ů."));
  2433. g->RequestRefuseWar(opp_g->GetID());
  2434. return;
  2435. }
  2436.  
  2437. if (!g->CanStartWar(type))
  2438. {
  2439. // ±ćµĺŔüŔ» ÇŇ Ľö ŔÖ´Â Á¶°ÇŔ» ¸¸Á·ÇĎÁöľĘ´Â´Ů.
  2440. if (g->GetLadderPoint() == 0)
  2441. {
  2442. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ·ą´ő ÁˇĽö°ˇ ¸đŔÚ¶óĽ­ ±ćµĺŔüŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2443. sys_log(0, "GuildWar.StartError.NEED_LADDER_POINT");
  2444. }
  2445. else if (g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
  2446. {
  2447. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±ćµĺŔüŔ» Çϱâ Ŕ§ÇŘĽ± ĂÖĽŇÇŃ %d¸íŔĚ ŔÖľîľß ÇŐ´Ď´Ů."), GUILD_WAR_MIN_MEMBER_COUNT);
  2448. sys_log(0, "GuildWar.StartError.NEED_MINIMUM_MEMBER[%d]", GUILD_WAR_MIN_MEMBER_COUNT);
  2449. }
  2450. else
  2451. {
  2452. sys_log(0, "GuildWar.StartError.UNKNOWN_ERROR");
  2453. }
  2454. return;
  2455. }
  2456.  
  2457. // ÇʵĺŔü ĂĽĹ©¸¸ ÇĎ°í ĽĽĽĽÇŃ ĂĽĹ©´Â »ó´ëąćŔĚ ˝Âł«ÇҶ§ ÇŃ´Ů.
  2458. if (!opp_g->CanStartWar(GUILD_WAR_TYPE_FIELD))
  2459. {
  2460. if (opp_g->GetLadderPoint() == 0)
  2461. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺŔÇ ·ą´ő ÁˇĽö°ˇ ¸đŔÚ¶óĽ­ ±ćµĺŔüŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2462. else if (opp_g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
  2463. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺŔÇ ±ćµĺżř Ľö°ˇ şÎÁ·ÇĎż© ±ćµĺŔüŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2464. return;
  2465. }
  2466.  
  2467. do
  2468. {
  2469. if (g->GetMasterCharacter() != NULL)
  2470. break;
  2471.  
  2472. CCI *pCCI = P2P_MANAGER::instance().FindByPID(g->GetMasterPID());
  2473.  
  2474. if (pCCI != NULL)
  2475. break;
  2476.  
  2477. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺŔÇ ±ćµĺŔĺŔĚ Á˘ĽÓÁßŔĚ ľĆ´Ő´Ď´Ů."));
  2478. g->RequestRefuseWar(opp_g->GetID());
  2479. return;
  2480.  
  2481. } while (false);
  2482.  
  2483. do
  2484. {
  2485. if (opp_g->GetMasterCharacter() != NULL)
  2486. break;
  2487.  
  2488. CCI *pCCI = P2P_MANAGER::instance().FindByPID(opp_g->GetMasterPID());
  2489.  
  2490. if (pCCI != NULL)
  2491. break;
  2492.  
  2493. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> »ó´ëąć ±ćµĺŔÇ ±ćµĺŔĺŔĚ Á˘ĽÓÁßŔĚ ľĆ´Ő´Ď´Ů."));
  2494. g->RequestRefuseWar(opp_g->GetID());
  2495. return;
  2496.  
  2497. } while (false);
  2498.  
  2499. g->RequestDeclareWar(opp_g->GetID(), type);
  2500. }
  2501.  
  2502. ACMD(do_nowar)
  2503. {
  2504. CGuild* g = ch->GetGuild();
  2505. if (!g)
  2506. return;
  2507.  
  2508. char arg1[256];
  2509. one_argument(argument, arg1, sizeof(arg1));
  2510.  
  2511. if (!*arg1)
  2512. return;
  2513.  
  2514. DWORD gm_pid = g->GetMasterPID();
  2515.  
  2516. if (gm_pid != ch->GetPlayerID())
  2517. {
  2518. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±ćµĺŔüżˇ ´ëÇŃ ±ÇÇŃŔĚ ľř˝Ŕ´Ď´Ů."));
  2519. return;
  2520. }
  2521.  
  2522. CGuild* opp_g = CGuildManager::instance().FindGuildByName(arg1);
  2523.  
  2524. if (!opp_g)
  2525. {
  2526. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> ±×·± ±ćµĺ°ˇ ľř˝Ŕ´Ď´Ů."));
  2527. return;
  2528. }
  2529.  
  2530. g->RequestRefuseWar(opp_g->GetID());
  2531. }
  2532.  
  2533. ACMD(do_detaillog)
  2534. {
  2535. ch->DetailLog();
  2536. }
  2537.  
  2538. ACMD(do_monsterlog)
  2539. {
  2540. ch->ToggleMonsterLog();
  2541. }
  2542.  
  2543. ACMD(do_pkmode)
  2544. {
  2545. char arg1[256];
  2546. one_argument(argument, arg1, sizeof(arg1));
  2547.  
  2548. if (!*arg1)
  2549. return;
  2550.  
  2551. BYTE mode = 0;
  2552. str_to_number(mode, arg1);
  2553.  
  2554. if (mode == PK_MODE_PROTECT)
  2555. return;
  2556.  
  2557. if (ch->GetLevel() < PK_PROTECT_LEVEL && mode != 0)
  2558. return;
  2559.  
  2560. ch->SetPKMode(mode);
  2561. }
  2562.  
  2563. ACMD(do_messenger_auth)
  2564. {
  2565. if (ch->GetArena())
  2566. {
  2567. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ĂŔ忡Ľ­ »çżëÇĎ˝Ç Ľö ľř˝Ŕ´Ď´Ů."));
  2568. return;
  2569. }
  2570.  
  2571. char arg1[256], arg2[256];
  2572. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  2573.  
  2574. if (!*arg1 || !*arg2)
  2575. return;
  2576.  
  2577. char answer = LOWER(*arg1);
  2578.  
  2579. if (answer != 'y')
  2580. {
  2581. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2);
  2582.  
  2583. if (tch)
  2584. tch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔŔ¸·Î şÎĹÍ ÄŁ±¸ µî·ĎŔ» °ĹşÎ ´çÇß˝Ŕ´Ď´Ů."), ch->GetName());
  2585. }
  2586.  
  2587. MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, answer == 'y' ? false : true); // DENY
  2588. }
  2589.  
  2590. #ifdef ENABLE_ONLINE_COMMAND
  2591. ACMD (do_online)
  2592. {
  2593. int mTotalOnline;
  2594. int * mEmpire;
  2595. int mLocal;
  2596. DESC_MANAGER::instance().GetUserCount(mTotalOnline, & mEmpire, mLocal);
  2597.  
  2598. #ifdef ENABLE_ONLINE_COMMAND_BOOST
  2599. int mTotalOnlinePlus = mTotalOnline * ENABLE_ONLINE_COMMAND_BOOST_MULTIPLIER;
  2600. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Online: %d"), mTotalOnlinePlus);
  2601. #else
  2602. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Online: %d"), mTotalOnline);
  2603. #endif
  2604. }
  2605. #endif
  2606.  
  2607. ACMD(do_setblockmode)
  2608. {
  2609. char arg1[256];
  2610. one_argument(argument, arg1, sizeof(arg1));
  2611.  
  2612. if (*arg1)
  2613. {
  2614. BYTE flag = 0;
  2615. str_to_number(flag, arg1);
  2616. ch->SetBlockMode(flag);
  2617. }
  2618. }
  2619.  
  2620. ACMD(do_unmount)
  2621. {
  2622. LPITEM item = ch->GetWear(WEAR_UNIQUE1);
  2623. LPITEM item2 = ch->GetWear(WEAR_UNIQUE2);
  2624. LPITEM item3 = ch->GetWear(WEAR_COSTUME_MOUNT);
  2625.  
  2626. if (item && item->IsRideItem())
  2627. ch->UnequipItem(item);
  2628.  
  2629. if (item2 && item2->IsRideItem())
  2630. ch->UnequipItem(item2);
  2631.  
  2632. if (item3 && item3->IsRideItem())
  2633. ch->UnequipItem(item3);
  2634.  
  2635. if (true == ch->UnEquipSpecialRideUniqueItem())
  2636. {
  2637. ch->RemoveAffect(AFFECT_MOUNT);
  2638. ch->RemoveAffect(AFFECT_MOUNT_BONUS);
  2639.  
  2640. if (ch->IsHorseRiding())
  2641. {
  2642. ch->StopRiding();
  2643. }
  2644. }
  2645. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  2646. if(ch->GetWear(WEAR_COSTUME_MOUNT))
  2647. {
  2648. CMountSystem* mountSystem = ch->GetMountSystem();
  2649. LPITEM mount = ch->GetWear(WEAR_COSTUME_MOUNT);
  2650. DWORD mobVnum = 0;
  2651.  
  2652. if (!mountSystem && !mount)
  2653. return;
  2654.  
  2655. #ifdef __CHANGELOOK_SYSTEM__
  2656. if(mount->GetTransmutation())
  2657. {
  2658. const TItemTable* itemTable = ITEM_MANAGER::instance().GetTable(mount->GetTransmutation());
  2659.  
  2660. if (itemTable)
  2661. mobVnum = itemTable->alValues[1];
  2662. else
  2663. mobVnum = mount->GetValue(1);
  2664. }
  2665. else
  2666. mobVnum = mount->GetValue(1);
  2667. #else
  2668. if(mount->GetValue(1) != 0)
  2669. mobVnum = mount->GetValue(1);
  2670. #endif
  2671.  
  2672. if (ch->GetMountVnum())
  2673. {
  2674. if(mountSystem->CountSummoned() == 0)
  2675. {
  2676. mountSystem->Unmount(mobVnum);
  2677. }
  2678. }
  2679. return;
  2680. }
  2681. #endif
  2682. else
  2683. {
  2684. ch->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("ŔÎşĄĹ丮°ˇ ˛Ë Â÷Ľ­ ł»¸± Ľö ľř˝Ŕ´Ď´Ů."));
  2685. }
  2686. }
  2687.  
  2688. ACMD(do_observer_exit)
  2689. {
  2690. if (ch->IsObserverMode())
  2691. {
  2692. if (ch->GetWarMap())
  2693. ch->SetWarMap(NULL);
  2694.  
  2695. if (ch->GetArena() != NULL || ch->GetArenaObserverMode() == true)
  2696. {
  2697. ch->SetArenaObserverMode(false);
  2698.  
  2699. if (ch->GetArena() != NULL)
  2700. ch->GetArena()->RemoveObserver(ch->GetPlayerID());
  2701.  
  2702. ch->SetArena(NULL);
  2703. ch->WarpSet(ARENA_RETURN_POINT_X(ch->GetEmpire()), ARENA_RETURN_POINT_Y(ch->GetEmpire()));
  2704. }
  2705. else
  2706. {
  2707. ch->ExitToSavedLocation();
  2708. }
  2709. ch->SetObserverMode(false);
  2710. }
  2711. }
  2712.  
  2713. ACMD(do_view_equip)
  2714. {
  2715. if (ch->GetGMLevel() <= GM_PLAYER)
  2716. return;
  2717.  
  2718. char arg1[256];
  2719. one_argument(argument, arg1, sizeof(arg1));
  2720.  
  2721. if (*arg1)
  2722. {
  2723. DWORD vid = 0;
  2724. str_to_number(vid, arg1);
  2725. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  2726.  
  2727. if (!tch)
  2728. return;
  2729.  
  2730. if (!tch->IsPC())
  2731. return;
  2732. /*
  2733. int iSPCost = ch->GetMaxSP() / 3;
  2734.  
  2735. if (ch->GetSP() < iSPCost)
  2736. {
  2737. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á¤˝Ĺ·ÂŔĚ şÎÁ·ÇĎż© ´Ů¸Ą »ç¶÷ŔÇ Ŕĺşń¸¦ şĽ Ľö ľř˝Ŕ´Ď´Ů."));
  2738. return;
  2739. }
  2740. ch->PointChange(POINT_SP, -iSPCost);
  2741. */
  2742. tch->SendEquipment(ch);
  2743. }
  2744. }
  2745.  
  2746. ACMD(do_party_request)
  2747. {
  2748. if (ch->GetArena())
  2749. {
  2750. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ĂŔ忡Ľ­ »çżëÇĎ˝Ç Ľö ľř˝Ŕ´Ď´Ů."));
  2751. return;
  2752. }
  2753.  
  2754. if (ch->GetParty())
  2755. {
  2756. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŔĚąĚ ĆÄĆĽżˇ ĽÓÇŘ ŔÖŔ¸ąÇ·Î °ˇŔÔ˝ĹĂ»Ŕ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2757. return;
  2758. }
  2759.  
  2760. char arg1[256];
  2761. one_argument(argument, arg1, sizeof(arg1));
  2762.  
  2763. if (!*arg1)
  2764. return;
  2765.  
  2766. DWORD vid = 0;
  2767. str_to_number(vid, arg1);
  2768. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  2769.  
  2770. if (tch)
  2771. if (!ch->RequestToParty(tch))
  2772. ch->ChatPacket(CHAT_TYPE_COMMAND, "PartyRequestDenied");
  2773. }
  2774.  
  2775. ACMD(do_party_request_accept)
  2776. {
  2777. char arg1[256];
  2778. one_argument(argument, arg1, sizeof(arg1));
  2779.  
  2780. if (!*arg1)
  2781. return;
  2782.  
  2783. DWORD vid = 0;
  2784. str_to_number(vid, arg1);
  2785. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  2786.  
  2787. if (tch)
  2788. ch->AcceptToParty(tch);
  2789. }
  2790.  
  2791. ACMD(do_party_request_deny)
  2792. {
  2793. char arg1[256];
  2794. one_argument(argument, arg1, sizeof(arg1));
  2795.  
  2796. if (!*arg1)
  2797. return;
  2798.  
  2799. DWORD vid = 0;
  2800. str_to_number(vid, arg1);
  2801. LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);
  2802.  
  2803. if (tch)
  2804. ch->DenyToParty(tch);
  2805. }
  2806.  
  2807. ACMD(do_monarch_warpto)
  2808. {
  2809. if (true == LC_IsYMIR() || true == LC_IsKorea())
  2810. return;
  2811.  
  2812. if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
  2813. {
  2814. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±şÁÖ¸¸ŔĚ »çżë °ˇ´ÉÇŃ ±â´ÉŔÔ´Ď´Ů"));
  2815. return;
  2816. }
  2817.  
  2818. //±şÁÖ ÄđŸŔÓ °Ë»ç
  2819. if (!ch->IsMCOK(CHARACTER::MI_WARP))
  2820. {
  2821. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d ĂĘ°Ł ÄđŸŔÓŔĚ ŔűżëÁßŔÔ´Ď´Ů."), ch->GetMCLTime(CHARACTER::MI_WARP));
  2822. return;
  2823. }
  2824.  
  2825. //±şÁÖ ¸÷ ĽŇČŻ şńżë
  2826. const int WarpPrice = 10000;
  2827.  
  2828. //±şÁÖ ±ą°í °Ë»ç
  2829. if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
  2830. {
  2831. int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
  2832. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ą°íżˇ µ·ŔĚ şÎÁ·ÇŐ´Ď´Ů. ÇöŔç : %u ÇĘżä±Ýľ× : %u"), NationMoney, WarpPrice);
  2833. return;
  2834. }
  2835.  
  2836. int x = 0, y = 0;
  2837. char arg1[256];
  2838.  
  2839. one_argument(argument, arg1, sizeof(arg1));
  2840.  
  2841. if (!*arg1)
  2842. {
  2843. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»çżëąý: warpto <character name>"));
  2844. return;
  2845. }
  2846.  
  2847. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  2848.  
  2849. if (!tch)
  2850. {
  2851. CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
  2852.  
  2853. if (pkCCI)
  2854. {
  2855. if (pkCCI->bEmpire != ch->GetEmpire())
  2856. {
  2857. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±ą ŔŻŔúżˇ°Ô´Â Ŕ̵żÇŇĽö ľř˝Ŕ´Ď´Ů"));
  2858. return;
  2859. }
  2860.  
  2861. if (pkCCI->bChannel != g_bChannel)
  2862. {
  2863. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ŔŻŔú´Â %d äłÎżˇ ŔÖ˝Ŕ´Ď´Ů. (ÇöŔç äłÎ %d)"), pkCCI->bChannel, g_bChannel);
  2864. return;
  2865. }
  2866. if (!IsMonarchWarpZone(pkCCI->lMapIndex))
  2867. {
  2868. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î Ŕ̵żÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2869. return;
  2870. }
  2871.  
  2872. PIXEL_POSITION pos;
  2873.  
  2874. if (!SECTREE_MANAGER::instance().GetCenterPositionOfMap(pkCCI->lMapIndex, pos))
  2875. ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map (index %d)", pkCCI->lMapIndex);
  2876. else
  2877. {
  2878. //ch->ChatPacket(CHAT_TYPE_INFO, "You warp to (%d, %d)", pos.x, pos.y);
  2879. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s żˇ°Ô·Î Ŕ̵żÇŐ´Ď´Ů"), arg1);
  2880. ch->WarpSet(pos.x, pos.y);
  2881.  
  2882. //±şÁÖ µ· »č°¨
  2883. CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
  2884.  
  2885. //ÄđŸŔÓ ĂʱâČ­
  2886. ch->SetMC(CHARACTER::MI_WARP);
  2887. }
  2888. }
  2889. else if (NULL == CHARACTER_MANAGER::instance().FindPC(arg1))
  2890. {
  2891. ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
  2892. }
  2893.  
  2894. return;
  2895. }
  2896. else
  2897. {
  2898. if (tch->GetEmpire() != ch->GetEmpire())
  2899. {
  2900. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±ą ŔŻŔúżˇ°Ô´Â Ŕ̵żÇŇĽö ľř˝Ŕ´Ď´Ů"));
  2901. return;
  2902. }
  2903. if (!IsMonarchWarpZone(tch->GetMapIndex()))
  2904. {
  2905. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î Ŕ̵żÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2906. return;
  2907. }
  2908. x = tch->GetX();
  2909. y = tch->GetY();
  2910. }
  2911.  
  2912. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s żˇ°Ô·Î Ŕ̵żÇŐ´Ď´Ů"), arg1);
  2913. ch->WarpSet(x, y);
  2914. ch->Stop();
  2915.  
  2916. //±şÁÖ µ· »č°¨
  2917. CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
  2918.  
  2919. //ÄđŸŔÓ ĂʱâČ­
  2920. ch->SetMC(CHARACTER::MI_WARP);
  2921. }
  2922.  
  2923. ACMD(do_monarch_transfer)
  2924. {
  2925. if (true == LC_IsYMIR() || true == LC_IsKorea())
  2926. return;
  2927.  
  2928. char arg1[256];
  2929. one_argument(argument, arg1, sizeof(arg1));
  2930.  
  2931. if (!*arg1)
  2932. {
  2933. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»çżëąý: transfer <name>"));
  2934. return;
  2935. }
  2936.  
  2937. if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
  2938. {
  2939. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±şÁÖ¸¸ŔĚ »çżë °ˇ´ÉÇŃ ±â´ÉŔÔ´Ď´Ů"));
  2940. return;
  2941. }
  2942.  
  2943. //±şÁÖ ÄđŸŔÓ °Ë»ç
  2944. if (!ch->IsMCOK(CHARACTER::MI_TRANSFER))
  2945. {
  2946. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d ĂĘ°Ł ÄđŸŔÓŔĚ ŔűżëÁßŔÔ´Ď´Ů."), ch->GetMCLTime(CHARACTER::MI_TRANSFER));
  2947. return;
  2948. }
  2949.  
  2950. //±şÁÖ żöÇÁ şńżë
  2951. const int WarpPrice = 10000;
  2952.  
  2953. //±şÁÖ ±ą°í °Ë»ç
  2954. if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
  2955. {
  2956. int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
  2957. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ą°íżˇ µ·ŔĚ şÎÁ·ÇŐ´Ď´Ů. ÇöŔç : %u ÇĘżä±Ýľ× : %u"), NationMoney, WarpPrice);
  2958. return;
  2959. }
  2960.  
  2961.  
  2962. LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
  2963.  
  2964. if (!tch)
  2965. {
  2966. CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
  2967.  
  2968. if (pkCCI)
  2969. {
  2970. if (pkCCI->bEmpire != ch->GetEmpire())
  2971. {
  2972. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ů¸Ą Á¦±ą ŔŻŔú´Â ĽŇČŻÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2973. return;
  2974. }
  2975. if (pkCCI->bChannel != g_bChannel)
  2976. {
  2977. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔŔş %d äłÎżˇ Á˘ĽÓ Áß ŔÔ´Ď´Ů. (ÇöŔç äłÎ: %d)"), arg1, pkCCI->bChannel, g_bChannel);
  2978. return;
  2979. }
  2980. if (!IsMonarchWarpZone(pkCCI->lMapIndex))
  2981. {
  2982. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î Ŕ̵żÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2983. return;
  2984. }
  2985. if (!IsMonarchWarpZone(ch->GetMapIndex()))
  2986. {
  2987. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î ĽŇČŻÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  2988. return;
  2989. }
  2990.  
  2991. TPacketGGTransfer pgg;
  2992.  
  2993. pgg.bHeader = HEADER_GG_TRANSFER;
  2994. strlcpy(pgg.szName, arg1, sizeof(pgg.szName));
  2995. pgg.lX = ch->GetX();
  2996. pgg.lY = ch->GetY();
  2997.  
  2998. P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGTransfer));
  2999. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔŔ» ĽŇČŻÇĎż´˝Ŕ´Ď´Ů."), arg1);
  3000.  
  3001. //±şÁÖ µ· »č°¨
  3002. CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
  3003. //ÄđŸŔÓ ĂʱâČ­
  3004. ch->SetMC(CHARACTER::MI_TRANSFER);
  3005. }
  3006. else
  3007. {
  3008. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŔÔ·ÂÇϽŠŔ̸§Ŕ» °ˇÁř »çżëŔÚ°ˇ ľř˝Ŕ´Ď´Ů."));
  3009. }
  3010.  
  3011. return;
  3012. }
  3013.  
  3014.  
  3015. if (ch == tch)
  3016. {
  3017. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŔÚ˝ĹŔ» ĽŇČŻÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  3018. return;
  3019. }
  3020.  
  3021. if (tch->GetEmpire() != ch->GetEmpire())
  3022. {
  3023. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ů¸Ą Á¦±ą ŔŻŔú´Â ĽŇČŻÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  3024. return;
  3025. }
  3026. if (!IsMonarchWarpZone(tch->GetMapIndex()))
  3027. {
  3028. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î Ŕ̵żÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  3029. return;
  3030. }
  3031. if (!IsMonarchWarpZone(ch->GetMapIndex()))
  3032. {
  3033. ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇŘ´ç ÁöżŞŔ¸·Î ĽŇČŻÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  3034. return;
  3035. }
  3036.  
  3037. //tch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
  3038. tch->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
  3039.  
  3040. //±şÁÖ µ· »č°¨
  3041. CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
  3042. //ÄđŸŔÓ ĂʱâČ­
  3043. ch->SetMC(CHARACTER::MI_TRANSFER);
  3044. }
  3045.  
  3046. ACMD(do_monarch_info)
  3047. {
  3048. if (CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
  3049. {
  3050. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("łŞŔÇ ±şÁÖ Á¤ş¸"));
  3051. TMonarchInfo * p = CMonarch::instance().GetMonarch();
  3052. for (int n = 1; n < 4; ++n)
  3053. {
  3054. if (n == ch->GetEmpire())
  3055. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±şÁÖ] : %s ş¸ŔŻ±Ýľ× %lld "), EMPIRE_NAME(n), p->name[n], p->money[n]);
  3056. else
  3057. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±şÁÖ] : %s "), EMPIRE_NAME(n), p->name[n]);
  3058.  
  3059. }
  3060. }
  3061. else
  3062. {
  3063. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±şÁÖ Á¤ş¸"));
  3064. TMonarchInfo * p = CMonarch::instance().GetMonarch();
  3065. for (int n = 1; n < 4; ++n)
  3066. {
  3067. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±şÁÖ] : %s "), EMPIRE_NAME(n), p->name[n]);
  3068.  
  3069. }
  3070. }
  3071.  
  3072. }
  3073.  
  3074. ACMD(do_elect)
  3075. {
  3076. db_clientdesc->DBPacketHeader(HEADER_GD_COME_TO_VOTE, ch->GetDesc()->GetHandle(), 0);
  3077. }
  3078.  
  3079. // LUA_ADD_GOTO_INFO
  3080. struct GotoInfo
  3081. {
  3082. std::string st_name;
  3083.  
  3084. BYTE empire;
  3085. int mapIndex;
  3086. DWORD x, y;
  3087.  
  3088. GotoInfo()
  3089. {
  3090. st_name = "";
  3091. empire = 0;
  3092. mapIndex = 0;
  3093.  
  3094. x = 0;
  3095. y = 0;
  3096. }
  3097.  
  3098. GotoInfo(const GotoInfo& c_src)
  3099. {
  3100. __copy__(c_src);
  3101. }
  3102.  
  3103. void operator = (const GotoInfo& c_src)
  3104. {
  3105. __copy__(c_src);
  3106. }
  3107.  
  3108. void __copy__(const GotoInfo& c_src)
  3109. {
  3110. st_name = c_src.st_name;
  3111. empire = c_src.empire;
  3112. mapIndex = c_src.mapIndex;
  3113.  
  3114. x = c_src.x;
  3115. y = c_src.y;
  3116. }
  3117. };
  3118.  
  3119. extern void BroadcastNotice(const char * c_pszBuf, bool IsBig);
  3120.  
  3121. ACMD(do_monarch_tax)
  3122. {
  3123. char arg1[256];
  3124. one_argument(argument, arg1, sizeof(arg1));
  3125.  
  3126. if (!*arg1)
  3127. {
  3128. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: monarch_tax <1-50>");
  3129. return;
  3130. }
  3131.  
  3132. // ±şÁÖ °Ë»ç
  3133. if (!ch->IsMonarch())
  3134. {
  3135. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±şÁÖ¸¸ŔĚ »çżëÇŇĽö ŔÖ´Â ±â´ÉŔÔ´Ď´Ů"));
  3136. return;
  3137. }
  3138.  
  3139. // ĽĽ±ÝĽłÁ¤
  3140. int tax = 0;
  3141. str_to_number(tax, arg1);
  3142.  
  3143. if (tax < 1 || tax > 50)
  3144. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("1-50 »çŔĚŔÇ Ľöġ¸¦ Ľ±ĹĂÇŘÁÖĽĽżä"));
  3145.  
  3146. quest::CQuestManager::instance().SetEventFlag("trade_tax", tax);
  3147.  
  3148. // ±şÁÖżˇ°Ô ¸ŢĽĽÁö ÇĎłŞ
  3149. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĽĽ±ÝŔĚ %d %·Î ĽłÁ¤µÇľú˝Ŕ´Ď´Ů"));
  3150.  
  3151. // °řÁö
  3152. char szMsg[1024];
  3153.  
  3154. snprintf(szMsg, sizeof(szMsg), "±şÁÖŔÇ ¸íŔ¸·Î ĽĽ±ÝŔĚ %d %% ·Î şŻ°ćµÇľú˝Ŕ´Ď´Ů", tax);
  3155. BroadcastNotice(szMsg);
  3156.  
  3157. snprintf(szMsg, sizeof(szMsg), "ľŐŔ¸·Î´Â °Ĺ·ˇ ±Ýľ×ŔÇ %d %% °ˇ ±ą°í·Î µéľî°ˇ°ÔµË´Ď´Ů.", tax);
  3158. BroadcastNotice(szMsg);
  3159.  
  3160. // ÄđŸŔÓ ĂʱâČ­
  3161. ch->SetMC(CHARACTER::MI_TAX);
  3162. }
  3163.  
  3164. static const DWORD cs_dwMonarchMobVnums[] =
  3165. {
  3166. 191, // »ę°ß˝Ĺ
  3167. 192, // Ŕú˝Ĺ
  3168. 193, // żő˝Ĺ
  3169. 194, // ČŁ˝Ĺ
  3170. 391, // ąĚÁ¤
  3171. 392, // ŔşÁ¤
  3172. 393, // ĽĽ¶ű
  3173. 394, // ÁřČń
  3174. 491, // ¸ÍČŻ
  3175. 492, // ş¸żě
  3176. 493, // ±¸ĆĐ
  3177. 494, // ĂßČç
  3178. 591, // şń·ů´Ü´ëŔĺ
  3179. 691, // żő±Í Á·Ŕĺ
  3180. 791, // ąĐ±ł±łÁÖ
  3181. 1304, // ´©··ąü±Í
  3182. 1901, // ±¸ąĚČŁ
  3183. 2091, // ż©żŐ°ĹąĚ
  3184. 2191, // °Ĺ´ë»ç¸·°ĹşĎ
  3185. 2206, // Č­ż°żŐi
  3186. 0,
  3187. };
  3188.  
  3189. ACMD(do_monarch_mob)
  3190. {
  3191. char arg1[256];
  3192. LPCHARACTER tch;
  3193.  
  3194. one_argument(argument, arg1, sizeof(arg1));
  3195.  
  3196. if (!ch->IsMonarch())
  3197. {
  3198. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±şÁÖ¸¸ŔĚ »çżëÇŇĽö ŔÖ´Â ±â´ÉŔÔ´Ď´Ů"));
  3199. return;
  3200. }
  3201.  
  3202. if (!*arg1)
  3203. {
  3204. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mmob <mob name>");
  3205. return;
  3206. }
  3207.  
  3208. BYTE pcEmpire = ch->GetEmpire();
  3209. BYTE mapEmpire = SECTREE_MANAGER::instance().GetEmpireFromMapIndex(ch->GetMapIndex());
  3210.  
  3211. if (LC_IsYMIR() == true || LC_IsKorea() == true)
  3212. {
  3213. if (mapEmpire != pcEmpire && mapEmpire != 0)
  3214. {
  3215. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŔÚ±ą żµĹ信Ľ­¸¸ »çżëÇŇ Ľö ŔÖ´Â ±â´ÉŔÔ´Ď´Ů"));
  3216. return;
  3217. }
  3218. }
  3219.  
  3220. // ±şÁÖ ¸÷ ĽŇČŻ şńżë
  3221. const int SummonPrice = 5000000;
  3222.  
  3223. // ±şÁÖ ÄđŸŔÓ °Ë»ç
  3224. if (!ch->IsMCOK(CHARACTER::MI_SUMMON))
  3225. {
  3226. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d ĂĘ°Ł ÄđŸŔÓŔĚ ŔűżëÁßŔÔ´Ď´Ů."), ch->GetMCLTime(CHARACTER::MI_SUMMON));
  3227. return;
  3228. }
  3229.  
  3230. // ±şÁÖ ±ą°í °Ë»ç
  3231. if (!CMonarch::instance().IsMoneyOk(SummonPrice, ch->GetEmpire()))
  3232. {
  3233. int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
  3234. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ą°íżˇ µ·ŔĚ şÎÁ·ÇŐ´Ď´Ů. ÇöŔç : %u ÇĘżä±Ýľ× : %u"), NationMoney, SummonPrice);
  3235. return;
  3236. }
  3237.  
  3238. const CMob * pkMob;
  3239. DWORD vnum = 0;
  3240.  
  3241. if (isdigit(*arg1))
  3242. {
  3243. str_to_number(vnum, arg1);
  3244.  
  3245. if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
  3246. vnum = 0;
  3247. }
  3248. else
  3249. {
  3250. pkMob = CMobManager::Instance().Get(arg1, true);
  3251.  
  3252. if (pkMob)
  3253. vnum = pkMob->m_table.dwVnum;
  3254. }
  3255.  
  3256. DWORD count;
  3257.  
  3258. // ĽŇČŻ °ˇ´É ¸÷ °Ë»ç
  3259. for (count = 0; cs_dwMonarchMobVnums[count] != 0; ++count)
  3260. if (cs_dwMonarchMobVnums[count] == vnum)
  3261. break;
  3262.  
  3263. if (0 == cs_dwMonarchMobVnums[count])
  3264. {
  3265. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĽŇČŻÇŇĽö ľř´Â ¸ó˝şĹÍ ŔÔ´Ď´Ů. ĽŇČŻ°ˇ´ÉÇŃ ¸ó˝şĹʹ ȨĆäŔĚÁö¸¦ ÂüÁ¶ÇĎĽĽżä"));
  3266. return;
  3267. }
  3268.  
  3269. tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
  3270. ch->GetMapIndex(),
  3271. ch->GetX() - number(200, 750),
  3272. ch->GetY() - number(200, 750),
  3273. ch->GetX() + number(200, 750),
  3274. ch->GetY() + number(200, 750),
  3275. true,
  3276. pkMob->m_table.bType == CHAR_TYPE_STONE,
  3277. true);
  3278.  
  3279. if (tch)
  3280. {
  3281. // ±şÁÖ µ· »č°¨
  3282. CMonarch::instance().SendtoDBDecMoney(SummonPrice, ch->GetEmpire(), ch);
  3283.  
  3284. // ÄđŸŔÓ ĂʱâČ­
  3285. ch->SetMC(CHARACTER::MI_SUMMON);
  3286. }
  3287. }
  3288.  
  3289. static const char* FN_point_string(int apply_number)
  3290. {
  3291. switch (apply_number)
  3292. {
  3293. case POINT_MAX_HP: return LC_TEXT("ĂÖ´ë »ý¸í·Â +%d");
  3294. case POINT_MAX_SP: return LC_TEXT("ĂÖ´ë Á¤˝Ĺ·Â +%d");
  3295. case POINT_HT: return LC_TEXT("ĂĽ·Â +%d");
  3296. case POINT_IQ: return LC_TEXT("Áö´É +%d");
  3297. case POINT_ST: return LC_TEXT("±Ů·Â +%d");
  3298. case POINT_DX: return LC_TEXT("ąÎø +%d");
  3299. case POINT_ATT_SPEED: return LC_TEXT("°ř°ÝĽÓµµ +%d");
  3300. case POINT_MOV_SPEED: return LC_TEXT("Ŕ̵żĽÓµµ %d");
  3301. case POINT_CASTING_SPEED: return LC_TEXT("ÄđŸŔÓ -%d");
  3302. case POINT_HP_REGEN: return LC_TEXT("»ý¸í·Â ȸşą +%d");
  3303. case POINT_SP_REGEN: return LC_TEXT("Á¤˝Ĺ·Â ȸşą +%d");
  3304. case POINT_POISON_PCT: return LC_TEXT("µ¶°ř°Ý %d");
  3305. case POINT_STUN_PCT: return LC_TEXT("˝şĹĎ +%d");
  3306. case POINT_SLOW_PCT: return LC_TEXT("˝˝·Îżě +%d");
  3307. case POINT_CRITICAL_PCT: return LC_TEXT("%d%% Č®·ü·Î ġ¸íŸ °ř°Ý");
  3308. case POINT_RESIST_CRITICAL: return LC_TEXT("»ó´ëŔÇ Äˇ¸íŸ Č®·ü %d%% °¨ĽŇ");
  3309. case POINT_PENETRATE_PCT: return LC_TEXT("%d%% Č®·ü·Î °üĹë °ř°Ý");
  3310. case POINT_RESIST_PENETRATE: return LC_TEXT("»ó´ëŔÇ °üĹë °ř°Ý Č®·ü %d%% °¨ĽŇ");
  3311. case POINT_ATTBONUS_HUMAN: return LC_TEXT("ŔΰŁ·ů ¸ó˝şĹÍ Ĺ¸°Ýġ +%d%%");
  3312. case POINT_ATTBONUS_ANIMAL: return LC_TEXT("µżą°·ů ¸ó˝şĹÍ Ĺ¸°Ýġ +%d%%");
  3313. case POINT_ATTBONUS_ORC: return LC_TEXT("żő±ÍÁ· Ÿ°Ýġ +%d%%");
  3314. case POINT_ATTBONUS_MILGYO: return LC_TEXT("ąĐ±ł·ů Ÿ°Ýġ +%d%%");
  3315. case POINT_ATTBONUS_UNDEAD: return LC_TEXT("˝ĂĂĽ·ů Ÿ°Ýġ +%d%%");
  3316. case POINT_ATTBONUS_DEVIL: return LC_TEXT("ľÇ¸¶·ů Ÿ°Ýġ +%d%%");
  3317. case POINT_STEAL_HP: return LC_TEXT("Ÿ°Ýġ %d%% ¸¦ »ý¸í·ÂŔ¸·Î ČíĽö");
  3318. case POINT_STEAL_SP: return LC_TEXT("Ÿ·Âġ %d%% ¸¦ Á¤˝Ĺ·ÂŔ¸·Î ČíĽö");
  3319. case POINT_MANA_BURN_PCT: return LC_TEXT("%d%% Č®·ü·Î Ÿ°Ý˝Ă »ó´ë Ŕü˝Ĺ·Â ĽŇ¸đ");
  3320. case POINT_DAMAGE_SP_RECOVER: return LC_TEXT("%d%% Č®·ü·Î ÇÇÇؽà Á¤˝Ĺ·Â ȸşą");
  3321. case POINT_BLOCK: return LC_TEXT("ą°¸®Ĺ¸°Ý˝Ă şí·° Č®·ü %d%%");
  3322. case POINT_DODGE: return LC_TEXT("Č° °ř°Ý ȸÇÇ Č®·ü %d%%");
  3323. case POINT_RESIST_SWORD: return LC_TEXT("ÇŃĽŐ°Ë ąćľî %d%%");
  3324. case POINT_RESIST_TWOHAND: return LC_TEXT("ľçĽŐ°Ë ąćľî %d%%");
  3325. case POINT_RESIST_DAGGER: return LC_TEXT("µÎĽŐ°Ë ąćľî %d%%");
  3326. case POINT_RESIST_BELL: return LC_TEXT("ąćżď ąćľî %d%%");
  3327. case POINT_RESIST_FAN: return LC_TEXT("şÎä ąćľî %d%%");
  3328. case POINT_RESIST_BOW: return LC_TEXT("Č°°ř°Ý ŔúÇ× %d%%");
  3329. case POINT_RESIST_FIRE: return LC_TEXT("Č­ż° ŔúÇ× %d%%");
  3330. case POINT_RESIST_ELEC: return LC_TEXT("Ŕü±â ŔúÇ× %d%%");
  3331. case POINT_RESIST_MAGIC: return LC_TEXT("¸¶ąý ŔúÇ× %d%%");
  3332. case POINT_RESIST_WIND: return LC_TEXT("ąŮ¶÷ ŔúÇ× %d%%");
  3333. case POINT_RESIST_ICE: return LC_TEXT("łĂ±â ŔúÇ× %d%%");
  3334. case POINT_RESIST_EARTH: return LC_TEXT("´ëÁö ŔúÇ× %d%%");
  3335. case POINT_RESIST_DARK: return LC_TEXT("ľîµŇ ŔúÇ× %d%%");
  3336. case POINT_REFLECT_MELEE: return LC_TEXT("Á÷Á˘ Ÿ°Ýġ ąÝ»ç Č®·ü : %d%%");
  3337. case POINT_REFLECT_CURSE: return LC_TEXT("ŔúÁÖ µÇµą¸®±â Č®·ü %d%%");
  3338. case POINT_POISON_REDUCE: return LC_TEXT("µ¶ ŔúÇ× %d%%");
  3339. case POINT_KILL_SP_RECOVER: return LC_TEXT("%d%% Č®·ü·Î ŔűĹđġ˝Ă Á¤˝Ĺ·Â ȸşą");
  3340. case POINT_EXP_DOUBLE_BONUS: return LC_TEXT("%d%% Č®·ü·Î ŔűĹđġ˝Ă °ćÇčġ Ăß°ˇ »ó˝Â");
  3341. case POINT_GOLD_DOUBLE_BONUS: return LC_TEXT("%d%% Č®·ü·Î ŔűĹđġ˝Ă µ· 2ąč µĺ·Ó");
  3342. case POINT_ITEM_DROP_BONUS: return LC_TEXT("%d%% Č®·ü·Î ŔűĹđġ˝Ă ľĆŔĚĹŰ 2ąč µĺ·Ó");
  3343. case POINT_POTION_BONUS: return LC_TEXT("ą°ľŕ »çżë˝Ă %d%% Ľş´É Áő°ˇ");
  3344. case POINT_KILL_HP_RECOVERY: return LC_TEXT("%d%% Č®·ü·Î ŔűĹđġ˝Ă »ý¸í·Â ȸşą");
  3345. // case POINT_IMMUNE_STUN: return LC_TEXT("±âŔýÇĎÁö ľĘŔ˝ %d%%");
  3346. // case POINT_IMMUNE_SLOW: return LC_TEXT("´Ŕ·ÁÁöÁö ľĘŔ˝ %d%%");
  3347. // case POINT_IMMUNE_FALL: return LC_TEXT("łŃľîÁöÁö ľĘŔ˝ %d%%");
  3348. // case POINT_SKILL: return LC_TEXT("");
  3349. // case POINT_BOW_DISTANCE: return LC_TEXT("");
  3350. case POINT_ATT_GRADE_BONUS: return LC_TEXT("°ř°Ý·Â +%d");
  3351. case POINT_DEF_GRADE_BONUS: return LC_TEXT("ąćľî·Â +%d");
  3352. case POINT_MAGIC_ATT_GRADE: return LC_TEXT("¸¶ąý °ř°Ý·Â +%d");
  3353. case POINT_MAGIC_DEF_GRADE: return LC_TEXT("¸¶ąý ąćľî·Â +%d");
  3354. // case POINT_CURSE_PCT: return LC_TEXT("");
  3355. case POINT_MAX_STAMINA: return LC_TEXT("ĂÖ´ë Áö±¸·Â +%d");
  3356. case POINT_ATTBONUS_WARRIOR: return LC_TEXT("ą«»çżˇ°Ô °­ÇÔ +%d%%");
  3357. case POINT_ATTBONUS_ASSASSIN: return LC_TEXT("ŔÚ°´żˇ°Ô °­ÇÔ +%d%%");
  3358. case POINT_ATTBONUS_SURA: return LC_TEXT("Ľö¶óżˇ°Ô °­ÇÔ +%d%%");
  3359. case POINT_ATTBONUS_SHAMAN: return LC_TEXT("ą«´çżˇ°Ô °­ÇÔ +%d%%");
  3360. case POINT_ATTBONUS_MONSTER: return LC_TEXT("¸ó˝şĹÍżˇ°Ô °­ÇÔ +%d%%");
  3361. case POINT_MALL_ATTBONUS: return LC_TEXT("°ř°Ý·Â +%d%%");
  3362. case POINT_MALL_DEFBONUS: return LC_TEXT("ąćľî·Â +%d%%");
  3363. case POINT_MALL_EXPBONUS: return LC_TEXT("°ćÇčġ %d%%");
  3364. case POINT_MALL_ITEMBONUS: return LC_TEXT("ľĆŔĚĹŰ µĺ·ÓŔ˛ %.1fąč");
  3365. case POINT_MALL_GOLDBONUS: return LC_TEXT("µ· µĺ·ÓŔ˛ %.1fąč");
  3366. case POINT_MAX_HP_PCT: return LC_TEXT("ĂÖ´ë »ý¸í·Â +%d%%");
  3367. case POINT_MAX_SP_PCT: return LC_TEXT("ĂÖ´ë Á¤˝Ĺ·Â +%d%%");
  3368. case POINT_SKILL_DAMAGE_BONUS: return LC_TEXT("˝şĹł µĄąĚÁö %d%%");
  3369. case POINT_NORMAL_HIT_DAMAGE_BONUS: return LC_TEXT("ĆňŸ µĄąĚÁö %d%%");
  3370. case POINT_SKILL_DEFEND_BONUS: return LC_TEXT("˝şĹł µĄąĚÁö ŔúÇ× %d%%");
  3371. case POINT_NORMAL_HIT_DEFEND_BONUS: return LC_TEXT("ĆňŸ µĄąĚÁö ŔúÇ× %d%%");
  3372. // case POINT_PC_BANG_EXP_BONUS: return LC_TEXT("");
  3373. // case POINT_PC_BANG_DROP_BONUS: return LC_TEXT("");
  3374. // case POINT_EXTRACT_HP_PCT: return LC_TEXT("");
  3375. case POINT_RESIST_WARRIOR: return LC_TEXT("ą«»ç°ř°Ýżˇ %d%% ŔúÇ×");
  3376. case POINT_RESIST_ASSASSIN: return LC_TEXT("ŔÚ°´°ř°Ýżˇ %d%% ŔúÇ×");
  3377. case POINT_RESIST_SURA: return LC_TEXT("Ľö¶ó°ř°Ýżˇ %d%% ŔúÇ×");
  3378. case POINT_RESIST_SHAMAN: return LC_TEXT("ą«´ç°ř°Ýżˇ %d%% ŔúÇ×");
  3379. default: return NULL;
  3380. }
  3381. }
  3382.  
  3383. static bool FN_hair_affect_string(LPCHARACTER ch, char *buf, size_t bufsiz)
  3384. {
  3385. if (NULL == ch || NULL == buf)
  3386. return false;
  3387.  
  3388. CAffect* aff = NULL;
  3389. time_t expire = 0;
  3390. struct tm ltm;
  3391. int year, mon, day;
  3392. int offset = 0;
  3393.  
  3394. aff = ch->FindAffect(AFFECT_HAIR);
  3395.  
  3396. if (NULL == aff)
  3397. return false;
  3398.  
  3399. expire = ch->GetQuestFlag("hair.limit_time");
  3400.  
  3401. if (expire < get_global_time())
  3402. return false;
  3403.  
  3404. // set apply string
  3405. offset = snprintf(buf, bufsiz, FN_point_string(aff->bApplyOn), aff->lApplyValue);
  3406.  
  3407. if (offset < 0 || offset >= (int) bufsiz)
  3408. offset = bufsiz - 1;
  3409.  
  3410. localtime_r(&expire, &ltm);
  3411.  
  3412. year = ltm.tm_year + 1900;
  3413. mon = ltm.tm_mon + 1;
  3414. day = ltm.tm_mday;
  3415.  
  3416. snprintf(buf + offset, bufsiz - offset, LC_TEXT(" (¸¸·áŔĎ : %dłâ %dżů %dŔĎ)"), year, mon, day);
  3417.  
  3418. return true;
  3419. }
  3420.  
  3421. ACMD(do_costume)
  3422. {
  3423. #ifdef __SASH_SYSTEM__
  3424. char buf[768];
  3425. #else
  3426. char buf[512];
  3427. #endif
  3428.  
  3429. char arg1[256];
  3430. one_argument(argument, arg1, sizeof(arg1));
  3431.  
  3432. CItem * pBody = ch->GetWear(WEAR_COSTUME_BODY);
  3433. CItem * pHair = ch->GetWear(WEAR_COSTUME_HAIR);
  3434. #ifdef __SASH_SYSTEM__
  3435. CItem * pSash = ch->GetWear(WEAR_COSTUME_SASH);
  3436. #endif
  3437. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  3438. CItem* pMount = ch->GetWear(WEAR_COSTUME_MOUNT);
  3439. #endif
  3440. ch->ChatPacket(CHAT_TYPE_INFO, "COSTUME status:");
  3441. if (pBody)
  3442. {
  3443. const char* itemName = pBody->GetName();
  3444. ch->ChatPacket(CHAT_TYPE_INFO, " BODY: %s", itemName);
  3445.  
  3446. if (pBody->IsEquipped() && arg1[0] == 'b')
  3447. ch->UnequipItem(pBody);
  3448. }
  3449.  
  3450. if (pHair)
  3451. {
  3452. const char* itemName = pHair->GetName();
  3453. ch->ChatPacket(CHAT_TYPE_INFO, " HAIR: %s", itemName);
  3454.  
  3455. for (int i = 0; i < pHair->GetAttributeCount(); ++i)
  3456. {
  3457. const TPlayerItemAttribute& attr = pHair->GetAttribute(i);
  3458. if (attr.bType > 0)
  3459. {
  3460. const char * pAttrName = FN_point_string(attr.bType);
  3461. if (pAttrName == NULL)
  3462. continue;
  3463.  
  3464. snprintf(buf, sizeof(buf), FN_point_string(attr.bType), attr.sValue);
  3465. ch->ChatPacket(CHAT_TYPE_INFO, " %s", buf);
  3466. }
  3467. }
  3468.  
  3469. if (pHair->IsEquipped() && arg1[0] == 'h')
  3470. ch->UnequipItem(pHair);
  3471. }
  3472.  
  3473. #ifdef __SASH_SYSTEM__
  3474. if (pSash)
  3475. {
  3476. const char * itemName = pSash->GetName();
  3477. ch->ChatPacket(CHAT_TYPE_INFO, " SASH: %s", itemName);
  3478. for (int i = 0; i < pSash->GetAttributeCount(); ++i)
  3479. {
  3480. const TPlayerItemAttribute& attr = pSash->GetAttribute(i);
  3481. if (attr.bType > 0)
  3482. {
  3483. const char * pAttrName = FN_point_string(attr.bType);
  3484. if (pAttrName == NULL)
  3485. continue;
  3486.  
  3487. snprintf(buf, sizeof(buf), FN_point_string(attr.bType), attr.sValue);
  3488. ch->ChatPacket(CHAT_TYPE_INFO, " %s", buf);
  3489. }
  3490. }
  3491.  
  3492. if (pSash->IsEquipped() && arg1[0] == 's')
  3493. ch->UnequipItem(pSash);
  3494. }
  3495. #endif
  3496. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  3497. if (pMount)
  3498. {
  3499. const char* itemName = pMount->GetName();
  3500. ch->ChatPacket(CHAT_TYPE_INFO, " MOUNT : %s", itemName);
  3501.  
  3502. if (pMount->IsEquipped() && arg1[0] == 'm')
  3503. ch->UnequipItem(pMount);
  3504. }
  3505. #endif
  3506. }
  3507.  
  3508. ACMD(do_costum_effect)
  3509. {
  3510. char arg1[256];
  3511. char arg2[256];
  3512. char arg3[256];
  3513. one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  3514.  
  3515. if (!*arg1 || !*arg2 || !*arg3)
  3516. return;
  3517.  
  3518. if (ch->IsOpenSafebox() || ch->GetExchange() || ch->GetMyShop() || ch->IsCubeOpen())
  3519. {
  3520. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Nie możesz handlować w sklepie z otwartym innym oknem transakcji."));
  3521. return;
  3522. }
  3523.  
  3524. DWORD dwVnum = 0;
  3525. str_to_number(dwVnum, arg1);
  3526.  
  3527. if (dwVnum < 0 || dwVnum >= INVENTORY_MAX_NUM)
  3528. return;
  3529.  
  3530. DWORD dwVnumSlot = 0;
  3531. str_to_number(dwVnumSlot, arg3);
  3532.  
  3533. if (dwVnumSlot < 0 || dwVnumSlot >= INVENTORY_MAX_NUM)
  3534. return;
  3535.  
  3536. int BStat = 0;
  3537. str_to_number(BStat, arg2);
  3538.  
  3539. if (BStat <= 0 || BStat > 7)
  3540. return;
  3541.  
  3542. LPITEM item2 = ch->GetInventoryItem(dwVnumSlot);
  3543.  
  3544. if (!item2 || item2->IsExchanging() || item2->GetVnum() != 50512)
  3545. return;
  3546.  
  3547. LPITEM item = ch->GetInventoryItem(dwVnum);
  3548.  
  3549. if (!item || item->IsExchanging() || item->IsEquipped())
  3550. return;
  3551.  
  3552. if (item->GetType() != ITEM_COSTUME || item->GetSubType() != COSTUME_BODY)
  3553. return;
  3554.  
  3555. item->SetSocket(1, BStat);
  3556. item2->SetCount(item->GetCount() - 1);
  3557. }
  3558.  
  3559. ACMD(do_hair)
  3560. {
  3561. char buf[256];
  3562.  
  3563. if (false == FN_hair_affect_string(ch, buf, sizeof(buf)))
  3564. return;
  3565.  
  3566. ch->ChatPacket(CHAT_TYPE_INFO, buf);
  3567. }
  3568.  
  3569. ACMD(do_inventory)
  3570. {
  3571. int index = 0;
  3572. int count = 1;
  3573.  
  3574. char arg1[256];
  3575. char arg2[256];
  3576.  
  3577. LPITEM item;
  3578.  
  3579. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3580.  
  3581. if (!*arg1)
  3582. {
  3583. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: inventory <start_index> <count>");
  3584. return;
  3585. }
  3586.  
  3587. if (!*arg2)
  3588. {
  3589. index = 0;
  3590. str_to_number(count, arg1);
  3591. }
  3592. else
  3593. {
  3594. str_to_number(index, arg1); index = MIN(index, INVENTORY_MAX_NUM);
  3595. str_to_number(count, arg2); count = MIN(count, INVENTORY_MAX_NUM);
  3596. }
  3597.  
  3598. for (int i = 0; i < count; ++i)
  3599. {
  3600. if (index >= INVENTORY_MAX_NUM)
  3601. break;
  3602.  
  3603. item = ch->GetInventoryItem(index);
  3604.  
  3605. ch->ChatPacket(CHAT_TYPE_INFO, "inventory [%d] = %s",
  3606. index, item ? item->GetName() : "<NONE>");
  3607. ++index;
  3608. }
  3609. }
  3610.  
  3611. //gift notify quest command
  3612. ACMD(do_gift)
  3613. {
  3614. ch->ChatPacket(CHAT_TYPE_COMMAND, "gift");
  3615. }
  3616.  
  3617. ACMD(do_cube)
  3618. {
  3619. if (!ch->CanDoCube())
  3620. return;
  3621.  
  3622. dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->GetName(), argument);
  3623. int cube_index = 0, inven_index = 0;
  3624. const char *line;
  3625.  
  3626. char arg1[256], arg2[256], arg3[256];
  3627.  
  3628. line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3629. one_argument(line, arg3, sizeof(arg3));
  3630.  
  3631. if (0 == arg1[0])
  3632. {
  3633. // print usage
  3634. ch->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
  3635. ch->ChatPacket(CHAT_TYPE_INFO, " cube close");
  3636. ch->ChatPacket(CHAT_TYPE_INFO, " cube add <inveltory_index>");
  3637. ch->ChatPacket(CHAT_TYPE_INFO, " cube delete <cube_index>");
  3638. ch->ChatPacket(CHAT_TYPE_INFO, " cube list");
  3639. ch->ChatPacket(CHAT_TYPE_INFO, " cube cancel");
  3640. ch->ChatPacket(CHAT_TYPE_INFO, " cube make [all]");
  3641. return;
  3642. }
  3643.  
  3644. const std::string& strArg1 = std::string(arg1);
  3645.  
  3646. // r_info (request information)
  3647. // /cube r_info ==> (Client -> Server) ÇöŔç NPC°ˇ ¸¸µé Ľö ŔÖ´Â ·ą˝ĂÇÇ żäĂ»
  3648. // (Server -> Client) /cube r_list npcVNUM resultCOUNT 123,1/125,1/128,1/130,5
  3649. //
  3650. // /cube r_info 3 ==> (Client -> Server) ÇöŔç NPC°ˇ ¸¸µéĽö ŔÖ´Â ·ą˝ĂÇÇ Áß 3ąř° ľĆŔĚĹŰŔ» ¸¸µĺ´Â µĄ ÇĘżäÇŃ Á¤ş¸¸¦ żäĂ»
  3651. // /cube r_info 3 5 ==> (Client -> Server) ÇöŔç NPC°ˇ ¸¸µéĽö ŔÖ´Â ·ą˝ĂÇÇ Áß 3ąř° ľĆŔĚĹŰşÎĹÍ ŔĚČÄ 5°łŔÇ ľĆŔĚĹŰŔ» ¸¸µĺ´Â µĄ ÇĘżäÇŃ Ŕç·á Á¤ş¸¸¦ żäĂ»
  3652. // (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
  3653. //
  3654. if (strArg1 == "r_info")
  3655. {
  3656. if (0 == arg2[0])
  3657. Cube_request_result_list(ch);
  3658. else
  3659. {
  3660. if (isdigit(*arg2))
  3661. {
  3662. int listIndex = 0, requestCount = 1;
  3663. str_to_number(listIndex, arg2);
  3664.  
  3665. if (0 != arg3[0] && isdigit(*arg3))
  3666. str_to_number(requestCount, arg3);
  3667.  
  3668. Cube_request_material_info(ch, listIndex, requestCount);
  3669. }
  3670. }
  3671.  
  3672. return;
  3673. }
  3674.  
  3675. switch (LOWER(arg1[0]))
  3676. {
  3677. case 'o': // open
  3678. Cube_open(ch);
  3679. break;
  3680.  
  3681. case 'c': // close
  3682. Cube_close(ch);
  3683. break;
  3684.  
  3685. case 'l': // list
  3686. Cube_show_list(ch);
  3687. break;
  3688.  
  3689. case 'a': // add cue_index inven_index
  3690. {
  3691. if (0 == arg2[0] || !isdigit(*arg2) ||
  3692. 0 == arg3[0] || !isdigit(*arg3))
  3693. return;
  3694.  
  3695. str_to_number(cube_index, arg2);
  3696. str_to_number(inven_index, arg3);
  3697. Cube_add_item (ch, cube_index, inven_index);
  3698. }
  3699. break;
  3700.  
  3701. case 'd': // delete
  3702. {
  3703. if (0 == arg2[0] || !isdigit(*arg2))
  3704. return;
  3705.  
  3706. str_to_number(cube_index, arg2);
  3707. Cube_delete_item (ch, cube_index);
  3708. }
  3709. break;
  3710.  
  3711. case 'm': // make
  3712. if (0 != arg2[0])
  3713. {
  3714. while (true == Cube_make(ch))
  3715. dev_log (LOG_DEB0, "cube make success");
  3716. }
  3717. else
  3718. Cube_make(ch);
  3719. break;
  3720.  
  3721. default:
  3722. return;
  3723. }
  3724. }
  3725.  
  3726. ACMD(do_cards)
  3727. {
  3728. const char *line;
  3729.  
  3730. char arg1[256], arg2[256];
  3731.  
  3732. line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  3733. switch (LOWER(arg1[0]))
  3734. {
  3735. case 'o': // open
  3736. if (isdigit(*arg2))
  3737. {
  3738. DWORD safemode;
  3739. str_to_number(safemode, arg2);
  3740. ch->Cards_open(safemode);
  3741. }
  3742. break;
  3743. case 'p': // open
  3744. ch->Cards_pullout();
  3745. break;
  3746. case 'e': // open
  3747. ch->CardsEnd();
  3748. break;
  3749. case 'd': // open
  3750. if (isdigit(*arg2))
  3751. {
  3752. DWORD destroy_index;
  3753. str_to_number(destroy_index, arg2);
  3754. ch->CardsDestroy(destroy_index);
  3755. }
  3756. break;
  3757. case 'a': // open
  3758. if (isdigit(*arg2))
  3759. {
  3760. DWORD accpet_index;
  3761. str_to_number(accpet_index, arg2);
  3762. ch->CardsAccept(accpet_index);
  3763. }
  3764. break;
  3765. case 'r': // open
  3766. if (isdigit(*arg2))
  3767. {
  3768. DWORD restore_index;
  3769. str_to_number(restore_index, arg2);
  3770. ch->CardsRestore(restore_index);
  3771. }
  3772. break;
  3773. default:
  3774. return;
  3775. }
  3776. }
  3777.  
  3778. ACMD(do_in_game_mall)
  3779. {
  3780. if (LC_IsYMIR() == true || LC_IsKorea() == true)
  3781. {
  3782. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3783. return;
  3784. }
  3785.  
  3786. if (true == LC_IsTaiwan())
  3787. {
  3788. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3789. return;
  3790. }
  3791.  
  3792. // ¤Đ_¤Đ ÄčµµĽ­ąö ľĆŔĚĹ۸ô URL ÇϵĺÄÚµů Ăß°ˇ
  3793. if (true == LC_IsWE_Korea())
  3794. {
  3795. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3796. return;
  3797. }
  3798.  
  3799. if (LC_IsJapan() == true)
  3800. {
  3801. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3802. return;
  3803. }
  3804.  
  3805. if (LC_IsNewCIBN() == true && test_server)
  3806. {
  3807. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3808. return;
  3809. }
  3810.  
  3811. if (LC_IsSingapore() == true)
  3812. {
  3813. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3814. return;
  3815. }
  3816.  
  3817. /*
  3818. if (LC_IsCanada() == true)
  3819. {
  3820. ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://calios.eu");
  3821. return;
  3822. }*/
  3823.  
  3824. if (LC_IsEurope() == true)
  3825. {
  3826. char country_code[3];
  3827.  
  3828. switch (LC_GetLocalType())
  3829. {
  3830. case LC_GERMANY: country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0'; break;
  3831. case LC_FRANCE: country_code[0] = 'f'; country_code[1] = 'r'; country_code[2] = '\0'; break;
  3832. case LC_ITALY: country_code[0] = 'i'; country_code[1] = 't'; country_code[2] = '\0'; break;
  3833. case LC_SPAIN: country_code[0] = 'e'; country_code[1] = 's'; country_code[2] = '\0'; break;
  3834. case LC_UK: country_code[0] = 'e'; country_code[1] = 'n'; country_code[2] = '\0'; break;
  3835. case LC_TURKEY: country_code[0] = 't'; country_code[1] = 'r'; country_code[2] = '\0'; break;
  3836. case LC_POLAND: country_code[0] = 'p'; country_code[1] = 'l'; country_code[2] = '\0'; break;
  3837. case LC_PORTUGAL: country_code[0] = 'p'; country_code[1] = 't'; country_code[2] = '\0'; break;
  3838. case LC_GREEK: country_code[0] = 'g'; country_code[1] = 'r'; country_code[2] = '\0'; break;
  3839. case LC_RUSSIA: country_code[0] = 'r'; country_code[1] = 'u'; country_code[2] = '\0'; break;
  3840. case LC_DENMARK: country_code[0] = 'd'; country_code[1] = 'k'; country_code[2] = '\0'; break;
  3841. case LC_BULGARIA: country_code[0] = 'b'; country_code[1] = 'g'; country_code[2] = '\0'; break;
  3842. case LC_CROATIA: country_code[0] = 'h'; country_code[1] = 'r'; country_code[2] = '\0'; break;
  3843. case LC_MEXICO: country_code[0] = 'm'; country_code[1] = 'x'; country_code[2] = '\0'; break;
  3844. case LC_ARABIA: country_code[0] = 'a'; country_code[1] = 'e'; country_code[2] = '\0'; break;
  3845. case LC_CZECH: country_code[0] = 'c'; country_code[1] = 'z'; country_code[2] = '\0'; break;
  3846. case LC_ROMANIA: country_code[0] = 'r'; country_code[1] = 'o'; country_code[2] = '\0'; break;
  3847. case LC_HUNGARY: country_code[0] = 'h'; country_code[1] = 'u'; country_code[2] = '\0'; break;
  3848. case LC_NETHERLANDS: country_code[0] = 'n'; country_code[1] = 'l'; country_code[2] = '\0'; break;
  3849. case LC_USA: country_code[0] = 'u'; country_code[1] = 's'; country_code[2] = '\0'; break;
  3850. case LC_CANADA: country_code[0] = 'c'; country_code[1] = 'a'; country_code[2] = '\0'; break;
  3851. default:
  3852. if (test_server == true)
  3853. {
  3854. country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0';
  3855. }
  3856. break;
  3857. }
  3858.  
  3859. char buf[512+1];
  3860. char sas[33];
  3861. MD5_CTX ctx;
  3862. const char sas_key[] = "GF9001";
  3863.  
  3864. snprintf(buf, sizeof(buf), "%u%u%s", ch->GetPlayerID(), ch->GetAID(), sas_key);
  3865.  
  3866. MD5Init(&ctx);
  3867. MD5Update(&ctx, (const unsigned char *) buf, strlen(buf));
  3868. #ifdef __FreeBSD__
  3869. MD5End(&ctx, sas);
  3870. #else
  3871. static const char hex[] = "0123456789abcdef";
  3872. unsigned char digest[16];
  3873. MD5Final(digest, &ctx);
  3874. int i;
  3875. for (i = 0; i < 16; ++i) {
  3876. sas[i+i] = hex[digest[i] >> 4];
  3877. sas[i+i+1] = hex[digest[i] & 0x0f];
  3878. }
  3879. sas[i+i] = '\0';
  3880. #endif
  3881.  
  3882. snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d&sas=%s",
  3883. g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id, sas);
  3884.  
  3885. ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
  3886. }
  3887. }
  3888.  
  3889. // ÁÖ»çŔ§
  3890. ACMD(do_dice)
  3891. {
  3892. sys_err("Wykryto użycie komendy /dice przez: %s", ch->GetName());
  3893. }
  3894.  
  3895. ACMD(do_click_mall)
  3896. {
  3897. ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeMallPassword");
  3898. }
  3899.  
  3900. ACMD(do_shop_open)
  3901. {
  3902. if (ch->IsObserverMode() || ch->IsDead() || ch->IsStun() || ch->GetMountVnum() || ch->IsHorseRiding() == true || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->GetMyShop() || ch->IsCubeOpen() || ch->GetExchange())
  3903. {
  3904. return;
  3905. }
  3906. ch->ChatPacket(CHAT_TYPE_COMMAND, "OpenPrivateShop");
  3907. }
  3908.  
  3909. ACMD(do_ride)
  3910. {
  3911. dev_log(LOG_DEB0, "[DO_RIDE] start");
  3912. if (ch->IsDead() || ch->IsStun())
  3913. return;
  3914.  
  3915. if (ch->GetMapIndex() == 113)
  3916. return;
  3917.  
  3918. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  3919. if (ch->IsPolymorphed() == true){
  3920. ch->ChatPacket(CHAT_TYPE_INFO, "Nu poti folosi un mount atat timp cat esti transformat.");
  3921. return;
  3922. }
  3923. if(ch->GetWear(WEAR_COSTUME_MOUNT))
  3924. {
  3925. CMountSystem* mountSystem = ch->GetMountSystem();
  3926. LPITEM mount = ch->GetWear(WEAR_COSTUME_MOUNT);
  3927. DWORD mobVnum = 0;
  3928.  
  3929. if (!mountSystem && !mount)
  3930. return;
  3931.  
  3932. #ifdef __CHANGELOOK_SYSTEM__
  3933. if(mount->GetTransmutation())
  3934. {
  3935. const TItemTable* itemTable = ITEM_MANAGER::instance().GetTable(mount->GetTransmutation());
  3936.  
  3937. if (itemTable)
  3938. mobVnum = itemTable->alValues[1];
  3939. else
  3940. mobVnum = mount->GetValue(1);
  3941. }
  3942. else
  3943. mobVnum = mount->GetValue(1);
  3944. #else
  3945. if(mount->GetValue(1) != 0)
  3946. mobVnum = mount->GetValue(1);
  3947. #endif
  3948.  
  3949. if (ch->GetMountVnum())
  3950. {
  3951. if(mountSystem->CountSummoned() == 0)
  3952. {
  3953. mountSystem->Unmount(mobVnum);
  3954. }
  3955. }
  3956. else
  3957. {
  3958. if(mountSystem->CountSummoned() == 1)
  3959. {
  3960. mountSystem->Mount(mobVnum, mount);
  3961. }
  3962. }
  3963.  
  3964. return;
  3965. }
  3966. #endif
  3967.  
  3968. if (ch->IsHorseRiding())
  3969. {
  3970. ch->StopRiding();
  3971. return;
  3972. }
  3973.  
  3974. if (ch->GetHorse() != NULL)
  3975. {
  3976. ch->StartRiding();
  3977. return;
  3978. }
  3979.  
  3980. for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i)
  3981. {
  3982. LPITEM item = ch->GetInventoryItem(i);
  3983. if (NULL == item)
  3984. continue;
  3985.  
  3986. if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_MOUNT) {
  3987. ch->UseItem(TItemPos (INVENTORY, i));
  3988. return;
  3989. }
  3990. }
  3991.  
  3992. // Ÿ°ĹłŞ ł»¸± Ľö ľřŔ»¶§
  3993. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»Ŕ» ¸ŐŔú ĽŇČŻÇŘÁÖĽĽżä."));
  3994. }
  3995.  
  3996. #ifdef __AUCTION__
  3997. // temp_auction
  3998. ACMD(do_get_item_id_list)
  3999. {
  4000. for (int i = 0; i < INVENTORY_MAX_NUM; i++)
  4001. {
  4002. LPITEM item = ch->GetInventoryItem(i);
  4003. if (item != NULL)
  4004. ch->ChatPacket(CHAT_TYPE_INFO, "name : %s id : %d", item->GetProto()->szName, item->GetID());
  4005. }
  4006. }
  4007.  
  4008. // temp_auction
  4009.  
  4010. ACMD(do_enroll_auction)
  4011. {
  4012. char arg1[256];
  4013. char arg2[256];
  4014. char arg3[256];
  4015. char arg4[256];
  4016. two_arguments (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3), arg4, sizeof(arg4));
  4017.  
  4018. DWORD item_id = strtoul(arg1, NULL, 10);
  4019. BYTE empire = strtoul(arg2, NULL, 10);
  4020. int bidPrice = strtol(arg3, NULL, 10);
  4021. int immidiatePurchasePrice = strtol(arg4, NULL, 10);
  4022.  
  4023. LPITEM item = ITEM_MANAGER::instance().Find(item_id);
  4024. if (item == NULL)
  4025. return;
  4026.  
  4027. AuctionManager::instance().enroll_auction(ch, item, empire, bidPrice, immidiatePurchasePrice);
  4028. }
  4029.  
  4030. ACMD(do_enroll_wish)
  4031. {
  4032. char arg1[256];
  4033. char arg2[256];
  4034. char arg3[256];
  4035. one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  4036.  
  4037. DWORD item_num = strtoul(arg1, NULL, 10);
  4038. BYTE empire = strtoul(arg2, NULL, 10);
  4039. int wishPrice = strtol(arg3, NULL, 10);
  4040.  
  4041. AuctionManager::instance().enroll_wish(ch, item_num, empire, wishPrice);
  4042. }
  4043.  
  4044. ACMD(do_enroll_sale)
  4045. {
  4046. char arg1[256];
  4047. char arg2[256];
  4048. char arg3[256];
  4049. one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
  4050.  
  4051. DWORD item_id = strtoul(arg1, NULL, 10);
  4052. DWORD wisher_id = strtoul(arg2, NULL, 10);
  4053. int salePrice = strtol(arg3, NULL, 10);
  4054.  
  4055. LPITEM item = ITEM_MANAGER::instance().Find(item_id);
  4056. if (item == NULL)
  4057. return;
  4058.  
  4059. AuctionManager::instance().enroll_sale(ch, item, wisher_id, salePrice);
  4060. }
  4061.  
  4062. // temp_auction
  4063. // packetŔ¸·Î Ĺë˝ĹÇĎ°Ô ÇĎ°í, ŔĚ°Ç »čÁ¦ÇŘľßÇŃ´Ů.
  4064. ACMD(do_get_auction_list)
  4065. {
  4066. char arg1[256];
  4067. char arg2[256];
  4068. char arg3[256];
  4069. two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));
  4070.  
  4071. AuctionManager::instance().get_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
  4072. }
  4073. //
  4074. //ACMD(do_get_wish_list)
  4075. //{
  4076. // char arg1[256];
  4077. // char arg2[256];
  4078. // char arg3[256];
  4079. // two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));
  4080. //
  4081. // AuctionManager::instance().get_wish_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
  4082. //}
  4083. ACMD (do_get_my_auction_list)
  4084. {
  4085. char arg1[256];
  4086. char arg2[256];
  4087. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4088.  
  4089. AuctionManager::instance().get_my_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4090. }
  4091.  
  4092. ACMD (do_get_my_purchase_list)
  4093. {
  4094. char arg1[256];
  4095. char arg2[256];
  4096. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4097.  
  4098. AuctionManager::instance().get_my_purchase_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4099. }
  4100.  
  4101. ACMD (do_auction_bid)
  4102. {
  4103. char arg1[256];
  4104. char arg2[256];
  4105. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4106.  
  4107. AuctionManager::instance().bid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4108. }
  4109.  
  4110. ACMD (do_auction_impur)
  4111. {
  4112. char arg1[256];
  4113. one_argument (argument, arg1, sizeof(arg1));
  4114.  
  4115. AuctionManager::instance().immediate_purchase (ch, strtoul(arg1, NULL, 10));
  4116. }
  4117.  
  4118. ACMD (do_get_auctioned_item)
  4119. {
  4120. char arg1[256];
  4121. char arg2[256];
  4122. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4123.  
  4124. AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4125. }
  4126.  
  4127. ACMD (do_buy_sold_item)
  4128. {
  4129. char arg1[256];
  4130. char arg2[256];
  4131. one_argument (argument, arg1, sizeof(arg1));
  4132.  
  4133. AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4134. }
  4135.  
  4136. ACMD (do_cancel_auction)
  4137. {
  4138. char arg1[256];
  4139. one_argument (argument, arg1, sizeof(arg1));
  4140.  
  4141. AuctionManager::instance().cancel_auction (ch, strtoul(arg1, NULL, 10));
  4142. }
  4143.  
  4144. ACMD (do_cancel_wish)
  4145. {
  4146. char arg1[256];
  4147. one_argument (argument, arg1, sizeof(arg1));
  4148.  
  4149. AuctionManager::instance().cancel_wish (ch, strtoul(arg1, NULL, 10));
  4150. }
  4151.  
  4152. ACMD (do_cancel_sale)
  4153. {
  4154. char arg1[256];
  4155. one_argument (argument, arg1, sizeof(arg1));
  4156.  
  4157. AuctionManager::instance().cancel_sale (ch, strtoul(arg1, NULL, 10));
  4158. }
  4159.  
  4160. ACMD (do_rebid)
  4161. {
  4162. char arg1[256];
  4163. char arg2[256];
  4164. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4165.  
  4166. AuctionManager::instance().rebid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
  4167. }
  4168.  
  4169. ACMD (do_bid_cancel)
  4170. {
  4171. char arg1[256];
  4172. char arg2[256];
  4173. two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4174.  
  4175. AuctionManager::instance().bid_cancel (ch, strtoul(arg1, NULL, 10));
  4176. }
  4177. #endif
  4178. struct s_sort {
  4179. bool operator() (LPITEM src, LPITEM dst) { return (src->GetVnum()<dst->GetVnum()); }
  4180. } _sort;
  4181.  
  4182. ACMD(do_sort_inventory)
  4183. {
  4184. std::vector<LPITEM> collectItems;
  4185. std::vector<WORD> oldCells;
  4186. int INVENTORY_MAX_NUM = 180;
  4187. int totalSize = 0;
  4188. for (WORD i = 0; i < INVENTORY_MAX_NUM; ++i)
  4189. {
  4190. LPITEM item = ch->GetInventoryItem(i);
  4191. if (item)
  4192. {
  4193. totalSize += item->GetSize();
  4194. oldCells.push_back(item->GetCell());
  4195. collectItems.push_back(item);
  4196. }
  4197. }
  4198. if (totalSize - 3 >= INVENTORY_MAX_NUM)
  4199. {
  4200. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("INVENTORY_FULL_CANNOT_SORT"));
  4201. return;
  4202. }
  4203.  
  4204. std::vector<LPITEM>::iterator it = collectItems.begin(), end = collectItems.end();
  4205. for (; it != end; ++it)
  4206. ((LPITEM)*it)->RemoveFromCharacter();
  4207.  
  4208. std::sort(collectItems.begin(), collectItems.end(), _sort);
  4209.  
  4210. std::vector<LPITEM>::iterator it1 = collectItems.begin(), end1 = collectItems.end();
  4211. for (; it1 != end1; ++it1)
  4212. {
  4213. WORD cell = ch->GetEmptyInventory(((LPITEM)*it1)->GetSize());
  4214. ((LPITEM)*it1)->AddToCharacter(ch, TItemPos(INVENTORY, cell)/*, isNew=false*/);
  4215. }
  4216. }
  4217.  
  4218. ACMD(do_efektimiver)
  4219. {
  4220. char arg1[256];
  4221. one_argument(argument, arg1, sizeof(arg1));
  4222.  
  4223. if (ch->IsDead() || ch->GetHP() <= 0 || !ch->IsPC())
  4224. {
  4225. ch->ChatPacket(CHAT_TYPE_INFO, "Nie możesz tego zrobić.");
  4226. return;
  4227. }
  4228. if (*arg1)
  4229. {
  4230. switch (LOWER(*arg1))
  4231. {
  4232. case 'a'://sarý efekt
  4233. if (!ch->IsAffectFlag(AFFECT_YELLOW)){
  4234. ch->AddAffect(AFFECT_YELLOW, POINT_NONE, 0,AFF_YELLOW, INFINITE_AFFECT_DURATION, 0, false);
  4235. }
  4236. break;
  4237. case 'b'://kahverengi efekt
  4238. if (!ch->IsAffectFlag(AFFECT_BROWN)){
  4239. ch->AddAffect(AFFECT_BROWN, POINT_NONE, 0,AFF_BROWN, INFINITE_AFFECT_DURATION, 0, false);
  4240. }
  4241. break;
  4242. case 'c'://gri efekt
  4243. if (!ch->IsAffectFlag(AFFECT_GREY)){
  4244. ch->AddAffect(AFFECT_GREY, POINT_NONE, 0,AFF_GREY, INFINITE_AFFECT_DURATION, 0, false);
  4245. }
  4246. break;
  4247. case 'd'://turuncu efekt
  4248. if (!ch->IsAffectFlag(AFFECT_ORANGE)){
  4249. ch->AddAffect(AFFECT_ORANGE, POINT_NONE, 0,AFF_ORANGE, INFINITE_AFFECT_DURATION, 0, false);
  4250. }
  4251. break;
  4252. case 'e'://pembe efekt
  4253. if (!ch->IsAffectFlag(AFFECT_PINK)){
  4254. ch->AddAffect(AFFECT_PINK, POINT_NONE, 0,AFF_PINK, INFINITE_AFFECT_DURATION, 0, false);
  4255. }
  4256. break;
  4257. case 'f'://mor efekt
  4258. if (!ch->IsAffectFlag(AFFECT_PURPLE)){
  4259. ch->AddAffect(AFFECT_PURPLE, POINT_NONE, 0,AFF_PURPLE, INFINITE_AFFECT_DURATION, 0, false);
  4260. }
  4261. break;
  4262. case 'g'://turkuaz efekt
  4263. if (!ch->IsAffectFlag(AFFECT_TURQUOISE)){
  4264. ch->AddAffect(AFFECT_TURQUOISE, POINT_NONE, 0,AFF_TURQUOISE, INFINITE_AFFECT_DURATION, 0, false);
  4265. }
  4266. break;
  4267. case 'h'://mavi efekt
  4268. if (!ch->IsAffectFlag(AFFECT_BLUE)){
  4269. ch->AddAffect(AFFECT_BLUE, POINT_NONE, 0,AFF_BLUE, INFINITE_AFFECT_DURATION, 0, false);
  4270. }
  4271. break;
  4272. case 'j'://kýrmýzý efekt
  4273. if (!ch->IsAffectFlag(AFFECT_RED)){
  4274. ch->AddAffect(AFFECT_RED, POINT_NONE, 0,AFF_RED, INFINITE_AFFECT_DURATION, 0, false);
  4275. }
  4276. break;
  4277. }
  4278. }
  4279. }
  4280.  
  4281. ACMD(do_efektlerisil)
  4282. {
  4283. if (ch->IsDead() || ch->GetHP() <= 0 || !ch->IsPC())
  4284. {
  4285. ch->ChatPacket(CHAT_TYPE_INFO, "Nie możesz tego zrobić.");
  4286. return;
  4287. }
  4288. if (ch->RemoveAffect(AFFECT_YELLOW));
  4289. if (ch->RemoveAffect(AFFECT_BROWN));
  4290. if (ch->RemoveAffect(AFFECT_GREY));
  4291. if (ch->RemoveAffect(AFFECT_ORANGE));
  4292. if (ch->RemoveAffect(AFFECT_PINK));
  4293. if (ch->RemoveAffect(AFFECT_PURPLE));
  4294. if (ch->RemoveAffect(AFFECT_TURQUOISE));
  4295. if (ch->RemoveAffect(AFFECT_BLUE));
  4296. if (ch->RemoveAffect(AFFECT_RED));
  4297. ch->ChatPacket(CHAT_TYPE_INFO, "Efekt Usunięty.");
  4298. }
  4299.  
  4300. ACMD(do_stat_val)
  4301. {
  4302. char arg1[256], arg2[256];
  4303. two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
  4304.  
  4305. int val = 0;
  4306. str_to_number(val, arg2);
  4307.  
  4308. if (!*arg1 || val <= 0)
  4309. return;
  4310.  
  4311. if (ch->IsPolymorphed())
  4312. {
  4313. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Nie możesz tego zrobić."));
  4314. return;
  4315. }
  4316.  
  4317. if (ch->GetPoint(POINT_STAT) <= 0)
  4318. return;
  4319.  
  4320. BYTE idx = 0;
  4321.  
  4322. if (!strcmp(arg1, "st"))
  4323. idx = POINT_ST;
  4324. else if (!strcmp(arg1, "dx"))
  4325. idx = POINT_DX;
  4326. else if (!strcmp(arg1, "ht"))
  4327. idx = POINT_HT;
  4328. else if (!strcmp(arg1, "iq"))
  4329. idx = POINT_IQ;
  4330. else
  4331. return;
  4332.  
  4333. if (ch->GetRealPoint(idx) >= MAX_STAT)
  4334. return;
  4335.  
  4336. if (val > ch->GetPoint(POINT_STAT))
  4337. {
  4338. val = ch->GetPoint(POINT_STAT);
  4339. }
  4340.  
  4341. if (ch->GetRealPoint(idx) + val > MAX_STAT)
  4342. {
  4343. val = MAX_STAT - ch->GetRealPoint(idx);
  4344. }
  4345.  
  4346. ch->SetRealPoint(idx, ch->GetRealPoint(idx) + val);
  4347. ch->SetPoint(idx, ch->GetPoint(idx) + val);
  4348. ch->ComputePoints();
  4349. ch->PointChange(idx, 0);
  4350.  
  4351. if (idx == POINT_IQ)
  4352. {
  4353. ch->PointChange(POINT_MAX_HP, 0);
  4354. }
  4355. else if (idx == POINT_HT)
  4356. {
  4357. ch->PointChange(POINT_MAX_SP, 0);
  4358. }
  4359.  
  4360. ch->PointChange(POINT_STAT, -val);
  4361. ch->ComputePoints();
  4362. }
  4363.  
  4364. const struct change_visual_eq_struct
  4365. {
  4366. const BYTE partNum;
  4367. const std::string flagName;
  4368. } change_visual_eq_fields[] = {
  4369. { PART_MAIN, "visual_eq.main" },
  4370. { PART_WEAPON, "visual_eq.weapon" },
  4371. { PART_HAIR, "visual_eq.hair" },
  4372. { PART_SASH, "visual_eq.sash" },
  4373. };
  4374.  
  4375. ACMD(do_change_visual_eq)
  4376. {
  4377. if (!ch)
  4378. return;
  4379.  
  4380. if (ch->IsPolymorphed())
  4381. {
  4382. ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Nie mozesz tego wykonac. Jestes przemieniony w potwora."));
  4383. return;
  4384. }
  4385.  
  4386. char arg1[256];
  4387. one_argument(argument, arg1, sizeof(arg1));
  4388. if (!*arg1)
  4389. return;
  4390.  
  4391. BYTE partNum = PART_MAX_NUM;
  4392. str_to_number(partNum, arg1);
  4393.  
  4394. switch (partNum)
  4395. {
  4396. case PART_MAIN:
  4397. case PART_WEAPON:
  4398. case PART_HAIR:
  4399. case PART_SASH:
  4400. {
  4401. std::string flagName = change_visual_eq_fields[partNum].flagName;
  4402. ch->SetQuestFlag(flagName, !ch->GetQuestFlag(flagName));
  4403. break;
  4404. }
  4405.  
  4406. default:
  4407. break;
  4408. }
  4409. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement