Advertisement
Guest User

cmd_gm.cpp

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