YusufŞimşek14 1
YusufŞimşek14
berzahx 2
berzahx
xranzei 1
xranzei
Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
romegames 1
romegames
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

#Uzak NPC hakkınad yardım istiyorum

  • Konuyu başlatan Konuyu başlatan 6kanka6
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 8
  • Görüntüleme Görüntüleme 4K
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

6kanka6

Level 7
TM Üye
Katılım
14 Ara 2010
Konular
339
Mesajlar
1,890
Çözüm
57
Online süresi
1mo 19d
Reaksiyon Skoru
102
Altın Konu
0
TM Yaşı
15 Yıl 6 Ay 4 Gün
Başarım Puanı
209
MmoLira
6,672
DevLira
0
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

merhabalar uzaktan npc kurdum src yerindekileri ekliyorum ama hata alıyorum . Baska fileslar ile karsılastırdım . Arattığım kodlar onlarda yok zaten anlamadım ben sorunu bu konuda yardımcı olucak kişiler varmı lütfen ? Dünden beri bulamadım neyi yanlıs yaptığımıda anladım ama

İndirdiğim

Kod:
#include "stdafx.h"
#include "utils.h"
#include "config.h"
#include "char.h"
#include "locale_service.h"
#include "log.h"
#include "desc.h"

ACMD(do_user_horse_ride);
ACMD(do_user_horse_back);
ACMD(do_user_horse_feed);
ACMD(do_ruhoku);

ACMD(do_pcbang_update);
ACMD(do_pcbang_check);

// ADD_COMMAND_SLOW_STUN
ACMD(do_slow);
ACMD(do_stun);
#ifdef ENABLE_POLY_SHOP
ACMD(do_buy_marble);
#endif
// END_OF_ADD_COMMAND_SLOW_STUN

//black event
ACMD(event_new);
ACMD(event_aciyom);
//blackeventkapat

ACMD(do_warp);
ACMD(do_goto);
ACMD(do_item);
ACMD(do_mob);
ACMD(do_mob_ld);
ACMD(do_mob_aggresive);
ACMD(do_mob_coward);
ACMD(do_mob_map);
ACMD(do_purge);
#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
ACMD(do_remove_polymorph);
#endif
ACMD(do_weaken);
ACMD(do_item_purge);
ACMD(do_state);
ACMD(do_notice);
ACMD(do_map_notice);
ACMD(do_big_notice);
ACMD(do_broadcast_big_notice);
ACMD(do_who);
ACMD(do_user);
ACMD(do_disconnect);
ACMD(do_kill);
ACMD(do_emotion_allow);
ACMD(do_emotion);
ACMD(do_transfer);
ACMD(do_set);
ACMD(do_cmd);
ACMD(do_reset);
ACMD(do_greset);
ACMD(do_mount);
ACMD(do_fishing);
ACMD(do_refine_rod);
ACMD(do_bkoku);

// REFINE_PICK
ACMD(do_max_pick);
ACMD(do_refine_pick);
// END_OF_REFINE_PICK

ACMD(do_fishing_simul);
ACMD(do_console);
ACMD(do_restart);
ACMD(do_advance);
ACMD(do_stat);
ACMD(do_respawn);
ACMD(do_skillup);
ACMD(do_guildskillup);
ACMD(do_pvp);
ACMD(do_point_reset);
ACMD(do_safebox_size);
ACMD(do_safebox_close);
ACMD(do_safebox_password);
ACMD(do_safebox_change_password);
ACMD(do_mall_password);
ACMD(do_mall_close);
ACMD(do_ajanikov);
ACMD(do_ungroup);
ACMD(do_makeguild);
ACMD(do_deleteguild);
ACMD(do_shutdown);
ACMD(do_group);
ACMD(do_group_random);
ACMD(do_invisibility);
ACMD(do_event_flag);
ACMD(do_get_event_flag);
ACMD(do_private);
ACMD(do_qf);
ACMD(do_clear_quest);
ACMD(do_book);
ACMD(do_reload);
ACMD(do_war);
ACMD(do_nowar);
ACMD(do_setskill);
ACMD(do_setskillother);
ACMD(do_level);
ACMD(do_polymorph);
ACMD(do_polymorph_item);
/*
   ACMD(do_b1);
   ACMD(do_b2);
   ACMD(do_b3);
   ACMD(do_b4);
   ACMD(do_b5);
   ACMD(do_b6);
   ACMD(do_b7);
 */
ACMD(do_close_shop);
ACMD(do_set_walk_mode);
ACMD(do_set_run_mode);
ACMD(do_set_skill_group);
ACMD(do_set_skill_point);
ACMD(do_cooltime);
ACMD(do_detaillog);
ACMD(do_monsterlog);

ACMD(do_gwlist);
ACMD(do_stop_guild_war);
ACMD(do_cancel_guild_war);
ACMD(do_guild_state);

ACMD(do_pkmode);
ACMD(do_mobile);
ACMD(do_mobile_auth);
ACMD(do_messenger_auth);

ACMD(do_getqf);
ACMD(do_setqf);
ACMD(do_delqf);
ACMD(do_set_state);

ACMD(do_forgetme);
ACMD(do_aggregate);
ACMD(do_attract_ranger);
ACMD(do_pull_monster);
ACMD(do_setblockmode);
ACMD(do_priv_empire);
ACMD(do_priv_guild);
ACMD(do_mount_test);
ACMD(do_unmount);
ACMD(do_observer);
ACMD(do_observer_exit);
ACMD(do_socket_item);
ACMD(do_xmas);
ACMD(do_stat_minus);
ACMD(do_stat_reset);
ACMD(do_view_equip);
ACMD(do_block_chat);
ACMD(do_vote_block_chat);
ACMD(do_ban);
ACMD(do_sban);

// BLOCK_CHAT
ACMD(do_block_chat_list);
// END_OF_BLOCK_CHAT

ACMD(do_party_request);
ACMD(do_party_request_deny);
ACMD(do_party_request_accept);
ACMD(do_build);
ACMD(do_clear_land);

ACMD(do_horse_state);
ACMD(do_horse_level);
ACMD(do_horse_ride);
ACMD(do_horse_summon);
ACMD(do_horse_unsummon);
ACMD(do_horse_set_stat);

ACMD(do_save_attribute_to_image);
ACMD(do_affect_remove);

ACMD(do_change_attr);
ACMD(do_add_attr);
ACMD(do_add_socket);

ACMD(do_inputall)
{
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸í·É¾î¸¦ ¸ğµÎ ÀÔ·ÂÇϼ¼¿ä."));
}

ACMD(do_show_arena_list);
ACMD(do_end_all_duel);
ACMD(do_end_duel);
ACMD(do_duel);

ACMD(do_stat_plus_amount);

ACMD(do_break_marriage);

ACMD(do_oxevent_show_quiz);
ACMD(do_oxevent_log);
ACMD(do_oxevent_get_attender);

ACMD(do_effect);
ACMD(do_threeway_war_info );
ACMD(do_threeway_war_myinfo );
//
//±ºÁÖ Àü¿ë±â´É
ACMD(do_monarch_warpto);
ACMD(do_monarch_transfer);
ACMD(do_monarch_info);
ACMD(do_elect);
ACMD(do_monarch_tax);
ACMD(do_monarch_mob);
ACMD(do_monarch_notice);

//±ºÁÖ °ü¸® ±â´É
ACMD(do_rmcandidacy);
ACMD(do_setmonarch);
ACMD(do_rmmonarch);

ACMD(do_hair);
//gift notify quest command
ACMD(do_gift);
// Å¥ºê°ü·Ã
ACMD(do_inventory);
ACMD(do_cube);
ACMD(do_cards);
// °ø¼ºÀü
ACMD(do_siege);
ACMD(do_temp);
ACMD(do_frog);

ACMD(do_check_monarch_money);

ACMD(do_reset_subskill );
ACMD(do_flush);

ACMD(do_eclipse);
ACMD(do_weeklyevent);

ACMD(do_event_helper);

ACMD(do_in_game_mall);

ACMD(do_get_mob_count);

ACMD(do_dice);
ACMD(do_special_item);

ACMD(do_click_mall);
ACMD(do_click_safebox);
ACMD(do_click_town);
ACMD(do_item_game_start);
ACMD(do_item_game_start_bonus);

ACMD(do_ride);
ACMD(do_get_item_id_list);
ACMD(do_set_socket);
#ifdef __AUCTION__
// temp_auction ÀÓ½Ã
ACMD(do_get_auction_list);
ACMD (do_get_my_auction_list);
ACMD (do_get_my_purchase_list);
ACMD(do_get_item_id_list);
ACMD(do_enroll_auction);
ACMD (do_auction_bid);
ACMD (do_auction_impur);
ACMD (do_enroll_wish);
ACMD (do_enroll_sale);

ACMD (do_get_auctioned_item);
ACMD (do_buy_sold_item);
ACMD (do_cancel_auction);
ACMD (do_cancel_wish);
ACMD (do_cancel_sale);

ACMD (do_rebid);
ACMD (do_bid_cancel);
#endif
// ÄÚ½ºÃõ »óź¸±â ¹× ¹ş±â
ACMD(do_costume);
ACMD(do_set_stat);

// ¹«Àû
ACMD (do_can_dead);

ACMD (do_full_set);
// Á÷±º°ú ·¹º§¿¡ µû¸¥ ÃÖ°í ¾ÆÀÌÅÛ
ACMD (do_item_full_set);
// Á÷±º¿¡ µû¸¥ ÃÖ°í ¿É¼ÇÀÇ ¼Ó¼º ¼ÂÆÃ
ACMD (do_attr_full_set);
// ¸ğµç ½ºÅ³ ¸¶½ºÅÍ
ACMD (do_all_skill_master);
// ¾ÆÀÌÅÛ Âø¿ë. iconÀÌ ¾ø¾î Ŭ¶ó¿¡¼ È®ÀÎ ÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛ Âø¿ëÀ» À§ÇØ ¸¸µê.
ACMD (do_use_item);
ACMD (do_dragon_soul);
ACMD (do_ds_list);
ACMD (do_clear_affect);
ACMD (do_uzaktantic);
ACMD (do_uzakmarket);
ACMD (do_uzaksatici);
ACMD (do_weapon_rarity);
ACMD(do_search_cofres);
ACMD(do_open_offline_shop);
ACMD(do_kick_offline_shop);
ACMD(do_search_shop);
ACMD(do_name_offline_shop);

struct command_info cmd_info[] =
{
    { "!RESERVED!",    NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    }, /* ¹İµå½Ã ÀÌ °ÍÀÌ Ã³À½À̾î¾ß ÇÑ´Ù. */
    { "who",        do_who,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
#ifdef ENABLE_POLY_SHOP
    { "buy_marble_item", do_buy_marble, 0, POS_DEAD, GM_PLAYER },
#endif
#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
    { "remove_polymorph",    do_remove_polymorph,    0,        POS_DEAD,    GM_PLAYER    },
#endif
    { "war",        do_war,            0,            POS_DEAD,    GM_PLAYER    },
    { "warp",        do_warp,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "user",        do_user,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "notice",        do_notice,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "notice_map",    do_map_notice,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "big_notice",    do_big_notice,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "bt_text",    do_broadcast_big_notice,0,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "nowar",        do_nowar,        0,            POS_DEAD,    GM_PLAYER    },
    { "purge",        do_purge,        0,            POS_DEAD,    GM_WIZARD    },
    { "weaken",        do_weaken,        0,            POS_DEAD,    GM_GOD        },
    { "dc",        do_disconnect,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "transfer",    do_transfer,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "goto",        do_goto,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "level",        do_level,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "eventflag",    do_event_flag,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "geteventflag",    do_get_event_flag,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "item",        do_item,        0,            POS_DEAD,    GM_GOD        },

    { "mob",        do_mob,            0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mob_ld",        do_mob_ld,            0,            POS_DEAD,    GM_HIGH_WIZARD    }, /* ¸÷ÀÇ À§Ä¡¿Í ¹æÇâÀ» ¼³Á¤ÇØ ¼Òȯ /mob_ld vnum x y dir */
    { "ma",        do_mob_aggresive,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mc",        do_mob_coward,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mm",        do_mob_map,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "kill",        do_kill,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "ipurge",        do_item_purge,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "group",        do_group,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "grrandom",    do_group_random,    0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "set",        do_set,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "reset",        do_reset,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "greset",        do_greset,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "advance",    do_advance,        0,            POS_DEAD,    GM_GOD        },
    { "book",        do_book,        0,            POS_DEAD,    GM_IMPLEMENTOR  },

    { "console",    do_console,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "shutdow",    do_inputall,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "shutdown",    do_shutdown,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "stat",        do_stat,        0,            POS_DEAD,    GM_PLAYER    },
    { "stat-",        do_stat_minus,        0,            POS_DEAD,    GM_PLAYER    },
    { "stat_reset",    do_stat_reset,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "state",        do_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    // ADD_COMMAND_SLOW_STUN
    { "stun",        do_stun,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "slow",        do_slow,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    {"event_new",    event_new,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    {"event_aciyom",    event_aciyom,    0,        POS_DEAD,    GM_PLAYER        },
    // END_OF_ADD_COMMAND_SLOW_STUN

    { "respawn",    do_respawn,        0,            POS_DEAD,    GM_WIZARD    },

    { "makeguild",    do_makeguild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "deleteguild",    do_deleteguild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "mount",        do_mount,        0,            POS_MOUNTING,    GM_PLAYER    },
    { "restart_here",    do_restart,        SCMD_RESTART_HERE,    POS_DEAD,    GM_PLAYER    },
    { "restart_town",    do_restart,        SCMD_RESTART_TOWN,    POS_DEAD,    GM_PLAYER    },
    { "phase_selec",    do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "phase_select",    do_cmd,            SCMD_PHASE_SELECT,    POS_DEAD,    GM_PLAYER    },
    { "qui",        do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "quit",        do_cmd,            SCMD_QUIT,        POS_DEAD,    GM_PLAYER    },
    { "logou",        do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "logout",        do_cmd,            SCMD_LOGOUT,        POS_DEAD,    GM_PLAYER    },
    { "skillup",    do_skillup,        0,            POS_DEAD,    GM_PLAYER    },
    { "gskillup",    do_guildskillup,    0,            POS_DEAD,    GM_PLAYER    },
    { "pvp",        do_pvp,            0,            POS_DEAD,    GM_PLAYER    },
    { "safebox",    do_safebox_size,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "safebox_close",    do_safebox_close,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_passwor",do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_password",do_safebox_password,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_change_passwor", do_inputall,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_change_password", do_safebox_change_password,    0,    POS_DEAD,    GM_PLAYER    },
    { "mall_passwor",    do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "mall_password",    do_mall_password,    0,            POS_DEAD,    GM_PLAYER    },
    { "mall_close",    do_mall_close,        0,            POS_DEAD,    GM_PLAYER    },

    // Group Command
    { "ungroup",    do_ungroup,        0,            POS_DEAD,    GM_PLAYER    },

    // REFINE_ROD_HACK_BUG_FIX
    { "refine_rod",    do_refine_rod,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    // END_OF_REFINE_ROD_HACK_BUG_FIX

    // REFINE_PICK
    { "refine_pick",    do_refine_pick,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "max_pick",    do_max_pick,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    // END_OF_REFINE_PICK

    { "fish_simul",    do_fishing_simul,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "invisible",    do_invisibility,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "qf",        do_qf,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "clear_quest",    do_clear_quest,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "close_shop",    do_close_shop,        0,            POS_DEAD,    GM_PLAYER    },

    { "set_walk_mode",    do_set_walk_mode,    0,            POS_DEAD,    GM_PLAYER    },
    { "set_run_mode",    do_set_run_mode,    0,            POS_DEAD,    GM_PLAYER    },
    { "setjob",do_set_skill_group,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "setskill",    do_setskill,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setskillother",    do_setskillother,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "setskillpoint",  do_set_skill_point,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "reload",        do_reload,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "cooltime",    do_cooltime,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "gwlist",        do_gwlist,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gwstop",        do_stop_guild_war,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gwcancel",    do_cancel_guild_war, 0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gstate",        do_guild_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "pkmode",        do_pkmode,        0,            POS_DEAD,    GM_PLAYER    },
    { "messenger_auth",    do_messenger_auth,    0,            POS_DEAD,    GM_PLAYER    },

    { "getqf",        do_getqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setqf",        do_setqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "delqf",        do_delqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "set_state",    do_set_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "·Î±×¸¦º¸¿©Áà",    do_detaillog,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "¸ó½ºÅͺ¸¿©Áà",    do_monsterlog,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "detaillog",    do_detaillog,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "monsterlog",    do_monsterlog,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "forgetme",    do_forgetme,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "aggregate",    do_aggregate,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "attract_ranger",    do_attract_ranger,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "pull_monster",    do_pull_monster,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setblockmode",    do_setblockmode,    0,            POS_DEAD,    GM_PLAYER    },
    { "polymorph",    do_polymorph,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "polyitem",    do_polymorph_item,    0,            POS_DEAD,    GM_HIGH_WIZARD },
    { "priv_empire",    do_priv_empire,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "priv_guild",    do_priv_guild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mount_test",    do_mount_test,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "unmount",    do_unmount,        0,            POS_DEAD,    GM_PLAYER    },
    { "private",    do_private,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "party_request",    do_party_request,    0,            POS_DEAD,    GM_PLAYER    },
    { "party_request_accept", do_party_request_accept,0,        POS_DEAD,    GM_PLAYER    },
    { "party_request_deny", do_party_request_deny,0,            POS_DEAD,    GM_PLAYER    },
    { "observer",    do_observer,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "observer_exit",    do_observer_exit,    0,            POS_DEAD,    GM_PLAYER    },
    { "socketitem",    do_socket_item,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "saveati",    do_save_attribute_to_image, 0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "xmas_boom",    do_xmas,        SCMD_XMAS_BOOM,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_snow",    do_xmas,        SCMD_XMAS_SNOW,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_santa",    do_xmas,        SCMD_XMAS_SANTA,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_muzik",    do_xmas,        SCMD_XMAS_MUZIK,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "view_equip",    do_view_equip,        0,            POS_DEAD,    GM_PLAYER       },
    { "jy",                do_block_chat,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    // BLOCK_CHAT
    { "vote_block_chat", do_vote_block_chat,        0,            POS_DEAD,    GM_PLAYER    },
    { "block_chat",        do_block_chat,        0,            POS_DEAD,    GM_PLAYER    },
    { "block_chat_list",do_block_chat_list,    0,            POS_DEAD,    GM_PLAYER    },
    { "ban", do_ban, 0, POS_DEAD, GM_IMPLEMENTOR },
    { "sban", do_sban, 0, POS_DEAD, GM_IMPLEMENTOR },
    // END_OF_BLOCK_CHAT

    { "build",        do_build,        0,        POS_DEAD,    GM_PLAYER    },
    { "clear_land", do_clear_land,    0,        POS_DEAD,    GM_HIGH_WIZARD    },

    { "affect_remove",    do_affect_remove,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "horse_state",    do_horse_state,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_level",    do_horse_level,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_ride",    do_horse_ride,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "ruhoku",    do_ruhoku,    0,    POS_DEAD,    GM_PLAYER    },
    { "horse_summon",    do_horse_summon,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_unsummon",    do_horse_unsummon,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_set_stat", do_horse_set_stat,    0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "pcbang_update",     do_pcbang_update,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "pcbang_check",     do_pcbang_check,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "emotion_allow",    do_emotion_allow,    0,            POS_FIGHTING,    GM_PLAYER    },
    { "kiss",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "slap",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "french_kiss",    do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "clap",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "cheer1",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "cheer2",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },

    // DANCE
    { "dance1",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance2",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance3",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance4",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance5",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance6",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    // END_OF_DANCE

    { "congratulation",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "forgive",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "angry",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "attractive",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "sad",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "shy",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "cheerup",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "banter",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "joy",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },


    { "change_attr",    do_change_attr,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "add_attr",    do_add_attr,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "add_socket",    do_add_socket,        0,            POS_DEAD,    GM_IMPLEMENTOR    },

    { "user_horse_ride",    do_user_horse_ride,        0,        POS_FISHING,    GM_PLAYER    },
    { "user_horse_back",    do_user_horse_back,        0,        POS_FISHING,    GM_PLAYER    },
    { "user_horse_feed",    do_user_horse_feed,        0,        POS_FISHING,    GM_PLAYER    },

    { "show_arena_list",    do_show_arena_list,        0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "end_all_duel",        do_end_all_duel,        0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "end_duel",            do_end_duel,            0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "duel",                do_duel,                0,        POS_DEAD,    GM_LOW_WIZARD    },

    { "con+",            do_stat_plus_amount,    POINT_HT,    POS_DEAD,    GM_LOW_WIZARD    },
    { "int+",            do_stat_plus_amount,    POINT_IQ,    POS_DEAD,    GM_LOW_WIZARD    },
    { "str+",            do_stat_plus_amount,    POINT_ST,    POS_DEAD,    GM_LOW_WIZARD    },
    { "dex+",            do_stat_plus_amount,    POINT_DX,    POS_DEAD,    GM_LOW_WIZARD    },

    { "break_marriage",    do_break_marriage,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "show_quiz",            do_oxevent_show_quiz,    0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "log_oxevent",        do_oxevent_log,            0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "get_oxevent_att",    do_oxevent_get_attender,0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "effect",                do_effect,                0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "threeway_info",        do_threeway_war_info,    0,    POS_DEAD,    GM_LOW_WIZARD},
    { "threeway_myinfo",    do_threeway_war_myinfo, 0,    POS_DEAD,    GM_LOW_WIZARD},
    { "mto",                do_monarch_warpto,        0,     POS_DEAD,    GM_PLAYER},
    { "mtr",                do_monarch_transfer,    0,    POS_DEAD,    GM_PLAYER},
    { "minfo",        do_monarch_info,        0,  POS_DEAD,   GM_PLAYER},   
    { "mtax",            do_monarch_tax,            0,    POS_DEAD,    GM_PLAYER},
    { "mmob",            do_monarch_mob,            0,     POS_DEAD,    GM_PLAYER},
    { "elect",                do_elect,                0,    POS_DEAD,    GM_HIGH_WIZARD},
    { "rmcandidacy",        do_rmcandidacy,            0,     POS_DEAD,    GM_LOW_WIZARD},
    { "setmonarch",            do_setmonarch,            0,     POS_DEAD,    GM_LOW_WIZARD},
    { "rmmonarch",            do_rmmonarch,            0,     POS_DEAD,     GM_LOW_WIZARD},
    { "hair",                do_hair,                0,    POS_DEAD,    GM_PLAYER    },
    { "inventory",            do_inventory,            0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "cube",                do_cube,                0,    POS_DEAD,    GM_PLAYER    },
    { "cards",                do_cards,                0,    POS_DEAD,    GM_PLAYER    },
    { "siege",                do_siege,                0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "temp",                do_temp,                0,    POS_DEAD,    GM_IMPLEMENTOR    },
    { "frog",                do_frog,                0,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "check_mmoney",        do_check_monarch_money,    0,    POS_DEAD,    GM_IMPLEMENTOR    },
    { "reset_subskill",        do_reset_subskill,        0,    POS_DEAD,    GM_HIGH_WIZARD },
    { "flush",                do_flush,                0,    POS_DEAD,    GM_IMPLEMENTOR },
    { "gift",                do_gift,                0,  POS_DEAD,   GM_PLAYER    },    //gift

    { "mnotice",            do_monarch_notice,        0,    POS_DEAD,    GM_PLAYER    },
    
    { "eclipse",            do_eclipse,                0,    POS_DEAD,    GM_HIGH_WIZARD    },

    { "weeklyevent",        do_weeklyevent,            0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "eventhelper",        do_event_helper,        0,    POS_DEAD,    GM_HIGH_WIZARD    },

    { "in_game_mall",        do_in_game_mall,        0,    POS_DEAD,    GM_PLAYER    },

    { "get_mob_count",        do_get_mob_count,        0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "dice",                do_dice,                0,    POS_DEAD,    GM_PLAYER        },
    { "ÁÖ»çÀ§",                do_dice,                0,    POS_DEAD,    GM_PLAYER        },
    { "special_item",            do_special_item,    0,    POS_DEAD,    GM_IMPLEMENTOR        },

    { "click_safebox",        do_click_safebox,        0,    POS_DEAD,    GM_PLAYER        },
    { "click_mall",            do_click_mall,            0,    POS_DEAD,    GM_PLAYER        },
    { "click_town",            do_click_town,            0,    POS_DEAD,    GM_PLAYER        },
    { "item_game_start",    do_item_game_start,            0,    POS_DEAD,    GM_PLAYER        },
    { "item_game_start_bonus",    do_item_game_start_bonus,        0,    POS_DEAD,    GM_PLAYER        },
    
    { "ride",                do_ride,                0,    POS_DEAD,    GM_PLAYER    },

    { "item_id_list",    do_get_item_id_list,    0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "set_socket",        do_set_socket,            0,    POS_DEAD,    GM_LOW_WIZARD    },
#ifdef __AUCTION__
    // auction ÀÓ½Ã
    { "auction_list",    do_get_auction_list,    0,    POS_DEAD,    GM_PLAYER    },
    { "my_auction_list", do_get_my_auction_list, 0, POS_DEAD,    GM_PLAYER    },
    { "my_purchase_list", do_get_my_purchase_list, 0, POS_DEAD,    GM_PLAYER    },


    { "enroll_auction",        do_enroll_auction,         0,    POS_DEAD,    GM_PLAYER    },
    { "bid", do_auction_bid,     0,    POS_DEAD,    GM_PLAYER    },
    { "impur", do_auction_impur,     0,    POS_DEAD,    GM_PLAYER    },
    { "enroll_wish", do_enroll_wish,     0,    POS_DEAD,    GM_PLAYER    },
    { "enroll_sale", do_enroll_sale,     0,    POS_DEAD,    GM_PLAYER    },
    { "get_auctioned_item", do_get_auctioned_item,     0,    POS_DEAD,    GM_PLAYER    },
    { "buy_sold_item", do_buy_sold_item,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_auction", do_cancel_auction,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_wish", do_cancel_wish,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_sale", do_cancel_sale,     0,    POS_DEAD,    GM_PLAYER    },
    { "rebid", do_rebid,     0,    POS_DEAD,    GM_PLAYER    },
    { "bid_cancel", do_bid_cancel,     0,    POS_DEAD,    GM_PLAYER    },
    
#endif
    { "costume",            do_costume,             0,    POS_DEAD,    GM_PLAYER    },

    { "tcon",            do_set_stat,    POINT_HT,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tint",            do_set_stat,    POINT_IQ,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tstr",            do_set_stat,    POINT_ST,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tdex",            do_set_stat,    POINT_DX,    POS_DEAD,    GM_LOW_WIZARD    },

    { "cannot_dead",            do_can_dead,    1,    POS_DEAD,        GM_LOW_WIZARD},
    { "can_dead",                do_can_dead,    0,    POS_DEAD,        GM_LOW_WIZARD},

    { "full_set",    do_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "item_full_set",    do_item_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "attr_full_set",    do_attr_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "all_skill_master",    do_all_skill_master,    0,    POS_DEAD,    GM_LOW_WIZARD},
    { "use_item",        do_use_item,    0, POS_DEAD,        GM_LOW_WIZARD},

    { "dragon_soul",                do_dragon_soul,                0,    POS_DEAD,    GM_PLAYER    },
    { "ds_list",                do_ds_list,                0,    POS_DEAD,    GM_PLAYER    },
    { "do_clear_affect", do_clear_affect,     0, POS_DEAD,        GM_LOW_WIZARD},
#ifdef ENABLE_OFFLINE_SHOP_SYSTEM
    { "open_offlineshop", do_open_offline_shop, 0, POS_DEAD, GM_PLAYER        },
    { "kick_offlineshop", do_kick_offline_shop, 0, POS_DEAD, GM_IMPLEMENTOR },
#endif
    { "uzaktantic",            do_uzaktantic,            0,    POS_DEAD,    GM_PLAYER },
    { "uzakmarket",            do_uzakmarket,            0,    POS_DEAD,    GM_PLAYER },
    { "uzaksatici",            do_uzaksatici,            0,    POS_DEAD,    GM_PLAYER },
    { "weapon_rarity",            do_weapon_rarity,            0,    POS_DEAD,    GM_LOW_WIZARD },
    { "search_cofres",            do_search_cofres,            0,    POS_DEAD,    GM_PLAYER    },
    { "search_shop",                do_search_shop,            0,            POS_DEAD,        GM_PLAYER       },
    { "name_offlineshop",             do_name_offline_shop,   0,             POS_DEAD,         GM_IMPLEMENTOR },
    { "ajanikov",    do_ajanikov,        0,            POS_DEAD,    GM_PLAYER    },
    { "bkoku",    do_bkoku,    0,    POS_DEAD,    GM_PLAYER    },

    { "\n",        NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    }  /* ¹İµå½Ã ÀÌ °ÍÀÌ ¸¶Áö¸·À̾î¾ß ÇÑ´Ù. */
};

void interpreter_set_privilege(const char *cmd, int lvl)
{
    int i;

    for (i = 0; *cmd_info[i].command != '\n'; ++i)
    {
        if (!str_cmp(cmd, cmd_info[i].command))
        {
            cmd_info[i].gm_level = lvl;
            sys_log(0, "Setting command privilege: %s -> %d", cmd, lvl);
            break;
        }
    }
}

void double_dollar(const char *src, size_t src_len, char *dest, size_t dest_len)
{       
    const char * tmp = src;
    size_t cur_len = 0;

    // \0 ³ÖÀ» ÀÚ¸® È®º¸
    dest_len -= 1;

    while (src_len-- && *tmp)
    {
        if (*tmp == '$')
        {
            if (cur_len + 1 >= dest_len)
                break;

            *(dest++) = '$';
            *(dest++) = *(tmp++);
            cur_len += 2;
        }
        else
        {
            if (cur_len >= dest_len)
                break;

            *(dest++) = *(tmp++);
            cur_len += 1;
        }
    }

    *dest = '\0';
}

void interpret_command(LPCHARACTER ch, const char * argument, size_t len)
{
    if (NULL == ch)
    {
        sys_err ("NULL CHRACTER");
        return ;
    }

    char cmd[128 + 1];  // buffer overflow ¹®Á¦°¡ »ı±âÁö ¾Êµµ·Ï ÀϺη¯ ±æÀ̸¦ ª°Ô ÀâÀ½
    char new_line[256 + 1];
    const char * line;
    int icmd;

    if (len == 0 || !*argument)
        return;

    double_dollar(argument, len, new_line, sizeof(new_line));

    size_t cmdlen;
    line = first_cmd(new_line, cmd, sizeof(cmd), &cmdlen);

    for (icmd = 1; *cmd_info[icmd].command != '\n'; ++icmd)
    {
        if (cmd_info[icmd].command_pointer == do_cmd)
        {
            if (!strcmp(cmd_info[icmd].command, cmd)) // do_cmd´Â ¸ğµç ¸í·É¾î¸¦ ÃÄ¾ß ÇÒ ¼ö ÀÖ´Ù.
                break;
        }
        else if (!strncmp(cmd_info[icmd].command, cmd, cmdlen))
            break;
    }

    if (ch->GetPosition() < cmd_info[icmd].minimum_position)
    {
        switch (ch->GetPosition())
        {
            case POS_MOUNTING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ź »óÅ¿¡¼´Â ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                break;

            case POS_DEAD:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾²·¯Áø »óÅ¿¡¼´Â ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                break;

            case POS_SLEEPING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("²Ş¼Ó¿¡¼ ¾î¶»°Ô¿ä?"));
                break;

            case POS_RESTING:
            case POS_SITTING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸ÕÀú ÀÏ¾î ³ª¼¼¿ä."));
                break;
                /*
                   case POS_FIGHTING:
                   ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸ñ¼ûÀ» °É°í ÀüÅõ Áß ÀÔ´Ï´Ù. ÁıÁß Çϼ¼¿ä."));
                   break;
                 */
            default:
                sys_err("unknown position %d", ch->GetPosition());
                break;
        }

        return;
    }

    if (*cmd_info[icmd].command == '\n')
    {   
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±×·± ¸í·É¾î´Â ¾ø½À´Ï´Ù"));
        return;
    }

    if (cmd_info[icmd].gm_level && cmd_info[icmd].gm_level > ch->GetGMLevel())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±×·± ¸í·É¾î´Â ¾ø½À´Ï´Ù"));
        return;
    }

    if (strncmp("phase", cmd_info[icmd].command, 5) != 0) // È÷µç ¸í·É¾î ó¸®
        sys_log(0, "COMMAND: %s: %s", ch->GetName(), cmd_info[icmd].command);

    ((*cmd_info[icmd].command_pointer) (ch, line, icmd, cmd_info[icmd].subcmd));

    if (ch->GetGMLevel() >= GM_LOW_WIZARD)
    {
        if (cmd_info[icmd].gm_level >= GM_LOW_WIZARD)
        {
            if (LC_IsEurope() == true || /*LC_IsNewCIBN() == true || */LC_IsCanada() == true || LC_IsBrazil() == true)
            {
                char buf[1024];
                snprintf( buf, sizeof(buf), "%s", argument );

                LogManager::instance().GMCommandLog(ch->GetPlayerID(), ch->GetName(), ch->GetDesc()->GetHostName(), g_bChannel, buf);
            }
        }
    }
}

Kod:
#include "stdafx.h"
#ifdef __FreeBSD__
#include <md5.h>
#else
#include "../../libthecore/include/xmd5.h"
#endif

#include "utils.h"
#include "config.h"
#include "desc_client.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "motion.h"
#include "packet.h"
#include "affect.h"
#include "pvp.h"
#include "start_position.h"
#include "party.h"
#include "guild_manager.h"
#include "p2p.h"
#include "dungeon.h"
#include "messenger_manager.h"
#include "war_map.h"
#include "questmanager.h"
#include "item_manager.h"
#include "monarch.h"
#include "mob_manager.h"
#include "dev_log.h"
#include "item.h"
#include "arena.h"
#include "buffer_manager.h"
#include "unique_item.h"
#include "threeway_war.h"
#include "log.h"
#include "../../common/VnumHelper.h"
#ifdef __AUCTION__
#include "auction_manager.h"
#endif
#include "offlineshop_manager.h"
#include "target.h"

extern int g_server_id;

extern int g_nPortalLimitTime;


ACMD(do_ajanikov)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Gereksiz islem yapmayin.");
        return;
    }
    if (!ch->GetWarMap())
        return;

    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
    if (!tch)
        return;
    if (!tch->IsPC())
        return;   
    if (ch == tch)
        return;
    if (!tch->GetGuild())
        return;   
    if (!ch->GetGuild())
        return;
    if (tch->GetGuild()->GetID() != ch->GetGuild()->GetID())
        return;
    CGuild* loncam = CGuildManager::instance().FindGuild(ch->GetGuild()->GetID());
    CGuild* loncan = CGuildManager::instance().FindGuild(tch->GetGuild()->GetID());
    if ((loncam == NULL) || (loncan == NULL))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Loncan yok");
    }
    else
    {
        if (loncan->GetMasterPID() == ch->GetPlayerID())
        {
            if (loncam->RequestRemoveMember(tch->GetPlayerID()))
            {
                ch->ChatPacket(CHAT_TYPE_GUILD, "%s ajan olarak secilip kovuldu.", tch->GetName());
                tch->GoHome();
                return;
            }
            else
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Hata.");
                return;
            }
        }
        else
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Lonca Lideri Olman Gerekiyor");
            return;
        }
    }
    return;
}

ACMD(do_user_horse_ride)
{
    int arrayMapIndexBlocked[] = {
        113, 1100000, 1120000, 72, 200, 182, 183, 31, 48, // map index kodu
    };

    for (int idxMapIndex = 0; idxMapIndex < _countof(arrayMapIndexBlocked); idxMapIndex++)
    {
        if (ch->GetMapIndex() == arrayMapIndexBlocked[idxMapIndex])
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Bu haritada binek kullan©¥ma Kapal©¥d©¥r..");
            return;
        }
    }
    
    if (ch->IsObserverMode())
        return;

    if (ch->IsDead() || ch->IsStun())
        return;

    if (ch->IsHorseRiding() == false)
    {
        // ¸»ÀÌ ¾Æ´Ñ ´Ù¸¥Å»°ÍÀ» Ÿ°íÀÖ´Ù.
        if (ch->GetMountVnum())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì Å»°ÍÀ» ÀÌ¿ëÁßÀÔ´Ï´Ù."));
            return;
        }

        if (ch->GetHorse() == NULL)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
            return;
        }

        ch->StartRiding();
    }
    else
    {
        ch->StopRiding();
    }
}

ACMD(do_user_horse_back)
{
    if (ch->GetHorse() != NULL)
    {
        ch->HorseSummon(false);
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» µ¹·Áº¸³Â½À´Ï´Ù."));
    }
    else if (ch->IsHorseRiding() == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»¿¡¼ ¸ÕÀú ³»·Á¾ß ÇÕ´Ï´Ù."));
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
    }
}

ACMD(do_user_horse_feed)
{
    // °³ÀλóÁ¡À» ¿¬ »óÅ¿¡¼´Â ¸» ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø´Ù.
    if (ch->GetMyShop())
        return;

    if (ch->GetHorse() == NULL)
    {
        if (ch->IsHorseRiding() == false)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
        else
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼´Â ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    DWORD dwFood = ch->GetHorseGrade() + 50054 - 1;

    if (ch->CountSpecifyItem(dwFood) > 0)
    {
        ch->RemoveSpecifyItem(dwFood, 1);
        ch->FeedHorse();
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»¿¡°Ô %s%s ÁÖ¾ú½À´Ï´Ù."),
                ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName,
                g_iUseLocale ? "" : under_han(ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName) ? LC_TEXT("À»") : LC_TEXT("¸¦"));
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¾ÆÀÌÅÛÀÌ ÇÊ¿äÇÕ´Ï´Ù"), ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName);
    }
}

#define MAX_REASON_LEN        128

EVENTINFO(TimedEventInfo)
{
    DynamicCharacterPtr ch;
    int        subcmd;
    int             left_second;
    char        szReason[MAX_REASON_LEN];

    TimedEventInfo()
    : ch()
    , subcmd( 0 )
    , left_second( 0 )
    {
        ::memset( szReason, 0, MAX_REASON_LEN );
    }
};

struct SendDisconnectFunc
{
    void operator () (LPDESC d)
    {
        if (d->GetCharacter())
        {
            if (d->GetCharacter()->GetGMLevel() == GM_PLAYER)
                d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "quit Shutdown(SendDisconnectFunc)");
        }
    }
};

struct DisconnectFunc
{
    void operator () (LPDESC d)
    {
        if (d->GetType() == DESC_TYPE_CONNECTOR)
            return;

        if (d->IsPhase(PHASE_P2P))
            return;

        if (d->GetCharacter())
            d->GetCharacter()->Disconnect("Shutdown(DisconnectFunc)");

        d->SetPhase(PHASE_CLOSE);
    }
};

EVENTINFO(shutdown_event_data)
{
    int seconds;

    shutdown_event_data()
    : seconds( 0 )
    {
    }
};

EVENTFUNC(shutdown_event)
{
    shutdown_event_data* info = dynamic_cast<shutdown_event_data*>( event->info );

    if ( info == NULL )
    {
        sys_err( "shutdown_event> <Factor> Null pointer" );
        return 0;
    }

    int * pSec = & (info->seconds);

    if (*pSec < 0)
    {
        sys_log(0, "shutdown_event sec %d", *pSec);

        if (--*pSec == -10)
        {
            const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
            std::for_each(c_set_desc.begin(), c_set_desc.end(), DisconnectFunc());
            return passes_per_sec;
        }
        else if (*pSec < -10)
            return 0;

        return passes_per_sec;
    }
    else if (*pSec == 0)
    {
        const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
        std::for_each(c_set_desc.begin(), c_set_desc.end(), SendDisconnectFunc());
        g_bNoMoreClient = true;
        --*pSec;
        return passes_per_sec;
    }
    else
    {
        char buf[64];
        snprintf(buf, sizeof(buf), LC_TEXT("¼Ë´Ù¿îÀÌ %dÃÊ ³²¾Ò½À´Ï´Ù."), *pSec);
        SendNotice(buf);

        --*pSec;
        return passes_per_sec;
    }
}

void Shutdown(int iSec)
{
    if (g_bNoMoreClient)
    {
        thecore_shutdown();
        return;
    }

    CWarMapManager::instance().OnShutdown();

    char buf[64];
    snprintf(buf, sizeof(buf), LC_TEXT("%dÃÊ ÈÄ °ÔÀÓÀÌ ¼Ë´Ù¿î µË´Ï´Ù."), iSec);

    SendNotice(buf);

    shutdown_event_data* info = AllocEventInfo<shutdown_event_data>();
    info->seconds = iSec;

    event_create(shutdown_event, info, 1);
}

ACMD(do_shutdown)
{
    if (NULL == ch)
    {
        sys_err("Accept shutdown command from %s.", ch->GetName());
    }
    TPacketGGShutdown p;
    p.bHeader = HEADER_GG_SHUTDOWN;
    P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown));

    Shutdown(10);
}

EVENTFUNC(timed_event)
{
    TimedEventInfo * info = dynamic_cast<TimedEventInfo *>( event->info );
    
    if ( info == NULL )
    {
        sys_err( "timed_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER    ch = info->ch;
    if (ch == NULL) { // <Factor>
        return 0;
    }
    LPDESC d = ch->GetDesc();

    if (info->left_second <= 0)
    {
        ch->m_pkTimedEvent = NULL;

        if (true == LC_IsEurope() || true == LC_IsYMIR() || true == LC_IsKorea())
        {
            switch (info->subcmd)
            {
                case SCMD_LOGOUT:
                case SCMD_QUIT:
                case SCMD_PHASE_SELECT:
                    {
                        TPacketNeedLoginLogInfo acc_info;
                        acc_info.dwPlayerID = ch->GetDesc()->GetAccountTable().id;

                        db_clientdesc->DBPacket( HEADER_GD_VALID_LOGOUT, 0, &acc_info, sizeof(acc_info) );

                        LogManager::instance().DetailLoginLog( false, ch );
                    }
                    break;
            }
        }

        switch (info->subcmd)
        {
            case SCMD_LOGOUT:
                if (d)
                    d->SetPhase(PHASE_CLOSE);
                break;

            case SCMD_QUIT:
                ch->ChatPacket(CHAT_TYPE_COMMAND, "quit");
                break;

            case SCMD_PHASE_SELECT:
                {
                    ch->Disconnect("timed_event - SCMD_PHASE_SELECT");

                    if (d)
                    {
                        d->SetPhase(PHASE_SELECT);
                    }
                }
                break;
        }

        return 0;
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dÃÊ ³²¾Ò½À´Ï´Ù."), info->left_second);
        --info->left_second;
    }

    return PASSES_PER_SEC(1);
}

ACMD(do_cmd)
{
    /* RECALL_DELAY
       if (ch->m_pkRecallEvent != NULL)
       {
       ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
       event_cancel(&ch->m_pkRecallEvent);
       return;
       }
    // END_OF_RECALL_DELAY */

    if (ch->m_pkTimedEvent)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
        event_cancel(&ch->m_pkTimedEvent);
        return;
    }

    switch (subcmd)
    {
        case SCMD_LOGOUT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·Î±×ÀΠȸéÀ¸·Î µ¹¾Æ °©´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;

        case SCMD_QUIT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ÔÀÓÀ» Á¾·á ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;

        case SCMD_PHASE_SELECT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ij¸¯Å͸¦ Àüȯ ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;
    }

    int nExitLimitTime = 10;

    if (ch->IsHack(false, true, nExitLimitTime) &&
        false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()) &&
           (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
    {
        return;
    }
    
    switch (subcmd)
    {
        case SCMD_LOGOUT:
        case SCMD_QUIT:
        case SCMD_PHASE_SELECT:
            {
                TimedEventInfo* info = AllocEventInfo<TimedEventInfo>();

                {
                    if (ch->IsPosition(POS_FIGHTING))
                        info->left_second = 10;
                    else
                        info->left_second = 3;
                }

                info->ch        = ch;
                info->subcmd        = subcmd;
                strlcpy(info->szReason, argument, sizeof(info->szReason));

                ch->m_pkTimedEvent    = event_create(timed_event, info, 1);
            }
            break;
    }
}

ACMD(do_mount)
{
    /*
       char            arg1[256];
       struct action_mount_param    param;

    // ÀÌ¹Ì Å¸°í ÀÖÀ¸¸é
    if (ch->GetMountingChr())
    {
    char arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || !*arg2)
    return;

    param.x        = atoi(arg1);
    param.y        = atoi(arg2);
    param.vid    = ch->GetMountingChr()->GetVID();
    param.is_unmount = true;

    float distance = DISTANCE_SQRT(param.x - (DWORD) ch->GetX(), param.y - (DWORD) ch->GetY());

    if (distance > 600.0f)
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´õ °¡±îÀÌ °¡¼ ³»¸®¼¼¿ä."));
    return;
    }

    action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
    return;
    }

    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    return;

    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(atoi(arg1));

    if (!tch->IsNPC() || !tch->IsMountable())
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å±â¿¡´Â Å» ¼ö ¾ø¾î¿ä."));
    return;
    }

    float distance = DISTANCE_SQRT(tch->GetX() - ch->GetX(), tch->GetY() - ch->GetY());

    if (distance > 600.0f)
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´õ °¡±îÀÌ °¡¼ Ÿ¼¼¿ä."));
    return;
    }

    param.vid        = tch->GetVID();
    param.is_unmount    = false;

    action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
     */
}

ACMD(do_fishing)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    ch->SetRotation(atof(arg1));
    ch->fishing();
}

ACMD(do_console)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ConsoleEnable");
}

ACMD(do_restart)
{
    if (false == ch->IsDead())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
        ch->StartRecoveryEvent();
        return;
    }

    if (NULL == ch->m_pkDeadEvent)
        return;

    int iTimeToDead = (event_time(ch->m_pkDeadEvent) / passes_per_sec);

    if (subcmd != SCMD_RESTART_TOWN && (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
    {
        if (!test_server)
        {
            if (ch->IsHack())
            {
                //¼ºÁö ¸ÊÀϰæ¿ì¿¡´Â üũ ÇÏÁö ¾Ê´Â´Ù.
                if (false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
                    return;
                }
            }

            if (iTimeToDead > 170)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - 170);
                return;
            }
        }
    }

    //PREVENT_HACK
    //DESC : â°í, ±³È¯ â ÈÄ Æ÷Å»À» »ç¿ëÇÏ´Â ¹ö±×¿¡ ÀÌ¿ëµÉ¼ö ÀÖ¾î¼
    //        ÄğŸÀÓÀ» Ãß°¡
    if (subcmd == SCMD_RESTART_TOWN)
    {
        if (ch->IsHack())
        {
            //±æµå¸Ê, ¼ºÁö¸Ê¿¡¼´Â üũ ÇÏÁö ¾Ê´Â´Ù.
            if ((!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG) ||
                   false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
                return;
            }
        }

        if (iTimeToDead > 173)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ ¸¶À»¿¡¼ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%d ÃÊ ³²À½)"), iTimeToDead - 173);
            return;
        }
    }
    //END_PREVENT_HACK

    ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");

    ch->GetDesc()->SetPhase(PHASE_GAME);
    ch->SetPosition(POS_STANDING);
    ch->StartRecoveryEvent();

    //FORKED_LOAD
    //DESC: »ï°Å¸® ÀüÅõ½Ã ºÎȰÀ» ÇÒ°æ¿ì ¸ÊÀÇ ÀÔ±¸°¡ ¾Æ´Ñ »ï°Å¸® ÀüÅõÀÇ ½ÃÀÛÁöÁ¡À¸·Î À̵¿ÇÏ°Ô µÈ´Ù.
    if (1 == quest::CQuestManager::instance().GetEventFlag("threeway_war"))
    {
        if (subcmd == SCMD_RESTART_TOWN || subcmd == SCMD_RESTART_HERE)
        {
            if (true == CThreeWayWar::instance().IsThreeWayWarMapIndex(ch->GetMapIndex()) &&
                    false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));

                ch->ReviveInvisible(5);
                ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());

                return;
            }

            //¼ºÁö
            if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                if (CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) <= 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ºÁö¿¡¼ ºÎȰ ±âȸ¸¦ ¸ğµÎ ÀÒ¾ú½À´Ï´Ù! ¸¶À»·Î À̵¿ÇÕ´Ï´Ù!"));
                    ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
                }
                else
                {
                    ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire()));
                }

                ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                ch->ReviveInvisible(5);

                return;
            }
        }
    }
    //END_FORKED_LOAD

    if (ch->GetDungeon())
        ch->GetDungeon()->UseRevive(ch);

    if (ch->GetWarMap() && !ch->IsObserverMode())
    {
        CWarMap * pMap = ch->GetWarMap();
        DWORD dwGuildOpponent = pMap ? pMap->GetGuildOpponent(ch) : 0;

        if (dwGuildOpponent)
        {
            switch (subcmd)
            {
                case SCMD_RESTART_TOWN:
                    sys_log(0, "do_restart: restart town");
                    PIXEL_POSITION pos;

                    if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos))
                        ch->Show(ch->GetMapIndex(), pos.x, pos.y);
                    else
                        ch->ExitToSavedLocation();

                    ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                    ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                    ch->ReviveInvisible(5);
                    break;

                case SCMD_RESTART_HERE:
                    sys_log(0, "do_restart: restart here");
                    ch->RestartAtSamePos();
                    //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
                    ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                    ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                    ch->ReviveInvisible(5);
                    break;
            }

            return;
        }
    }

    switch (subcmd)
    {
        case SCMD_RESTART_TOWN:
            sys_log(0, "do_restart: restart town");
            PIXEL_POSITION pos;

            if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(ch->GetMapIndex(), ch->GetEmpire(), pos))
                ch->WarpSet(pos.x, pos.y);
            else
                ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));

            ch->PointChange(POINT_HP, 50 - ch->GetHP());
            ch->DeathPenalty(1);
            break;

        case SCMD_RESTART_HERE:
            sys_log(0, "do_restart: restart here");
            ch->RestartAtSamePos();
            //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
            ch->PointChange(POINT_HP, 50 - ch->GetHP());
            ch->DeathPenalty(0);
            ch->ReviveInvisible(5);
            break;
    }
}

#define MAX_STAT 90

ACMD(do_stat_reset)
{
    ch->PointChange(POINT_STAT_RESET_COUNT, 12 - ch->GetPoint(POINT_STAT_RESET_COUNT));
}

ACMD(do_stat_minus)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (ch->IsPolymorphed())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0)
        return;

    if (!strcmp(arg1, "st"))
    {
        if (ch->GetRealPoint(POINT_ST) <= JobInitialPoints[ch->GetJob()].st)
            return;

        ch->SetRealPoint(POINT_ST, ch->GetRealPoint(POINT_ST) - 1);
        ch->SetPoint(POINT_ST, ch->GetPoint(POINT_ST) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_ST, 0);
    }
    else if (!strcmp(arg1, "dx"))
    {
        if (ch->GetRealPoint(POINT_DX) <= JobInitialPoints[ch->GetJob()].dx)
            return;

        ch->SetRealPoint(POINT_DX, ch->GetRealPoint(POINT_DX) - 1);
        ch->SetPoint(POINT_DX, ch->GetPoint(POINT_DX) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_DX, 0);
    }
    else if (!strcmp(arg1, "ht"))
    {
        if (ch->GetRealPoint(POINT_HT) <= JobInitialPoints[ch->GetJob()].ht)
            return;

        ch->SetRealPoint(POINT_HT, ch->GetRealPoint(POINT_HT) - 1);
        ch->SetPoint(POINT_HT, ch->GetPoint(POINT_HT) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_HT, 0);
        ch->PointChange(POINT_MAX_HP, 0);
    }
    else if (!strcmp(arg1, "iq"))
    {
        if (ch->GetRealPoint(POINT_IQ) <= JobInitialPoints[ch->GetJob()].iq)
            return;

        ch->SetRealPoint(POINT_IQ, ch->GetRealPoint(POINT_IQ) - 1);
        ch->SetPoint(POINT_IQ, ch->GetPoint(POINT_IQ) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_IQ, 0);
        ch->PointChange(POINT_MAX_SP, 0);
    }
    else
        return;

    ch->PointChange(POINT_STAT, +1);
    ch->PointChange(POINT_STAT_RESET_COUNT, -1);
    ch->ComputePoints();
}



ACMD(do_stat)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (ch->IsPolymorphed())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetPoint(POINT_STAT) <= 0)
        return;

    BYTE idx = 0;
    
    if (!strcmp(arg1, "st"))
        idx = POINT_ST;
    else if (!strcmp(arg1, "dx"))
        idx = POINT_DX;
    else if (!strcmp(arg1, "ht"))
        idx = POINT_HT;
    else if (!strcmp(arg1, "iq"))
        idx = POINT_IQ;
    else
        return;

    if (ch->GetRealPoint(idx) >= MAX_STAT)
        return;

    ch->SetRealPoint(idx, ch->GetRealPoint(idx) + 1);
    ch->SetPoint(idx, ch->GetPoint(idx) + 1);
    ch->ComputePoints();
    ch->PointChange(idx, 0);

    if (idx == POINT_IQ)
    {
        ch->PointChange(POINT_MAX_HP, 0);
    }
    else if (idx == POINT_HT)
    {
        ch->PointChange(POINT_MAX_SP, 0);
    }

    ch->PointChange(POINT_STAT, -1);
    ch->ComputePoints();
}

ACMD(do_pvp)
{
    if (ch->GetArena() != NULL || CArenaManager::instance().IsArenaMap(ch->GetMapIndex()) == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);

    if (!pkVictim)
        return;

    if (pkVictim->IsNPC())
        return;

    if (pkVictim->GetArena() != NULL)
    {
        pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÌ ´ë·ÃÁßÀÔ´Ï´Ù."));
        return;
    }

    CPVPManager::instance().Insert(ch, pkVictim);
}

ACMD(do_guildskillup)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (!ch->GetGuild())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµå¿¡ ¼ÓÇØÀÖÁö ¾Ê½À´Ï´Ù."));
        return;
    }

    CGuild* g = ch->GetGuild();
    TGuildMember* gm = g->GetMember(ch->GetPlayerID());
    if (gm->grade == GUILD_LEADER_GRADE)
    {
        DWORD vnum = 0;
        str_to_number(vnum, arg1);
        g->SkillLevelUp(vnum);
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµå ½ºÅ³ ·¹º§À» º¯°æÇÒ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
    }
}

ACMD(do_skillup)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vnum = 0;
    str_to_number(vnum, arg1);

    if (true == ch->CanUseSkill(vnum))
    {
        ch->SkillLevelUp(vnum);
    }
    else
    {
        switch(vnum)
        {
            case SKILL_HORSE_WILDATTACK:
            case SKILL_HORSE_CHARGE:
            case SKILL_HORSE_ESCAPE:
            case SKILL_HORSE_WILDATTACK_RANGE:

            case SKILL_7_A_ANTI_TANHWAN:
            case SKILL_7_B_ANTI_AMSEOP:
            case SKILL_7_C_ANTI_SWAERYUNG:
            case SKILL_7_D_ANTI_YONGBI:

            case SKILL_8_A_ANTI_GIGONGCHAM:
            case SKILL_8_B_ANTI_YEONSA:
            case SKILL_8_C_ANTI_MAHWAN:
            case SKILL_8_D_ANTI_BYEURAK:

            case SKILL_ADD_HP:
            case SKILL_RESIST_PENETRATE:
                ch->SkillLevelUp(vnum);
                break;
        }
    }
}

//
// @version    05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
//
ACMD(do_safebox_close)
{
    ch->CloseSafebox();
}

//
// @version    05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
//
ACMD(do_safebox_password)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));
    ch->ReqSafeboxLoad(arg1);
}

ACMD(do_safebox_change_password)
{
    char arg1[256];
    char arg2[256];

    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || strlen(arg1)>6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    if (!*arg2 || strlen(arg2)>6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    if (LC_IsBrazil() == true)
    {
        for (int i = 0; i < 6; ++i)
        {
            if (arg2[i] == '\0')
                break;

            if (isalpha(arg2[i]) == false)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> ºñ¹Ğ¹øÈ£´Â ¿µ¹®ÀÚ¸¸ °¡´ÉÇÕ´Ï´Ù."));
                return;
            }
        }
    }

    TSafeboxChangePasswordPacket p;

    p.dwID = ch->GetDesc()->GetAccountTable().id;
    strlcpy(p.szOldPassword, arg1, sizeof(p.szOldPassword));
    strlcpy(p.szNewPassword, arg2, sizeof(p.szNewPassword));

    db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_CHANGE_PASSWORD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
}

ACMD(do_mall_password)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1 || strlen(arg1) > 6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    int iPulse = thecore_pulse();

    if (ch->GetMall())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í°¡ ÀÌ¹Ì ¿·ÁÀÖ½À´Ï´Ù."));
        return;
    }

    if (iPulse - ch->GetMallLoadTime() < passes_per_sec * 10) // 10ÃÊ¿¡ Çѹø¸¸ ¿äû °¡´É
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í¸¦ ´İÀºÁö 10ÃÊ ¾È¿¡´Â ¿ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    ch->SetMallLoadTime(iPulse);

    TSafeboxLoadPacket p;
    p.dwID = ch->GetDesc()->GetAccountTable().id;
    strlcpy(p.szLogin, ch->GetDesc()->GetAccountTable().login, sizeof(p.szLogin));
    strlcpy(p.szPassword, arg1, sizeof(p.szPassword));

    db_clientdesc->DBPacket(HEADER_GD_MALL_LOAD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
}

ACMD(do_mall_close)
{
    if (ch->GetMall())
    {
        ch->SetMallLoadTime(thecore_pulse());
        ch->CloseMall();
        ch->Save();
    }
}

ACMD(do_ungroup)
{
    if (!ch->GetParty())
        return;

    if (!CPartyManager::instance().IsEnablePCParty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ¼¹ö ¹®Á¦·Î ÆÄƼ °ü·Ã 󸮸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetDungeon())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ´øÀü ¾È¿¡¼´Â ÆÄƼ¿¡¼ ³ª°¥ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    LPPARTY pParty = ch->GetParty();

    if (pParty->GetMemberCount() == 2)
    {
        // party disband
        CPartyManager::instance().DeleteParty(pParty);
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ÆÄƼ¿¡¼ ³ª°¡¼Ì½À´Ï´Ù."));
        //pParty->SendPartyRemoveOneToAll(ch);
        pParty->Quit(ch->GetPlayerID());
        //pParty->SendPartyRemoveAllToOne(ch);
    }
}

ACMD(do_close_shop)
{
    if (ch->GetMyShop())
    {
        ch->CloseMyShop();
        return;
    }
}

ACMD(do_set_walk_mode)
{
    ch->SetNowWalking(true);
    ch->SetWalking(true);
}

ACMD(do_set_run_mode)
{
    ch->SetNowWalking(false);
    ch->SetWalking(false);
}

#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
ACMD(do_remove_polymorph)
{
    if (!ch)
        return;
    
    if (!ch->IsPolymorphed())
        return;
    
    ch->SetPolymorph(0);
    ch->RemoveAffect(AFFECT_POLYMORPH);
}
#endif

ACMD(do_war)
{
    //³» ±æµå Á¤º¸¸¦ ¾ò¾î¿À°í
    CGuild * g = ch->GetGuild();

    if (!g)
        return;

    //ÀüÀïÁßÀÎÁö üũÇѹø!
    if (g->UnderAnyWar())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ´Ù¸¥ ÀüÀï¿¡ ÂüÀü Áß ÀÔ´Ï´Ù."));
        return;
    }

    //ÆÄ¶ó¸ŞÅ͸¦ µÎ¹è·Î ³ª´©°í
    char arg1[256], arg2[256];
    int type = GUILD_WAR_TYPE_FIELD;
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1)
        return;

if (*arg2)
    {
        str_to_number(type, arg2);


        if(type < 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<error> can't declare war with type less than zero."));
            return;
        }


        if (type >= GUILD_WAR_TYPE_MAX_NUM || type == 0)
            type = GUILD_WAR_TYPE_FIELD;
    }

    //±æµåÀÇ ¸¶½ºÅÍ ¾ÆÀ̵𸦠¾ò¾î¿ÂµÚ
    DWORD gm_pid = g->GetMasterPID();

    //¸¶½ºÅÍÀÎÁö üũ(±æÀüÀº ±æµåÀ常ÀÌ °¡´É)
    if (gm_pid != ch->GetPlayerID())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
        return;
    }

    //»ó´ë ±æµå¸¦ ¾ò¾î¿À°í
    CGuild * opp_g = CGuildManager::instance().FindGuildByName(arg1);

    if (!opp_g)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
        return;
    }

    //»ó´ë±æµå¿ÍÀÇ »óÅ üũ
    switch (g->GetGuildWarState(opp_g->GetID()))
    {
        case GUILD_WAR_NONE:
            {
                if (opp_g->UnderAnyWar())
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
                    return;
                }

                int iWarPrice = KOR_aGuildWarInfo[type].iWarPrice;

                if (g->GetGuildMoney() < iWarPrice)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                    return;
                }

                if (opp_g->GetGuildMoney() < iWarPrice)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                    return;
                }
            }
            break;

        case GUILD_WAR_SEND_DECLARE:
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì ¼±ÀüÆ÷°í ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
                return;
            }
            break;

        case GUILD_WAR_RECV_DECLARE:
            {
                if (opp_g->UnderAnyWar())
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
                    g->RequestRefuseWar(opp_g->GetID());
                    return;
                }
            }
            break;

        case GUILD_WAR_RESERVE:
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀïÀÌ ¿¹¾àµÈ ±æµå ÀÔ´Ï´Ù."));
                return;
            }
            break;

        case GUILD_WAR_END:
            return;

        default:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀï ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
            g->RequestRefuseWar(opp_g->GetID());
            return;
    }

    if (!g->CanStartWar(type))
    {
        // ±æµåÀüÀ» ÇÒ ¼ö ÀÖ´Â Á¶°ÇÀ» ¸¸Á·ÇÏÁö¾Ê´Â´Ù.
        if (g->GetLadderPoint() == 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
            sys_log(0, "GuildWar.StartError.NEED_LADDER_POINT");
        }
        else if (g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀüÀ» Çϱâ À§Çؼ± ÃÖ¼ÒÇÑ %d¸íÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù."), GUILD_WAR_MIN_MEMBER_COUNT);
            sys_log(0, "GuildWar.StartError.NEED_MINIMUM_MEMBER[%d]", GUILD_WAR_MIN_MEMBER_COUNT);
        }
        else
        {
            sys_log(0, "GuildWar.StartError.UNKNOWN_ERROR");
        }
        return;
    }

    // ÇʵåÀü üũ¸¸ ÇÏ°í ¼¼¼¼ÇÑ Ã¼Å©´Â »ó´ë¹æÀÌ ½Â³«ÇÒ¶§ ÇÑ´Ù.
    if (!opp_g->CanStartWar(GUILD_WAR_TYPE_FIELD))
    {
        if (opp_g->GetLadderPoint() == 0)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        else if (opp_g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµå¿ø ¼ö°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    do
    {
        if (g->GetMasterCharacter() != NULL)
            break;

        CCI *pCCI = P2P_MANAGER::instance().FindByPID(g->GetMasterPID());

        if (pCCI != NULL)
            break;

        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
        g->RequestRefuseWar(opp_g->GetID());
        return;

    } while (false);

    do
    {
        if (opp_g->GetMasterCharacter() != NULL)
            break;
        
        CCI *pCCI = P2P_MANAGER::instance().FindByPID(opp_g->GetMasterPID());
        
        if (pCCI != NULL)
            break;

        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
        g->RequestRefuseWar(opp_g->GetID());
        return;

    } while (false);

    g->RequestDeclareWar(opp_g->GetID(), type);
}

ACMD(do_nowar)
{
    CGuild* g = ch->GetGuild();
    if (!g)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD gm_pid = g->GetMasterPID();

    if (gm_pid != ch->GetPlayerID())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
        return;
    }

    CGuild* opp_g = CGuildManager::instance().FindGuildByName(arg1);

    if (!opp_g)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
        return;
    }

    g->RequestRefuseWar(opp_g->GetID());
}

ACMD(do_detaillog)
{
    ch->DetailLog();
}

ACMD(do_monsterlog)
{
    ch->ToggleMonsterLog();
}

ACMD(do_pkmode)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    BYTE mode = 0;
    str_to_number(mode, arg1);

    if (mode == PK_MODE_PROTECT)
        return;

    if (ch->GetLevel() < PK_PROTECT_LEVEL && mode != 0)
        return;

    ch->SetPKMode(mode);
}

ACMD(do_messenger_auth)
{
    if (ch->GetArena())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || !*arg2)
        return;

    char answer = LOWER(*arg1);

    if (answer != 'y')
    {
        LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2);

        if (tch)
            tch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀ¸·Î ºÎÅÍ Ä£±¸ µî·ÏÀ» °ÅºÎ ´çÇß½À´Ï´Ù."), ch->GetName());
    }

    MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, answer == 'y' ? false : true); // DENY
}

ACMD(do_setblockmode)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (*arg1)
    {
        BYTE flag = 0;
        str_to_number(flag, arg1);
        ch->SetBlockMode(flag);
    }
}

ACMD(do_unmount)
{
    LPITEM item = ch->GetWear(WEAR_UNIQUE1);
    LPITEM item2 = ch->GetWear(WEAR_UNIQUE2);
    LPITEM item3 = ch->GetWear(WEAR_COSTUME_MOUNT);

    if (item && item->IsRideItem())
        ch->UnequipItem(item);

    if (item2 && item2->IsRideItem())
        ch->UnequipItem(item2);

    if (item3 && item3->IsRideItem())
        ch->UnequipItem(item3);

    if (true == ch->UnEquipSpecialRideUniqueItem())
    {
        ch->RemoveAffect(AFFECT_MOUNT);
        ch->RemoveAffect(AFFECT_MOUNT_BONUS);

        if (ch->IsHorseRiding())
        {
            ch->StopRiding();
        }
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("AI??Aa¢¬¢ç¡Æ? ?E A¡À?¡© ??¢¬¡¾ ?o ???A¢¥I¢¥U."));
    }

}

ACMD(do_observer_exit)
{
    if (ch->IsObserverMode())
    {
        if (ch->GetWarMap())
            ch->SetWarMap(NULL);

        if (ch->GetArena() != NULL || ch->GetArenaObserverMode() == true)
        {
            ch->SetArenaObserverMode(false);

            if (ch->GetArena() != NULL)
                ch->GetArena()->RemoveObserver(ch->GetPlayerID());

            ch->SetArena(NULL);
            ch->WarpSet(ARENA_RETURN_POINT_X(ch->GetEmpire()), ARENA_RETURN_POINT_Y(ch->GetEmpire()));
        }
        else
        {
            ch->ExitToSavedLocation();
        }
        ch->SetObserverMode(false);
    }
}

ACMD(do_view_equip)
{
    if (ch->GetGMLevel() <= GM_PLAYER)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (*arg1)
    {
        DWORD vid = 0;
        str_to_number(vid, arg1);
        LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

        if (!tch)
            return;

        if (!tch->IsPC())
            return;
        /*
           int iSPCost = ch->GetMaxSP() / 3;

           if (ch->GetSP() < iSPCost)
           {
           ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á¤½Å·ÂÀÌ ºÎÁ·ÇÏ¿© ´Ù¸¥ »ç¶÷ÀÇ Àåºñ¸¦ º¼ ¼ö ¾ø½À´Ï´Ù."));
           return;
           }
           ch->PointChange(POINT_SP, -iSPCost);
         */
        tch->SendEquipment(ch);
    }
}

ACMD(do_party_request)
{
    if (ch->GetArena())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetParty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì ÆÄƼ¿¡ ¼ÓÇØ ÀÖÀ¸¹Ç·Î °¡ÀÔ½ÅûÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        if (!ch->RequestToParty(tch))
            ch->ChatPacket(CHAT_TYPE_COMMAND, "PartyRequestDenied");
}

ACMD(do_party_request_accept)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        ch->AcceptToParty(tch);
}

ACMD(do_party_request_deny)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        ch->DenyToParty(tch);
}

ACMD(do_monarch_warpto)
{
    if (true == LC_IsYMIR() || true == LC_IsKorea())
        return;

    if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
    
    //±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_WARP))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_WARP));
        return;
    }

    //±ºÁÖ ¸÷ ¼Òȯ ºñ¿ë
    const int WarpPrice = 10000;
    
    //±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, WarpPrice);
        return;   
    }

    int x = 0, y = 0;
    char arg1[256];

    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç¿ë¹ı: warpto <character name>"));
        return;
    }

    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);

    if (!tch)
    {
        CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);

        if (pkCCI)
        {
            if (pkCCI->bEmpire != ch->GetEmpire())
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±¹ À¯Àú¿¡°Ô´Â À̵¿ÇÒ¼ö ¾ø½À´Ï´Ù"));
                return;
            }

            if (pkCCI->bChannel != g_bChannel)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç À¯Àú´Â %d ä³Î¿¡ ÀÖ½À´Ï´Ù. (ÇöÀç ä³Î %d)"), pkCCI->bChannel, g_bChannel);
                return;
            }
            if (!IsMonarchWarpZone(pkCCI->lMapIndex))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }

            PIXEL_POSITION pos;
    
            if (!SECTREE_MANAGER::instance().GetCenterPositionOfMap(pkCCI->lMapIndex, pos))
                ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map (index %d)", pkCCI->lMapIndex);
            else
            {
                //ch->ChatPacket(CHAT_TYPE_INFO, "You warp to (%d, %d)", pos.x, pos.y);
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¿¡°Ô·Î À̵¿ÇÕ´Ï´Ù"), arg1);
                ch->WarpSet(pos.x, pos.y);
                
                //±ºÁÖ µ· »è°¨   
                CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);

                //ÄğŸÀÓ ÃʱâÈ
                ch->SetMC(CHARACTER::MI_WARP);
            }
        }
        else if (NULL == CHARACTER_MANAGER::instance().FindPC(arg1))
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
        }

        return;
    }
    else
    {
        if (tch->GetEmpire() != ch->GetEmpire())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±¹ À¯Àú¿¡°Ô´Â À̵¿ÇÒ¼ö ¾ø½À´Ï´Ù"));
            return;
        }
        if (!IsMonarchWarpZone(tch->GetMapIndex()))
        {
            ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
            return;
        }
        x = tch->GetX();
        y = tch->GetY();
    }

    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¿¡°Ô·Î À̵¿ÇÕ´Ï´Ù"), arg1);
    ch->WarpSet(x, y);
    ch->Stop();

    //±ºÁÖ µ· »è°¨   
    CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);

    //ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_WARP);
}

ACMD(do_monarch_transfer)
{
    if (true == LC_IsYMIR() || true == LC_IsKorea())
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç¿ë¹ı: transfer <name>"));
        return;
    }
    
    if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
    
    //±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_TRANSFER))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_TRANSFER));   
        return;
    }

    //±ºÁÖ ¿öÇÁ ºñ¿ë
    const int WarpPrice = 10000;

    //±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, WarpPrice);
        return;   
    }


    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);

    if (!tch)
    {
        CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);

        if (pkCCI)
        {
            if (pkCCI->bEmpire != ch->GetEmpire())
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ Á¦±¹ À¯Àú´Â ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }
            if (pkCCI->bChannel != g_bChannel)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀº %d ä³Î¿¡ Á¢¼Ó Áß ÀÔ´Ï´Ù. (ÇöÀç ä³Î: %d)"), arg1, pkCCI->bChannel, g_bChannel);
                return;
            }
            if (!IsMonarchWarpZone(pkCCI->lMapIndex))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }
            if (!IsMonarchWarpZone(ch->GetMapIndex()))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }

            TPacketGGTransfer pgg;

            pgg.bHeader = HEADER_GG_TRANSFER;
            strlcpy(pgg.szName, arg1, sizeof(pgg.szName));
            pgg.lX = ch->GetX();
            pgg.lY = ch->GetY();

            P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGTransfer));
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀ» ¼ÒȯÇÏ¿´½À´Ï´Ù."), arg1);
            
            //±ºÁÖ µ· »è°¨   
            CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
            //ÄğŸÀÓ ÃʱâÈ
            ch->SetMC(CHARACTER::MI_TRANSFER);
        }
        else
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÔ·ÂÇϽŠÀ̸§À» °¡Áø »ç¿ëÀÚ°¡ ¾ø½À´Ï´Ù."));
        }

        return;
    }


    if (ch == tch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÚ½ÅÀ» ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (tch->GetEmpire() != ch->GetEmpire())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ Á¦±¹ À¯Àú´Â ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
    if (!IsMonarchWarpZone(tch->GetMapIndex()))
    {
        ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
    if (!IsMonarchWarpZone(ch->GetMapIndex()))
    {
        ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    //tch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
    tch->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
    
    //±ºÁÖ µ· »è°¨   
    CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
    //ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_TRANSFER);
}

ACMD(do_monarch_info)
{
    if (CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))   
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³ªÀÇ ±ºÁÖ Á¤º¸"));
        TMonarchInfo * p = CMonarch::instance().GetMonarch();
        for (int n = 1; n < 4; ++n)
        {
            if (n == ch->GetEmpire())
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  º¸À¯±İ¾× %lld "), EMPIRE_NAME(n), p->name[n], p->money[n]);
            else
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  "), EMPIRE_NAME(n), p->name[n]);
                
        }
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ Á¤º¸"));
        TMonarchInfo * p = CMonarch::instance().GetMonarch();
        for (int n = 1; n < 4; ++n)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  "), EMPIRE_NAME(n), p->name[n]);
                
        }
    }
    
}   

ACMD(do_elect)
{
    db_clientdesc->DBPacketHeader(HEADER_GD_COME_TO_VOTE, ch->GetDesc()->GetHandle(), 0);
}

// LUA_ADD_GOTO_INFO
struct GotoInfo
{
    std::string     st_name;

    BYTE     empire;
    int     mapIndex;
    DWORD     x, y;

    GotoInfo()
    {
        st_name     = "";
        empire         = 0;
        mapIndex     = 0;

        x = 0;
        y = 0;
    }

    GotoInfo(const GotoInfo& c_src)
    {
        __copy__(c_src);
    }

    void operator = (const GotoInfo& c_src)
    {
        __copy__(c_src);
    }

    void __copy__(const GotoInfo& c_src)
    {
        st_name     = c_src.st_name;
        empire         = c_src.empire;
        mapIndex     = c_src.mapIndex;

        x = c_src.x;
        y = c_src.y;
    }
};

extern void BroadcastNotice(const char * c_pszBuf);

ACMD(do_monarch_tax)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: monarch_tax <1-50>");
        return;
    }

    // ±ºÁÖ °Ë»ç   
    if (!ch->IsMonarch())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
        return;
    }

    // ¼¼±İ¼³Á¤
    int tax = 0;
    str_to_number(tax,  arg1);

    if (tax < 1 || tax > 50)
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("1-50 »çÀÌÀÇ ¼öÄ¡¸¦ ¼±ÅÃÇØÁÖ¼¼¿ä"));

    quest::CQuestManager::instance().SetEventFlag("trade_tax", tax);

    // ±ºÁÖ¿¡°Ô ¸Ş¼¼Áö Çϳª
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼¼±İÀÌ %d %·Î ¼³Á¤µÇ¾ú½À´Ï´Ù"));

    // °øÁö
    char szMsg[1024];   

    snprintf(szMsg, sizeof(szMsg), "±ºÁÖÀÇ ¸íÀ¸·Î ¼¼±İÀÌ %d %% ·Î º¯°æµÇ¾ú½À´Ï´Ù", tax);
    BroadcastNotice(szMsg);

    snprintf(szMsg, sizeof(szMsg), "¾ÕÀ¸·Î´Â °Å·¡ ±İ¾×ÀÇ %d %% °¡ ±¹°í·Î µé¾î°¡°ÔµË´Ï´Ù.", tax);
    BroadcastNotice(szMsg);

    // ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_TAX);
}

static const DWORD cs_dwMonarchMobVnums[] =
{
    191, //    »ê°ß½Å
    192, //    Àú½Å
    193, //    ¿õ½Å
    194, //    È£½Å
    391, //    ¹ÌÁ¤
    392, //    ÀºÁ¤
    393, //    ¼¼¶û
    394, //    ÁøÈñ
    491, //    ¸Íȯ
    492, //    º¸¿ì
    493, //    ±¸ÆĞ
    494, //    ÃßÈç
    591, //    ºñ·ù´Ü´ëÀå
    691, //    ¿õ±Í Á·Àå
    791, //    ¹Ğ±³±³ÁÖ
    1304, // ´©··¹ü±Í
    1901, // ±¸¹ÌÈ£
    2091, // ¿©¿Õ°Å¹Ì
    2191, // °Å´ë»ç¸·°ÅºÏ
    2206, // È¿°¿Õi
    0,
};

ACMD(do_monarch_mob)
{
    char arg1[256];
    LPCHARACTER    tch;

    one_argument(argument, arg1, sizeof(arg1));

    if (!ch->IsMonarch())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
    
    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mmob <mob name>");
        return;
    }

    BYTE pcEmpire = ch->GetEmpire();
    BYTE mapEmpire = SECTREE_MANAGER::instance().GetEmpireFromMapIndex(ch->GetMapIndex());

    if (LC_IsYMIR() == true || LC_IsKorea() == true)
    {
        if (mapEmpire != pcEmpire && mapEmpire != 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÚ±¹ ¿µÅä¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
            return;
        }
    }

    // ±ºÁÖ ¸÷ ¼Òȯ ºñ¿ë
    const int SummonPrice = 5000000;

    // ±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_SUMMON))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_SUMMON));   
        return;
    }
    
    // ±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(SummonPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, SummonPrice);
        return;   
    }

    const CMob * pkMob;
    DWORD vnum = 0;

    if (isdigit(*arg1))
    {
        str_to_number(vnum, arg1);

        if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
            vnum = 0;
    }
    else
    {
        pkMob = CMobManager::Instance().Get(arg1, true);

        if (pkMob)
            vnum = pkMob->m_table.dwVnum;
    }

    DWORD count;

    // ¼Òȯ °¡´É ¸÷ °Ë»ç
    for (count = 0; cs_dwMonarchMobVnums[count] != 0; ++count)
        if (cs_dwMonarchMobVnums[count] == vnum)
            break;

    if (0 == cs_dwMonarchMobVnums[count])
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒȯÇÒ¼ö ¾ø´Â ¸ó½ºÅÍ ÀÔ´Ï´Ù. ¼Òȯ°¡´ÉÇÑ ¸ó½ºÅʹ ȨÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä"));
        return;
    }

    tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
            ch->GetMapIndex(),
            ch->GetX() - number(200, 750),
            ch->GetY() - number(200, 750),
            ch->GetX() + number(200, 750),
            ch->GetY() + number(200, 750),
            true,
            pkMob->m_table.bType == CHAR_TYPE_STONE,
            true);

    if (tch)
    {
        // ±ºÁÖ µ· »è°¨   
        CMonarch::instance().SendtoDBDecMoney(SummonPrice, ch->GetEmpire(), ch);

        // ÄğŸÀÓ ÃʱâÈ
        ch->SetMC(CHARACTER::MI_SUMMON);
    }
}

static const char* FN_point_string(int apply_number)
{
    switch (apply_number)
    {
        case POINT_MAX_HP:    return LC_TEXT("ÃÖ´ë »ı¸í·Â +%d");
        case POINT_MAX_SP:    return LC_TEXT("ÃÖ´ë Á¤½Å·Â +%d");
        case POINT_HT:        return LC_TEXT("ü·Â +%d");
        case POINT_IQ:        return LC_TEXT("Áö´É +%d");
        case POINT_ST:        return LC_TEXT("±Ù·Â +%d");
        case POINT_DX:        return LC_TEXT("¹Îø +%d");
        case POINT_ATT_SPEED:    return LC_TEXT("°ø°İ¼Óµµ +%d");
        case POINT_MOV_SPEED:    return LC_TEXT("À̵¿¼Óµµ %d");
        case POINT_CASTING_SPEED:    return LC_TEXT("ÄğŸÀÓ -%d");
        case POINT_HP_REGEN:    return LC_TEXT("»ı¸í·Â ȸº¹ +%d");
        case POINT_SP_REGEN:    return LC_TEXT("Á¤½Å·Â ȸº¹ +%d");
        case POINT_POISON_PCT:    return LC_TEXT("µ¶°ø°İ %d");
        case POINT_STUN_PCT:    return LC_TEXT("½ºÅÏ +%d");
        case POINT_SLOW_PCT:    return LC_TEXT("½½·Î¿ì +%d");
        case POINT_CRITICAL_PCT:    return LC_TEXT("%d%% È®·ü·Î Ä¡¸íŸ °ø°İ");
        case POINT_RESIST_CRITICAL:    return LC_TEXT("»ó´ëÀÇ Ä¡¸íŸ È®·ü %d%% °¨¼Ò");
        case POINT_PENETRATE_PCT:    return LC_TEXT("%d%% È®·ü·Î °üÅë °ø°İ");
        case POINT_RESIST_PENETRATE: return LC_TEXT("»ó´ëÀÇ °üÅë °ø°İ È®·ü %d%% °¨¼Ò");
        case POINT_ATTBONUS_HUMAN:    return LC_TEXT("Àΰ£·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%");
        case POINT_ATTBONUS_ANIMAL:    return LC_TEXT("µ¿¹°·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%");
        case POINT_ATTBONUS_ORC:    return LC_TEXT("¿õ±ÍÁ· Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_MILGYO:    return LC_TEXT("¹Ğ±³·ù Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_UNDEAD:    return LC_TEXT("½Ãü·ù Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_DEVIL:    return LC_TEXT("¾Ç¸¶·ù Ÿ°İÄ¡ +%d%%");
        case POINT_STEAL_HP:        return LC_TEXT("Ÿ°İÄ¡ %d%% ¸¦ »ı¸í·ÂÀ¸·Î Èí¼ö");
        case POINT_STEAL_SP:        return LC_TEXT("Ÿ·ÂÄ¡ %d%% ¸¦ Á¤½Å·ÂÀ¸·Î Èí¼ö");
        case POINT_MANA_BURN_PCT:    return LC_TEXT("%d%% È®·ü·Î Ÿ°İ½Ã »ó´ë Àü½Å·Â ¼Ò¸ğ");
        case POINT_DAMAGE_SP_RECOVER:    return LC_TEXT("%d%% È®·ü·Î ÇÇÇØ½Ã Á¤½Å·Â ȸº¹");
        case POINT_BLOCK:            return LC_TEXT("¹°¸®Å¸°İ½Ã ºí·° È®·ü %d%%");
        case POINT_DODGE:            return LC_TEXT("Ȱ °ø°İ ȸÇÇ È®·ü %d%%");
        case POINT_RESIST_SWORD:    return LC_TEXT("ÇÑ¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_TWOHAND:    return LC_TEXT("¾ç¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_DAGGER:    return LC_TEXT("µÎ¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_BELL:        return LC_TEXT("¹æ¿ï ¹æ¾î %d%%");
        case POINT_RESIST_FAN:        return LC_TEXT("ºÎä ¹æ¾î %d%%");
        case POINT_RESIST_BOW:        return LC_TEXT("Ȱ°ø°İ ÀúÇ× %d%%");
        case POINT_RESIST_FIRE:        return LC_TEXT("È¿° ÀúÇ× %d%%");
        case POINT_RESIST_ELEC:        return LC_TEXT("Àü±â ÀúÇ× %d%%");
        case POINT_RESIST_MAGIC:    return LC_TEXT("¸¶¹ı ÀúÇ× %d%%");
        case POINT_RESIST_WIND:        return LC_TEXT("¹Ù¶÷ ÀúÇ× %d%%");
        case POINT_RESIST_ICE:        return LC_TEXT("³Ã±â ÀúÇ× %d%%");
        case POINT_RESIST_EARTH:    return LC_TEXT("´ëÁö ÀúÇ× %d%%");
        case POINT_RESIST_DARK:        return LC_TEXT("¾îµÒ ÀúÇ× %d%%");
        case POINT_REFLECT_MELEE:    return LC_TEXT("Á÷Á¢ Ÿ°İÄ¡ ¹İ»ç È®·ü : %d%%");
        case POINT_REFLECT_CURSE:    return LC_TEXT("ÀúÁÖ µÇµ¹¸®±â È®·ü %d%%");
        case POINT_POISON_REDUCE:    return LC_TEXT("µ¶ ÀúÇ× %d%%");
        case POINT_KILL_SP_RECOVER:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã Á¤½Å·Â ȸº¹");
        case POINT_EXP_DOUBLE_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã °æÇèÄ¡ Ãß°¡ »ó½Â");
        case POINT_GOLD_DOUBLE_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã µ· 2¹è µå·Ó");
        case POINT_ITEM_DROP_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã ¾ÆÀÌÅÛ 2¹è µå·Ó");
        case POINT_POTION_BONUS:    return LC_TEXT("¹°¾à »ç¿ë½Ã %d%% ¼º´É Áõ°¡");
        case POINT_KILL_HP_RECOVERY:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã »ı¸í·Â ȸº¹");
//        case POINT_IMMUNE_STUN:    return LC_TEXT("±âÀıÇÏÁö ¾ÊÀ½ %d%%");
//        case POINT_IMMUNE_SLOW:    return LC_TEXT("´À·ÁÁöÁö ¾ÊÀ½ %d%%");
//        case POINT_IMMUNE_FALL:    return LC_TEXT("³Ñ¾îÁöÁö ¾ÊÀ½ %d%%");
//        case POINT_SKILL:    return LC_TEXT("");
//        case POINT_BOW_DISTANCE:    return LC_TEXT("");
        case POINT_ATT_GRADE_BONUS:    return LC_TEXT("°ø°İ·Â +%d");
        case POINT_DEF_GRADE_BONUS:    return LC_TEXT("¹æ¾î·Â +%d");
        case POINT_MAGIC_ATT_GRADE:    return LC_TEXT("¸¶¹ı °ø°İ·Â +%d");
        case POINT_MAGIC_DEF_GRADE:    return LC_TEXT("¸¶¹ı ¹æ¾î·Â +%d");
//        case POINT_CURSE_PCT:    return LC_TEXT("");
        case POINT_MAX_STAMINA:    return LC_TEXT("ÃÖ´ë Áö±¸·Â +%d");
        case POINT_ATTBONUS_WARRIOR:    return LC_TEXT("¹«»ç¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_ASSASSIN:    return LC_TEXT("ÀÚ°´¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_SURA:        return LC_TEXT("¼ö¶ó¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_SHAMAN:        return LC_TEXT("¹«´ç¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_MONSTER:    return LC_TEXT("¸ó½ºÅÍ¿¡°Ô °ÇÔ +%d%%");
        case POINT_MALL_ATTBONUS:        return LC_TEXT("°ø°İ·Â +%d%%");
        case POINT_MALL_DEFBONUS:        return LC_TEXT("¹æ¾î·Â +%d%%");
        case POINT_MALL_EXPBONUS:        return LC_TEXT("°æÇèÄ¡ %d%%");
        case POINT_MALL_ITEMBONUS:        return LC_TEXT("¾ÆÀÌÅÛ µå·ÓÀ² %.1f¹è");
        case POINT_MALL_GOLDBONUS:        return LC_TEXT("µ· µå·ÓÀ² %.1f¹è");
        case POINT_MAX_HP_PCT:            return LC_TEXT("ÃÖ´ë »ı¸í·Â +%d%%");
        case POINT_MAX_SP_PCT:            return LC_TEXT("ÃÖ´ë Á¤½Å·Â +%d%%");
        case POINT_SKILL_DAMAGE_BONUS:    return LC_TEXT("½ºÅ³ µ¥¹ÌÁö %d%%");
        case POINT_NORMAL_HIT_DAMAGE_BONUS:    return LC_TEXT("ÆòŸ µ¥¹ÌÁö %d%%");
        case POINT_SKILL_DEFEND_BONUS:        return LC_TEXT("½ºÅ³ µ¥¹ÌÁö ÀúÇ× %d%%");
        case POINT_NORMAL_HIT_DEFEND_BONUS:    return LC_TEXT("ÆòŸ µ¥¹ÌÁö ÀúÇ× %d%%");
//        case POINT_PC_BANG_EXP_BONUS:    return LC_TEXT("");
//        case POINT_PC_BANG_DROP_BONUS:    return LC_TEXT("");
//        case POINT_EXTRACT_HP_PCT:    return LC_TEXT("");
        case POINT_RESIST_WARRIOR:    return LC_TEXT("¹«»ç°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_ASSASSIN:    return LC_TEXT("ÀÚ°´°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_SURA:        return LC_TEXT("¼ö¶ó°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_SHAMAN:    return LC_TEXT("¹«´ç°ø°İ¿¡ %d%% ÀúÇ×");
        default:                    return NULL;
    }
}

static bool FN_hair_affect_string(LPCHARACTER ch, char *buf, size_t bufsiz)
{
    if (NULL == ch || NULL == buf)
        return false;

    CAffect* aff = NULL;
    time_t expire = 0;
    struct tm ltm;
    int    year, mon, day;
    int    offset = 0;

    aff = ch->FindAffect(AFFECT_HAIR);

    if (NULL == aff)
        return false;

    expire = ch->GetQuestFlag("hair.limit_time");

    if (expire < get_global_time())
        return false;

    // set apply string
    offset = snprintf(buf, bufsiz, FN_point_string(aff->bApplyOn), aff->lApplyValue);

    if (offset < 0 || offset >= (int) bufsiz)
        offset = bufsiz - 1;

    localtime_r(&expire, &ltm);

    year    = ltm.tm_year + 1900;
    mon        = ltm.tm_mon + 1;
    day        = ltm.tm_mday;

    snprintf(buf + offset, bufsiz - offset, LC_TEXT(" (¸¸·áÀÏ : %d³â %d¿ù %dÀÏ)"), year, mon, day);

    return true;
}

ACMD(do_costume)
{
    char buf[512];
    const size_t bufferSize = sizeof(buf);

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    CItem* pBody = ch->GetWear(WEAR_COSTUME_BODY);
    CItem* pHair = ch->GetWear(WEAR_COSTUME_HAIR);

    ch->ChatPacket(CHAT_TYPE_INFO, "COSTUME status:");

    if (pHair)
    {
        const char* itemName = pHair->GetName();
        ch->ChatPacket(CHAT_TYPE_INFO, "  HAIR : %s", itemName);

        for (int i = 0; i < pHair->GetAttributeCount(); ++i)
        {
            const TPlayerItemAttribute& attr = pHair->GetAttribute(i);
            if (0 < attr.bType)
            {
                snprintf(buf, bufferSize, FN_point_string(attr.bType), attr.sValue);
                ch->ChatPacket(CHAT_TYPE_INFO, "     %s", buf);
            }
        }

        if (pHair->IsEquipped() && arg1[0] == 'h')
            ch->UnequipItem(pHair);
    }

    if (pBody)
    {
        const char* itemName = pBody->GetName();
        ch->ChatPacket(CHAT_TYPE_INFO, "  BODY : %s", itemName);

        if (pBody->IsEquipped() && arg1[0] == 'b')
            ch->UnequipItem(pBody);
    }
}

ACMD(do_hair)
{
    char buf[256];

    if (false == FN_hair_affect_string(ch, buf, sizeof(buf)))
        return;

    ch->ChatPacket(CHAT_TYPE_INFO, buf);
}

ACMD(do_inventory)
{
    int    index = 0;
    int    count        = 1;

    char arg1[256];
    char arg2[256];

    LPITEM    item;

    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: inventory <start_index> <count>");
        return;
    }

    if (!*arg2)
    {
        index = 0;
        str_to_number(count, arg1);
    }
    else
    {
        str_to_number(index, arg1); index = MIN(index, INVENTORY_MAX_NUM);
        str_to_number(count, arg2); count = MIN(count, INVENTORY_MAX_NUM);
    }

    for (int i = 0; i < count; ++i)
    {
        if (index >= INVENTORY_MAX_NUM)
            break;

        item = ch->GetInventoryItem(index);

        ch->ChatPacket(CHAT_TYPE_INFO, "inventory [%d] = %s",
                        index, item ? item->GetName() : "<NONE>");
        ++index;
    }
}

//gift notify quest command
ACMD(do_gift)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "gift");
}

ACMD(do_cards)
{
    const char *line;

    char arg1[256], arg2[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    switch (LOWER(arg1[0]))
    {
        case 'o':    // open
            if (isdigit(*arg2))
            {
                DWORD safemode;
                str_to_number(safemode, arg2);
                ch->Cards_open(safemode);
            }
            break;
            case 'p':    // open
            ch->Cards_pullout();
            break;
        case 'e':    // open
            ch->CardsEnd();
            break;
        case 'd':    // open
            if (isdigit(*arg2))
            {
                DWORD destroy_index;
                str_to_number(destroy_index, arg2);
                ch->CardsDestroy(destroy_index);
            }
            break;
        case 'a':    // open
            if (isdigit(*arg2))
            {
                DWORD accpet_index;
                str_to_number(accpet_index, arg2);
                ch->CardsAccept(accpet_index);
            }
            break;
        case 'r':    // open
            if (isdigit(*arg2))
            {
                DWORD restore_index;
                str_to_number(restore_index, arg2);
                ch->CardsRestore(restore_index);
            }
            break;
        default:
            return;
    }
}

ACMD(do_cube)
{
    if (!ch->CanDoCube())
        return;

    dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->GetName(), argument);
    int cube_index = 0, inven_index = 0;
    const char *line;

    char arg1[256], arg2[256], arg3[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    one_argument(line, arg3, sizeof(arg3));

    if (0 == arg1[0])
    {
        // print usage
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube close");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube add <inveltory_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube delete <cube_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube list");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube cancel");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");
        return;
    }

    const std::string& strArg1 = std::string(arg1);

    // r_info (request information)
    // /cube r_info     ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé ¼ö ÀÖ´Â ·¹½ÃÇÇ ¿äû
    //                        (Server -> Client) /cube r_list npcVNUM resultCOUNT 123,1/125,1/128,1/130,5
    //
    // /cube r_info 3   ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ ¿äû
    // /cube r_info 3 5 ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛºÎÅÍ ÀÌÈÄ 5°³ÀÇ ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Àç·á Á¤º¸¸¦ ¿äû
    //                       (Server -> Client) /cube m_info startIndex count 125,1|126,2|127,2|123,5&555,5&555,4/120000@125,1|126,2|127,2|123,5&555,5&555,4/120000
    //
    if (strArg1 == "r_info")
    {
        if (0 == arg2[0])
            Cube_request_result_list(ch);
        else
        {
            if (isdigit(*arg2))
            {
                int listIndex = 0, requestCount = 1;
                str_to_number(listIndex, arg2);

                if (0 != arg3[0] && isdigit(*arg3))
                    str_to_number(requestCount, arg3);

                Cube_request_material_info(ch, listIndex, requestCount);
            }
        }

        return;
    }

    switch (LOWER(arg1[0]))
    {
        case 'o':    // open
            Cube_open(ch);
            break;

        case 'c':    // close
            Cube_close(ch);
            break;

        case 'l':    // list
            Cube_show_list(ch);
            break;

        case 'a':    // add cue_index inven_index
            {
                if (0 == arg2[0] || !isdigit(*arg2) ||
                    0 == arg3[0] || !isdigit(*arg3))
                    return;

                str_to_number(cube_index, arg2);
                str_to_number(inven_index, arg3);
                Cube_add_item (ch, cube_index, inven_index);
            }
            break;

        case 'd':    // delete
            {
                if (0 == arg2[0] || !isdigit(*arg2))
                    return;

                str_to_number(cube_index, arg2);
                Cube_delete_item (ch, cube_index);
            }
            break;

        case 'm':    // make
            if (0 != arg2[0])
            {
                while (true == Cube_make(ch))
                    dev_log (LOG_DEB0, "cube make success");
            }
            else
                Cube_make(ch);
            break;

        default:
            return;
    }
}

ACMD(do_in_game_mall)
{
    if (LC_IsYMIR() == true || LC_IsKorea() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://metin2.co.kr/04_mall/mall/login.htm");
        return;
    }

    if (true == LC_IsTaiwan())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://203.69.141.203/mall/mall/item_main.htm");
        return;
    }

    // ¤Ğ_¤Ğ Äèµµ¼¹ö ¾ÆÀÌÅÛ¸ô URL ÇϵåÄÚµù Ãß°¡
    if (true == LC_IsWE_Korea())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://metin2.co.kr/50_we_mall/mall/login.htm");
        return;
    }

    if (LC_IsJapan() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://mt2.oge.jp/itemmall/itemList.php");
        return;
    }
    
    if (LC_IsNewCIBN() == true && test_server)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://218.99.6.51/04_mall/mall/login.htm");
        return;
    }
    if (LC_IsSingapore() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://www.metin2.sg/ishop.php");
        return;
    }
    /*
    if (LC_IsCanada() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://mall.z8games.com/mall_entry.aspx?tb=m2");
        return;
    }*/

    if (LC_IsEurope() == true)
    {
        char country_code[3];

        switch (LC_GetLocalType())
        {
            case LC_GERMANY:    country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0'; break;
            case LC_FRANCE:        country_code[0] = 'f'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_ITALY:        country_code[0] = 'i'; country_code[1] = 't'; country_code[2] = '\0'; break;
            case LC_SPAIN:        country_code[0] = 'e'; country_code[1] = 's'; country_code[2] = '\0'; break;
            case LC_UK:            country_code[0] = 'e'; country_code[1] = 'n'; country_code[2] = '\0'; break;
            case LC_TURKEY:        country_code[0] = 't'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_POLAND:        country_code[0] = 'p'; country_code[1] = 'l'; country_code[2] = '\0'; break;
            case LC_PORTUGAL:    country_code[0] = 'p'; country_code[1] = 't'; country_code[2] = '\0'; break;
            case LC_GREEK:        country_code[0] = 'g'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_RUSSIA:        country_code[0] = 'r'; country_code[1] = 'u'; country_code[2] = '\0'; break;
            case LC_DENMARK:    country_code[0] = 'd'; country_code[1] = 'k'; country_code[2] = '\0'; break;
            case LC_BULGARIA:    country_code[0] = 'b'; country_code[1] = 'g'; country_code[2] = '\0'; break;
            case LC_CROATIA:    country_code[0] = 'h'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_MEXICO:        country_code[0] = 'm'; country_code[1] = 'x'; country_code[2] = '\0'; break;
            case LC_ARABIA:        country_code[0] = 'a'; country_code[1] = 'e'; country_code[2] = '\0'; break;
            case LC_CZECH:        country_code[0] = 'c'; country_code[1] = 'z'; country_code[2] = '\0'; break;
            case LC_ROMANIA:    country_code[0] = 'r'; country_code[1] = 'o'; country_code[2] = '\0'; break;
            case LC_HUNGARY:    country_code[0] = 'h'; country_code[1] = 'u'; country_code[2] = '\0'; break;
            case LC_NETHERLANDS: country_code[0] = 'n'; country_code[1] = 'l'; country_code[2] = '\0'; break;
            case LC_USA:        country_code[0] = 'u'; country_code[1] = 's'; country_code[2] = '\0'; break;
            case LC_CANADA:    country_code[0] = 'c'; country_code[1] = 'a'; country_code[2] = '\0'; break;
            default:
                if (test_server == true)
                {
                    country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0';
                }
                break;
        }

        char buf[512+1];
        char sas[33];
        MD5_CTX ctx;
        const char sas_key[] = "GF9001";

        snprintf(buf, sizeof(buf), "%u%u%s", ch->GetPlayerID(), ch->GetAID(), sas_key);

        MD5Init(&ctx);
        MD5Update(&ctx, (const unsigned char *) buf, strlen(buf));
#ifdef __FreeBSD__
        MD5End(&ctx, sas);
#else
        static const char hex[] = "0123456789abcdef";
        unsigned char digest[16];
        MD5Final(digest, &ctx);
        int i;
        for (i = 0; i < 16; ++i) {
            sas[i+i] = hex[digest[i] >> 4];
            sas[i+i+1] = hex[digest[i] & 0x0f];
        }
        sas[i+i] = '\0';
#endif

        snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d&sas=%s",
                g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id, sas);

        ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
    }
}

// ÁÖ»çÀ§
ACMD(do_dice)
{
    ch->ChatPacket(CHAT_TYPE_INFO, "Dice komudu bu serverde kullanilamaz.. ");
}

ACMD(do_click_mall)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeMallPassword");
}

ACMD(do_item_game_start){
    BYTE job = ch->GetJob();
    LPITEM item;
    for (int i = 0; i < 6; i++)
    {
        item = ch->GetWear(i);
        if (item != NULL)
            ch->UnequipItem(item);
    }
    item = ch->GetWear(WEAR_SHIELD);
    if (item != NULL)
        ch->UnequipItem(item);


    switch (job)
    {
    case JOB_SURA:
        {
        
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11609);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12489);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_WARRIOR:
        {
        
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11209);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12209 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_SHAMAN:
        {
        
            item = ITEM_MANAGER::instance().CreateItem(7009);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11809);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12629 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_ASSASSIN:
        {
        
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11409);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12349 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    }
}


ACMD(do_item_game_start_bonus)
{
    BYTE job = ch->GetJob();
    LPITEM item;


    switch (job)
    {
    case JOB_WARRIOR:
    case JOB_ASSASSIN:
    case JOB_SURA:
    case JOB_SHAMAN:
        {
            //  -- Kask Efsunlar©¥
            item = ch->GetWear(WEAR_HEAD);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_ATT_SPEED, 8);
                item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
                item->SetForceAttribute( 2, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 3, APPLY_DODGE, 15);
                item->SetForceAttribute( 4, APPLY_STEAL_HP, 10);
            }
            // -- Silah Efsunlar©¥
            item = ch->GetWear(WEAR_WEAPON);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_STR, 12);
                item->SetForceAttribute( 1, APPLY_CRITICAL_PCT, 10);
                item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 3, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 4, APPLY_STUN_PCT, 8);
            }
            // -- Kalkan Efsunlar©¥
            item = ch->GetWear(WEAR_SHIELD);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_CON, 12);
                item->SetForceAttribute( 1, APPLY_BLOCK, 15);
                item->SetForceAttribute( 2, APPLY_REFLECT_MELEE, 10);
                item->SetForceAttribute( 3, APPLY_IMMUNE_STUN, 1);
                item->SetForceAttribute( 4, APPLY_STR, 12);
            }
            //  -- Z©¥rh Efsunlar©¥
            item = ch->GetWear(WEAR_BODY);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_CAST_SPEED, 20);
                item->SetForceAttribute( 2, APPLY_STEAL_HP, 10);
                item->SetForceAttribute( 3, APPLY_REFLECT_MELEE, 10);
                item->SetForceAttribute( 4, APPLY_ATT_GRADE_BONUS, 50);
            }
            //  -- Ayakkab©¥ Efsunlar©¥
            item = ch->GetWear(WEAR_FOOTS);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
                item->SetForceAttribute( 2, APPLY_MOV_SPEED, 8);
                item->SetForceAttribute( 3, APPLY_ATT_SPEED, 8);
                item->SetForceAttribute( 4, APPLY_CRITICAL_PCT, 10);
            }
            //  -- Bilezik Efsunlar©¥
            item = ch->GetWear(WEAR_WRIST);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
                item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 3, APPLY_STEAL_HP, 10);
                item->SetForceAttribute( 4, APPLY_MANA_BURN_PCT, 10);
            }
            //  -- Kolye Efsunlar©¥
            item = ch->GetWear(WEAR_NECK);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
                item->SetForceAttribute( 2, APPLY_CRITICAL_PCT, 10);
                item->SetForceAttribute( 3, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 4, APPLY_STEAL_HP, 10);
            }
            //  -- Kupe Efsunlar©¥
            item = ch->GetWear(WEAR_EAR);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MOV_SPEED, 20);
                item->SetForceAttribute( 1, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 2, APPLY_POISON_REDUCE, 5);
                item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
                item->SetForceAttribute( 4, APPLY_ATTBONUS_UNDEAD, 20);
            }
        }
        break;
    }
}


ACMD(do_click_town)
{
    ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
}

ACMD(do_click_safebox)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeSafeboxPassword");
}

ACMD(do_ride)
{
    dev_log(LOG_DEB0, "[DO_RIDE] start");
    if (ch->IsDead() || ch->IsStun())
    return;

    {
    if (ch->IsHorseRiding())
    {
        dev_log(LOG_DEB0, "[DO_RIDE] stop riding");
        ch->StopRiding();
        return;
    }

    if (ch->GetMountVnum())
    {
        dev_log(LOG_DEB0, "[DO_RIDE] unmount");
        do_unmount(ch, NULL, 0, 0);
        return;
    }
    }

    {
    if (ch->GetHorse() != NULL)
    {
        dev_log(LOG_DEB0, "[DO_RIDE] start riding");
        ch->StartRiding();
        return;
    }

    for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i)
    {
        LPITEM item = ch->GetInventoryItem(i);
        if (NULL == item)
        continue;

        if (item->IsRideItem())
        {
            if (NULL==ch->GetWear(WEAR_UNIQUE1) || NULL==ch->GetWear(WEAR_UNIQUE2) || NULL==ch->GetWear(WEAR_COSTUME_MOUNT))
            {
                dev_log(LOG_DEB0, "[DO_RIDE] USE UNIQUE ITEM");
                ch->UseItem(TItemPos (INVENTORY, i));
                return;
            }
        }

        switch (item->GetVnum())
        {
        case 71114:
        case 71116:
        case 71118:
        case 71120:
            dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
            ch->UseItem(TItemPos (INVENTORY, i));
            return;
        }

        if( (item->GetVnum() > 52000) && (item->GetVnum() < 52091) )    {
            dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
            ch->UseItem(TItemPos (INVENTORY, i));
            return;
        }
    }
    }

    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?? ?? ??????."));
}

#ifdef __AUCTION__
// temp_auction
ACMD(do_get_item_id_list)
{
    for (int i = 0; i < INVENTORY_MAX_NUM; i++)
    {
        LPITEM item = ch->GetInventoryItem(i);
        if (item != NULL)
            ch->ChatPacket(CHAT_TYPE_INFO, "name : %s id : %d", item->GetProto()->szName, item->GetID());
    }
}

// temp_auction

ACMD(do_enroll_auction)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    char arg4[256];
    two_arguments (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3), arg4, sizeof(arg4));
    
    DWORD item_id = strtoul(arg1, NULL, 10);
    BYTE empire = strtoul(arg2, NULL, 10);
    int bidPrice = strtol(arg3, NULL, 10);
    int immidiatePurchasePrice = strtol(arg4, NULL, 10);

    LPITEM item = ITEM_MANAGER::instance().Find(item_id);
    if (item == NULL)
        return;

    AuctionManager::instance().enroll_auction(ch, item, empire, bidPrice, immidiatePurchasePrice);
}

ACMD(do_enroll_wish)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
    
    DWORD item_num = strtoul(arg1, NULL, 10);
    BYTE empire = strtoul(arg2, NULL, 10);
    int wishPrice = strtol(arg3, NULL, 10);

    AuctionManager::instance().enroll_wish(ch, item_num, empire, wishPrice);
}

ACMD(do_enroll_sale)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
    
    DWORD item_id = strtoul(arg1, NULL, 10);
    DWORD wisher_id = strtoul(arg2, NULL, 10);
    int salePrice = strtol(arg3, NULL, 10);

    LPITEM item = ITEM_MANAGER::instance().Find(item_id);
    if (item == NULL)
        return;

    AuctionManager::instance().enroll_sale(ch, item, wisher_id, salePrice);
}

// temp_auction
// packetÀ¸·Î Åë½ÅÇÏ°Ô Çϰí, ÀÌ°Ç »èÁ¦ÇؾßÇÑ´Ù.
ACMD(do_get_auction_list)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));

    AuctionManager::instance().get_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
}
//
//ACMD(do_get_wish_list)
//{
//    char arg1[256];
//    char arg2[256];
//    char arg3[256];
//    two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));
//
//    AuctionManager::instance().get_wish_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
//}
ACMD (do_get_my_auction_list)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_my_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_get_my_purchase_list)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_my_purchase_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_auction_bid)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().bid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_auction_impur)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().immediate_purchase (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_get_auctioned_item)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_buy_sold_item)
{
    char arg1[256];
    char arg2[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_cancel_auction)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_auction (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_cancel_wish)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_wish (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_cancel_sale)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_sale (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_rebid)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().rebid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_bid_cancel)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().bid_cancel (ch, strtoul(arg1, NULL, 10));
}
#endif

LPEVENT ruhtimer = NULL;

EVENTINFO(TMainEventInfo)
{
    LPCHARACTER    kim;   
    long skillindexx;   
    
    TMainEventInfo()
    : kim( NULL )
    , skillindexx( 0 )
    {
    }

} ;

EVENTFUNC(ruh_event)
{
    TMainEventInfo * info = dynamic_cast<TMainEventInfo *>(  event->info );

    if ( info == NULL )
    {
        sys_err( "ruh_event> <Factor> Null pointer" );
        return 0;
    }
    
    LPCHARACTER    ch = info->kim;
    long skillindex = info->skillindexx;
    
    if (NULL == ch || skillindex == 0)
        return 0;
    
    if(ch->CountSpecifyItem(50513) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhtasiyok"));
        return 0;
    }
    
    
    
    
    int skilllevel = ch->GetSkillLevel(skillindex);

    if (skilllevel >= 40)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhskillson"));
        return 0;
    }
    int gerekenderece = (1000+500*(skilllevel-30));
    int derecem = (ch->GetRealAlignment()/10);
    int sonuc = (-19000+gerekenderece);
    if (derecem < 0)
    {
        gerekenderece = gerekenderece*2;
        sonuc = (-19000-gerekenderece);
    }
    if (derecem > sonuc)
    {
        // int gerekliknk = sonuc-derecem;
        int gerekliknk = gerekenderece;
        int kactane = gerekliknk/500;
        if (kactane < 0)
        {
            kactane = 0 - kactane;
        }
        
        if (derecem < 0)
        {
            if (ch->CountSpecifyItem(70102) < kactane)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbitti %d"),kactane);
                return 0;
            }
            
            int delta = MIN(-(ch->GetAlignment()), 500);
            ch->UpdateAlignment(delta*kactane);
            ch->RemoveSpecifyItem(70102,kactane);
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbastim"));
        }
    }
        
    if(ch->GetQuestFlag("ruh.sure") > get_global_time())
    {
        if (ch->CountSpecifyItem(71001) < 1 )
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhsuredolmadi"));
            return 0;
        }
        else
        {
            ch->RemoveSpecifyItem(71001,1);
        }
            
    }
    
    if (ch->CountSpecifyItem(71094) >= 1)
    {
        ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
        ch->RemoveSpecifyItem(71094,1);
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhmunzevikullandim"));
    }
    
    if (gerekenderece < 0)
    {
        ch->UpdateAlignment(gerekenderece*10);
    }
    else
    {
        ch->UpdateAlignment(-gerekenderece*10);
    }
    ch->LearnGrandMasterSkill(skillindex);
    ch->RemoveSpecifyItem(50513,1);
    ch->SetQuestFlag("ruh.sure",get_global_time()+60*60*24);

    return 1;
}

ACMD(do_ruhoku)
{
    int gelen;
    long skillindex;
    char arg1[256], arg2[256];
    
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    str_to_number(gelen, arg1);
    str_to_number(skillindex, arg2);
    
    if (!ch)
        return;
 
    if (!ch->IsPC())
        return;
 
    if (ch->IsDead() || ch->IsStun())
        return;
 
    if (ch->IsHack())
        return;
    
    
    if(ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?? ???(??,??,??)?? ????? ??? ? ????."));
        return;
    }
    
    
    
    if(ch->CountSpecifyItem(50513) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhtasiyok"));
        return;
    }
    
    LPITEM slot1 = ch->GetWear(WEAR_UNIQUE1);
    LPITEM slot2 = ch->GetWear(WEAR_UNIQUE2);
    
    if (NULL != slot1)
    {
        if (slot1->GetVnum() == 70048)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pelerin_cikar"));
            return;
        }
    }
    if (NULL != slot2)
    {
        if (slot2->GetVnum() == 70048)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pelerin_cikar"));
            return;
        }
    }
    
    int skillgrup = ch->GetSkillGroup();
    if (skillgrup == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhokuyamazsin"));
        return;
    }
    
    
    
    if (gelen == 1) ///tek
    {
        int skilllevel = ch->GetSkillLevel(skillindex);
        int gerekenderece = (1000+500*(skilllevel-30));
        int derecem = (ch->GetRealAlignment()/10);
        int sonuc = (-19000+gerekenderece);
        
        if (ch->GetQuestFlag("ruh.yenisure") > get_global_time())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruh1sn"));
            return;
        }
        
        
        if (derecem < 0)
        {
            gerekenderece = gerekenderece*2;
            sonuc = (-19000-gerekenderece);
        }
        if (derecem > sonuc)
        {
            
            // int gerekliknk = sonuc-derecem;
            int gerekliknk = gerekenderece;
            int kactane = gerekliknk/500;
            if (kactane < 0)
            {
                kactane = 0 - kactane;
            }
            
            if (derecem < 0)
            {
                if (ch->CountSpecifyItem(70102) < kactane)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbitti %d"),kactane);
                    return;
                }
                
                int delta = MIN(-(ch->GetAlignment()), 500);
                ch->UpdateAlignment(delta*kactane);
                ch->RemoveSpecifyItem(70102,kactane);
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbastim"));
            }
        }

        
        if(ch->GetQuestFlag("ruh.sure") > get_global_time())
        {
            if (ch->CountSpecifyItem(71001) < 1 )
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhsuredolmadi"));
                return;
            }
            else
            {
                ch->RemoveSpecifyItem(71001,1);
            }
                
        }
        
        if (ch->CountSpecifyItem(71094) >= 1)
        {
            ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
            ch->RemoveSpecifyItem(71094,1);
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhmunzevikullandim"));
        }
        
        if (gerekenderece < 0)
        {
            ch->UpdateAlignment(gerekenderece*10);
        }
        else
        {
            ch->UpdateAlignment(-gerekenderece*10);
        }
        
        ch->LearnGrandMasterSkill(skillindex);
        ch->RemoveSpecifyItem(50513,1);
        ch->SetQuestFlag("ruh.sure",get_global_time()+60*60*24);
        ch->SetQuestFlag("ruh.yenisure",get_global_time()+1);
        

    }
    else if(gelen == 0) ///hepsi
    {
        
        if (ruhtimer)
        {
            event_cancel(&ruhtimer);
        }
        
        TMainEventInfo* info = AllocEventInfo<TMainEventInfo>();
        
        
        info->kim = ch;
        info->skillindexx = skillindex;
        ruhtimer = event_create(ruh_event, info, PASSES_PER_SEC(1));
    }
    return;
}

LPEVENT bktimer = NULL;

EVENTINFO(TMainEventInfo2)
{
    LPCHARACTER    kim;   
    long skillindexx;   
    
    TMainEventInfo2()
    : kim( NULL )
    , skillindexx( 0 )
    {
    }

} ;

EVENTFUNC(bk_event)
{
    TMainEventInfo2 * info = dynamic_cast<TMainEventInfo2 *>(  event->info );

    if ( info == NULL )
    {
        sys_err( "ruh_event> <Factor> Null pointer" );
        return 0;
    }
    
    LPCHARACTER    ch = info->kim;
    long skillindex = info->skillindexx;
    
    if (NULL == ch || skillindex == 0)
        return 0;
    
    if (!ch)
        return 0;
    
    if (ch)
    {
        if(ch->CountSpecifyItem(50300) < 1 )
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Beceri kitabın olmadan bu işlemi yapamazsin."));
            return 0;
        }
        
        
        int skilllevel = ch->GetSkillLevel(skillindex);
        if (skilllevel >= 30)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Yetenek son seviyeye ulasti."));
            return 0;
        }
        
        int dwVnum = ch->BKBul(skillindex);
        if (dwVnum == 999)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
            return 0;
        }
            
        LPITEM item = ch->GetInventoryItem(dwVnum);
        
        if (item->GetVnum() != 50300 || item->GetSocket(0) != skillindex)
        {
            return 0;
        }
        
        if (ch->CountSpecifyItem(71001) > 0)
        {
            if (!ch->IsAffectFlag(513))
            {
                ch->AddAffect(513, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71001,1);
            }
            
        }
        
        if (ch->CountSpecifyItem(71001) < 1)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Beceri kitabi okumaya devam etmek icin kotu ruh kovma kagidina ihtiyacin var."));
            return 0;
        }

        if (ch->CountSpecifyItem(71094) >= 1)
        {
            if (!ch->IsAffectFlag(512))
            {
                ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71094,1);
            }
        }
        if (item->GetVnum() == 50300)
        {
            if (true == ch->LearnSkillByBook(skillindex))
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
            }
            else
            {
                
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
                
                
            }
        }
        return 1;
    }
    return 0;   
}
ACMD(do_bkoku)
{
    
    int gelen;
    long skillindex;
    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    str_to_number(gelen, arg1);
    str_to_number(skillindex, arg2);
    
    if (!ch)
        return;
 
    if (!ch->IsPC())
        return;
 
    if (ch->IsDead() || ch->IsStun())
        return;
 
    if (ch->IsHack())
        return;
    
    if(ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Áß(â°í,±³È¯,»óÁ¡)¿¡´Â °³ÀλóÁ¡À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
    
    int skillgrup = ch->GetSkillGroup();
    if (skillgrup == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Becerilerini almadan bu islemi yapamazsin."));
        return;
    }
    
    
    
    if(ch->CountSpecifyItem(50300) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
        return;
    }
    
    
    if (gelen == 1) ///tek
    {
        int skilllevel = ch->GetSkillLevel(skillindex);

        if (skilllevel >= 30)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhskillson"));
            return;
        }
        
        if (ch->GetQuestFlag("bk.yenisure") > get_global_time())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Bir sonraki okuma icin 1 saniye beklemelisin."));
            return;
        }
        
        int dwVnum = ch->BKBul(skillindex);
        if (dwVnum == 999)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
            return;
        }
        
        LPITEM item = ch->GetInventoryItem(dwVnum);
        
        if (item->GetVnum() != 50300 || item->GetSocket(0) != skillindex)
        {
            return;
        }
        
        
        if (ch->CountSpecifyItem(71001) > 0)
        {
            if (!ch->IsAffectFlag(513))
            {
                ch->AddAffect(513, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71001,1);
            }
        }

        if (ch->CountSpecifyItem(71094) >= 1)
        {
            if (!ch->IsAffectFlag(512))
            {
                ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71094,1);
            }
        }
        if (item->GetVnum() == 50300)
        {
            
            
            if (ch->FindAffect(AFFECT_SKILL_NO_BOOK_DELAY) == false && ch->CountSpecifyItem(71001) < 1)
            {
                ch->SkillLearnWaitMoreTimeMessage(ch->GetSkillNextReadTime(skillindex) - get_global_time());
                return;
            }
            
            
            if (true == ch->LearnSkillByBook(skillindex))
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }   
            }
            else
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
            }
            ch->SetQuestFlag("bk.yenisure",get_global_time()+1);
        }
        
    }
    else if(gelen == 0) ///hepsi
    {
        if (bktimer)
        {
            event_cancel(&bktimer);
        }
        
        TMainEventInfo2* info = AllocEventInfo<TMainEventInfo2>();
        
        
        info->kim = ch;
        info->skillindexx = skillindex;
        bktimer = event_create(bk_event, info, PASSES_PER_SEC(1));
    }

    return;
}

ACMD(do_open_offline_shop)
{
    // olmusssun
    if (ch->IsDead())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Sekilde Bu Islemi Yapamazsin.");
        return;
    }

    // If character is exchanging with someone, return false
    if (ch->GetExchange())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character has a private shop, return false
    if (ch->GetMyShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character is look at one offline shop, return false
    if (ch->GetOfflineShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If cube window is open, return false
    if (ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If cube window is open, return false
    //if (ch->IsAcceOpen())
    //{
    //    ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
    //    return;
    //}

    // If character's safebox is open, return false
    if (ch->IsOpenSafebox())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character's shop window is open, return false
    if (ch->GetShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // Send the command to client.
    ch->ChatPacket(CHAT_TYPE_COMMAND, "OpenOfflineShop");
}

ACMD(do_search_cofres){
    
    int posicion = 0;
    bool g_item_cofres = false;
    const char *line;
    char arg1[256], arg2[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (0 == arg1[0])
        return;

    int slot = atoi(arg2);
    LPITEM    item = ch->GetItem(TItemPos(INVENTORY, slot));

    if(NULL == item){
        ch->ChatPacket(CHAT_TYPE_INFO,"[SearchBox]Error 000");
        return;
    }
    DWORD dwBoxVnum = item->GetVnum();
    std::vector <DWORD> dwVnums;
    std::vector <DWORD> dwCounts;
    std::vector <LPITEM> item_gets(NULL);
    int count = 0;

    std::vector <DWORD> dwVnums1;
    std::vector <DWORD> dwCounts1;
    std::vector <LPITEM> item_gets1(NULL);
    int count1 = 0;

    const std::string& strArg1 = std::string(arg1);

    if (ch->InformationSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
    {
        g_item_cofres = true;
    }

    if (g_item_cofres == false || dwBoxVnum == 50300){
        ch->ChatPacket(CHAT_TYPE_INFO,"[SearchBox]Este item no contiene items adentro.");
        return;
    }

    if (strArg1 == "search"){

        if (ch->InformationSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
        {
            for (int i = 0; i < count; i++)
            {
                ch->ChatPacket(CHAT_TYPE_COMMAND, "search_cofre_ids %d %d", dwVnums[i],dwCounts[i]);
            }
            ch->ChatPacket(CHAT_TYPE_COMMAND,"search_cofre_refresh");
        }
    }
    else if(strArg1 == "open"){
        if (item->GetType() == ITEM_TREASURE_BOX)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "[SearchBox]No puede abrir items que necesiten llaves");
            return;
        }
        if (ch->GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums1, dwCounts1, item_gets1, count1))
        {
            ch->RemoveSpecifyItem(dwBoxVnum, 1);
            for (int i = 0; i < count1; i++){
                switch (dwVnums1[i])
                {
                    case CSpecialItemGroup::GOLD:
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ha recibido %d de yang."), dwCounts1[i]);
                        break;
                    case CSpecialItemGroup::EXP:
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ha recibido %d de exp."), dwCounts1[i]);
                        break;
                }
            }
            ch->ChatPacket(CHAT_TYPE_COMMAND,"search_cofre_refresh_open");
        }

    }
}

ACMD(do_search_shop){

    const char *var;
    char arg1[255],arg2[255];
    var = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    int arg1_1 = atoi(arg1);
    int arg2_1 = atoi(arg2);

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Su argumento no es valido");
        return;
    }

    char szQuery1[1024];
    snprintf(szQuery1, sizeof(szQuery1),"SELECT * FROM player.offline_shop_npc");
    std::auto_ptr<SQLMsg> pMsg1(DBManager::Instance().DirectQuery(szQuery1));

    char szQuery[1024];
    char szQuery2[1024];
    char szQuery3[1024];
    char InsertSql[1024];

    int i_x = 0;
    int i_x_0 = 0;


    snprintf(szQuery3, sizeof(szQuery3),"SELECT * FROM player.offline_shop_search WHERE iid=%d",ch->GetPlayerID());
    std::auto_ptr<SQLMsg> pMsg3(DBManager::Instance().DirectQuery(szQuery3));
    if (pMsg3->Get()->uiNumRows > 0)
    {
        while (MYSQL_ROW row_vid = mysql_fetch_row(pMsg3->Get()->pSQLResult))
        {
            DWORD ID_Vid = 0;
            const char * Id_Vid_0 = row_vid[2];
            str_to_number(ID_Vid, Id_Vid_0);

            LPEVENT pkEvent = CTargetManager::instance().GetTargetEvent(ch->GetPlayerID(), ID_Vid, "_WorldArd_");
            if (pkEvent){
                CTargetManager::instance().DeleteTarget(ch->GetPlayerID(), ID_Vid, "_WorldArd_");
            }
        }
        DBManager::instance().DirectQuery("DELETE FROM player.offline_shop_search WHERE iid = %d", ch->GetPlayerID());
    }
    if (pMsg1->Get()->uiNumRows > 0){
        while (MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult))
        {
            DWORD ID_User = 0;
            const char * Id_User = row[0]; //iD Usuario
            str_to_number(ID_User, Id_User); //Convierte el vnum de string a numero entero

            snprintf(szQuery, sizeof(szQuery),"SELECT * FROM player.offline_shop_item WHERE vnum=%d and owner_id=%d",arg1_1,ID_User);
            std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery(szQuery));
            if (pMsg->Get()->uiNumRows > 0)
            {
                MYSQL_ROW row1 = mysql_fetch_row(pMsg->Get()->pSQLResult);

                DWORD ID_User_0 = 0;
                const char * Id_User_0 = row1[1];
                str_to_number(ID_User_0, Id_User_0);

                const char * Item_Gold_0 = row1[41]; //Gold Tablas
                int Gold_Item_0 = 0;
                str_to_number(Gold_Item_0, Item_Gold_0); //Convierte el vnum de string a numero entero

                if (arg2_1 > 0){
                    if (Gold_Item_0 <= arg2_1){

                        snprintf(szQuery2, sizeof(szQuery2),"SELECT * FROM player.offline_shop_npc WHERE owner_id=%d",ID_User_0);
                        std::auto_ptr<SQLMsg> pMsg2(DBManager::Instance().DirectQuery(szQuery2));
                        MYSQL_ROW row2 = mysql_fetch_row(pMsg2->Get()->pSQLResult);

                        const char * Posicion_X = row2[4]; //Posicion X
                        const char * Posicion_Y = row2[5]; //Posicion Y}
                        const char * Id_Owner = row2[0];

                        DWORD P_x = 0;
                        DWORD P_y = 0;
                        DWORD I_O = 0;
                        str_to_number(P_x, Posicion_X);
                        str_to_number(P_y, Posicion_Y);
                        str_to_number(I_O, Id_Owner);

                        CTargetManager::instance().CreateTarget(ch->GetPlayerID(),
                        I_O,
                        "_WorldArd_",
                        TARGET_TYPE_SHOP,
                        P_x,P_y,
                        ch->GetMapIndex());
                        
                        snprintf(InsertSql, sizeof(InsertSql), "INSERT INTO player.offline_shop_search (iid,vid) VALUES(%d,%d)", ch->GetPlayerID() , I_O);
                        std::auto_ptr<SQLMsg> pmsg4(DBManager::instance().DirectQuery(InsertSql));

                        ++i_x;
                    }
                }
                else{
                    snprintf(szQuery2, sizeof(szQuery2),"SELECT * FROM player.offline_shop_npc WHERE owner_id=%d",ID_User_0);
                    std::auto_ptr<SQLMsg> pMsg2(DBManager::Instance().DirectQuery(szQuery2));
                    MYSQL_ROW row2 = mysql_fetch_row(pMsg2->Get()->pSQLResult);

                    const char * Posicion_X = row2[4]; //Posicion X
                    const char * Posicion_Y = row2[5]; //Posicion Y}
                    const char * Id_Owner = row2[0];

                    DWORD P_x = 0;
                    DWORD P_y = 0;
                    DWORD I_O = 0;
                    str_to_number(P_x, Posicion_X);
                    str_to_number(P_y, Posicion_Y);
                    str_to_number(I_O, Id_Owner);

                    CTargetManager::instance().CreateTarget(ch->GetPlayerID(),
                    I_O,
                    "_WorldArd_",
                    TARGET_TYPE_SHOP,
                    P_x,P_y,
                    ch->GetMapIndex());
                        
                    snprintf(InsertSql, sizeof(InsertSql), "INSERT INTO player.offline_shop_search (iid,vid) VALUES(%d,%d)", ch->GetPlayerID() , I_O);
                    std::auto_ptr<SQLMsg> pmsg4(DBManager::instance().DirectQuery(InsertSql));

                    ++i_x;
                }
            }
        }
    }
    ch->SetIndexW(i_x);
}

Kod:
#include "stdafx.h"
#include "../../libgame/include/grid.h"
#include "constants.h"
#include "utils.h"
#include "config.h"
#include "shop.h"
#include "desc.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "item.h"
#include "item_manager.h"
#include "buffer_manager.h"
#include "packet.h"
#include "log.h"
#include "db.h"
#include "questmanager.h"
#include "monarch.h"
#include "mob_manager.h"
#include "locale_service.h"
#include "desc_client.h"
#include "shop_manager.h"
#include "group_text_parse_tree.h"
#include "shopEx.h"
#include <boost/algorithm/string/predicate.hpp>
#include "shop_manager.h"
#include <cctype>

CShopManager::CShopManager()
{
}

CShopManager::~CShopManager()
{
    Destroy();
}

bool CShopManager::Initialize(TShopTable * table, int size)
{
    if (!m_map_pkShop.empty())
        return false;

    int i;

    for (i = 0; i < size; ++i, ++table)
    {
        LPSHOP shop = M2_NEW CShop;

        if (!shop->Create(table->dwVnum, table->dwNPCVnum, table->items))
        {
            M2_DELETE(shop);
            continue;
        }

        m_map_pkShop.insert(TShopMap::value_type(table->dwVnum, shop));
        m_map_pkShopByNPCVnum.insert(TShopMap::value_type(table->dwNPCVnum, shop));
    }
    char szShopTableExFileName[256];

    snprintf(szShopTableExFileName, sizeof(szShopTableExFileName),
        "%s/shop_table_ex.txt", LocaleService_GetBasePath().c_str());

    return ReadShopTableEx(szShopTableExFileName);
}

void CShopManager::Destroy()
{
    TShopMap::iterator it = m_map_pkShop.begin();

    while (it != m_map_pkShop.end())
    {
        M2_DELETE(it->second);
        ++it;
    }

    m_map_pkShop.clear();
}

LPSHOP CShopManager::Get(DWORD dwVnum)
{
    TShopMap::const_iterator it = m_map_pkShop.find(dwVnum);

    if (it == m_map_pkShop.end())
        return NULL;

    return (it->second);
}

LPSHOP CShopManager::GetByNPCVnum(DWORD dwVnum)
{
    TShopMap::const_iterator it = m_map_pkShopByNPCVnum.find(dwVnum);

    if (it == m_map_pkShopByNPCVnum.end())
        return NULL;

    return (it->second);
}

/*
 * ÀÎÅÍÆäÀ̽º ÇÔ¼öµé
 */

// »óÁ¡ °Å·¡¸¦ ½ÃÀÛ
bool CShopManager::StartShopping(LPCHARACTER pkChr, LPCHARACTER pkChrShopKeeper, int iShopVnum)
{
    if (pkChr->GetShopOwner() == pkChrShopKeeper)
        return false;
    // this method is only for NPC
    if (pkChrShopKeeper->IsPC())
        return false;

    if (int(pkChr->GetQuestFlag("Kilit.Enable")) == 1)
    {
        pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return false;
    }

    //PREVENT_TRADE_WINDOW
    if (pkChr->IsOpenSafebox() || pkChr->GetExchange() || pkChr->GetMyShop() || pkChr->IsCubeOpen())
    {
        pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Ã¢ÀÌ ¿¸°»óÅ¿¡¼´Â »óÁ¡°Å·¡¸¦ ÇÒ¼ö °¡ ¾ø½À´Ï´Ù."));
        return false;
    }
    //END_PREVENT_TRADE_WINDOW

    // long distance = DISTANCE_APPROX(pkChr->GetX() - pkChrShopKeeper->GetX(), pkChr->GetY() - pkChrShopKeeper->GetY());

    // if (distance >= SHOP_MAX_DISTANCE)
    // {
        // sys_log(1, "SHOP: TOO_FAR: %s distance %d", pkChr->GetName(), distance);
        // return false;
    // }

    LPSHOP pkShop;

    if (iShopVnum)
        pkShop = Get(iShopVnum);
    else
        pkShop = GetByNPCVnum(pkChrShopKeeper->GetRaceNum());

    if (!pkShop)
    {
        sys_log(1, "SHOP: NO SHOP");
        return false;
    }

    bool bOtherEmpire = false;

    if (pkChr->GetEmpire() != pkChrShopKeeper->GetEmpire())
        bOtherEmpire = true;

    pkShop->AddGuest(pkChr, pkChrShopKeeper->GetVID(), bOtherEmpire);
    pkChr->SetShopOwner(pkChrShopKeeper);
    sys_log(0, "SHOP: START: %s", pkChr->GetName());
    return true;
}

LPSHOP CShopManager::FindPCShop(DWORD dwVID)
{
    TShopMap::iterator it = m_map_pkShopByPC.find(dwVID);

    if (it == m_map_pkShopByPC.end())
        return NULL;

    return it->second;
}

LPSHOP CShopManager::CreatePCShop(LPCHARACTER ch, TShopItemTable * pTable, BYTE bItemCount)
{
    if (FindPCShop(ch->GetVID()))
        return NULL;

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return false;
    }

    LPSHOP pkShop = M2_NEW CShop;
    pkShop->SetPCShop(ch);
    pkShop->SetShopItems(pTable, bItemCount);

    m_map_pkShopByPC.insert(TShopMap::value_type(ch->GetVID(), pkShop));
    return pkShop;
}

void CShopManager::DestroyPCShop(LPCHARACTER ch)
{
    LPSHOP pkShop = FindPCShop(ch->GetVID());

    if (!pkShop)
        return;

    //PREVENT_ITEM_COPY;
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY
    
    m_map_pkShopByPC.erase(ch->GetVID());
    M2_DELETE(pkShop);
}

// »óÁ¡ °Å·¡¸¦ Á¾·á
void CShopManager::StopShopping(LPCHARACTER ch)
{
    LPSHOP shop;

    if (!(shop = ch->GetShop()))
        return;

    //PREVENT_ITEM_COPY;
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY
    
    shop->RemoveGuest(ch);
    sys_log(0, "SHOP: END: %s", ch->GetName());
}

// ¾ÆÀÌÅÛ ±¸ÀÔ
void CShopManager::Buy(LPCHARACTER ch, BYTE pos)
{

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

#ifdef INVENTORY_PROTECT
    if (ch->Inventory_Protect() == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanter kilitli satin"));
        return;
    }
#endif

    if (!ch->GetShop())
        return;

    if (!ch->GetShopOwner())
        return;

    // if (DISTANCE_APPROX(ch->GetX() - ch->GetShopOwner()->GetX(), ch->GetY() - ch->GetShopOwner()->GetY()) > 2000)
    // {
        // ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»óÁ¡°úÀÇ °Å¸®°¡ ³Ê¹« ¸Ö¾î ¹°°ÇÀ» »ì ¼ö ¾ø½À´Ï´Ù."));
        // return;
    // }

    CShop* pkShop = ch->GetShop();

    if (!pkShop->IsPCShop())
    {
        //if (pkShop->GetVnum() == 0)
        //    return;
        //const CMob* pkMob = CMobManager::instance().Get(pkShop->GetNPCVnum());
        //if (!pkMob)
        //    return;

        //if (pkMob->m_table.bType != CHAR_TYPE_NPC)
        //{
        //    return;
        //}
    }
    else
    {
    }

    //PREVENT_ITEM_COPY
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY

    int ret = pkShop->Buy(ch, pos);

    if (SHOP_SUBHEADER_GC_OK != ret) // ¹®Á¦°¡ ÀÖ¾úÀ¸¸é º¸³½´Ù.
    {
        TPacketGCShop pack;

        pack.header    = HEADER_GC_SHOP;
        pack.subheader    = ret;
        pack.size    = sizeof(TPacketGCShop);

        ch->GetDesc()->Packet(&pack, sizeof(pack));
    }
}

void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount)
{
    if (!ch->GetShop())
        return;

    if (!ch->GetShopOwner())
        return;

    if (!ch->CanHandleItem())
        return;

    if (ch->GetShop()->IsPCShop())
        return;

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

    // if (DISTANCE_APPROX(ch->GetX()-ch->GetShopOwner()->GetX(), ch->GetY()-ch->GetShopOwner()->GetY())>2000)
    // {
        // ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»óÁ¡°úÀÇ °Å¸®°¡ ³Ê¹« ¸Ö¾î ¹°°ÇÀ» ÆÈ ¼ö ¾ø½À´Ï´Ù."));
        // return;
    // }
    
    LPITEM item = ch->GetInventoryItem(bCell);

    if (!item)
        return;

    if (item->IsEquipped() == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Âø¿ë ÁßÀÎ ¾ÆÀÌÅÛÀº ÆÇ¸ÅÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (true == item->isLocked())
    {
        return;
    }

    if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
        return;

    DWORD dwPrice;

    if (item->GetType() == ITEM_WEAPON || item->GetType() == ITEM_ARMOR || item->GetType() == ITEM_BELT)
    {
        char szEventFlag[30];
        snprintf(szEventFlag, sizeof(szEventFlag), "%d.Engel", item->GetID());
        if (*szEventFlag)
        {
            if (quest::CQuestManager::instance().GetEventFlag(szEventFlag))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("item_kilit_sat_engel"));
                return;
            }
        }
    }

    if (bCount == 0 || bCount > item->GetCount())
        bCount = item->GetCount();
    
    dwPrice = item->GetShopBuyPrice();

    if(dwPrice > item->GetGold())
        dwPrice=item->GetGold();

    if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
    {
        if (dwPrice == 0)
            dwPrice = bCount;
        else
            dwPrice = bCount / dwPrice;
    }
    else
        dwPrice *= bCount;

    dwPrice /= 5;
    
    //¼¼±İ °è»ê
    DWORD dwTax = 0;
    int iVal = 0;
    
    if (LC_IsYMIR() ||  LC_IsKorea())
    {
        dwTax = dwPrice * iVal / 100;
        dwPrice -= dwTax;
    }
    else
    {
        dwTax = dwPrice * iVal/100;
        dwPrice -= dwTax;
    }

    if (test_server)
        sys_log(0, "Sell Item price id %d %s itemid %d", ch->GetPlayerID(), ch->GetName(), item->GetID());

    const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice);

    if (GOLD_MAX <= nTotalMoney)
    {
        sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20¾ï³ÉÀÌ ÃʰúÇÏ¿© ¹°Ç°À» ÆÈ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    // 20050802.myevan.»óÁ¡ ÆÇ¸Å ·Î±×¿¡ ¾ÆÀÌÅÛ ID Ãß°¡
    sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", ch->GetName(), item->GetName(), bCount, item->GetID(), dwPrice);

    if (iVal > 0)
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆÇ¸Å±İ¾×ÀÇ %d %% °¡ ¼¼±İÀ¸·Î ³ª°¡°ÔµË´Ï´Ù"), iVal);

    DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);

    if (bCount == item->GetCount())
    {
        // Çѱ¹¿¡´Â ¾ÆÀÌÅÛÀ» ¹ö¸®°í º¹±¸Çش޶ó´Â Áø»óÀ¯ÀúµéÀÌ ¸¹¾Æ¼
        // »óÁ¡ ÆÇ¸Å½Ã ¼Ó¼º·Î±×¸¦ ³²±ä´Ù.
        if (LC_IsYMIR())
            item->AttrLog();

        ITEM_MANAGER::instance().RemoveItem(item, "SELL");
    }
    else
        item->SetCount(item->GetCount() - bCount);

    //±ºÁÖ ½Ã½ºÅÛ : ¼¼±İ ¡¼ö
    CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);

    ch->PointChange(POINT_GOLD, dwPrice, false);
}

bool CompareShopItemName(const SShopItemTable& lhs, const SShopItemTable& rhs)
{
    TItemTable* lItem = ITEM_MANAGER::instance().GetTable(lhs.vnum);
    TItemTable* rItem = ITEM_MANAGER::instance().GetTable(rhs.vnum);
    if (lItem && rItem)
        return strcmp(lItem->szLocaleName, rItem->szLocaleName) < 0;
    else
        return true;
}

bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
{
    if (!pNode->GetValue("vnum", 0, shopTable.dwVnum))
    {
        sys_err("Group %s does not have vnum.", pNode->GetNodeName().c_str());
        return false;
    }

    if (!pNode->GetValue("name", 0, shopTable.name))
    {
        sys_err("Group %s does not have name.", pNode->GetNodeName().c_str());
        return false;
    }
    
    if (shopTable.name.length() >= SHOP_TAB_NAME_MAX)
    {
        sys_err("Shop name length must be less than %d. Error in Group %s, name %s", SHOP_TAB_NAME_MAX, pNode->GetNodeName().c_str(), shopTable.name.c_str());
        return false;
    }

    std::string stCoinType;
    if (!pNode->GetValue("cointype", 0, stCoinType))
    {
        stCoinType = "Gold";
    }
    
    if (boost::iequals(stCoinType, "Gold"))
    {
        shopTable.coinType = SHOP_COIN_TYPE_GOLD;
    }
    else if (boost::iequals(stCoinType, "SecondaryCoin"))
    {
        shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN;
    }
    else
    {
        sys_err("Group %s has undefine cointype(%s).", pNode->GetNodeName().c_str(), stCoinType.c_str());
        return false;
    }

    CGroupNode* pItemGroup = pNode->GetChildNode("items");
    if (!pItemGroup)
    {
        sys_err("Group %s does not have 'group items'.", pNode->GetNodeName().c_str());
        return false;
    }

    int itemGroupSize = pItemGroup->GetRowCount();
    std::vector <TShopItemTable> shopItems(itemGroupSize);
    if (itemGroupSize >= SHOP_HOST_ITEM_MAX_NUM)
    {
        sys_err("count(%d) of rows of group items of group %s must be smaller than %d", itemGroupSize, pNode->GetNodeName().c_str(), SHOP_HOST_ITEM_MAX_NUM);
        return false;
    }

    for (int i = 0; i < itemGroupSize; i++)
    {
        if (!pItemGroup->GetValue(i, "vnum", shopItems[i].vnum))
        {
            sys_err("row(%d) of group items of group %s does not have vnum column", i, pNode->GetNodeName().c_str());
            return false;
        }
        
        if (!pItemGroup->GetValue(i, "count", shopItems[i].count))
        {
            sys_err("row(%d) of group items of group %s does not have count column", i, pNode->GetNodeName().c_str());
            return false;
        }
        if (!pItemGroup->GetValue(i, "price", shopItems[i].price))
        {
            sys_err("row(%d) of group items of group %s does not have price column", i, pNode->GetNodeName().c_str());
            return false;
        }
    }
    std::string stSort;
    if (!pNode->GetValue("sort", 0, stSort))
    {
        stSort = "None";
    }

    if (boost::iequals(stSort, "Asc"))
    {
        std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName);
    }
    else if(boost::iequals(stSort, "Desc"))
    {
        std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName);
    }

    CGrid grid = CGrid(10, 9);
    int iPos;

    memset(&shopTable.items[0], 0, sizeof(shopTable.items));

    for (int i = 0; i < shopItems.size(); i++)
    {
        TItemTable * item_table = ITEM_MANAGER::instance().GetTable(shopItems[i].vnum);
        if (!item_table)
        {
            sys_err("vnum(%d) of group items of group %s does not exist", shopItems[i].vnum, pNode->GetNodeName().c_str());
            return false;
        }

        iPos = grid.FindBlank(1, item_table->bSize);

        grid.Put(iPos, 1, item_table->bSize);
        shopTable.items[iPos] = shopItems[i];
    }

    shopTable.byItemCount = shopItems.size();
    return true;
}

bool CShopManager::ReadShopTableEx(const char* stFileName)
{
    // file À¯¹« üũ.
    // ¾ø´Â °æ¿ì´Â ¿¡·¯·Î ó¸®ÇÏÁö ¾Ê´Â´Ù.
    FILE* fp = fopen(stFileName, "rb");
    if (NULL == fp)
        return true;
    fclose(fp);

    CGroupTextParseTreeLoader loader;
    if (!loader.Load(stFileName))
    {
        sys_err("%s Load fail.", stFileName);
        return false;
    }

    CGroupNode* pShopNPCGroup = loader.GetGroup("shopnpc");
    if (NULL == pShopNPCGroup)
    {
        sys_err("Group ShopNPC is not exist.");
        return false;
    }

    typedef std::multimap <DWORD, TShopTableEx> TMapNPCshop;
    TMapNPCshop map_npcShop;
    for (int i = 0; i < pShopNPCGroup->GetRowCount(); i++)
    {
        DWORD npcVnum;
        std::string shopName;
        if (!pShopNPCGroup->GetValue(i, "npc", npcVnum) || !pShopNPCGroup->GetValue(i, "group", shopName))
        {
            sys_err("Invalid row(%d). Group ShopNPC rows must have 'npc', 'group' columns", i);
            return false;
        }
        std::transform(shopName.begin(), shopName.end(), shopName.begin(), (int(*)(int))std::tolower);
        CGroupNode* pShopGroup = loader.GetGroup(shopName.c_str());
        if (!pShopGroup)
        {
            sys_err("Group %s is not exist.", shopName.c_str());
            return false;
        }
        TShopTableEx table;
        if (!ConvertToShopItemTable(pShopGroup, table))
        {
            sys_err("Cannot read Group %s.", shopName.c_str());
            return false;
        }
        if (m_map_pkShopByNPCVnum.find(npcVnum) != m_map_pkShopByNPCVnum.end())
        {
            sys_err("%d cannot have both original shop and extended shop", npcVnum);
            return false;
        }
        
        map_npcShop.insert(TMapNPCshop::value_type(npcVnum, table));   
    }

    for (TMapNPCshop::iterator it = map_npcShop.begin(); it != map_npcShop.end(); ++it)
    {
        DWORD npcVnum = it->first;
        TShopTableEx& table = it->second;
        if (m_map_pkShop.find(table.dwVnum) != m_map_pkShop.end())
        {
            sys_err("Shop vnum(%d) already exists", table.dwVnum);
            return false;
        }
        TShopMap::iterator shop_it = m_map_pkShopByNPCVnum.find(npcVnum);
        
        LPSHOPEX pkShopEx = NULL;
        if (m_map_pkShopByNPCVnum.end() == shop_it)
        {
            pkShopEx = M2_NEW CShopEx;
            pkShopEx->Create(0, npcVnum);
            m_map_pkShopByNPCVnum.insert(TShopMap::value_type(npcVnum, pkShopEx));
        }
        else
        {
            pkShopEx = dynamic_cast <CShopEx*> (shop_it->second);
            if (NULL == pkShopEx)
            {
                sys_err("WTF!!! It can't be happend. NPC(%d) Shop is not extended version.", shop_it->first);
                return false;
            }
        }

        if (pkShopEx->GetTabCount() >= SHOP_TAB_COUNT_MAX)
        {
            sys_err("ShopEx cannot have tab more than %d", SHOP_TAB_COUNT_MAX);
            return false;
        }

        if (pkShopEx->GetVnum() != 0 && m_map_pkShop.find(pkShopEx->GetVnum()) != m_map_pkShop.end())
        {
            sys_err("Shop vnum(%d) already exist.", pkShopEx->GetVnum());
            return false;
        }
        m_map_pkShop.insert(TShopMap::value_type (pkShopEx->GetVnum(), pkShopEx));
        pkShopEx->AddShopTable(table);
    }

    return true;
}

Kod:
#ifndef __INC_METIN_II_GAME_SHOP_MANAGER_H__
#define __INC_METIN_II_GAME_SHOP_MANAGER_H__

class CShop;
typedef class CShop * LPSHOP;

class CShopManager : public singleton<CShopManager>
{
public:
    typedef std::map<DWORD, CShop *> TShopMap;

public:
    CShopManager();
    virtual ~CShopManager();

    bool    Initialize(TShopTable * table, int size);
    void    Destroy();

    LPSHOP    Get(DWORD dwVnum);
    LPSHOP    GetByNPCVnum(DWORD dwVnum);

    bool    StartShopping(LPCHARACTER pkChr, LPCHARACTER pkShopKeeper, int iShopVnum = 0);
    void    StopShopping(LPCHARACTER ch);

    void    Buy(LPCHARACTER ch, BYTE pos);
    void    Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount=0);

    LPSHOP    CreatePCShop(LPCHARACTER ch, TShopItemTable * pTable, BYTE bItemCount);
    LPSHOP    FindPCShop(DWORD dwVID);
    void    DestroyPCShop(LPCHARACTER ch);

private:
    TShopMap    m_map_pkShop;
    TShopMap    m_map_pkShopByNPCVnum;
    TShopMap    m_map_pkShopByPC;

    bool    ReadShopTableEx(const char* stFileName);
};

#endif
 
merhabalar uzaktan npc kurdum src yerindekileri ekliyorum ama hata alıyorum . Baska fileslar ile karsılastırdım . Arattığım kodlar onlarda yok zaten anlamadım ben sorunu bu konuda yardımcı olucak kişiler varmı lütfen ? Dünden beri bulamadım neyi yanlıs yaptığımıda anladım ama

İndirdiğim

Kod:
#include "stdafx.h"
#include "utils.h"
#include "config.h"
#include "char.h"
#include "locale_service.h"
#include "log.h"
#include "desc.h"

ACMD(do_user_horse_ride);
ACMD(do_user_horse_back);
ACMD(do_user_horse_feed);
ACMD(do_ruhoku);

ACMD(do_pcbang_update);
ACMD(do_pcbang_check);

// ADD_COMMAND_SLOW_STUN
ACMD(do_slow);
ACMD(do_stun);
#ifdef ENABLE_POLY_SHOP
ACMD(do_buy_marble);
#endif
// END_OF_ADD_COMMAND_SLOW_STUN

//black event
ACMD(event_new);
ACMD(event_aciyom);
//blackeventkapat

ACMD(do_warp);
ACMD(do_goto);
ACMD(do_item);
ACMD(do_mob);
ACMD(do_mob_ld);
ACMD(do_mob_aggresive);
ACMD(do_mob_coward);
ACMD(do_mob_map);
ACMD(do_purge);
#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
ACMD(do_remove_polymorph);
#endif
ACMD(do_weaken);
ACMD(do_item_purge);
ACMD(do_state);
ACMD(do_notice);
ACMD(do_map_notice);
ACMD(do_big_notice);
ACMD(do_broadcast_big_notice);
ACMD(do_who);
ACMD(do_user);
ACMD(do_disconnect);
ACMD(do_kill);
ACMD(do_emotion_allow);
ACMD(do_emotion);
ACMD(do_transfer);
ACMD(do_set);
ACMD(do_cmd);
ACMD(do_reset);
ACMD(do_greset);
ACMD(do_mount);
ACMD(do_fishing);
ACMD(do_refine_rod);
ACMD(do_bkoku);

// REFINE_PICK
ACMD(do_max_pick);
ACMD(do_refine_pick);
// END_OF_REFINE_PICK

ACMD(do_fishing_simul);
ACMD(do_console);
ACMD(do_restart);
ACMD(do_advance);
ACMD(do_stat);
ACMD(do_respawn);
ACMD(do_skillup);
ACMD(do_guildskillup);
ACMD(do_pvp);
ACMD(do_point_reset);
ACMD(do_safebox_size);
ACMD(do_safebox_close);
ACMD(do_safebox_password);
ACMD(do_safebox_change_password);
ACMD(do_mall_password);
ACMD(do_mall_close);
ACMD(do_ajanikov);
ACMD(do_ungroup);
ACMD(do_makeguild);
ACMD(do_deleteguild);
ACMD(do_shutdown);
ACMD(do_group);
ACMD(do_group_random);
ACMD(do_invisibility);
ACMD(do_event_flag);
ACMD(do_get_event_flag);
ACMD(do_private);
ACMD(do_qf);
ACMD(do_clear_quest);
ACMD(do_book);
ACMD(do_reload);
ACMD(do_war);
ACMD(do_nowar);
ACMD(do_setskill);
ACMD(do_setskillother);
ACMD(do_level);
ACMD(do_polymorph);
ACMD(do_polymorph_item);
/*
   ACMD(do_b1);
   ACMD(do_b2);
   ACMD(do_b3);
   ACMD(do_b4);
   ACMD(do_b5);
   ACMD(do_b6);
   ACMD(do_b7);
*/
ACMD(do_close_shop);
ACMD(do_set_walk_mode);
ACMD(do_set_run_mode);
ACMD(do_set_skill_group);
ACMD(do_set_skill_point);
ACMD(do_cooltime);
ACMD(do_detaillog);
ACMD(do_monsterlog);

ACMD(do_gwlist);
ACMD(do_stop_guild_war);
ACMD(do_cancel_guild_war);
ACMD(do_guild_state);

ACMD(do_pkmode);
ACMD(do_mobile);
ACMD(do_mobile_auth);
ACMD(do_messenger_auth);

ACMD(do_getqf);
ACMD(do_setqf);
ACMD(do_delqf);
ACMD(do_set_state);

ACMD(do_forgetme);
ACMD(do_aggregate);
ACMD(do_attract_ranger);
ACMD(do_pull_monster);
ACMD(do_setblockmode);
ACMD(do_priv_empire);
ACMD(do_priv_guild);
ACMD(do_mount_test);
ACMD(do_unmount);
ACMD(do_observer);
ACMD(do_observer_exit);
ACMD(do_socket_item);
ACMD(do_xmas);
ACMD(do_stat_minus);
ACMD(do_stat_reset);
ACMD(do_view_equip);
ACMD(do_block_chat);
ACMD(do_vote_block_chat);
ACMD(do_ban);
ACMD(do_sban);

// BLOCK_CHAT
ACMD(do_block_chat_list);
// END_OF_BLOCK_CHAT

ACMD(do_party_request);
ACMD(do_party_request_deny);
ACMD(do_party_request_accept);
ACMD(do_build);
ACMD(do_clear_land);

ACMD(do_horse_state);
ACMD(do_horse_level);
ACMD(do_horse_ride);
ACMD(do_horse_summon);
ACMD(do_horse_unsummon);
ACMD(do_horse_set_stat);

ACMD(do_save_attribute_to_image);
ACMD(do_affect_remove);

ACMD(do_change_attr);
ACMD(do_add_attr);
ACMD(do_add_socket);

ACMD(do_inputall)
{
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸í·É¾î¸¦ ¸ğµÎ ÀÔ·ÂÇϼ¼¿ä."));
}

ACMD(do_show_arena_list);
ACMD(do_end_all_duel);
ACMD(do_end_duel);
ACMD(do_duel);

ACMD(do_stat_plus_amount);

ACMD(do_break_marriage);

ACMD(do_oxevent_show_quiz);
ACMD(do_oxevent_log);
ACMD(do_oxevent_get_attender);

ACMD(do_effect);
ACMD(do_threeway_war_info );
ACMD(do_threeway_war_myinfo );
//
//±ºÁÖ Àü¿ë±â´É
ACMD(do_monarch_warpto);
ACMD(do_monarch_transfer);
ACMD(do_monarch_info);
ACMD(do_elect);
ACMD(do_monarch_tax);
ACMD(do_monarch_mob);
ACMD(do_monarch_notice);

//±ºÁÖ °ü¸® ±â´É
ACMD(do_rmcandidacy);
ACMD(do_setmonarch);
ACMD(do_rmmonarch);

ACMD(do_hair);
//gift notify quest command
ACMD(do_gift);
// Å¥ºê°ü·Ã
ACMD(do_inventory);
ACMD(do_cube);
ACMD(do_cards);
// °ø¼ºÀü
ACMD(do_siege);
ACMD(do_temp);
ACMD(do_frog);

ACMD(do_check_monarch_money);

ACMD(do_reset_subskill );
ACMD(do_flush);

ACMD(do_eclipse);
ACMD(do_weeklyevent);

ACMD(do_event_helper);

ACMD(do_in_game_mall);

ACMD(do_get_mob_count);

ACMD(do_dice);
ACMD(do_special_item);

ACMD(do_click_mall);
ACMD(do_click_safebox);
ACMD(do_click_town);
ACMD(do_item_game_start);
ACMD(do_item_game_start_bonus);

ACMD(do_ride);
ACMD(do_get_item_id_list);
ACMD(do_set_socket);
#ifdef __AUCTION__
// temp_auction ÀÓ½Ã
ACMD(do_get_auction_list);
ACMD (do_get_my_auction_list);
ACMD (do_get_my_purchase_list);
ACMD(do_get_item_id_list);
ACMD(do_enroll_auction);
ACMD (do_auction_bid);
ACMD (do_auction_impur);
ACMD (do_enroll_wish);
ACMD (do_enroll_sale);

ACMD (do_get_auctioned_item);
ACMD (do_buy_sold_item);
ACMD (do_cancel_auction);
ACMD (do_cancel_wish);
ACMD (do_cancel_sale);

ACMD (do_rebid);
ACMD (do_bid_cancel);
#endif
// ÄÚ½ºÃõ »óź¸±â ¹× ¹ş±â
ACMD(do_costume);
ACMD(do_set_stat);

// ¹«Àû
ACMD (do_can_dead);

ACMD (do_full_set);
// Á÷±º°ú ·¹º§¿¡ µû¸¥ ÃÖ°í ¾ÆÀÌÅÛ
ACMD (do_item_full_set);
// Á÷±º¿¡ µû¸¥ ÃÖ°í ¿É¼ÇÀÇ ¼Ó¼º ¼ÂÆÃ
ACMD (do_attr_full_set);
// ¸ğµç ½ºÅ³ ¸¶½ºÅÍ
ACMD (do_all_skill_master);
// ¾ÆÀÌÅÛ Âø¿ë. iconÀÌ ¾ø¾î Ŭ¶ó¿¡¼ È®ÀÎ ÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛ Âø¿ëÀ» À§ÇØ ¸¸µê.
ACMD (do_use_item);
ACMD (do_dragon_soul);
ACMD (do_ds_list);
ACMD (do_clear_affect);
ACMD (do_uzaktantic);
ACMD (do_uzakmarket);
ACMD (do_uzaksatici);
ACMD (do_weapon_rarity);
ACMD(do_search_cofres);
ACMD(do_open_offline_shop);
ACMD(do_kick_offline_shop);
ACMD(do_search_shop);
ACMD(do_name_offline_shop);

struct command_info cmd_info[] =
{
    { "!RESERVED!",    NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    }, /* ¹İµå½Ã ÀÌ °ÍÀÌ Ã³À½À̾î¾ß ÇÑ´Ù. */
    { "who",        do_who,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
#ifdef ENABLE_POLY_SHOP
    { "buy_marble_item", do_buy_marble, 0, POS_DEAD, GM_PLAYER },
#endif
#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
    { "remove_polymorph",    do_remove_polymorph,    0,        POS_DEAD,    GM_PLAYER    },
#endif
    { "war",        do_war,            0,            POS_DEAD,    GM_PLAYER    },
    { "warp",        do_warp,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "user",        do_user,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "notice",        do_notice,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "notice_map",    do_map_notice,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "big_notice",    do_big_notice,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "bt_text",    do_broadcast_big_notice,0,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "nowar",        do_nowar,        0,            POS_DEAD,    GM_PLAYER    },
    { "purge",        do_purge,        0,            POS_DEAD,    GM_WIZARD    },
    { "weaken",        do_weaken,        0,            POS_DEAD,    GM_GOD        },
    { "dc",        do_disconnect,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "transfer",    do_transfer,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "goto",        do_goto,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "level",        do_level,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "eventflag",    do_event_flag,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "geteventflag",    do_get_event_flag,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "item",        do_item,        0,            POS_DEAD,    GM_GOD        },

    { "mob",        do_mob,            0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mob_ld",        do_mob_ld,            0,            POS_DEAD,    GM_HIGH_WIZARD    }, /* ¸÷ÀÇ À§Ä¡¿Í ¹æÇâÀ» ¼³Á¤ÇØ ¼Òȯ /mob_ld vnum x y dir */
    { "ma",        do_mob_aggresive,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mc",        do_mob_coward,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mm",        do_mob_map,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "kill",        do_kill,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "ipurge",        do_item_purge,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "group",        do_group,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "grrandom",    do_group_random,    0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "set",        do_set,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "reset",        do_reset,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "greset",        do_greset,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "advance",    do_advance,        0,            POS_DEAD,    GM_GOD        },
    { "book",        do_book,        0,            POS_DEAD,    GM_IMPLEMENTOR  },

    { "console",    do_console,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "shutdow",    do_inputall,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "shutdown",    do_shutdown,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "stat",        do_stat,        0,            POS_DEAD,    GM_PLAYER    },
    { "stat-",        do_stat_minus,        0,            POS_DEAD,    GM_PLAYER    },
    { "stat_reset",    do_stat_reset,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "state",        do_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    // ADD_COMMAND_SLOW_STUN
    { "stun",        do_stun,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "slow",        do_slow,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    {"event_new",    event_new,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    {"event_aciyom",    event_aciyom,    0,        POS_DEAD,    GM_PLAYER        },
    // END_OF_ADD_COMMAND_SLOW_STUN

    { "respawn",    do_respawn,        0,            POS_DEAD,    GM_WIZARD    },

    { "makeguild",    do_makeguild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "deleteguild",    do_deleteguild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "mount",        do_mount,        0,            POS_MOUNTING,    GM_PLAYER    },
    { "restart_here",    do_restart,        SCMD_RESTART_HERE,    POS_DEAD,    GM_PLAYER    },
    { "restart_town",    do_restart,        SCMD_RESTART_TOWN,    POS_DEAD,    GM_PLAYER    },
    { "phase_selec",    do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "phase_select",    do_cmd,            SCMD_PHASE_SELECT,    POS_DEAD,    GM_PLAYER    },
    { "qui",        do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "quit",        do_cmd,            SCMD_QUIT,        POS_DEAD,    GM_PLAYER    },
    { "logou",        do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "logout",        do_cmd,            SCMD_LOGOUT,        POS_DEAD,    GM_PLAYER    },
    { "skillup",    do_skillup,        0,            POS_DEAD,    GM_PLAYER    },
    { "gskillup",    do_guildskillup,    0,            POS_DEAD,    GM_PLAYER    },
    { "pvp",        do_pvp,            0,            POS_DEAD,    GM_PLAYER    },
    { "safebox",    do_safebox_size,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "safebox_close",    do_safebox_close,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_passwor",do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_password",do_safebox_password,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_change_passwor", do_inputall,    0,            POS_DEAD,    GM_PLAYER    },
    { "safebox_change_password", do_safebox_change_password,    0,    POS_DEAD,    GM_PLAYER    },
    { "mall_passwor",    do_inputall,        0,            POS_DEAD,    GM_PLAYER    },
    { "mall_password",    do_mall_password,    0,            POS_DEAD,    GM_PLAYER    },
    { "mall_close",    do_mall_close,        0,            POS_DEAD,    GM_PLAYER    },

    // Group Command
    { "ungroup",    do_ungroup,        0,            POS_DEAD,    GM_PLAYER    },

    // REFINE_ROD_HACK_BUG_FIX
    { "refine_rod",    do_refine_rod,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    // END_OF_REFINE_ROD_HACK_BUG_FIX

    // REFINE_PICK
    { "refine_pick",    do_refine_pick,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "max_pick",    do_max_pick,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    // END_OF_REFINE_PICK

    { "fish_simul",    do_fishing_simul,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "invisible",    do_invisibility,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "qf",        do_qf,            0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "clear_quest",    do_clear_quest,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "close_shop",    do_close_shop,        0,            POS_DEAD,    GM_PLAYER    },

    { "set_walk_mode",    do_set_walk_mode,    0,            POS_DEAD,    GM_PLAYER    },
    { "set_run_mode",    do_set_run_mode,    0,            POS_DEAD,    GM_PLAYER    },
    { "setjob",do_set_skill_group,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "setskill",    do_setskill,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setskillother",    do_setskillother,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "setskillpoint",  do_set_skill_point,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "reload",        do_reload,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "cooltime",    do_cooltime,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "gwlist",        do_gwlist,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gwstop",        do_stop_guild_war,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gwcancel",    do_cancel_guild_war, 0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "gstate",        do_guild_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "pkmode",        do_pkmode,        0,            POS_DEAD,    GM_PLAYER    },
    { "messenger_auth",    do_messenger_auth,    0,            POS_DEAD,    GM_PLAYER    },

    { "getqf",        do_getqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setqf",        do_setqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "delqf",        do_delqf,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "set_state",    do_set_state,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "·Î±×¸¦º¸¿©Áà",    do_detaillog,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "¸ó½ºÅͺ¸¿©Áà",    do_monsterlog,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "detaillog",    do_detaillog,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "monsterlog",    do_monsterlog,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "forgetme",    do_forgetme,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "aggregate",    do_aggregate,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "attract_ranger",    do_attract_ranger,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "pull_monster",    do_pull_monster,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "setblockmode",    do_setblockmode,    0,            POS_DEAD,    GM_PLAYER    },
    { "polymorph",    do_polymorph,        0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "polyitem",    do_polymorph_item,    0,            POS_DEAD,    GM_HIGH_WIZARD },
    { "priv_empire",    do_priv_empire,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "priv_guild",    do_priv_guild,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "mount_test",    do_mount_test,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "unmount",    do_unmount,        0,            POS_DEAD,    GM_PLAYER    },
    { "private",    do_private,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "party_request",    do_party_request,    0,            POS_DEAD,    GM_PLAYER    },
    { "party_request_accept", do_party_request_accept,0,        POS_DEAD,    GM_PLAYER    },
    { "party_request_deny", do_party_request_deny,0,            POS_DEAD,    GM_PLAYER    },
    { "observer",    do_observer,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "observer_exit",    do_observer_exit,    0,            POS_DEAD,    GM_PLAYER    },
    { "socketitem",    do_socket_item,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "saveati",    do_save_attribute_to_image, 0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "xmas_boom",    do_xmas,        SCMD_XMAS_BOOM,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_snow",    do_xmas,        SCMD_XMAS_SNOW,        POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_santa",    do_xmas,        SCMD_XMAS_SANTA,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "xmas_muzik",    do_xmas,        SCMD_XMAS_MUZIK,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "view_equip",    do_view_equip,        0,            POS_DEAD,    GM_PLAYER       },
    { "jy",                do_block_chat,        0,            POS_DEAD,    GM_HIGH_WIZARD    },

    // BLOCK_CHAT
    { "vote_block_chat", do_vote_block_chat,        0,            POS_DEAD,    GM_PLAYER    },
    { "block_chat",        do_block_chat,        0,            POS_DEAD,    GM_PLAYER    },
    { "block_chat_list",do_block_chat_list,    0,            POS_DEAD,    GM_PLAYER    },
    { "ban", do_ban, 0, POS_DEAD, GM_IMPLEMENTOR },
    { "sban", do_sban, 0, POS_DEAD, GM_IMPLEMENTOR },
    // END_OF_BLOCK_CHAT

    { "build",        do_build,        0,        POS_DEAD,    GM_PLAYER    },
    { "clear_land", do_clear_land,    0,        POS_DEAD,    GM_HIGH_WIZARD    },

    { "affect_remove",    do_affect_remove,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "horse_state",    do_horse_state,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_level",    do_horse_level,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_ride",    do_horse_ride,        0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "ruhoku",    do_ruhoku,    0,    POS_DEAD,    GM_PLAYER    },
    { "horse_summon",    do_horse_summon,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_unsummon",    do_horse_unsummon,    0,            POS_DEAD,    GM_HIGH_WIZARD    },
    { "horse_set_stat", do_horse_set_stat,    0,            POS_DEAD,    GM_HIGH_WIZARD    },

    { "pcbang_update",     do_pcbang_update,    0,            POS_DEAD,    GM_LOW_WIZARD    },
    { "pcbang_check",     do_pcbang_check,    0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "emotion_allow",    do_emotion_allow,    0,            POS_FIGHTING,    GM_PLAYER    },
    { "kiss",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "slap",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "french_kiss",    do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "clap",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "cheer1",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "cheer2",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },

    // DANCE
    { "dance1",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance2",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance3",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance4",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance5",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    { "dance6",        do_emotion,        0,            POS_FIGHTING,    GM_PLAYER    },
    // END_OF_DANCE

    { "congratulation",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "forgive",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "angry",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "attractive",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "sad",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "shy",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "cheerup",    do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "banter",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },
    { "joy",        do_emotion,    0,    POS_FIGHTING,    GM_PLAYER    },


    { "change_attr",    do_change_attr,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "add_attr",    do_add_attr,        0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "add_socket",    do_add_socket,        0,            POS_DEAD,    GM_IMPLEMENTOR    },

    { "user_horse_ride",    do_user_horse_ride,        0,        POS_FISHING,    GM_PLAYER    },
    { "user_horse_back",    do_user_horse_back,        0,        POS_FISHING,    GM_PLAYER    },
    { "user_horse_feed",    do_user_horse_feed,        0,        POS_FISHING,    GM_PLAYER    },

    { "show_arena_list",    do_show_arena_list,        0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "end_all_duel",        do_end_all_duel,        0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "end_duel",            do_end_duel,            0,        POS_DEAD,    GM_LOW_WIZARD    },
    { "duel",                do_duel,                0,        POS_DEAD,    GM_LOW_WIZARD    },

    { "con+",            do_stat_plus_amount,    POINT_HT,    POS_DEAD,    GM_LOW_WIZARD    },
    { "int+",            do_stat_plus_amount,    POINT_IQ,    POS_DEAD,    GM_LOW_WIZARD    },
    { "str+",            do_stat_plus_amount,    POINT_ST,    POS_DEAD,    GM_LOW_WIZARD    },
    { "dex+",            do_stat_plus_amount,    POINT_DX,    POS_DEAD,    GM_LOW_WIZARD    },

    { "break_marriage",    do_break_marriage,        0,            POS_DEAD,    GM_LOW_WIZARD    },

    { "show_quiz",            do_oxevent_show_quiz,    0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "log_oxevent",        do_oxevent_log,            0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "get_oxevent_att",    do_oxevent_get_attender,0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "effect",                do_effect,                0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "threeway_info",        do_threeway_war_info,    0,    POS_DEAD,    GM_LOW_WIZARD},
    { "threeway_myinfo",    do_threeway_war_myinfo, 0,    POS_DEAD,    GM_LOW_WIZARD},
    { "mto",                do_monarch_warpto,        0,     POS_DEAD,    GM_PLAYER},
    { "mtr",                do_monarch_transfer,    0,    POS_DEAD,    GM_PLAYER},
    { "minfo",        do_monarch_info,        0,  POS_DEAD,   GM_PLAYER},  
    { "mtax",            do_monarch_tax,            0,    POS_DEAD,    GM_PLAYER},
    { "mmob",            do_monarch_mob,            0,     POS_DEAD,    GM_PLAYER},
    { "elect",                do_elect,                0,    POS_DEAD,    GM_HIGH_WIZARD},
    { "rmcandidacy",        do_rmcandidacy,            0,     POS_DEAD,    GM_LOW_WIZARD},
    { "setmonarch",            do_setmonarch,            0,     POS_DEAD,    GM_LOW_WIZARD},
    { "rmmonarch",            do_rmmonarch,            0,     POS_DEAD,     GM_LOW_WIZARD},
    { "hair",                do_hair,                0,    POS_DEAD,    GM_PLAYER    },
    { "inventory",            do_inventory,            0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "cube",                do_cube,                0,    POS_DEAD,    GM_PLAYER    },
    { "cards",                do_cards,                0,    POS_DEAD,    GM_PLAYER    },
    { "siege",                do_siege,                0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "temp",                do_temp,                0,    POS_DEAD,    GM_IMPLEMENTOR    },
    { "frog",                do_frog,                0,    POS_DEAD,    GM_HIGH_WIZARD    },
    { "check_mmoney",        do_check_monarch_money,    0,    POS_DEAD,    GM_IMPLEMENTOR    },
    { "reset_subskill",        do_reset_subskill,        0,    POS_DEAD,    GM_HIGH_WIZARD },
    { "flush",                do_flush,                0,    POS_DEAD,    GM_IMPLEMENTOR },
    { "gift",                do_gift,                0,  POS_DEAD,   GM_PLAYER    },    //gift

    { "mnotice",            do_monarch_notice,        0,    POS_DEAD,    GM_PLAYER    },
   
    { "eclipse",            do_eclipse,                0,    POS_DEAD,    GM_HIGH_WIZARD    },

    { "weeklyevent",        do_weeklyevent,            0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "eventhelper",        do_event_helper,        0,    POS_DEAD,    GM_HIGH_WIZARD    },

    { "in_game_mall",        do_in_game_mall,        0,    POS_DEAD,    GM_PLAYER    },

    { "get_mob_count",        do_get_mob_count,        0,    POS_DEAD,    GM_LOW_WIZARD    },

    { "dice",                do_dice,                0,    POS_DEAD,    GM_PLAYER        },
    { "ÁÖ»çÀ§",                do_dice,                0,    POS_DEAD,    GM_PLAYER        },
    { "special_item",            do_special_item,    0,    POS_DEAD,    GM_IMPLEMENTOR        },

    { "click_safebox",        do_click_safebox,        0,    POS_DEAD,    GM_PLAYER        },
    { "click_mall",            do_click_mall,            0,    POS_DEAD,    GM_PLAYER        },
    { "click_town",            do_click_town,            0,    POS_DEAD,    GM_PLAYER        },
    { "item_game_start",    do_item_game_start,            0,    POS_DEAD,    GM_PLAYER        },
    { "item_game_start_bonus",    do_item_game_start_bonus,        0,    POS_DEAD,    GM_PLAYER        },
   
    { "ride",                do_ride,                0,    POS_DEAD,    GM_PLAYER    },

    { "item_id_list",    do_get_item_id_list,    0,    POS_DEAD,    GM_LOW_WIZARD    },
    { "set_socket",        do_set_socket,            0,    POS_DEAD,    GM_LOW_WIZARD    },
#ifdef __AUCTION__
    // auction ÀÓ½Ã
    { "auction_list",    do_get_auction_list,    0,    POS_DEAD,    GM_PLAYER    },
    { "my_auction_list", do_get_my_auction_list, 0, POS_DEAD,    GM_PLAYER    },
    { "my_purchase_list", do_get_my_purchase_list, 0, POS_DEAD,    GM_PLAYER    },


    { "enroll_auction",        do_enroll_auction,         0,    POS_DEAD,    GM_PLAYER    },
    { "bid", do_auction_bid,     0,    POS_DEAD,    GM_PLAYER    },
    { "impur", do_auction_impur,     0,    POS_DEAD,    GM_PLAYER    },
    { "enroll_wish", do_enroll_wish,     0,    POS_DEAD,    GM_PLAYER    },
    { "enroll_sale", do_enroll_sale,     0,    POS_DEAD,    GM_PLAYER    },
    { "get_auctioned_item", do_get_auctioned_item,     0,    POS_DEAD,    GM_PLAYER    },
    { "buy_sold_item", do_buy_sold_item,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_auction", do_cancel_auction,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_wish", do_cancel_wish,     0,    POS_DEAD,    GM_PLAYER    },
    { "cancel_sale", do_cancel_sale,     0,    POS_DEAD,    GM_PLAYER    },
    { "rebid", do_rebid,     0,    POS_DEAD,    GM_PLAYER    },
    { "bid_cancel", do_bid_cancel,     0,    POS_DEAD,    GM_PLAYER    },
   
#endif
    { "costume",            do_costume,             0,    POS_DEAD,    GM_PLAYER    },

    { "tcon",            do_set_stat,    POINT_HT,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tint",            do_set_stat,    POINT_IQ,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tstr",            do_set_stat,    POINT_ST,    POS_DEAD,    GM_LOW_WIZARD    },
    { "tdex",            do_set_stat,    POINT_DX,    POS_DEAD,    GM_LOW_WIZARD    },

    { "cannot_dead",            do_can_dead,    1,    POS_DEAD,        GM_LOW_WIZARD},
    { "can_dead",                do_can_dead,    0,    POS_DEAD,        GM_LOW_WIZARD},

    { "full_set",    do_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "item_full_set",    do_item_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "attr_full_set",    do_attr_full_set, 0, POS_DEAD,        GM_LOW_WIZARD},
    { "all_skill_master",    do_all_skill_master,    0,    POS_DEAD,    GM_LOW_WIZARD},
    { "use_item",        do_use_item,    0, POS_DEAD,        GM_LOW_WIZARD},

    { "dragon_soul",                do_dragon_soul,                0,    POS_DEAD,    GM_PLAYER    },
    { "ds_list",                do_ds_list,                0,    POS_DEAD,    GM_PLAYER    },
    { "do_clear_affect", do_clear_affect,     0, POS_DEAD,        GM_LOW_WIZARD},
#ifdef ENABLE_OFFLINE_SHOP_SYSTEM
    { "open_offlineshop", do_open_offline_shop, 0, POS_DEAD, GM_PLAYER        },
    { "kick_offlineshop", do_kick_offline_shop, 0, POS_DEAD, GM_IMPLEMENTOR },
#endif
    { "uzaktantic",            do_uzaktantic,            0,    POS_DEAD,    GM_PLAYER },
    { "uzakmarket",            do_uzakmarket,            0,    POS_DEAD,    GM_PLAYER },
    { "uzaksatici",            do_uzaksatici,            0,    POS_DEAD,    GM_PLAYER },
    { "weapon_rarity",            do_weapon_rarity,            0,    POS_DEAD,    GM_LOW_WIZARD },
    { "search_cofres",            do_search_cofres,            0,    POS_DEAD,    GM_PLAYER    },
    { "search_shop",                do_search_shop,            0,            POS_DEAD,        GM_PLAYER       },
    { "name_offlineshop",             do_name_offline_shop,   0,             POS_DEAD,         GM_IMPLEMENTOR },
    { "ajanikov",    do_ajanikov,        0,            POS_DEAD,    GM_PLAYER    },
    { "bkoku",    do_bkoku,    0,    POS_DEAD,    GM_PLAYER    },

    { "\n",        NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    }  /* ¹İµå½Ã ÀÌ °ÍÀÌ ¸¶Áö¸·À̾î¾ß ÇÑ´Ù. */
};

void interpreter_set_privilege(const char *cmd, int lvl)
{
    int i;

    for (i = 0; *cmd_info[i].command != '\n'; ++i)
    {
        if (!str_cmp(cmd, cmd_info[i].command))
        {
            cmd_info[i].gm_level = lvl;
            sys_log(0, "Setting command privilege: %s -> %d", cmd, lvl);
            break;
        }
    }
}

void double_dollar(const char *src, size_t src_len, char *dest, size_t dest_len)
{      
    const char * tmp = src;
    size_t cur_len = 0;

    // \0 ³ÖÀ» ÀÚ¸® È®º¸
    dest_len -= 1;

    while (src_len-- && *tmp)
    {
        if (*tmp == '$')
        {
            if (cur_len + 1 >= dest_len)
                break;

            *(dest++) = '$';
            *(dest++) = *(tmp++);
            cur_len += 2;
        }
        else
        {
            if (cur_len >= dest_len)
                break;

            *(dest++) = *(tmp++);
            cur_len += 1;
        }
    }

    *dest = '\0';
}

void interpret_command(LPCHARACTER ch, const char * argument, size_t len)
{
    if (NULL == ch)
    {
        sys_err ("NULL CHRACTER");
        return ;
    }

    char cmd[128 + 1];  // buffer overflow ¹®Á¦°¡ »ı±âÁö ¾Êµµ·Ï ÀϺη¯ ±æÀ̸¦ ª°Ô ÀâÀ½
    char new_line[256 + 1];
    const char * line;
    int icmd;

    if (len == 0 || !*argument)
        return;

    double_dollar(argument, len, new_line, sizeof(new_line));

    size_t cmdlen;
    line = first_cmd(new_line, cmd, sizeof(cmd), &cmdlen);

    for (icmd = 1; *cmd_info[icmd].command != '\n'; ++icmd)
    {
        if (cmd_info[icmd].command_pointer == do_cmd)
        {
            if (!strcmp(cmd_info[icmd].command, cmd)) // do_cmd´Â ¸ğµç ¸í·É¾î¸¦ ÃÄ¾ß ÇÒ ¼ö ÀÖ´Ù.
                break;
        }
        else if (!strncmp(cmd_info[icmd].command, cmd, cmdlen))
            break;
    }

    if (ch->GetPosition() < cmd_info[icmd].minimum_position)
    {
        switch (ch->GetPosition())
        {
            case POS_MOUNTING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ź »óÅ¿¡¼´Â ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                break;

            case POS_DEAD:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾²·¯Áø »óÅ¿¡¼´Â ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                break;

            case POS_SLEEPING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("²Ş¼Ó¿¡¼ ¾î¶»°Ô¿ä?"));
                break;

            case POS_RESTING:
            case POS_SITTING:
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸ÕÀú ÀÏ¾î ³ª¼¼¿ä."));
                break;
                /*
                   case POS_FIGHTING:
                   ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸ñ¼ûÀ» °É°í ÀüÅõ Áß ÀÔ´Ï´Ù. ÁıÁß Çϼ¼¿ä."));
                   break;
                 */
            default:
                sys_err("unknown position %d", ch->GetPosition());
                break;
        }

        return;
    }

    if (*cmd_info[icmd].command == '\n')
    {  
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±×·± ¸í·É¾î´Â ¾ø½À´Ï´Ù"));
        return;
    }

    if (cmd_info[icmd].gm_level && cmd_info[icmd].gm_level > ch->GetGMLevel())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±×·± ¸í·É¾î´Â ¾ø½À´Ï´Ù"));
        return;
    }

    if (strncmp("phase", cmd_info[icmd].command, 5) != 0) // È÷µç ¸í·É¾î ó¸®
        sys_log(0, "COMMAND: %s: %s", ch->GetName(), cmd_info[icmd].command);

    ((*cmd_info[icmd].command_pointer) (ch, line, icmd, cmd_info[icmd].subcmd));

    if (ch->GetGMLevel() >= GM_LOW_WIZARD)
    {
        if (cmd_info[icmd].gm_level >= GM_LOW_WIZARD)
        {
            if (LC_IsEurope() == true || /*LC_IsNewCIBN() == true || */LC_IsCanada() == true || LC_IsBrazil() == true)
            {
                char buf[1024];
                snprintf( buf, sizeof(buf), "%s", argument );

                LogManager::instance().GMCommandLog(ch->GetPlayerID(), ch->GetName(), ch->GetDesc()->GetHostName(), g_bChannel, buf);
            }
        }
    }
}

Kod:
#include "stdafx.h"
#ifdef __FreeBSD__
#include <md5.h>
#else
#include "../../libthecore/include/xmd5.h"
#endif

#include "utils.h"
#include "config.h"
#include "desc_client.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "motion.h"
#include "packet.h"
#include "affect.h"
#include "pvp.h"
#include "start_position.h"
#include "party.h"
#include "guild_manager.h"
#include "p2p.h"
#include "dungeon.h"
#include "messenger_manager.h"
#include "war_map.h"
#include "questmanager.h"
#include "item_manager.h"
#include "monarch.h"
#include "mob_manager.h"
#include "dev_log.h"
#include "item.h"
#include "arena.h"
#include "buffer_manager.h"
#include "unique_item.h"
#include "threeway_war.h"
#include "log.h"
#include "../../common/VnumHelper.h"
#ifdef __AUCTION__
#include "auction_manager.h"
#endif
#include "offlineshop_manager.h"
#include "target.h"

extern int g_server_id;

extern int g_nPortalLimitTime;


ACMD(do_ajanikov)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Gereksiz islem yapmayin.");
        return;
    }
    if (!ch->GetWarMap())
        return;

    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
    if (!tch)
        return;
    if (!tch->IsPC())
        return;  
    if (ch == tch)
        return;
    if (!tch->GetGuild())
        return;  
    if (!ch->GetGuild())
        return;
    if (tch->GetGuild()->GetID() != ch->GetGuild()->GetID())
        return;
    CGuild* loncam = CGuildManager::instance().FindGuild(ch->GetGuild()->GetID());
    CGuild* loncan = CGuildManager::instance().FindGuild(tch->GetGuild()->GetID());
    if ((loncam == NULL) || (loncan == NULL))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Loncan yok");
    }
    else
    {
        if (loncan->GetMasterPID() == ch->GetPlayerID())
        {
            if (loncam->RequestRemoveMember(tch->GetPlayerID()))
            {
                ch->ChatPacket(CHAT_TYPE_GUILD, "%s ajan olarak secilip kovuldu.", tch->GetName());
                tch->GoHome();
                return;
            }
            else
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Hata.");
                return;
            }
        }
        else
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Lonca Lideri Olman Gerekiyor");
            return;
        }
    }
    return;
}

ACMD(do_user_horse_ride)
{
    int arrayMapIndexBlocked[] = {
        113, 1100000, 1120000, 72, 200, 182, 183, 31, 48, // map index kodu
    };

    for (int idxMapIndex = 0; idxMapIndex < _countof(arrayMapIndexBlocked); idxMapIndex++)
    {
        if (ch->GetMapIndex() == arrayMapIndexBlocked[idxMapIndex])
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Bu haritada binek kullan©¥ma Kapal©¥d©¥r..");
            return;
        }
    }
   
    if (ch->IsObserverMode())
        return;

    if (ch->IsDead() || ch->IsStun())
        return;

    if (ch->IsHorseRiding() == false)
    {
        // ¸»ÀÌ ¾Æ´Ñ ´Ù¸¥Å»°ÍÀ» Ÿ°íÀÖ´Ù.
        if (ch->GetMountVnum())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì Å»°ÍÀ» ÀÌ¿ëÁßÀÔ´Ï´Ù."));
            return;
        }

        if (ch->GetHorse() == NULL)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
            return;
        }

        ch->StartRiding();
    }
    else
    {
        ch->StopRiding();
    }
}

ACMD(do_user_horse_back)
{
    if (ch->GetHorse() != NULL)
    {
        ch->HorseSummon(false);
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» µ¹·Áº¸³Â½À´Ï´Ù."));
    }
    else if (ch->IsHorseRiding() == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»¿¡¼ ¸ÕÀú ³»·Á¾ß ÇÕ´Ï´Ù."));
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
    }
}

ACMD(do_user_horse_feed)
{
    // °³ÀλóÁ¡À» ¿¬ »óÅ¿¡¼´Â ¸» ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø´Ù.
    if (ch->GetMyShop())
        return;

    if (ch->GetHorse() == NULL)
    {
        if (ch->IsHorseRiding() == false)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ¸ÕÀú ¼ÒÈ¯ÇØÁÖ¼¼¿ä."));
        else
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼´Â ¸ÔÀ̸¦ ÁÙ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    DWORD dwFood = ch->GetHorseGrade() + 50054 - 1;

    if (ch->CountSpecifyItem(dwFood) > 0)
    {
        ch->RemoveSpecifyItem(dwFood, 1);
        ch->FeedHorse();
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»¿¡°Ô %s%s ÁÖ¾ú½À´Ï´Ù."),
                ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName,
                g_iUseLocale ? "" : under_han(ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName) ? LC_TEXT("À»") : LC_TEXT("¸¦"));
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¾ÆÀÌÅÛÀÌ ÇÊ¿äÇÕ´Ï´Ù"), ITEM_MANAGER::instance().GetTable(dwFood)->szLocaleName);
    }
}

#define MAX_REASON_LEN        128

EVENTINFO(TimedEventInfo)
{
    DynamicCharacterPtr ch;
    int        subcmd;
    int             left_second;
    char        szReason[MAX_REASON_LEN];

    TimedEventInfo()
    : ch()
    , subcmd( 0 )
    , left_second( 0 )
    {
        ::memset( szReason, 0, MAX_REASON_LEN );
    }
};

struct SendDisconnectFunc
{
    void operator () (LPDESC d)
    {
        if (d->GetCharacter())
        {
            if (d->GetCharacter()->GetGMLevel() == GM_PLAYER)
                d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "quit Shutdown(SendDisconnectFunc)");
        }
    }
};

struct DisconnectFunc
{
    void operator () (LPDESC d)
    {
        if (d->GetType() == DESC_TYPE_CONNECTOR)
            return;

        if (d->IsPhase(PHASE_P2P))
            return;

        if (d->GetCharacter())
            d->GetCharacter()->Disconnect("Shutdown(DisconnectFunc)");

        d->SetPhase(PHASE_CLOSE);
    }
};

EVENTINFO(shutdown_event_data)
{
    int seconds;

    shutdown_event_data()
    : seconds( 0 )
    {
    }
};

EVENTFUNC(shutdown_event)
{
    shutdown_event_data* info = dynamic_cast<shutdown_event_data*>( event->info );

    if ( info == NULL )
    {
        sys_err( "shutdown_event> <Factor> Null pointer" );
        return 0;
    }

    int * pSec = & (info->seconds);

    if (*pSec < 0)
    {
        sys_log(0, "shutdown_event sec %d", *pSec);

        if (--*pSec == -10)
        {
            const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
            std::for_each(c_set_desc.begin(), c_set_desc.end(), DisconnectFunc());
            return passes_per_sec;
        }
        else if (*pSec < -10)
            return 0;

        return passes_per_sec;
    }
    else if (*pSec == 0)
    {
        const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet();
        std::for_each(c_set_desc.begin(), c_set_desc.end(), SendDisconnectFunc());
        g_bNoMoreClient = true;
        --*pSec;
        return passes_per_sec;
    }
    else
    {
        char buf[64];
        snprintf(buf, sizeof(buf), LC_TEXT("¼Ë´Ù¿îÀÌ %dÃÊ ³²¾Ò½À´Ï´Ù."), *pSec);
        SendNotice(buf);

        --*pSec;
        return passes_per_sec;
    }
}

void Shutdown(int iSec)
{
    if (g_bNoMoreClient)
    {
        thecore_shutdown();
        return;
    }

    CWarMapManager::instance().OnShutdown();

    char buf[64];
    snprintf(buf, sizeof(buf), LC_TEXT("%dÃÊ ÈÄ °ÔÀÓÀÌ ¼Ë´Ù¿î µË´Ï´Ù."), iSec);

    SendNotice(buf);

    shutdown_event_data* info = AllocEventInfo<shutdown_event_data>();
    info->seconds = iSec;

    event_create(shutdown_event, info, 1);
}

ACMD(do_shutdown)
{
    if (NULL == ch)
    {
        sys_err("Accept shutdown command from %s.", ch->GetName());
    }
    TPacketGGShutdown p;
    p.bHeader = HEADER_GG_SHUTDOWN;
    P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown));

    Shutdown(10);
}

EVENTFUNC(timed_event)
{
    TimedEventInfo * info = dynamic_cast<TimedEventInfo *>( event->info );
   
    if ( info == NULL )
    {
        sys_err( "timed_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER    ch = info->ch;
    if (ch == NULL) { // <Factor>
        return 0;
    }
    LPDESC d = ch->GetDesc();

    if (info->left_second <= 0)
    {
        ch->m_pkTimedEvent = NULL;

        if (true == LC_IsEurope() || true == LC_IsYMIR() || true == LC_IsKorea())
        {
            switch (info->subcmd)
            {
                case SCMD_LOGOUT:
                case SCMD_QUIT:
                case SCMD_PHASE_SELECT:
                    {
                        TPacketNeedLoginLogInfo acc_info;
                        acc_info.dwPlayerID = ch->GetDesc()->GetAccountTable().id;

                        db_clientdesc->DBPacket( HEADER_GD_VALID_LOGOUT, 0, &acc_info, sizeof(acc_info) );

                        LogManager::instance().DetailLoginLog( false, ch );
                    }
                    break;
            }
        }

        switch (info->subcmd)
        {
            case SCMD_LOGOUT:
                if (d)
                    d->SetPhase(PHASE_CLOSE);
                break;

            case SCMD_QUIT:
                ch->ChatPacket(CHAT_TYPE_COMMAND, "quit");
                break;

            case SCMD_PHASE_SELECT:
                {
                    ch->Disconnect("timed_event - SCMD_PHASE_SELECT");

                    if (d)
                    {
                        d->SetPhase(PHASE_SELECT);
                    }
                }
                break;
        }

        return 0;
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%dÃÊ ³²¾Ò½À´Ï´Ù."), info->left_second);
        --info->left_second;
    }

    return PASSES_PER_SEC(1);
}

ACMD(do_cmd)
{
    /* RECALL_DELAY
       if (ch->m_pkRecallEvent != NULL)
       {
       ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
       event_cancel(&ch->m_pkRecallEvent);
       return;
       }
    // END_OF_RECALL_DELAY */

    if (ch->m_pkTimedEvent)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ãë¼Ò µÇ¾ú½À´Ï´Ù."));
        event_cancel(&ch->m_pkTimedEvent);
        return;
    }

    switch (subcmd)
    {
        case SCMD_LOGOUT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("·Î±×ÀΠȸéÀ¸·Î µ¹¾Æ °©´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;

        case SCMD_QUIT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ÔÀÓÀ» Á¾·á ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;

        case SCMD_PHASE_SELECT:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ij¸¯Å͸¦ Àüȯ ÇÕ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®¼¼¿ä."));
            break;
    }

    int nExitLimitTime = 10;

    if (ch->IsHack(false, true, nExitLimitTime) &&
        false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()) &&
           (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
    {
        return;
    }
   
    switch (subcmd)
    {
        case SCMD_LOGOUT:
        case SCMD_QUIT:
        case SCMD_PHASE_SELECT:
            {
                TimedEventInfo* info = AllocEventInfo<TimedEventInfo>();

                {
                    if (ch->IsPosition(POS_FIGHTING))
                        info->left_second = 10;
                    else
                        info->left_second = 3;
                }

                info->ch        = ch;
                info->subcmd        = subcmd;
                strlcpy(info->szReason, argument, sizeof(info->szReason));

                ch->m_pkTimedEvent    = event_create(timed_event, info, 1);
            }
            break;
    }
}

ACMD(do_mount)
{
    /*
       char            arg1[256];
       struct action_mount_param    param;

    // ÀÌ¹Ì Å¸°í ÀÖÀ¸¸é
    if (ch->GetMountingChr())
    {
    char arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || !*arg2)
    return;

    param.x        = atoi(arg1);
    param.y        = atoi(arg2);
    param.vid    = ch->GetMountingChr()->GetVID();
    param.is_unmount = true;

    float distance = DISTANCE_SQRT(param.x - (DWORD) ch->GetX(), param.y - (DWORD) ch->GetY());

    if (distance > 600.0f)
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´õ °¡±îÀÌ °¡¼ ³»¸®¼¼¿ä."));
    return;
    }

    action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
    return;
    }

    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    return;

    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(atoi(arg1));

    if (!tch->IsNPC() || !tch->IsMountable())
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å±â¿¡´Â Å» ¼ö ¾ø¾î¿ä."));
    return;
    }

    float distance = DISTANCE_SQRT(tch->GetX() - ch->GetX(), tch->GetY() - ch->GetY());

    if (distance > 600.0f)
    {
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á» ´õ °¡±îÀÌ °¡¼ Ÿ¼¼¿ä."));
    return;
    }

    param.vid        = tch->GetVID();
    param.is_unmount    = false;

    action_enqueue(ch, ACTION_TYPE_MOUNT, &param, 0.0f, true);
     */
}

ACMD(do_fishing)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    ch->SetRotation(atof(arg1));
    ch->fishing();
}

ACMD(do_console)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ConsoleEnable");
}

ACMD(do_restart)
{
    if (false == ch->IsDead())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
        ch->StartRecoveryEvent();
        return;
    }

    if (NULL == ch->m_pkDeadEvent)
        return;

    int iTimeToDead = (event_time(ch->m_pkDeadEvent) / passes_per_sec);

    if (subcmd != SCMD_RESTART_TOWN && (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
    {
        if (!test_server)
        {
            if (ch->IsHack())
            {
                //¼ºÁö ¸ÊÀϰæ¿ì¿¡´Â üũ ÇÏÁö ¾Ê´Â´Ù.
                if (false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
                    return;
                }
            }

            if (iTimeToDead > 170)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - 170);
                return;
            }
        }
    }

    //PREVENT_HACK
    //DESC : â°í, ±³È¯ â ÈÄ Æ÷Å»À» »ç¿ëÇÏ´Â ¹ö±×¿¡ ÀÌ¿ëµÉ¼ö ÀÖ¾î¼
    //        ÄğŸÀÓÀ» Ãß°¡
    if (subcmd == SCMD_RESTART_TOWN)
    {
        if (ch->IsHack())
        {
            //±æµå¸Ê, ¼ºÁö¸Ê¿¡¼´Â üũ ÇÏÁö ¾Ê´Â´Ù.
            if ((!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG) ||
                   false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%dÃÊ ³²À½)"), iTimeToDead - (180 - g_nPortalLimitTime));
                return;
            }
        }

        if (iTimeToDead > 173)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÁ÷ ¸¶À»¿¡¼ Àç½ÃÀÛ ÇÒ ¼ö ¾ø½À´Ï´Ù. (%d ÃÊ ³²À½)"), iTimeToDead - 173);
            return;
        }
    }
    //END_PREVENT_HACK

    ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");

    ch->GetDesc()->SetPhase(PHASE_GAME);
    ch->SetPosition(POS_STANDING);
    ch->StartRecoveryEvent();

    //FORKED_LOAD
    //DESC: »ï°Å¸® ÀüÅõ½Ã ºÎȰÀ» ÇÒ°æ¿ì ¸ÊÀÇ ÀÔ±¸°¡ ¾Æ´Ñ »ï°Å¸® ÀüÅõÀÇ ½ÃÀÛÁöÁ¡À¸·Î À̵¿ÇÏ°Ô µÈ´Ù.
    if (1 == quest::CQuestManager::instance().GetEventFlag("threeway_war"))
    {
        if (subcmd == SCMD_RESTART_TOWN || subcmd == SCMD_RESTART_HERE)
        {
            if (true == CThreeWayWar::instance().IsThreeWayWarMapIndex(ch->GetMapIndex()) &&
                    false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));

                ch->ReviveInvisible(5);
                ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());

                return;
            }

            //¼ºÁö
            if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
            {
                if (CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) <= 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ºÁö¿¡¼ ºÎȰ ±âȸ¸¦ ¸ğµÎ ÀÒ¾ú½À´Ï´Ù! ¸¶À»·Î À̵¿ÇÕ´Ï´Ù!"));
                    ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
                }
                else
                {
                    ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire()));
                }

                ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                ch->ReviveInvisible(5);

                return;
            }
        }
    }
    //END_FORKED_LOAD

    if (ch->GetDungeon())
        ch->GetDungeon()->UseRevive(ch);

    if (ch->GetWarMap() && !ch->IsObserverMode())
    {
        CWarMap * pMap = ch->GetWarMap();
        DWORD dwGuildOpponent = pMap ? pMap->GetGuildOpponent(ch) : 0;

        if (dwGuildOpponent)
        {
            switch (subcmd)
            {
                case SCMD_RESTART_TOWN:
                    sys_log(0, "do_restart: restart town");
                    PIXEL_POSITION pos;

                    if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos))
                        ch->Show(ch->GetMapIndex(), pos.x, pos.y);
                    else
                        ch->ExitToSavedLocation();

                    ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                    ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                    ch->ReviveInvisible(5);
                    break;

                case SCMD_RESTART_HERE:
                    sys_log(0, "do_restart: restart here");
                    ch->RestartAtSamePos();
                    //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
                    ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
                    ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
                    ch->ReviveInvisible(5);
                    break;
            }

            return;
        }
    }

    switch (subcmd)
    {
        case SCMD_RESTART_TOWN:
            sys_log(0, "do_restart: restart town");
            PIXEL_POSITION pos;

            if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(ch->GetMapIndex(), ch->GetEmpire(), pos))
                ch->WarpSet(pos.x, pos.y);
            else
                ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));

            ch->PointChange(POINT_HP, 50 - ch->GetHP());
            ch->DeathPenalty(1);
            break;

        case SCMD_RESTART_HERE:
            sys_log(0, "do_restart: restart here");
            ch->RestartAtSamePos();
            //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
            ch->PointChange(POINT_HP, 50 - ch->GetHP());
            ch->DeathPenalty(0);
            ch->ReviveInvisible(5);
            break;
    }
}

#define MAX_STAT 90

ACMD(do_stat_reset)
{
    ch->PointChange(POINT_STAT_RESET_COUNT, 12 - ch->GetPoint(POINT_STAT_RESET_COUNT));
}

ACMD(do_stat_minus)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (ch->IsPolymorphed())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0)
        return;

    if (!strcmp(arg1, "st"))
    {
        if (ch->GetRealPoint(POINT_ST) <= JobInitialPoints[ch->GetJob()].st)
            return;

        ch->SetRealPoint(POINT_ST, ch->GetRealPoint(POINT_ST) - 1);
        ch->SetPoint(POINT_ST, ch->GetPoint(POINT_ST) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_ST, 0);
    }
    else if (!strcmp(arg1, "dx"))
    {
        if (ch->GetRealPoint(POINT_DX) <= JobInitialPoints[ch->GetJob()].dx)
            return;

        ch->SetRealPoint(POINT_DX, ch->GetRealPoint(POINT_DX) - 1);
        ch->SetPoint(POINT_DX, ch->GetPoint(POINT_DX) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_DX, 0);
    }
    else if (!strcmp(arg1, "ht"))
    {
        if (ch->GetRealPoint(POINT_HT) <= JobInitialPoints[ch->GetJob()].ht)
            return;

        ch->SetRealPoint(POINT_HT, ch->GetRealPoint(POINT_HT) - 1);
        ch->SetPoint(POINT_HT, ch->GetPoint(POINT_HT) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_HT, 0);
        ch->PointChange(POINT_MAX_HP, 0);
    }
    else if (!strcmp(arg1, "iq"))
    {
        if (ch->GetRealPoint(POINT_IQ) <= JobInitialPoints[ch->GetJob()].iq)
            return;

        ch->SetRealPoint(POINT_IQ, ch->GetRealPoint(POINT_IQ) - 1);
        ch->SetPoint(POINT_IQ, ch->GetPoint(POINT_IQ) - 1);
        ch->ComputePoints();
        ch->PointChange(POINT_IQ, 0);
        ch->PointChange(POINT_MAX_SP, 0);
    }
    else
        return;

    ch->PointChange(POINT_STAT, +1);
    ch->PointChange(POINT_STAT_RESET_COUNT, -1);
    ch->ComputePoints();
}



ACMD(do_stat)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (ch->IsPolymorphed())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĞ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetPoint(POINT_STAT) <= 0)
        return;

    BYTE idx = 0;
   
    if (!strcmp(arg1, "st"))
        idx = POINT_ST;
    else if (!strcmp(arg1, "dx"))
        idx = POINT_DX;
    else if (!strcmp(arg1, "ht"))
        idx = POINT_HT;
    else if (!strcmp(arg1, "iq"))
        idx = POINT_IQ;
    else
        return;

    if (ch->GetRealPoint(idx) >= MAX_STAT)
        return;

    ch->SetRealPoint(idx, ch->GetRealPoint(idx) + 1);
    ch->SetPoint(idx, ch->GetPoint(idx) + 1);
    ch->ComputePoints();
    ch->PointChange(idx, 0);

    if (idx == POINT_IQ)
    {
        ch->PointChange(POINT_MAX_HP, 0);
    }
    else if (idx == POINT_HT)
    {
        ch->PointChange(POINT_MAX_SP, 0);
    }

    ch->PointChange(POINT_STAT, -1);
    ch->ComputePoints();
}

ACMD(do_pvp)
{
    if (ch->GetArena() != NULL || CArenaManager::instance().IsArenaMap(ch->GetMapIndex()) == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER pkVictim = CHARACTER_MANAGER::instance().Find(vid);

    if (!pkVictim)
        return;

    if (pkVictim->IsNPC())
        return;

    if (pkVictim->GetArena() != NULL)
    {
        pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÌ ´ë·ÃÁßÀÔ´Ï´Ù."));
        return;
    }

    CPVPManager::instance().Insert(ch, pkVictim);
}

ACMD(do_guildskillup)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (!ch->GetGuild())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµå¿¡ ¼ÓÇØÀÖÁö ¾Ê½À´Ï´Ù."));
        return;
    }

    CGuild* g = ch->GetGuild();
    TGuildMember* gm = g->GetMember(ch->GetPlayerID());
    if (gm->grade == GUILD_LEADER_GRADE)
    {
        DWORD vnum = 0;
        str_to_number(vnum, arg1);
        g->SkillLevelUp(vnum);
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµå ½ºÅ³ ·¹º§À» º¯°æÇÒ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
    }
}

ACMD(do_skillup)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vnum = 0;
    str_to_number(vnum, arg1);

    if (true == ch->CanUseSkill(vnum))
    {
        ch->SkillLevelUp(vnum);
    }
    else
    {
        switch(vnum)
        {
            case SKILL_HORSE_WILDATTACK:
            case SKILL_HORSE_CHARGE:
            case SKILL_HORSE_ESCAPE:
            case SKILL_HORSE_WILDATTACK_RANGE:

            case SKILL_7_A_ANTI_TANHWAN:
            case SKILL_7_B_ANTI_AMSEOP:
            case SKILL_7_C_ANTI_SWAERYUNG:
            case SKILL_7_D_ANTI_YONGBI:

            case SKILL_8_A_ANTI_GIGONGCHAM:
            case SKILL_8_B_ANTI_YEONSA:
            case SKILL_8_C_ANTI_MAHWAN:
            case SKILL_8_D_ANTI_BYEURAK:

            case SKILL_ADD_HP:
            case SKILL_RESIST_PENETRATE:
                ch->SkillLevelUp(vnum);
                break;
        }
    }
}

//
// @version    05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
//
ACMD(do_safebox_close)
{
    ch->CloseSafebox();
}

//
// @version    05/06/20 Bang2ni - Ä¿¸Çµå ó¸® Delegate to CHARACTER class
//
ACMD(do_safebox_password)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));
    ch->ReqSafeboxLoad(arg1);
}

ACMD(do_safebox_change_password)
{
    char arg1[256];
    char arg2[256];

    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || strlen(arg1)>6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    if (!*arg2 || strlen(arg2)>6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    if (LC_IsBrazil() == true)
    {
        for (int i = 0; i < 6; ++i)
        {
            if (arg2[i] == '\0')
                break;

            if (isalpha(arg2[i]) == false)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> ºñ¹Ğ¹øÈ£´Â ¿µ¹®ÀÚ¸¸ °¡´ÉÇÕ´Ï´Ù."));
                return;
            }
        }
    }

    TSafeboxChangePasswordPacket p;

    p.dwID = ch->GetDesc()->GetAccountTable().id;
    strlcpy(p.szOldPassword, arg1, sizeof(p.szOldPassword));
    strlcpy(p.szNewPassword, arg2, sizeof(p.szNewPassword));

    db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_CHANGE_PASSWORD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
}

ACMD(do_mall_password)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1 || strlen(arg1) > 6)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> À߸øµÈ ¾ÏÈ£¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù."));
        return;
    }

    int iPulse = thecore_pulse();

    if (ch->GetMall())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í°¡ ÀÌ¹Ì ¿·ÁÀÖ½À´Ï´Ù."));
        return;
    }

    if (iPulse - ch->GetMallLoadTime() < passes_per_sec * 10) // 10ÃÊ¿¡ Çѹø¸¸ ¿äû °¡´É
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í¸¦ ´İÀºÁö 10ÃÊ ¾È¿¡´Â ¿ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    ch->SetMallLoadTime(iPulse);

    TSafeboxLoadPacket p;
    p.dwID = ch->GetDesc()->GetAccountTable().id;
    strlcpy(p.szLogin, ch->GetDesc()->GetAccountTable().login, sizeof(p.szLogin));
    strlcpy(p.szPassword, arg1, sizeof(p.szPassword));

    db_clientdesc->DBPacket(HEADER_GD_MALL_LOAD, ch->GetDesc()->GetHandle(), &p, sizeof(p));
}

ACMD(do_mall_close)
{
    if (ch->GetMall())
    {
        ch->SetMallLoadTime(thecore_pulse());
        ch->CloseMall();
        ch->Save();
    }
}

ACMD(do_ungroup)
{
    if (!ch->GetParty())
        return;

    if (!CPartyManager::instance().IsEnablePCParty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ¼¹ö ¹®Á¦·Î ÆÄƼ °ü·Ã 󸮸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetDungeon())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ´øÀü ¾È¿¡¼´Â ÆÄƼ¿¡¼ ³ª°¥ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    LPPARTY pParty = ch->GetParty();

    if (pParty->GetMemberCount() == 2)
    {
        // party disband
        CPartyManager::instance().DeleteParty(pParty);
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> ÆÄƼ¿¡¼ ³ª°¡¼Ì½À´Ï´Ù."));
        //pParty->SendPartyRemoveOneToAll(ch);
        pParty->Quit(ch->GetPlayerID());
        //pParty->SendPartyRemoveAllToOne(ch);
    }
}

ACMD(do_close_shop)
{
    if (ch->GetMyShop())
    {
        ch->CloseMyShop();
        return;
    }
}

ACMD(do_set_walk_mode)
{
    ch->SetNowWalking(true);
    ch->SetWalking(true);
}

ACMD(do_set_run_mode)
{
    ch->SetNowWalking(false);
    ch->SetWalking(false);
}

#if defined(ENABLE_AFFECT_POLYMORPH_REMOVE)
ACMD(do_remove_polymorph)
{
    if (!ch)
        return;
   
    if (!ch->IsPolymorphed())
        return;
   
    ch->SetPolymorph(0);
    ch->RemoveAffect(AFFECT_POLYMORPH);
}
#endif

ACMD(do_war)
{
    //³» ±æµå Á¤º¸¸¦ ¾ò¾î¿À°í
    CGuild * g = ch->GetGuild();

    if (!g)
        return;

    //ÀüÀïÁßÀÎÁö üũÇѹø!
    if (g->UnderAnyWar())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ´Ù¸¥ ÀüÀï¿¡ ÂüÀü Áß ÀÔ´Ï´Ù."));
        return;
    }

    //ÆÄ¶ó¸ŞÅ͸¦ µÎ¹è·Î ³ª´©°í
    char arg1[256], arg2[256];
    int type = GUILD_WAR_TYPE_FIELD;
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1)
        return;

if (*arg2)
    {
        str_to_number(type, arg2);


        if(type < 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<error> can't declare war with type less than zero."));
            return;
        }


        if (type >= GUILD_WAR_TYPE_MAX_NUM || type == 0)
            type = GUILD_WAR_TYPE_FIELD;
    }

    //±æµåÀÇ ¸¶½ºÅÍ ¾ÆÀ̵𸦠¾ò¾î¿ÂµÚ
    DWORD gm_pid = g->GetMasterPID();

    //¸¶½ºÅÍÀÎÁö üũ(±æÀüÀº ±æµåÀ常ÀÌ °¡´É)
    if (gm_pid != ch->GetPlayerID())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
        return;
    }

    //»ó´ë ±æµå¸¦ ¾ò¾î¿À°í
    CGuild * opp_g = CGuildManager::instance().FindGuildByName(arg1);

    if (!opp_g)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
        return;
    }

    //»ó´ë±æµå¿ÍÀÇ »óÅ üũ
    switch (g->GetGuildWarState(opp_g->GetID()))
    {
        case GUILD_WAR_NONE:
            {
                if (opp_g->UnderAnyWar())
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
                    return;
                }

                int iWarPrice = KOR_aGuildWarInfo[type].iWarPrice;

                if (g->GetGuildMoney() < iWarPrice)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                    return;
                }

                if (opp_g->GetGuildMoney() < iWarPrice)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ Àüºñ°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                    return;
                }
            }
            break;

        case GUILD_WAR_SEND_DECLARE:
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì ¼±ÀüÆ÷°í ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
                return;
            }
            break;

        case GUILD_WAR_RECV_DECLARE:
            {
                if (opp_g->UnderAnyWar())
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµå°¡ ÀÌ¹Ì ÀüÀï Áß ÀÔ´Ï´Ù."));
                    g->RequestRefuseWar(opp_g->GetID());
                    return;
                }
            }
            break;

        case GUILD_WAR_RESERVE:
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀïÀÌ ¿¹¾àµÈ ±æµå ÀÔ´Ï´Ù."));
                return;
            }
            break;

        case GUILD_WAR_END:
            return;

        default:
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ÀÌ¹Ì ÀüÀï ÁßÀÎ ±æµåÀÔ´Ï´Ù."));
            g->RequestRefuseWar(opp_g->GetID());
            return;
    }

    if (!g->CanStartWar(type))
    {
        // ±æµåÀüÀ» ÇÒ ¼ö ÀÖ´Â Á¶°ÇÀ» ¸¸Á·ÇÏÁö¾Ê´Â´Ù.
        if (g->GetLadderPoint() == 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
            sys_log(0, "GuildWar.StartError.NEED_LADDER_POINT");
        }
        else if (g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀüÀ» Çϱâ À§Çؼ± ÃÖ¼ÒÇÑ %d¸íÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù."), GUILD_WAR_MIN_MEMBER_COUNT);
            sys_log(0, "GuildWar.StartError.NEED_MINIMUM_MEMBER[%d]", GUILD_WAR_MIN_MEMBER_COUNT);
        }
        else
        {
            sys_log(0, "GuildWar.StartError.UNKNOWN_ERROR");
        }
        return;
    }

    // ÇʵåÀü üũ¸¸ ÇÏ°í ¼¼¼¼ÇÑ Ã¼Å©´Â »ó´ë¹æÀÌ ½Â³«ÇÒ¶§ ÇÑ´Ù.
    if (!opp_g->CanStartWar(GUILD_WAR_TYPE_FIELD))
    {
        if (opp_g->GetLadderPoint() == 0)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ·¹´õ Á¡¼ö°¡ ¸ğÀÚ¶ó¼ ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        else if (opp_g->GetMemberCount() < GUILD_WAR_MIN_MEMBER_COUNT)
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµå¿ø ¼ö°¡ ºÎÁ·ÇÏ¿© ±æµåÀüÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    do
    {
        if (g->GetMasterCharacter() != NULL)
            break;

        CCI *pCCI = P2P_MANAGER::instance().FindByPID(g->GetMasterPID());

        if (pCCI != NULL)
            break;

        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
        g->RequestRefuseWar(opp_g->GetID());
        return;

    } while (false);

    do
    {
        if (opp_g->GetMasterCharacter() != NULL)
            break;
       
        CCI *pCCI = P2P_MANAGER::instance().FindByPID(opp_g->GetMasterPID());
       
        if (pCCI != NULL)
            break;

        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> »ó´ë¹æ ±æµåÀÇ ±æµåÀåÀÌ Á¢¼ÓÁßÀÌ ¾Æ´Õ´Ï´Ù."));
        g->RequestRefuseWar(opp_g->GetID());
        return;

    } while (false);

    g->RequestDeclareWar(opp_g->GetID(), type);
}

ACMD(do_nowar)
{
    CGuild* g = ch->GetGuild();
    if (!g)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD gm_pid = g->GetMasterPID();

    if (gm_pid != ch->GetPlayerID())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀü¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾ø½À´Ï´Ù."));
        return;
    }

    CGuild* opp_g = CGuildManager::instance().FindGuildByName(arg1);

    if (!opp_g)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±×·± ±æµå°¡ ¾ø½À´Ï´Ù."));
        return;
    }

    g->RequestRefuseWar(opp_g->GetID());
}

ACMD(do_detaillog)
{
    ch->DetailLog();
}

ACMD(do_monsterlog)
{
    ch->ToggleMonsterLog();
}

ACMD(do_pkmode)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    BYTE mode = 0;
    str_to_number(mode, arg1);

    if (mode == PK_MODE_PROTECT)
        return;

    if (ch->GetLevel() < PK_PROTECT_LEVEL && mode != 0)
        return;

    ch->SetPKMode(mode);
}

ACMD(do_messenger_auth)
{
    if (ch->GetArena())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1 || !*arg2)
        return;

    char answer = LOWER(*arg1);

    if (answer != 'y')
    {
        LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2);

        if (tch)
            tch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀ¸·Î ºÎÅÍ Ä£±¸ µî·ÏÀ» °ÅºÎ ´çÇß½À´Ï´Ù."), ch->GetName());
    }

    MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, answer == 'y' ? false : true); // DENY
}

ACMD(do_setblockmode)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (*arg1)
    {
        BYTE flag = 0;
        str_to_number(flag, arg1);
        ch->SetBlockMode(flag);
    }
}

ACMD(do_unmount)
{
    LPITEM item = ch->GetWear(WEAR_UNIQUE1);
    LPITEM item2 = ch->GetWear(WEAR_UNIQUE2);
    LPITEM item3 = ch->GetWear(WEAR_COSTUME_MOUNT);

    if (item && item->IsRideItem())
        ch->UnequipItem(item);

    if (item2 && item2->IsRideItem())
        ch->UnequipItem(item2);

    if (item3 && item3->IsRideItem())
        ch->UnequipItem(item3);

    if (true == ch->UnEquipSpecialRideUniqueItem())
    {
        ch->RemoveAffect(AFFECT_MOUNT);
        ch->RemoveAffect(AFFECT_MOUNT_BONUS);

        if (ch->IsHorseRiding())
        {
            ch->StopRiding();
        }
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("AI??Aa¢¬¢ç¡Æ? ?E A¡À?¡© ??¢¬¡¾ ?o ???A¢¥I¢¥U."));
    }

}

ACMD(do_observer_exit)
{
    if (ch->IsObserverMode())
    {
        if (ch->GetWarMap())
            ch->SetWarMap(NULL);

        if (ch->GetArena() != NULL || ch->GetArenaObserverMode() == true)
        {
            ch->SetArenaObserverMode(false);

            if (ch->GetArena() != NULL)
                ch->GetArena()->RemoveObserver(ch->GetPlayerID());

            ch->SetArena(NULL);
            ch->WarpSet(ARENA_RETURN_POINT_X(ch->GetEmpire()), ARENA_RETURN_POINT_Y(ch->GetEmpire()));
        }
        else
        {
            ch->ExitToSavedLocation();
        }
        ch->SetObserverMode(false);
    }
}

ACMD(do_view_equip)
{
    if (ch->GetGMLevel() <= GM_PLAYER)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (*arg1)
    {
        DWORD vid = 0;
        str_to_number(vid, arg1);
        LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

        if (!tch)
            return;

        if (!tch->IsPC())
            return;
        /*
           int iSPCost = ch->GetMaxSP() / 3;

           if (ch->GetSP() < iSPCost)
           {
           ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Á¤½Å·ÂÀÌ ºÎÁ·ÇÏ¿© ´Ù¸¥ »ç¶÷ÀÇ Àåºñ¸¦ º¼ ¼ö ¾ø½À´Ï´Ù."));
           return;
           }
           ch->PointChange(POINT_SP, -iSPCost);
         */
        tch->SendEquipment(ch);
    }
}

ACMD(do_party_request)
{
    if (ch->GetArena())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (ch->GetParty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì ÆÄƼ¿¡ ¼ÓÇØ ÀÖÀ¸¹Ç·Î °¡ÀÔ½ÅûÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        if (!ch->RequestToParty(tch))
            ch->ChatPacket(CHAT_TYPE_COMMAND, "PartyRequestDenied");
}

ACMD(do_party_request_accept)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        ch->AcceptToParty(tch);
}

ACMD(do_party_request_deny)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD vid = 0;
    str_to_number(vid, arg1);
    LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(vid);

    if (tch)
        ch->DenyToParty(tch);
}

ACMD(do_monarch_warpto)
{
    if (true == LC_IsYMIR() || true == LC_IsKorea())
        return;

    if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
   
    //±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_WARP))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_WARP));
        return;
    }

    //±ºÁÖ ¸÷ ¼Òȯ ºñ¿ë
    const int WarpPrice = 10000;
   
    //±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, WarpPrice);
        return;  
    }

    int x = 0, y = 0;
    char arg1[256];

    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç¿ë¹ı: warpto <character name>"));
        return;
    }

    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);

    if (!tch)
    {
        CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);

        if (pkCCI)
        {
            if (pkCCI->bEmpire != ch->GetEmpire())
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±¹ À¯Àú¿¡°Ô´Â À̵¿ÇÒ¼ö ¾ø½À´Ï´Ù"));
                return;
            }

            if (pkCCI->bChannel != g_bChannel)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç À¯Àú´Â %d ä³Î¿¡ ÀÖ½À´Ï´Ù. (ÇöÀç ä³Î %d)"), pkCCI->bChannel, g_bChannel);
                return;
            }
            if (!IsMonarchWarpZone(pkCCI->lMapIndex))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }

            PIXEL_POSITION pos;
   
            if (!SECTREE_MANAGER::instance().GetCenterPositionOfMap(pkCCI->lMapIndex, pos))
                ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map (index %d)", pkCCI->lMapIndex);
            else
            {
                //ch->ChatPacket(CHAT_TYPE_INFO, "You warp to (%d, %d)", pos.x, pos.y);
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¿¡°Ô·Î À̵¿ÇÕ´Ï´Ù"), arg1);
                ch->WarpSet(pos.x, pos.y);
               
                //±ºÁÖ µ· »è°¨  
                CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);

                //ÄğŸÀÓ ÃʱâÈ
                ch->SetMC(CHARACTER::MI_WARP);
            }
        }
        else if (NULL == CHARACTER_MANAGER::instance().FindPC(arg1))
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
        }

        return;
    }
    else
    {
        if (tch->GetEmpire() != ch->GetEmpire())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ŸÁ¦±¹ À¯Àú¿¡°Ô´Â À̵¿ÇÒ¼ö ¾ø½À´Ï´Ù"));
            return;
        }
        if (!IsMonarchWarpZone(tch->GetMapIndex()))
        {
            ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
            return;
        }
        x = tch->GetX();
        y = tch->GetY();
    }

    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¿¡°Ô·Î À̵¿ÇÕ´Ï´Ù"), arg1);
    ch->WarpSet(x, y);
    ch->Stop();

    //±ºÁÖ µ· »è°¨  
    CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);

    //ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_WARP);
}

ACMD(do_monarch_transfer)
{
    if (true == LC_IsYMIR() || true == LC_IsKorea())
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ç¿ë¹ı: transfer <name>"));
        return;
    }
   
    if (!CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
   
    //±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_TRANSFER))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_TRANSFER));  
        return;
    }

    //±ºÁÖ ¿öÇÁ ºñ¿ë
    const int WarpPrice = 10000;

    //±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(WarpPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, WarpPrice);
        return;  
    }


    LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);

    if (!tch)
    {
        CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);

        if (pkCCI)
        {
            if (pkCCI->bEmpire != ch->GetEmpire())
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ Á¦±¹ À¯Àú´Â ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }
            if (pkCCI->bChannel != g_bChannel)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀº %d ä³Î¿¡ Á¢¼Ó Áß ÀÔ´Ï´Ù. (ÇöÀç ä³Î: %d)"), arg1, pkCCI->bChannel, g_bChannel);
                return;
            }
            if (!IsMonarchWarpZone(pkCCI->lMapIndex))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }
            if (!IsMonarchWarpZone(ch->GetMapIndex()))
            {
                ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
                return;
            }

            TPacketGGTransfer pgg;

            pgg.bHeader = HEADER_GG_TRANSFER;
            strlcpy(pgg.szName, arg1, sizeof(pgg.szName));
            pgg.lX = ch->GetX();
            pgg.lY = ch->GetY();

            P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGTransfer));
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´ÔÀ» ¼ÒȯÇÏ¿´½À´Ï´Ù."), arg1);
           
            //±ºÁÖ µ· »è°¨  
            CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
            //ÄğŸÀÓ ÃʱâÈ
            ch->SetMC(CHARACTER::MI_TRANSFER);
        }
        else
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÔ·ÂÇϽŠÀ̸§À» °¡Áø »ç¿ëÀÚ°¡ ¾ø½À´Ï´Ù."));
        }

        return;
    }


    if (ch == tch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÚ½ÅÀ» ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (tch->GetEmpire() != ch->GetEmpire())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ Á¦±¹ À¯Àú´Â ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
    if (!IsMonarchWarpZone(tch->GetMapIndex()))
    {
        ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
    if (!IsMonarchWarpZone(ch->GetMapIndex()))
    {
        ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT("ÇØ´ç Áö¿ªÀ¸·Î ¼ÒȯÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    //tch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
    tch->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
   
    //±ºÁÖ µ· »è°¨  
    CMonarch::instance().SendtoDBDecMoney(WarpPrice, ch->GetEmpire(), ch);
    //ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_TRANSFER);
}

ACMD(do_monarch_info)
{
    if (CMonarch::instance().IsMonarch(ch->GetPlayerID(), ch->GetEmpire()))  
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("³ªÀÇ ±ºÁÖ Á¤º¸"));
        TMonarchInfo * p = CMonarch::instance().GetMonarch();
        for (int n = 1; n < 4; ++n)
        {
            if (n == ch->GetEmpire())
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  º¸À¯±İ¾× %lld "), EMPIRE_NAME(n), p->name[n], p->money[n]);
            else
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  "), EMPIRE_NAME(n), p->name[n]);
               
        }
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ Á¤º¸"));
        TMonarchInfo * p = CMonarch::instance().GetMonarch();
        for (int n = 1; n < 4; ++n)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[%s±ºÁÖ] : %s  "), EMPIRE_NAME(n), p->name[n]);
               
        }
    }
   
}  

ACMD(do_elect)
{
    db_clientdesc->DBPacketHeader(HEADER_GD_COME_TO_VOTE, ch->GetDesc()->GetHandle(), 0);
}

// LUA_ADD_GOTO_INFO
struct GotoInfo
{
    std::string     st_name;

    BYTE     empire;
    int     mapIndex;
    DWORD     x, y;

    GotoInfo()
    {
        st_name     = "";
        empire         = 0;
        mapIndex     = 0;

        x = 0;
        y = 0;
    }

    GotoInfo(const GotoInfo& c_src)
    {
        __copy__(c_src);
    }

    void operator = (const GotoInfo& c_src)
    {
        __copy__(c_src);
    }

    void __copy__(const GotoInfo& c_src)
    {
        st_name     = c_src.st_name;
        empire         = c_src.empire;
        mapIndex     = c_src.mapIndex;

        x = c_src.x;
        y = c_src.y;
    }
};

extern void BroadcastNotice(const char * c_pszBuf);

ACMD(do_monarch_tax)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: monarch_tax <1-50>");
        return;
    }

    // ±ºÁÖ °Ë»ç  
    if (!ch->IsMonarch())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
        return;
    }

    // ¼¼±İ¼³Á¤
    int tax = 0;
    str_to_number(tax,  arg1);

    if (tax < 1 || tax > 50)
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("1-50 »çÀÌÀÇ ¼öÄ¡¸¦ ¼±ÅÃÇØÁÖ¼¼¿ä"));

    quest::CQuestManager::instance().SetEventFlag("trade_tax", tax);

    // ±ºÁÖ¿¡°Ô ¸Ş¼¼Áö Çϳª
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼¼±İÀÌ %d %·Î ¼³Á¤µÇ¾ú½À´Ï´Ù"));

    // °øÁö
    char szMsg[1024];  

    snprintf(szMsg, sizeof(szMsg), "±ºÁÖÀÇ ¸íÀ¸·Î ¼¼±İÀÌ %d %% ·Î º¯°æµÇ¾ú½À´Ï´Ù", tax);
    BroadcastNotice(szMsg);

    snprintf(szMsg, sizeof(szMsg), "¾ÕÀ¸·Î´Â °Å·¡ ±İ¾×ÀÇ %d %% °¡ ±¹°í·Î µé¾î°¡°ÔµË´Ï´Ù.", tax);
    BroadcastNotice(szMsg);

    // ÄğŸÀÓ ÃʱâÈ
    ch->SetMC(CHARACTER::MI_TAX);
}

static const DWORD cs_dwMonarchMobVnums[] =
{
    191, //    »ê°ß½Å
    192, //    Àú½Å
    193, //    ¿õ½Å
    194, //    È£½Å
    391, //    ¹ÌÁ¤
    392, //    ÀºÁ¤
    393, //    ¼¼¶û
    394, //    ÁøÈñ
    491, //    ¸Íȯ
    492, //    º¸¿ì
    493, //    ±¸ÆĞ
    494, //    ÃßÈç
    591, //    ºñ·ù´Ü´ëÀå
    691, //    ¿õ±Í Á·Àå
    791, //    ¹Ğ±³±³ÁÖ
    1304, // ´©··¹ü±Í
    1901, // ±¸¹ÌÈ£
    2091, // ¿©¿Õ°Å¹Ì
    2191, // °Å´ë»ç¸·°ÅºÏ
    2206, // È¿°¿Õi
    0,
};

ACMD(do_monarch_mob)
{
    char arg1[256];
    LPCHARACTER    tch;

    one_argument(argument, arg1, sizeof(arg1));

    if (!ch->IsMonarch())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁÖ¸¸ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
        return;
    }
   
    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mmob <mob name>");
        return;
    }

    BYTE pcEmpire = ch->GetEmpire();
    BYTE mapEmpire = SECTREE_MANAGER::instance().GetEmpireFromMapIndex(ch->GetMapIndex());

    if (LC_IsYMIR() == true || LC_IsKorea() == true)
    {
        if (mapEmpire != pcEmpire && mapEmpire != 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÚ±¹ ¿µÅä¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â ±â´ÉÀÔ´Ï´Ù"));
            return;
        }
    }

    // ±ºÁÖ ¸÷ ¼Òȯ ºñ¿ë
    const int SummonPrice = 5000000;

    // ±ºÁÖ ÄğŸÀÓ °Ë»ç
    if (!ch->IsMCOK(CHARACTER::MI_SUMMON))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d Ãʰ£ ÄğŸÀÓÀÌ Àû¿ëÁßÀÔ´Ï´Ù."), ch->GetMCLTime(CHARACTER::MI_SUMMON));  
        return;
    }
   
    // ±ºÁÖ ±¹°í °Ë»ç
    if (!CMonarch::instance().IsMoneyOk(SummonPrice, ch->GetEmpire()))
    {
        int NationMoney = CMonarch::instance().GetMoney(ch->GetEmpire());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±¹°í¿¡ µ·ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ÇöÀç : %u ÇÊ¿ä±İ¾× : %u"), NationMoney, SummonPrice);
        return;  
    }

    const CMob * pkMob;
    DWORD vnum = 0;

    if (isdigit(*arg1))
    {
        str_to_number(vnum, arg1);

        if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
            vnum = 0;
    }
    else
    {
        pkMob = CMobManager::Instance().Get(arg1, true);

        if (pkMob)
            vnum = pkMob->m_table.dwVnum;
    }

    DWORD count;

    // ¼Òȯ °¡´É ¸÷ °Ë»ç
    for (count = 0; cs_dwMonarchMobVnums[count] != 0; ++count)
        if (cs_dwMonarchMobVnums[count] == vnum)
            break;

    if (0 == cs_dwMonarchMobVnums[count])
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒȯÇÒ¼ö ¾ø´Â ¸ó½ºÅÍ ÀÔ´Ï´Ù. ¼Òȯ°¡´ÉÇÑ ¸ó½ºÅʹ ȨÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä"));
        return;
    }

    tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
            ch->GetMapIndex(),
            ch->GetX() - number(200, 750),
            ch->GetY() - number(200, 750),
            ch->GetX() + number(200, 750),
            ch->GetY() + number(200, 750),
            true,
            pkMob->m_table.bType == CHAR_TYPE_STONE,
            true);

    if (tch)
    {
        // ±ºÁÖ µ· »è°¨  
        CMonarch::instance().SendtoDBDecMoney(SummonPrice, ch->GetEmpire(), ch);

        // ÄğŸÀÓ ÃʱâÈ
        ch->SetMC(CHARACTER::MI_SUMMON);
    }
}

static const char* FN_point_string(int apply_number)
{
    switch (apply_number)
    {
        case POINT_MAX_HP:    return LC_TEXT("ÃÖ´ë »ı¸í·Â +%d");
        case POINT_MAX_SP:    return LC_TEXT("ÃÖ´ë Á¤½Å·Â +%d");
        case POINT_HT:        return LC_TEXT("ü·Â +%d");
        case POINT_IQ:        return LC_TEXT("Áö´É +%d");
        case POINT_ST:        return LC_TEXT("±Ù·Â +%d");
        case POINT_DX:        return LC_TEXT("¹Îø +%d");
        case POINT_ATT_SPEED:    return LC_TEXT("°ø°İ¼Óµµ +%d");
        case POINT_MOV_SPEED:    return LC_TEXT("À̵¿¼Óµµ %d");
        case POINT_CASTING_SPEED:    return LC_TEXT("ÄğŸÀÓ -%d");
        case POINT_HP_REGEN:    return LC_TEXT("»ı¸í·Â ȸº¹ +%d");
        case POINT_SP_REGEN:    return LC_TEXT("Á¤½Å·Â ȸº¹ +%d");
        case POINT_POISON_PCT:    return LC_TEXT("µ¶°ø°İ %d");
        case POINT_STUN_PCT:    return LC_TEXT("½ºÅÏ +%d");
        case POINT_SLOW_PCT:    return LC_TEXT("½½·Î¿ì +%d");
        case POINT_CRITICAL_PCT:    return LC_TEXT("%d%% È®·ü·Î Ä¡¸íŸ °ø°İ");
        case POINT_RESIST_CRITICAL:    return LC_TEXT("»ó´ëÀÇ Ä¡¸íŸ È®·ü %d%% °¨¼Ò");
        case POINT_PENETRATE_PCT:    return LC_TEXT("%d%% È®·ü·Î °üÅë °ø°İ");
        case POINT_RESIST_PENETRATE: return LC_TEXT("»ó´ëÀÇ °üÅë °ø°İ È®·ü %d%% °¨¼Ò");
        case POINT_ATTBONUS_HUMAN:    return LC_TEXT("Àΰ£·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%");
        case POINT_ATTBONUS_ANIMAL:    return LC_TEXT("µ¿¹°·ù ¸ó½ºÅÍ Å¸°İÄ¡ +%d%%");
        case POINT_ATTBONUS_ORC:    return LC_TEXT("¿õ±ÍÁ· Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_MILGYO:    return LC_TEXT("¹Ğ±³·ù Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_UNDEAD:    return LC_TEXT("½Ãü·ù Ÿ°İÄ¡ +%d%%");
        case POINT_ATTBONUS_DEVIL:    return LC_TEXT("¾Ç¸¶·ù Ÿ°İÄ¡ +%d%%");
        case POINT_STEAL_HP:        return LC_TEXT("Ÿ°İÄ¡ %d%% ¸¦ »ı¸í·ÂÀ¸·Î Èí¼ö");
        case POINT_STEAL_SP:        return LC_TEXT("Ÿ·ÂÄ¡ %d%% ¸¦ Á¤½Å·ÂÀ¸·Î Èí¼ö");
        case POINT_MANA_BURN_PCT:    return LC_TEXT("%d%% È®·ü·Î Ÿ°İ½Ã »ó´ë Àü½Å·Â ¼Ò¸ğ");
        case POINT_DAMAGE_SP_RECOVER:    return LC_TEXT("%d%% È®·ü·Î ÇÇÇØ½Ã Á¤½Å·Â ȸº¹");
        case POINT_BLOCK:            return LC_TEXT("¹°¸®Å¸°İ½Ã ºí·° È®·ü %d%%");
        case POINT_DODGE:            return LC_TEXT("Ȱ °ø°İ ȸÇÇ È®·ü %d%%");
        case POINT_RESIST_SWORD:    return LC_TEXT("ÇÑ¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_TWOHAND:    return LC_TEXT("¾ç¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_DAGGER:    return LC_TEXT("µÎ¼Õ°Ë ¹æ¾î %d%%");
        case POINT_RESIST_BELL:        return LC_TEXT("¹æ¿ï ¹æ¾î %d%%");
        case POINT_RESIST_FAN:        return LC_TEXT("ºÎä ¹æ¾î %d%%");
        case POINT_RESIST_BOW:        return LC_TEXT("Ȱ°ø°İ ÀúÇ× %d%%");
        case POINT_RESIST_FIRE:        return LC_TEXT("È¿° ÀúÇ× %d%%");
        case POINT_RESIST_ELEC:        return LC_TEXT("Àü±â ÀúÇ× %d%%");
        case POINT_RESIST_MAGIC:    return LC_TEXT("¸¶¹ı ÀúÇ× %d%%");
        case POINT_RESIST_WIND:        return LC_TEXT("¹Ù¶÷ ÀúÇ× %d%%");
        case POINT_RESIST_ICE:        return LC_TEXT("³Ã±â ÀúÇ× %d%%");
        case POINT_RESIST_EARTH:    return LC_TEXT("´ëÁö ÀúÇ× %d%%");
        case POINT_RESIST_DARK:        return LC_TEXT("¾îµÒ ÀúÇ× %d%%");
        case POINT_REFLECT_MELEE:    return LC_TEXT("Á÷Á¢ Ÿ°İÄ¡ ¹İ»ç È®·ü : %d%%");
        case POINT_REFLECT_CURSE:    return LC_TEXT("ÀúÁÖ µÇµ¹¸®±â È®·ü %d%%");
        case POINT_POISON_REDUCE:    return LC_TEXT("µ¶ ÀúÇ× %d%%");
        case POINT_KILL_SP_RECOVER:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã Á¤½Å·Â ȸº¹");
        case POINT_EXP_DOUBLE_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã °æÇèÄ¡ Ãß°¡ »ó½Â");
        case POINT_GOLD_DOUBLE_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã µ· 2¹è µå·Ó");
        case POINT_ITEM_DROP_BONUS:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã ¾ÆÀÌÅÛ 2¹è µå·Ó");
        case POINT_POTION_BONUS:    return LC_TEXT("¹°¾à »ç¿ë½Ã %d%% ¼º´É Áõ°¡");
        case POINT_KILL_HP_RECOVERY:    return LC_TEXT("%d%% È®·ü·Î ÀûÅğÄ¡½Ã »ı¸í·Â ȸº¹");
//        case POINT_IMMUNE_STUN:    return LC_TEXT("±âÀıÇÏÁö ¾ÊÀ½ %d%%");
//        case POINT_IMMUNE_SLOW:    return LC_TEXT("´À·ÁÁöÁö ¾ÊÀ½ %d%%");
//        case POINT_IMMUNE_FALL:    return LC_TEXT("³Ñ¾îÁöÁö ¾ÊÀ½ %d%%");
//        case POINT_SKILL:    return LC_TEXT("");
//        case POINT_BOW_DISTANCE:    return LC_TEXT("");
        case POINT_ATT_GRADE_BONUS:    return LC_TEXT("°ø°İ·Â +%d");
        case POINT_DEF_GRADE_BONUS:    return LC_TEXT("¹æ¾î·Â +%d");
        case POINT_MAGIC_ATT_GRADE:    return LC_TEXT("¸¶¹ı °ø°İ·Â +%d");
        case POINT_MAGIC_DEF_GRADE:    return LC_TEXT("¸¶¹ı ¹æ¾î·Â +%d");
//        case POINT_CURSE_PCT:    return LC_TEXT("");
        case POINT_MAX_STAMINA:    return LC_TEXT("ÃÖ´ë Áö±¸·Â +%d");
        case POINT_ATTBONUS_WARRIOR:    return LC_TEXT("¹«»ç¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_ASSASSIN:    return LC_TEXT("ÀÚ°´¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_SURA:        return LC_TEXT("¼ö¶ó¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_SHAMAN:        return LC_TEXT("¹«´ç¿¡°Ô °ÇÔ +%d%%");
        case POINT_ATTBONUS_MONSTER:    return LC_TEXT("¸ó½ºÅÍ¿¡°Ô °ÇÔ +%d%%");
        case POINT_MALL_ATTBONUS:        return LC_TEXT("°ø°İ·Â +%d%%");
        case POINT_MALL_DEFBONUS:        return LC_TEXT("¹æ¾î·Â +%d%%");
        case POINT_MALL_EXPBONUS:        return LC_TEXT("°æÇèÄ¡ %d%%");
        case POINT_MALL_ITEMBONUS:        return LC_TEXT("¾ÆÀÌÅÛ µå·ÓÀ² %.1f¹è");
        case POINT_MALL_GOLDBONUS:        return LC_TEXT("µ· µå·ÓÀ² %.1f¹è");
        case POINT_MAX_HP_PCT:            return LC_TEXT("ÃÖ´ë »ı¸í·Â +%d%%");
        case POINT_MAX_SP_PCT:            return LC_TEXT("ÃÖ´ë Á¤½Å·Â +%d%%");
        case POINT_SKILL_DAMAGE_BONUS:    return LC_TEXT("½ºÅ³ µ¥¹ÌÁö %d%%");
        case POINT_NORMAL_HIT_DAMAGE_BONUS:    return LC_TEXT("ÆòŸ µ¥¹ÌÁö %d%%");
        case POINT_SKILL_DEFEND_BONUS:        return LC_TEXT("½ºÅ³ µ¥¹ÌÁö ÀúÇ× %d%%");
        case POINT_NORMAL_HIT_DEFEND_BONUS:    return LC_TEXT("ÆòŸ µ¥¹ÌÁö ÀúÇ× %d%%");
//        case POINT_PC_BANG_EXP_BONUS:    return LC_TEXT("");
//        case POINT_PC_BANG_DROP_BONUS:    return LC_TEXT("");
//        case POINT_EXTRACT_HP_PCT:    return LC_TEXT("");
        case POINT_RESIST_WARRIOR:    return LC_TEXT("¹«»ç°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_ASSASSIN:    return LC_TEXT("ÀÚ°´°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_SURA:        return LC_TEXT("¼ö¶ó°ø°İ¿¡ %d%% ÀúÇ×");
        case POINT_RESIST_SHAMAN:    return LC_TEXT("¹«´ç°ø°İ¿¡ %d%% ÀúÇ×");
        default:                    return NULL;
    }
}

static bool FN_hair_affect_string(LPCHARACTER ch, char *buf, size_t bufsiz)
{
    if (NULL == ch || NULL == buf)
        return false;

    CAffect* aff = NULL;
    time_t expire = 0;
    struct tm ltm;
    int    year, mon, day;
    int    offset = 0;

    aff = ch->FindAffect(AFFECT_HAIR);

    if (NULL == aff)
        return false;

    expire = ch->GetQuestFlag("hair.limit_time");

    if (expire < get_global_time())
        return false;

    // set apply string
    offset = snprintf(buf, bufsiz, FN_point_string(aff->bApplyOn), aff->lApplyValue);

    if (offset < 0 || offset >= (int) bufsiz)
        offset = bufsiz - 1;

    localtime_r(&expire, &ltm);

    year    = ltm.tm_year + 1900;
    mon        = ltm.tm_mon + 1;
    day        = ltm.tm_mday;

    snprintf(buf + offset, bufsiz - offset, LC_TEXT(" (¸¸·áÀÏ : %d³â %d¿ù %dÀÏ)"), year, mon, day);

    return true;
}

ACMD(do_costume)
{
    char buf[512];
    const size_t bufferSize = sizeof(buf);

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    CItem* pBody = ch->GetWear(WEAR_COSTUME_BODY);
    CItem* pHair = ch->GetWear(WEAR_COSTUME_HAIR);

    ch->ChatPacket(CHAT_TYPE_INFO, "COSTUME status:");

    if (pHair)
    {
        const char* itemName = pHair->GetName();
        ch->ChatPacket(CHAT_TYPE_INFO, "  HAIR : %s", itemName);

        for (int i = 0; i < pHair->GetAttributeCount(); ++i)
        {
            const TPlayerItemAttribute& attr = pHair->GetAttribute(i);
            if (0 < attr.bType)
            {
                snprintf(buf, bufferSize, FN_point_string(attr.bType), attr.sValue);
                ch->ChatPacket(CHAT_TYPE_INFO, "     %s", buf);
            }
        }

        if (pHair->IsEquipped() && arg1[0] == 'h')
            ch->UnequipItem(pHair);
    }

    if (pBody)
    {
        const char* itemName = pBody->GetName();
        ch->ChatPacket(CHAT_TYPE_INFO, "  BODY : %s", itemName);

        if (pBody->IsEquipped() && arg1[0] == 'b')
            ch->UnequipItem(pBody);
    }
}

ACMD(do_hair)
{
    char buf[256];

    if (false == FN_hair_affect_string(ch, buf, sizeof(buf)))
        return;

    ch->ChatPacket(CHAT_TYPE_INFO, buf);
}

ACMD(do_inventory)
{
    int    index = 0;
    int    count        = 1;

    char arg1[256];
    char arg2[256];

    LPITEM    item;

    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: inventory <start_index> <count>");
        return;
    }

    if (!*arg2)
    {
        index = 0;
        str_to_number(count, arg1);
    }
    else
    {
        str_to_number(index, arg1); index = MIN(index, INVENTORY_MAX_NUM);
        str_to_number(count, arg2); count = MIN(count, INVENTORY_MAX_NUM);
    }

    for (int i = 0; i < count; ++i)
    {
        if (index >= INVENTORY_MAX_NUM)
            break;

        item = ch->GetInventoryItem(index);

        ch->ChatPacket(CHAT_TYPE_INFO, "inventory [%d] = %s",
                        index, item ? item->GetName() : "<NONE>");
        ++index;
    }
}

//gift notify quest command
ACMD(do_gift)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "gift");
}

ACMD(do_cards)
{
    const char *line;

    char arg1[256], arg2[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    switch (LOWER(arg1[0]))
    {
        case 'o':    // open
            if (isdigit(*arg2))
            {
                DWORD safemode;
                str_to_number(safemode, arg2);
                ch->Cards_open(safemode);
            }
            break;
            case 'p':    // open
            ch->Cards_pullout();
            break;
        case 'e':    // open
            ch->CardsEnd();
            break;
        case 'd':    // open
            if (isdigit(*arg2))
            {
                DWORD destroy_index;
                str_to_number(destroy_index, arg2);
                ch->CardsDestroy(destroy_index);
            }
            break;
        case 'a':    // open
            if (isdigit(*arg2))
            {
                DWORD accpet_index;
                str_to_number(accpet_index, arg2);
                ch->CardsAccept(accpet_index);
            }
            break;
        case 'r':    // open
            if (isdigit(*arg2))
            {
                DWORD restore_index;
                str_to_number(restore_index, arg2);
                ch->CardsRestore(restore_index);
            }
            break;
        default:
            return;
    }
}

ACMD(do_cube)
{
    if (!ch->CanDoCube())
        return;

    dev_log(LOG_DEB0, "CUBE COMMAND <%s>: %s", ch->GetName(), argument);
    int cube_index = 0, inven_index = 0;
    const char *line;

    char arg1[256], arg2[256], arg3[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    one_argument(line, arg3, sizeof(arg3));

    if (0 == arg1[0])
    {
        // print usage
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: cube open");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube close");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube add <inveltory_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube delete <cube_index>");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube list");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube cancel");
        ch->ChatPacket(CHAT_TYPE_INFO, "       cube make [all]");
        return;
    }

    const std::string& strArg1 = std::string(arg1);

    // r_info (request information)
    // /cube r_info     ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé ¼ö ÀÖ´Â ·¹½ÃÇÇ ¿äû
    //                        (Server -> Client) /cube r_list npcVNUM resultCOUNT 123,1/125,1/128,1/130,5
    //
    // /cube r_info 3   ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ ¿äû
    // /cube r_info 3 5 ==> (Client -> Server) ÇöÀç NPC°¡ ¸¸µé¼ö ÀÖ´Â ·¹½ÃÇÇ Áß 3¹øÂ° ¾ÆÀÌÅÛºÎÅÍ ÀÌÈÄ 5°³ÀÇ ¾ÆÀÌÅÛÀ» ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Àç·á Á¤º¸¸¦ ¿äû
    //                       (Server -> Client) /cube m_info startIndex count 125,1|126,2|127,2|123,5&555,5&555,4/120000@125,1|126,2|127,2|123,5&555,5&555,4/120000
    //
    if (strArg1 == "r_info")
    {
        if (0 == arg2[0])
            Cube_request_result_list(ch);
        else
        {
            if (isdigit(*arg2))
            {
                int listIndex = 0, requestCount = 1;
                str_to_number(listIndex, arg2);

                if (0 != arg3[0] && isdigit(*arg3))
                    str_to_number(requestCount, arg3);

                Cube_request_material_info(ch, listIndex, requestCount);
            }
        }

        return;
    }

    switch (LOWER(arg1[0]))
    {
        case 'o':    // open
            Cube_open(ch);
            break;

        case 'c':    // close
            Cube_close(ch);
            break;

        case 'l':    // list
            Cube_show_list(ch);
            break;

        case 'a':    // add cue_index inven_index
            {
                if (0 == arg2[0] || !isdigit(*arg2) ||
                    0 == arg3[0] || !isdigit(*arg3))
                    return;

                str_to_number(cube_index, arg2);
                str_to_number(inven_index, arg3);
                Cube_add_item (ch, cube_index, inven_index);
            }
            break;

        case 'd':    // delete
            {
                if (0 == arg2[0] || !isdigit(*arg2))
                    return;

                str_to_number(cube_index, arg2);
                Cube_delete_item (ch, cube_index);
            }
            break;

        case 'm':    // make
            if (0 != arg2[0])
            {
                while (true == Cube_make(ch))
                    dev_log (LOG_DEB0, "cube make success");
            }
            else
                Cube_make(ch);
            break;

        default:
            return;
    }
}

ACMD(do_in_game_mall)
{
    if (LC_IsYMIR() == true || LC_IsKorea() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://metin2.co.kr/04_mall/mall/login.htm");
        return;
    }

    if (true == LC_IsTaiwan())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://203.69.141.203/mall/mall/item_main.htm");
        return;
    }

    // ¤Ğ_¤Ğ Äèµµ¼¹ö ¾ÆÀÌÅÛ¸ô URL ÇϵåÄÚµù Ãß°¡
    if (true == LC_IsWE_Korea())
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://metin2.co.kr/50_we_mall/mall/login.htm");
        return;
    }

    if (LC_IsJapan() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://mt2.oge.jp/itemmall/itemList.php");
        return;
    }
   
    if (LC_IsNewCIBN() == true && test_server)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://218.99.6.51/04_mall/mall/login.htm");
        return;
    }
    if (LC_IsSingapore() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://www.metin2.sg/ishop.php");
        return;
    }
    /*
    if (LC_IsCanada() == true)
    {
        ch->ChatPacket(CHAT_TYPE_COMMAND, "mall http://mall.z8games.com/mall_entry.aspx?tb=m2");
        return;
    }*/

    if (LC_IsEurope() == true)
    {
        char country_code[3];

        switch (LC_GetLocalType())
        {
            case LC_GERMANY:    country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0'; break;
            case LC_FRANCE:        country_code[0] = 'f'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_ITALY:        country_code[0] = 'i'; country_code[1] = 't'; country_code[2] = '\0'; break;
            case LC_SPAIN:        country_code[0] = 'e'; country_code[1] = 's'; country_code[2] = '\0'; break;
            case LC_UK:            country_code[0] = 'e'; country_code[1] = 'n'; country_code[2] = '\0'; break;
            case LC_TURKEY:        country_code[0] = 't'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_POLAND:        country_code[0] = 'p'; country_code[1] = 'l'; country_code[2] = '\0'; break;
            case LC_PORTUGAL:    country_code[0] = 'p'; country_code[1] = 't'; country_code[2] = '\0'; break;
            case LC_GREEK:        country_code[0] = 'g'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_RUSSIA:        country_code[0] = 'r'; country_code[1] = 'u'; country_code[2] = '\0'; break;
            case LC_DENMARK:    country_code[0] = 'd'; country_code[1] = 'k'; country_code[2] = '\0'; break;
            case LC_BULGARIA:    country_code[0] = 'b'; country_code[1] = 'g'; country_code[2] = '\0'; break;
            case LC_CROATIA:    country_code[0] = 'h'; country_code[1] = 'r'; country_code[2] = '\0'; break;
            case LC_MEXICO:        country_code[0] = 'm'; country_code[1] = 'x'; country_code[2] = '\0'; break;
            case LC_ARABIA:        country_code[0] = 'a'; country_code[1] = 'e'; country_code[2] = '\0'; break;
            case LC_CZECH:        country_code[0] = 'c'; country_code[1] = 'z'; country_code[2] = '\0'; break;
            case LC_ROMANIA:    country_code[0] = 'r'; country_code[1] = 'o'; country_code[2] = '\0'; break;
            case LC_HUNGARY:    country_code[0] = 'h'; country_code[1] = 'u'; country_code[2] = '\0'; break;
            case LC_NETHERLANDS: country_code[0] = 'n'; country_code[1] = 'l'; country_code[2] = '\0'; break;
            case LC_USA:        country_code[0] = 'u'; country_code[1] = 's'; country_code[2] = '\0'; break;
            case LC_CANADA:    country_code[0] = 'c'; country_code[1] = 'a'; country_code[2] = '\0'; break;
            default:
                if (test_server == true)
                {
                    country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0';
                }
                break;
        }

        char buf[512+1];
        char sas[33];
        MD5_CTX ctx;
        const char sas_key[] = "GF9001";

        snprintf(buf, sizeof(buf), "%u%u%s", ch->GetPlayerID(), ch->GetAID(), sas_key);

        MD5Init(&ctx);
        MD5Update(&ctx, (const unsigned char *) buf, strlen(buf));
#ifdef __FreeBSD__
        MD5End(&ctx, sas);
#else
        static const char hex[] = "0123456789abcdef";
        unsigned char digest[16];
        MD5Final(digest, &ctx);
        int i;
        for (i = 0; i < 16; ++i) {
            sas[i+i] = hex[digest[i] >> 4];
            sas[i+i+1] = hex[digest[i] & 0x0f];
        }
        sas[i+i] = '\0';
#endif

        snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d&sas=%s",
                g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id, sas);

        ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
    }
}

// ÁÖ»çÀ§
ACMD(do_dice)
{
    ch->ChatPacket(CHAT_TYPE_INFO, "Dice komudu bu serverde kullanilamaz.. ");
}

ACMD(do_click_mall)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeMallPassword");
}

ACMD(do_item_game_start){
    BYTE job = ch->GetJob();
    LPITEM item;
    for (int i = 0; i < 6; i++)
    {
        item = ch->GetWear(i);
        if (item != NULL)
            ch->UnequipItem(item);
    }
    item = ch->GetWear(WEAR_SHIELD);
    if (item != NULL)
        ch->UnequipItem(item);


    switch (job)
    {
    case JOB_SURA:
        {
       
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11609);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12489);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_WARRIOR:
        {
       
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11209);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12209 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_SHAMAN:
        {
       
            item = ITEM_MANAGER::instance().CreateItem(7009);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11809);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12629 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    case JOB_ASSASSIN:
        {
       
            item = ITEM_MANAGER::instance().CreateItem(19);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(11409);
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(12349 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(13009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(14009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(15009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(16009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(17009 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
            item = ITEM_MANAGER::instance().CreateItem(39036 );
            if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
                M2_DESTROY_ITEM(item);
        }
        break;
    }
}


ACMD(do_item_game_start_bonus)
{
    BYTE job = ch->GetJob();
    LPITEM item;


    switch (job)
    {
    case JOB_WARRIOR:
    case JOB_ASSASSIN:
    case JOB_SURA:
    case JOB_SHAMAN:
        {
            //  -- Kask Efsunlar©¥
            item = ch->GetWear(WEAR_HEAD);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_ATT_SPEED, 8);
                item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
                item->SetForceAttribute( 2, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 3, APPLY_DODGE, 15);
                item->SetForceAttribute( 4, APPLY_STEAL_HP, 10);
            }
            // -- Silah Efsunlar©¥
            item = ch->GetWear(WEAR_WEAPON);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_STR, 12);
                item->SetForceAttribute( 1, APPLY_CRITICAL_PCT, 10);
                item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 3, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 4, APPLY_STUN_PCT, 8);
            }
            // -- Kalkan Efsunlar©¥
            item = ch->GetWear(WEAR_SHIELD);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_CON, 12);
                item->SetForceAttribute( 1, APPLY_BLOCK, 15);
                item->SetForceAttribute( 2, APPLY_REFLECT_MELEE, 10);
                item->SetForceAttribute( 3, APPLY_IMMUNE_STUN, 1);
                item->SetForceAttribute( 4, APPLY_STR, 12);
            }
            //  -- Z©¥rh Efsunlar©¥
            item = ch->GetWear(WEAR_BODY);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_CAST_SPEED, 20);
                item->SetForceAttribute( 2, APPLY_STEAL_HP, 10);
                item->SetForceAttribute( 3, APPLY_REFLECT_MELEE, 10);
                item->SetForceAttribute( 4, APPLY_ATT_GRADE_BONUS, 50);
            }
            //  -- Ayakkab©¥ Efsunlar©¥
            item = ch->GetWear(WEAR_FOOTS);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
                item->SetForceAttribute( 2, APPLY_MOV_SPEED, 8);
                item->SetForceAttribute( 3, APPLY_ATT_SPEED, 8);
                item->SetForceAttribute( 4, APPLY_CRITICAL_PCT, 10);
            }
            //  -- Bilezik Efsunlar©¥
            item = ch->GetWear(WEAR_WRIST);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
                item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 3, APPLY_STEAL_HP, 10);
                item->SetForceAttribute( 4, APPLY_MANA_BURN_PCT, 10);
            }
            //  -- Kolye Efsunlar©¥
            item = ch->GetWear(WEAR_NECK);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MAX_HP, 3000);
                item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
                item->SetForceAttribute( 2, APPLY_CRITICAL_PCT, 10);
                item->SetForceAttribute( 3, APPLY_PENETRATE_PCT, 10);
                item->SetForceAttribute( 4, APPLY_STEAL_HP, 10);
            }
            //  -- Kupe Efsunlar©¥
            item = ch->GetWear(WEAR_EAR);
            if (item != NULL)
            {
                item->ClearAttribute();
                item->SetForceAttribute( 0, APPLY_MOV_SPEED, 20);
                item->SetForceAttribute( 1, APPLY_ATTBONUS_ANIMAL, 20);
                item->SetForceAttribute( 2, APPLY_POISON_REDUCE, 5);
                item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
                item->SetForceAttribute( 4, APPLY_ATTBONUS_UNDEAD, 20);
            }
        }
        break;
    }
}


ACMD(do_click_town)
{
    ch->WarpSet(EMPIRE_START_X(ch->GetEmpire()), EMPIRE_START_Y(ch->GetEmpire()));
}

ACMD(do_click_safebox)
{
    ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowMeSafeboxPassword");
}

ACMD(do_ride)
{
    dev_log(LOG_DEB0, "[DO_RIDE] start");
    if (ch->IsDead() || ch->IsStun())
    return;

    {
    if (ch->IsHorseRiding())
    {
        dev_log(LOG_DEB0, "[DO_RIDE] stop riding");
        ch->StopRiding();
        return;
    }

    if (ch->GetMountVnum())
    {
        dev_log(LOG_DEB0, "[DO_RIDE] unmount");
        do_unmount(ch, NULL, 0, 0);
        return;
    }
    }

    {
    if (ch->GetHorse() != NULL)
    {
        dev_log(LOG_DEB0, "[DO_RIDE] start riding");
        ch->StartRiding();
        return;
    }

    for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i)
    {
        LPITEM item = ch->GetInventoryItem(i);
        if (NULL == item)
        continue;

        if (item->IsRideItem())
        {
            if (NULL==ch->GetWear(WEAR_UNIQUE1) || NULL==ch->GetWear(WEAR_UNIQUE2) || NULL==ch->GetWear(WEAR_COSTUME_MOUNT))
            {
                dev_log(LOG_DEB0, "[DO_RIDE] USE UNIQUE ITEM");
                ch->UseItem(TItemPos (INVENTORY, i));
                return;
            }
        }

        switch (item->GetVnum())
        {
        case 71114:
        case 71116:
        case 71118:
        case 71120:
            dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
            ch->UseItem(TItemPos (INVENTORY, i));
            return;
        }

        if( (item->GetVnum() > 52000) && (item->GetVnum() < 52091) )    {
            dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM");
            ch->UseItem(TItemPos (INVENTORY, i));
            return;
        }
    }
    }

    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?? ?? ??????."));
}

#ifdef __AUCTION__
// temp_auction
ACMD(do_get_item_id_list)
{
    for (int i = 0; i < INVENTORY_MAX_NUM; i++)
    {
        LPITEM item = ch->GetInventoryItem(i);
        if (item != NULL)
            ch->ChatPacket(CHAT_TYPE_INFO, "name : %s id : %d", item->GetProto()->szName, item->GetID());
    }
}

// temp_auction

ACMD(do_enroll_auction)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    char arg4[256];
    two_arguments (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3), arg4, sizeof(arg4));
   
    DWORD item_id = strtoul(arg1, NULL, 10);
    BYTE empire = strtoul(arg2, NULL, 10);
    int bidPrice = strtol(arg3, NULL, 10);
    int immidiatePurchasePrice = strtol(arg4, NULL, 10);

    LPITEM item = ITEM_MANAGER::instance().Find(item_id);
    if (item == NULL)
        return;

    AuctionManager::instance().enroll_auction(ch, item, empire, bidPrice, immidiatePurchasePrice);
}

ACMD(do_enroll_wish)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
   
    DWORD item_num = strtoul(arg1, NULL, 10);
    BYTE empire = strtoul(arg2, NULL, 10);
    int wishPrice = strtol(arg3, NULL, 10);

    AuctionManager::instance().enroll_wish(ch, item_num, empire, wishPrice);
}

ACMD(do_enroll_sale)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    one_argument (two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
   
    DWORD item_id = strtoul(arg1, NULL, 10);
    DWORD wisher_id = strtoul(arg2, NULL, 10);
    int salePrice = strtol(arg3, NULL, 10);

    LPITEM item = ITEM_MANAGER::instance().Find(item_id);
    if (item == NULL)
        return;

    AuctionManager::instance().enroll_sale(ch, item, wisher_id, salePrice);
}

// temp_auction
// packetÀ¸·Î Åë½ÅÇÏ°Ô Çϰí, ÀÌ°Ç »èÁ¦ÇؾßÇÑ´Ù.
ACMD(do_get_auction_list)
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));

    AuctionManager::instance().get_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
}
//
//ACMD(do_get_wish_list)
//{
//    char arg1[256];
//    char arg2[256];
//    char arg3[256];
//    two_arguments (one_argument (argument, arg1, sizeof(arg1)), arg2, sizeof(arg2), arg3, sizeof(arg3));
//
//    AuctionManager::instance().get_wish_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10), strtoul(arg3, NULL, 10));
//}
ACMD (do_get_my_auction_list)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_my_auction_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_get_my_purchase_list)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_my_purchase_list (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_auction_bid)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().bid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_auction_impur)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().immediate_purchase (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_get_auctioned_item)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_buy_sold_item)
{
    char arg1[256];
    char arg2[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().get_auctioned_item (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_cancel_auction)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_auction (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_cancel_wish)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_wish (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_cancel_sale)
{
    char arg1[256];
    one_argument (argument, arg1, sizeof(arg1));

    AuctionManager::instance().cancel_sale (ch, strtoul(arg1, NULL, 10));
}

ACMD (do_rebid)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().rebid (ch, strtoul(arg1, NULL, 10), strtoul(arg2, NULL, 10));
}

ACMD (do_bid_cancel)
{
    char arg1[256];
    char arg2[256];
    two_arguments (argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    AuctionManager::instance().bid_cancel (ch, strtoul(arg1, NULL, 10));
}
#endif

LPEVENT ruhtimer = NULL;

EVENTINFO(TMainEventInfo)
{
    LPCHARACTER    kim;  
    long skillindexx;  
   
    TMainEventInfo()
    : kim( NULL )
    , skillindexx( 0 )
    {
    }

} ;

EVENTFUNC(ruh_event)
{
    TMainEventInfo * info = dynamic_cast<TMainEventInfo *>(  event->info );

    if ( info == NULL )
    {
        sys_err( "ruh_event> <Factor> Null pointer" );
        return 0;
    }
   
    LPCHARACTER    ch = info->kim;
    long skillindex = info->skillindexx;
   
    if (NULL == ch || skillindex == 0)
        return 0;
   
    if(ch->CountSpecifyItem(50513) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhtasiyok"));
        return 0;
    }
   
   
   
   
    int skilllevel = ch->GetSkillLevel(skillindex);

    if (skilllevel >= 40)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhskillson"));
        return 0;
    }
    int gerekenderece = (1000+500*(skilllevel-30));
    int derecem = (ch->GetRealAlignment()/10);
    int sonuc = (-19000+gerekenderece);
    if (derecem < 0)
    {
        gerekenderece = gerekenderece*2;
        sonuc = (-19000-gerekenderece);
    }
    if (derecem > sonuc)
    {
        // int gerekliknk = sonuc-derecem;
        int gerekliknk = gerekenderece;
        int kactane = gerekliknk/500;
        if (kactane < 0)
        {
            kactane = 0 - kactane;
        }
       
        if (derecem < 0)
        {
            if (ch->CountSpecifyItem(70102) < kactane)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbitti %d"),kactane);
                return 0;
            }
           
            int delta = MIN(-(ch->GetAlignment()), 500);
            ch->UpdateAlignment(delta*kactane);
            ch->RemoveSpecifyItem(70102,kactane);
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbastim"));
        }
    }
       
    if(ch->GetQuestFlag("ruh.sure") > get_global_time())
    {
        if (ch->CountSpecifyItem(71001) < 1 )
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhsuredolmadi"));
            return 0;
        }
        else
        {
            ch->RemoveSpecifyItem(71001,1);
        }
           
    }
   
    if (ch->CountSpecifyItem(71094) >= 1)
    {
        ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
        ch->RemoveSpecifyItem(71094,1);
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhmunzevikullandim"));
    }
   
    if (gerekenderece < 0)
    {
        ch->UpdateAlignment(gerekenderece*10);
    }
    else
    {
        ch->UpdateAlignment(-gerekenderece*10);
    }
    ch->LearnGrandMasterSkill(skillindex);
    ch->RemoveSpecifyItem(50513,1);
    ch->SetQuestFlag("ruh.sure",get_global_time()+60*60*24);

    return 1;
}

ACMD(do_ruhoku)
{
    int gelen;
    long skillindex;
    char arg1[256], arg2[256];
   
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    str_to_number(gelen, arg1);
    str_to_number(skillindex, arg2);
   
    if (!ch)
        return;

    if (!ch->IsPC())
        return;

    if (ch->IsDead() || ch->IsStun())
        return;

    if (ch->IsHack())
        return;
   
   
    if(ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?? ???(??,??,??)?? ????? ??? ? ????."));
        return;
    }
   
   
   
    if(ch->CountSpecifyItem(50513) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhtasiyok"));
        return;
    }
   
    LPITEM slot1 = ch->GetWear(WEAR_UNIQUE1);
    LPITEM slot2 = ch->GetWear(WEAR_UNIQUE2);
   
    if (NULL != slot1)
    {
        if (slot1->GetVnum() == 70048)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pelerin_cikar"));
            return;
        }
    }
    if (NULL != slot2)
    {
        if (slot2->GetVnum() == 70048)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("pelerin_cikar"));
            return;
        }
    }
   
    int skillgrup = ch->GetSkillGroup();
    if (skillgrup == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhokuyamazsin"));
        return;
    }
   
   
   
    if (gelen == 1) ///tek
    {
        int skilllevel = ch->GetSkillLevel(skillindex);
        int gerekenderece = (1000+500*(skilllevel-30));
        int derecem = (ch->GetRealAlignment()/10);
        int sonuc = (-19000+gerekenderece);
       
        if (ch->GetQuestFlag("ruh.yenisure") > get_global_time())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruh1sn"));
            return;
        }
       
       
        if (derecem < 0)
        {
            gerekenderece = gerekenderece*2;
            sonuc = (-19000-gerekenderece);
        }
        if (derecem > sonuc)
        {
           
            // int gerekliknk = sonuc-derecem;
            int gerekliknk = gerekenderece;
            int kactane = gerekliknk/500;
            if (kactane < 0)
            {
                kactane = 0 - kactane;
            }
           
            if (derecem < 0)
            {
                if (ch->CountSpecifyItem(70102) < kactane)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbitti %d"),kactane);
                    return;
                }
               
                int delta = MIN(-(ch->GetAlignment()), 500);
                ch->UpdateAlignment(delta*kactane);
                ch->RemoveSpecifyItem(70102,kactane);
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhzenbastim"));
            }
        }

       
        if(ch->GetQuestFlag("ruh.sure") > get_global_time())
        {
            if (ch->CountSpecifyItem(71001) < 1 )
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhsuredolmadi"));
                return;
            }
            else
            {
                ch->RemoveSpecifyItem(71001,1);
            }
               
        }
       
        if (ch->CountSpecifyItem(71094) >= 1)
        {
            ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
            ch->RemoveSpecifyItem(71094,1);
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhmunzevikullandim"));
        }
       
        if (gerekenderece < 0)
        {
            ch->UpdateAlignment(gerekenderece*10);
        }
        else
        {
            ch->UpdateAlignment(-gerekenderece*10);
        }
       
        ch->LearnGrandMasterSkill(skillindex);
        ch->RemoveSpecifyItem(50513,1);
        ch->SetQuestFlag("ruh.sure",get_global_time()+60*60*24);
        ch->SetQuestFlag("ruh.yenisure",get_global_time()+1);
       

    }
    else if(gelen == 0) ///hepsi
    {
       
        if (ruhtimer)
        {
            event_cancel(&ruhtimer);
        }
       
        TMainEventInfo* info = AllocEventInfo<TMainEventInfo>();
       
       
        info->kim = ch;
        info->skillindexx = skillindex;
        ruhtimer = event_create(ruh_event, info, PASSES_PER_SEC(1));
    }
    return;
}

LPEVENT bktimer = NULL;

EVENTINFO(TMainEventInfo2)
{
    LPCHARACTER    kim;  
    long skillindexx;  
   
    TMainEventInfo2()
    : kim( NULL )
    , skillindexx( 0 )
    {
    }

} ;

EVENTFUNC(bk_event)
{
    TMainEventInfo2 * info = dynamic_cast<TMainEventInfo2 *>(  event->info );

    if ( info == NULL )
    {
        sys_err( "ruh_event> <Factor> Null pointer" );
        return 0;
    }
   
    LPCHARACTER    ch = info->kim;
    long skillindex = info->skillindexx;
   
    if (NULL == ch || skillindex == 0)
        return 0;
   
    if (!ch)
        return 0;
   
    if (ch)
    {
        if(ch->CountSpecifyItem(50300) < 1 )
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Beceri kitabın olmadan bu işlemi yapamazsin."));
            return 0;
        }
       
       
        int skilllevel = ch->GetSkillLevel(skillindex);
        if (skilllevel >= 30)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Yetenek son seviyeye ulasti."));
            return 0;
        }
       
        int dwVnum = ch->BKBul(skillindex);
        if (dwVnum == 999)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
            return 0;
        }
           
        LPITEM item = ch->GetInventoryItem(dwVnum);
       
        if (item->GetVnum() != 50300 || item->GetSocket(0) != skillindex)
        {
            return 0;
        }
       
        if (ch->CountSpecifyItem(71001) > 0)
        {
            if (!ch->IsAffectFlag(513))
            {
                ch->AddAffect(513, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71001,1);
            }
           
        }
       
        if (ch->CountSpecifyItem(71001) < 1)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Beceri kitabi okumaya devam etmek icin kotu ruh kovma kagidina ihtiyacin var."));
            return 0;
        }

        if (ch->CountSpecifyItem(71094) >= 1)
        {
            if (!ch->IsAffectFlag(512))
            {
                ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71094,1);
            }
        }
        if (item->GetVnum() == 50300)
        {
            if (true == ch->LearnSkillByBook(skillindex))
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
            }
            else
            {
               
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
               
               
            }
        }
        return 1;
    }
    return 0;  
}
ACMD(do_bkoku)
{
   
    int gelen;
    long skillindex;
    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    str_to_number(gelen, arg1);
    str_to_number(skillindex, arg2);
   
    if (!ch)
        return;

    if (!ch->IsPC())
        return;

    if (ch->IsDead() || ch->IsStun())
        return;

    if (ch->IsHack())
        return;
   
    if(ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Áß(â°í,±³È¯,»óÁ¡)¿¡´Â °³ÀλóÁ¡À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }
   
    int skillgrup = ch->GetSkillGroup();
    if (skillgrup == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Becerilerini almadan bu islemi yapamazsin."));
        return;
    }
   
   
   
    if(ch->CountSpecifyItem(50300) < 1 )
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
        return;
    }
   
   
    if (gelen == 1) ///tek
    {
        int skilllevel = ch->GetSkillLevel(skillindex);

        if (skilllevel >= 30)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ruhskillson"));
            return;
        }
       
        if (ch->GetQuestFlag("bk.yenisure") > get_global_time())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Bir sonraki okuma icin 1 saniye beklemelisin."));
            return;
        }
       
        int dwVnum = ch->BKBul(skillindex);
        if (dwVnum == 999)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Beceri Sistemi>Gerekli beceriye ait beceri kitabin yok."));
            return;
        }
       
        LPITEM item = ch->GetInventoryItem(dwVnum);
       
        if (item->GetVnum() != 50300 || item->GetSocket(0) != skillindex)
        {
            return;
        }
       
       
        if (ch->CountSpecifyItem(71001) > 0)
        {
            if (!ch->IsAffectFlag(513))
            {
                ch->AddAffect(513, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71001,1);
            }
        }

        if (ch->CountSpecifyItem(71094) >= 1)
        {
            if (!ch->IsAffectFlag(512))
            {
                ch->AddAffect(512, aApplyInfo[0].bPointType, 0, 0, 536870911, 0, false);
                ch->RemoveSpecifyItem(71094,1);
            }
        }
        if (item->GetVnum() == 50300)
        {
           
           
            if (ch->FindAffect(AFFECT_SKILL_NO_BOOK_DELAY) == false && ch->CountSpecifyItem(71001) < 1)
            {
                ch->SkillLearnWaitMoreTimeMessage(ch->GetSkillNextReadTime(skillindex) - get_global_time());
                return;
            }
           
           
            if (true == ch->LearnSkillByBook(skillindex))
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }  
            }
            else
            {
                if (item->GetVnum() == 50300 && item->GetSocket(0) == skillindex)
                {
                    item->SetCount(item->GetCount() - 1);
                    int iReadDelay;
                    iReadDelay= number(SKILLBOOK_DELAY_MIN, SKILLBOOK_DELAY_MAX);
                    ch->SetSkillNextReadTime(skillindex, get_global_time() + iReadDelay);
                }
            }
            ch->SetQuestFlag("bk.yenisure",get_global_time()+1);
        }
       
    }
    else if(gelen == 0) ///hepsi
    {
        if (bktimer)
        {
            event_cancel(&bktimer);
        }
       
        TMainEventInfo2* info = AllocEventInfo<TMainEventInfo2>();
       
       
        info->kim = ch;
        info->skillindexx = skillindex;
        bktimer = event_create(bk_event, info, PASSES_PER_SEC(1));
    }

    return;
}

ACMD(do_open_offline_shop)
{
    // olmusssun
    if (ch->IsDead())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Sekilde Bu Islemi Yapamazsin.");
        return;
    }

    // If character is exchanging with someone, return false
    if (ch->GetExchange())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character has a private shop, return false
    if (ch->GetMyShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character is look at one offline shop, return false
    if (ch->GetOfflineShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If cube window is open, return false
    if (ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If cube window is open, return false
    //if (ch->IsAcceOpen())
    //{
    //    ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
    //    return;
    //}

    // If character's safebox is open, return false
    if (ch->IsOpenSafebox())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // If character's shop window is open, return false
    if (ch->GetShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "<Offline Shop> Bu Pencerede Offline Shop Acilamaz.");
        return;
    }

    // Send the command to client.
    ch->ChatPacket(CHAT_TYPE_COMMAND, "OpenOfflineShop");
}

ACMD(do_search_cofres){
   
    int posicion = 0;
    bool g_item_cofres = false;
    const char *line;
    char arg1[256], arg2[256];

    line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    if (0 == arg1[0])
        return;

    int slot = atoi(arg2);
    LPITEM    item = ch->GetItem(TItemPos(INVENTORY, slot));

    if(NULL == item){
        ch->ChatPacket(CHAT_TYPE_INFO,"[SearchBox]Error 000");
        return;
    }
    DWORD dwBoxVnum = item->GetVnum();
    std::vector <DWORD> dwVnums;
    std::vector <DWORD> dwCounts;
    std::vector <LPITEM> item_gets(NULL);
    int count = 0;

    std::vector <DWORD> dwVnums1;
    std::vector <DWORD> dwCounts1;
    std::vector <LPITEM> item_gets1(NULL);
    int count1 = 0;

    const std::string& strArg1 = std::string(arg1);

    if (ch->InformationSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
    {
        g_item_cofres = true;
    }

    if (g_item_cofres == false || dwBoxVnum == 50300){
        ch->ChatPacket(CHAT_TYPE_INFO,"[SearchBox]Este item no contiene items adentro.");
        return;
    }

    if (strArg1 == "search"){

        if (ch->InformationSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
        {
            for (int i = 0; i < count; i++)
            {
                ch->ChatPacket(CHAT_TYPE_COMMAND, "search_cofre_ids %d %d", dwVnums[i],dwCounts[i]);
            }
            ch->ChatPacket(CHAT_TYPE_COMMAND,"search_cofre_refresh");
        }
    }
    else if(strArg1 == "open"){
        if (item->GetType() == ITEM_TREASURE_BOX)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "[SearchBox]No puede abrir items que necesiten llaves");
            return;
        }
        if (ch->GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums1, dwCounts1, item_gets1, count1))
        {
            ch->RemoveSpecifyItem(dwBoxVnum, 1);
            for (int i = 0; i < count1; i++){
                switch (dwVnums1[i])
                {
                    case CSpecialItemGroup::GOLD:
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ha recibido %d de yang."), dwCounts1[i]);
                        break;
                    case CSpecialItemGroup::EXP:
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Ha recibido %d de exp."), dwCounts1[i]);
                        break;
                }
            }
            ch->ChatPacket(CHAT_TYPE_COMMAND,"search_cofre_refresh_open");
        }

    }
}

ACMD(do_search_shop){

    const char *var;
    char arg1[255],arg2[255];
    var = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

    int arg1_1 = atoi(arg1);
    int arg2_1 = atoi(arg2);

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Su argumento no es valido");
        return;
    }

    char szQuery1[1024];
    snprintf(szQuery1, sizeof(szQuery1),"SELECT * FROM player.offline_shop_npc");
    std::auto_ptr<SQLMsg> pMsg1(DBManager::Instance().DirectQuery(szQuery1));

    char szQuery[1024];
    char szQuery2[1024];
    char szQuery3[1024];
    char InsertSql[1024];

    int i_x = 0;
    int i_x_0 = 0;


    snprintf(szQuery3, sizeof(szQuery3),"SELECT * FROM player.offline_shop_search WHERE iid=%d",ch->GetPlayerID());
    std::auto_ptr<SQLMsg> pMsg3(DBManager::Instance().DirectQuery(szQuery3));
    if (pMsg3->Get()->uiNumRows > 0)
    {
        while (MYSQL_ROW row_vid = mysql_fetch_row(pMsg3->Get()->pSQLResult))
        {
            DWORD ID_Vid = 0;
            const char * Id_Vid_0 = row_vid[2];
            str_to_number(ID_Vid, Id_Vid_0);

            LPEVENT pkEvent = CTargetManager::instance().GetTargetEvent(ch->GetPlayerID(), ID_Vid, "_WorldArd_");
            if (pkEvent){
                CTargetManager::instance().DeleteTarget(ch->GetPlayerID(), ID_Vid, "_WorldArd_");
            }
        }
        DBManager::instance().DirectQuery("DELETE FROM player.offline_shop_search WHERE iid = %d", ch->GetPlayerID());
    }
    if (pMsg1->Get()->uiNumRows > 0){
        while (MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult))
        {
            DWORD ID_User = 0;
            const char * Id_User = row[0]; //iD Usuario
            str_to_number(ID_User, Id_User); //Convierte el vnum de string a numero entero

            snprintf(szQuery, sizeof(szQuery),"SELECT * FROM player.offline_shop_item WHERE vnum=%d and owner_id=%d",arg1_1,ID_User);
            std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery(szQuery));
            if (pMsg->Get()->uiNumRows > 0)
            {
                MYSQL_ROW row1 = mysql_fetch_row(pMsg->Get()->pSQLResult);

                DWORD ID_User_0 = 0;
                const char * Id_User_0 = row1[1];
                str_to_number(ID_User_0, Id_User_0);

                const char * Item_Gold_0 = row1[41]; //Gold Tablas
                int Gold_Item_0 = 0;
                str_to_number(Gold_Item_0, Item_Gold_0); //Convierte el vnum de string a numero entero

                if (arg2_1 > 0){
                    if (Gold_Item_0 <= arg2_1){

                        snprintf(szQuery2, sizeof(szQuery2),"SELECT * FROM player.offline_shop_npc WHERE owner_id=%d",ID_User_0);
                        std::auto_ptr<SQLMsg> pMsg2(DBManager::Instance().DirectQuery(szQuery2));
                        MYSQL_ROW row2 = mysql_fetch_row(pMsg2->Get()->pSQLResult);

                        const char * Posicion_X = row2[4]; //Posicion X
                        const char * Posicion_Y = row2[5]; //Posicion Y}
                        const char * Id_Owner = row2[0];

                        DWORD P_x = 0;
                        DWORD P_y = 0;
                        DWORD I_O = 0;
                        str_to_number(P_x, Posicion_X);
                        str_to_number(P_y, Posicion_Y);
                        str_to_number(I_O, Id_Owner);

                        CTargetManager::instance().CreateTarget(ch->GetPlayerID(),
                        I_O,
                        "_WorldArd_",
                        TARGET_TYPE_SHOP,
                        P_x,P_y,
                        ch->GetMapIndex());
                       
                        snprintf(InsertSql, sizeof(InsertSql), "INSERT INTO player.offline_shop_search (iid,vid) VALUES(%d,%d)", ch->GetPlayerID() , I_O);
                        std::auto_ptr<SQLMsg> pmsg4(DBManager::instance().DirectQuery(InsertSql));

                        ++i_x;
                    }
                }
                else{
                    snprintf(szQuery2, sizeof(szQuery2),"SELECT * FROM player.offline_shop_npc WHERE owner_id=%d",ID_User_0);
                    std::auto_ptr<SQLMsg> pMsg2(DBManager::Instance().DirectQuery(szQuery2));
                    MYSQL_ROW row2 = mysql_fetch_row(pMsg2->Get()->pSQLResult);

                    const char * Posicion_X = row2[4]; //Posicion X
                    const char * Posicion_Y = row2[5]; //Posicion Y}
                    const char * Id_Owner = row2[0];

                    DWORD P_x = 0;
                    DWORD P_y = 0;
                    DWORD I_O = 0;
                    str_to_number(P_x, Posicion_X);
                    str_to_number(P_y, Posicion_Y);
                    str_to_number(I_O, Id_Owner);

                    CTargetManager::instance().CreateTarget(ch->GetPlayerID(),
                    I_O,
                    "_WorldArd_",
                    TARGET_TYPE_SHOP,
                    P_x,P_y,
                    ch->GetMapIndex());
                       
                    snprintf(InsertSql, sizeof(InsertSql), "INSERT INTO player.offline_shop_search (iid,vid) VALUES(%d,%d)", ch->GetPlayerID() , I_O);
                    std::auto_ptr<SQLMsg> pmsg4(DBManager::instance().DirectQuery(InsertSql));

                    ++i_x;
                }
            }
        }
    }
    ch->SetIndexW(i_x);
}

Kod:
#include "stdafx.h"
#include "../../libgame/include/grid.h"
#include "constants.h"
#include "utils.h"
#include "config.h"
#include "shop.h"
#include "desc.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "item.h"
#include "item_manager.h"
#include "buffer_manager.h"
#include "packet.h"
#include "log.h"
#include "db.h"
#include "questmanager.h"
#include "monarch.h"
#include "mob_manager.h"
#include "locale_service.h"
#include "desc_client.h"
#include "shop_manager.h"
#include "group_text_parse_tree.h"
#include "shopEx.h"
#include <boost/algorithm/string/predicate.hpp>
#include "shop_manager.h"
#include <cctype>

CShopManager::CShopManager()
{
}

CShopManager::~CShopManager()
{
    Destroy();
}

bool CShopManager::Initialize(TShopTable * table, int size)
{
    if (!m_map_pkShop.empty())
        return false;

    int i;

    for (i = 0; i < size; ++i, ++table)
    {
        LPSHOP shop = M2_NEW CShop;

        if (!shop->Create(table->dwVnum, table->dwNPCVnum, table->items))
        {
            M2_DELETE(shop);
            continue;
        }

        m_map_pkShop.insert(TShopMap::value_type(table->dwVnum, shop));
        m_map_pkShopByNPCVnum.insert(TShopMap::value_type(table->dwNPCVnum, shop));
    }
    char szShopTableExFileName[256];

    snprintf(szShopTableExFileName, sizeof(szShopTableExFileName),
        "%s/shop_table_ex.txt", LocaleService_GetBasePath().c_str());

    return ReadShopTableEx(szShopTableExFileName);
}

void CShopManager::Destroy()
{
    TShopMap::iterator it = m_map_pkShop.begin();

    while (it != m_map_pkShop.end())
    {
        M2_DELETE(it->second);
        ++it;
    }

    m_map_pkShop.clear();
}

LPSHOP CShopManager::Get(DWORD dwVnum)
{
    TShopMap::const_iterator it = m_map_pkShop.find(dwVnum);

    if (it == m_map_pkShop.end())
        return NULL;

    return (it->second);
}

LPSHOP CShopManager::GetByNPCVnum(DWORD dwVnum)
{
    TShopMap::const_iterator it = m_map_pkShopByNPCVnum.find(dwVnum);

    if (it == m_map_pkShopByNPCVnum.end())
        return NULL;

    return (it->second);
}

/*
* ÀÎÅÍÆäÀ̽º ÇÔ¼öµé
*/

// »óÁ¡ °Å·¡¸¦ ½ÃÀÛ
bool CShopManager::StartShopping(LPCHARACTER pkChr, LPCHARACTER pkChrShopKeeper, int iShopVnum)
{
    if (pkChr->GetShopOwner() == pkChrShopKeeper)
        return false;
    // this method is only for NPC
    if (pkChrShopKeeper->IsPC())
        return false;

    if (int(pkChr->GetQuestFlag("Kilit.Enable")) == 1)
    {
        pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return false;
    }

    //PREVENT_TRADE_WINDOW
    if (pkChr->IsOpenSafebox() || pkChr->GetExchange() || pkChr->GetMyShop() || pkChr->IsCubeOpen())
    {
        pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Ã¢ÀÌ ¿¸°»óÅ¿¡¼´Â »óÁ¡°Å·¡¸¦ ÇÒ¼ö °¡ ¾ø½À´Ï´Ù."));
        return false;
    }
    //END_PREVENT_TRADE_WINDOW

    // long distance = DISTANCE_APPROX(pkChr->GetX() - pkChrShopKeeper->GetX(), pkChr->GetY() - pkChrShopKeeper->GetY());

    // if (distance >= SHOP_MAX_DISTANCE)
    // {
        // sys_log(1, "SHOP: TOO_FAR: %s distance %d", pkChr->GetName(), distance);
        // return false;
    // }

    LPSHOP pkShop;

    if (iShopVnum)
        pkShop = Get(iShopVnum);
    else
        pkShop = GetByNPCVnum(pkChrShopKeeper->GetRaceNum());

    if (!pkShop)
    {
        sys_log(1, "SHOP: NO SHOP");
        return false;
    }

    bool bOtherEmpire = false;

    if (pkChr->GetEmpire() != pkChrShopKeeper->GetEmpire())
        bOtherEmpire = true;

    pkShop->AddGuest(pkChr, pkChrShopKeeper->GetVID(), bOtherEmpire);
    pkChr->SetShopOwner(pkChrShopKeeper);
    sys_log(0, "SHOP: START: %s", pkChr->GetName());
    return true;
}

LPSHOP CShopManager::FindPCShop(DWORD dwVID)
{
    TShopMap::iterator it = m_map_pkShopByPC.find(dwVID);

    if (it == m_map_pkShopByPC.end())
        return NULL;

    return it->second;
}

LPSHOP CShopManager::CreatePCShop(LPCHARACTER ch, TShopItemTable * pTable, BYTE bItemCount)
{
    if (FindPCShop(ch->GetVID()))
        return NULL;

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return false;
    }

    LPSHOP pkShop = M2_NEW CShop;
    pkShop->SetPCShop(ch);
    pkShop->SetShopItems(pTable, bItemCount);

    m_map_pkShopByPC.insert(TShopMap::value_type(ch->GetVID(), pkShop));
    return pkShop;
}

void CShopManager::DestroyPCShop(LPCHARACTER ch)
{
    LPSHOP pkShop = FindPCShop(ch->GetVID());

    if (!pkShop)
        return;

    //PREVENT_ITEM_COPY;
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY
   
    m_map_pkShopByPC.erase(ch->GetVID());
    M2_DELETE(pkShop);
}

// »óÁ¡ °Å·¡¸¦ Á¾·á
void CShopManager::StopShopping(LPCHARACTER ch)
{
    LPSHOP shop;

    if (!(shop = ch->GetShop()))
        return;

    //PREVENT_ITEM_COPY;
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY
   
    shop->RemoveGuest(ch);
    sys_log(0, "SHOP: END: %s", ch->GetName());
}

// ¾ÆÀÌÅÛ ±¸ÀÔ
void CShopManager::Buy(LPCHARACTER ch, BYTE pos)
{

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

#ifdef INVENTORY_PROTECT
    if (ch->Inventory_Protect() == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanter kilitli satin"));
        return;
    }
#endif

    if (!ch->GetShop())
        return;

    if (!ch->GetShopOwner())
        return;

    // if (DISTANCE_APPROX(ch->GetX() - ch->GetShopOwner()->GetX(), ch->GetY() - ch->GetShopOwner()->GetY()) > 2000)
    // {
        // ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»óÁ¡°úÀÇ °Å¸®°¡ ³Ê¹« ¸Ö¾î ¹°°ÇÀ» »ì ¼ö ¾ø½À´Ï´Ù."));
        // return;
    // }

    CShop* pkShop = ch->GetShop();

    if (!pkShop->IsPCShop())
    {
        //if (pkShop->GetVnum() == 0)
        //    return;
        //const CMob* pkMob = CMobManager::instance().Get(pkShop->GetNPCVnum());
        //if (!pkMob)
        //    return;

        //if (pkMob->m_table.bType != CHAR_TYPE_NPC)
        //{
        //    return;
        //}
    }
    else
    {
    }

    //PREVENT_ITEM_COPY
    ch->SetMyShopTime();
    //END_PREVENT_ITEM_COPY

    int ret = pkShop->Buy(ch, pos);

    if (SHOP_SUBHEADER_GC_OK != ret) // ¹®Á¦°¡ ÀÖ¾úÀ¸¸é º¸³½´Ù.
    {
        TPacketGCShop pack;

        pack.header    = HEADER_GC_SHOP;
        pack.subheader    = ret;
        pack.size    = sizeof(TPacketGCShop);

        ch->GetDesc()->Packet(&pack, sizeof(pack));
    }
}

void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount)
{
    if (!ch->GetShop())
        return;

    if (!ch->GetShopOwner())
        return;

    if (!ch->CanHandleItem())
        return;

    if (ch->GetShop()->IsPCShop())
        return;

    if (int(ch->GetQuestFlag("Kilit.Enable")) == 1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("guvenlik_engel"));
        return;
    }

    // if (DISTANCE_APPROX(ch->GetX()-ch->GetShopOwner()->GetX(), ch->GetY()-ch->GetShopOwner()->GetY())>2000)
    // {
        // ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»óÁ¡°úÀÇ °Å¸®°¡ ³Ê¹« ¸Ö¾î ¹°°ÇÀ» ÆÈ ¼ö ¾ø½À´Ï´Ù."));
        // return;
    // }
   
    LPITEM item = ch->GetInventoryItem(bCell);

    if (!item)
        return;

    if (item->IsEquipped() == true)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Âø¿ë ÁßÀÎ ¾ÆÀÌÅÛÀº ÆÇ¸ÅÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    if (true == item->isLocked())
    {
        return;
    }

    if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
        return;

    DWORD dwPrice;

    if (item->GetType() == ITEM_WEAPON || item->GetType() == ITEM_ARMOR || item->GetType() == ITEM_BELT)
    {
        char szEventFlag[30];
        snprintf(szEventFlag, sizeof(szEventFlag), "%d.Engel", item->GetID());
        if (*szEventFlag)
        {
            if (quest::CQuestManager::instance().GetEventFlag(szEventFlag))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("item_kilit_sat_engel"));
                return;
            }
        }
    }

    if (bCount == 0 || bCount > item->GetCount())
        bCount = item->GetCount();
   
    dwPrice = item->GetShopBuyPrice();

    if(dwPrice > item->GetGold())
        dwPrice=item->GetGold();

    if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
    {
        if (dwPrice == 0)
            dwPrice = bCount;
        else
            dwPrice = bCount / dwPrice;
    }
    else
        dwPrice *= bCount;

    dwPrice /= 5;
   
    //¼¼±İ °è»ê
    DWORD dwTax = 0;
    int iVal = 0;
   
    if (LC_IsYMIR() ||  LC_IsKorea())
    {
        dwTax = dwPrice * iVal / 100;
        dwPrice -= dwTax;
    }
    else
    {
        dwTax = dwPrice * iVal/100;
        dwPrice -= dwTax;
    }

    if (test_server)
        sys_log(0, "Sell Item price id %d %s itemid %d", ch->GetPlayerID(), ch->GetName(), item->GetID());

    const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice);

    if (GOLD_MAX <= nTotalMoney)
    {
        sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold());
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20¾ï³ÉÀÌ ÃʰúÇÏ¿© ¹°Ç°À» ÆÈ¼ö ¾ø½À´Ï´Ù."));
        return;
    }

    // 20050802.myevan.»óÁ¡ ÆÇ¸Å ·Î±×¿¡ ¾ÆÀÌÅÛ ID Ãß°¡
    sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", ch->GetName(), item->GetName(), bCount, item->GetID(), dwPrice);

    if (iVal > 0)
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆÇ¸Å±İ¾×ÀÇ %d %% °¡ ¼¼±İÀ¸·Î ³ª°¡°ÔµË´Ï´Ù"), iVal);

    DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);

    if (bCount == item->GetCount())
    {
        // Çѱ¹¿¡´Â ¾ÆÀÌÅÛÀ» ¹ö¸®°í º¹±¸Çش޶ó´Â Áø»óÀ¯ÀúµéÀÌ ¸¹¾Æ¼
        // »óÁ¡ ÆÇ¸Å½Ã ¼Ó¼º·Î±×¸¦ ³²±ä´Ù.
        if (LC_IsYMIR())
            item->AttrLog();

        ITEM_MANAGER::instance().RemoveItem(item, "SELL");
    }
    else
        item->SetCount(item->GetCount() - bCount);

    //±ºÁÖ ½Ã½ºÅÛ : ¼¼±İ ¡¼ö
    CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);

    ch->PointChange(POINT_GOLD, dwPrice, false);
}

bool CompareShopItemName(const SShopItemTable& lhs, const SShopItemTable& rhs)
{
    TItemTable* lItem = ITEM_MANAGER::instance().GetTable(lhs.vnum);
    TItemTable* rItem = ITEM_MANAGER::instance().GetTable(rhs.vnum);
    if (lItem && rItem)
        return strcmp(lItem->szLocaleName, rItem->szLocaleName) < 0;
    else
        return true;
}

bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
{
    if (!pNode->GetValue("vnum", 0, shopTable.dwVnum))
    {
        sys_err("Group %s does not have vnum.", pNode->GetNodeName().c_str());
        return false;
    }

    if (!pNode->GetValue("name", 0, shopTable.name))
    {
        sys_err("Group %s does not have name.", pNode->GetNodeName().c_str());
        return false;
    }
   
    if (shopTable.name.length() >= SHOP_TAB_NAME_MAX)
    {
        sys_err("Shop name length must be less than %d. Error in Group %s, name %s", SHOP_TAB_NAME_MAX, pNode->GetNodeName().c_str(), shopTable.name.c_str());
        return false;
    }

    std::string stCoinType;
    if (!pNode->GetValue("cointype", 0, stCoinType))
    {
        stCoinType = "Gold";
    }
   
    if (boost::iequals(stCoinType, "Gold"))
    {
        shopTable.coinType = SHOP_COIN_TYPE_GOLD;
    }
    else if (boost::iequals(stCoinType, "SecondaryCoin"))
    {
        shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN;
    }
    else
    {
        sys_err("Group %s has undefine cointype(%s).", pNode->GetNodeName().c_str(), stCoinType.c_str());
        return false;
    }

    CGroupNode* pItemGroup = pNode->GetChildNode("items");
    if (!pItemGroup)
    {
        sys_err("Group %s does not have 'group items'.", pNode->GetNodeName().c_str());
        return false;
    }

    int itemGroupSize = pItemGroup->GetRowCount();
    std::vector <TShopItemTable> shopItems(itemGroupSize);
    if (itemGroupSize >= SHOP_HOST_ITEM_MAX_NUM)
    {
        sys_err("count(%d) of rows of group items of group %s must be smaller than %d", itemGroupSize, pNode->GetNodeName().c_str(), SHOP_HOST_ITEM_MAX_NUM);
        return false;
    }

    for (int i = 0; i < itemGroupSize; i++)
    {
        if (!pItemGroup->GetValue(i, "vnum", shopItems[i].vnum))
        {
            sys_err("row(%d) of group items of group %s does not have vnum column", i, pNode->GetNodeName().c_str());
            return false;
        }
       
        if (!pItemGroup->GetValue(i, "count", shopItems[i].count))
        {
            sys_err("row(%d) of group items of group %s does not have count column", i, pNode->GetNodeName().c_str());
            return false;
        }
        if (!pItemGroup->GetValue(i, "price", shopItems[i].price))
        {
            sys_err("row(%d) of group items of group %s does not have price column", i, pNode->GetNodeName().c_str());
            return false;
        }
    }
    std::string stSort;
    if (!pNode->GetValue("sort", 0, stSort))
    {
        stSort = "None";
    }

    if (boost::iequals(stSort, "Asc"))
    {
        std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName);
    }
    else if(boost::iequals(stSort, "Desc"))
    {
        std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName);
    }

    CGrid grid = CGrid(10, 9);
    int iPos;

    memset(&shopTable.items[0], 0, sizeof(shopTable.items));

    for (int i = 0; i < shopItems.size(); i++)
    {
        TItemTable * item_table = ITEM_MANAGER::instance().GetTable(shopItems[i].vnum);
        if (!item_table)
        {
            sys_err("vnum(%d) of group items of group %s does not exist", shopItems[i].vnum, pNode->GetNodeName().c_str());
            return false;
        }

        iPos = grid.FindBlank(1, item_table->bSize);

        grid.Put(iPos, 1, item_table->bSize);
        shopTable.items[iPos] = shopItems[i];
    }

    shopTable.byItemCount = shopItems.size();
    return true;
}

bool CShopManager::ReadShopTableEx(const char* stFileName)
{
    // file À¯¹« üũ.
    // ¾ø´Â °æ¿ì´Â ¿¡·¯·Î ó¸®ÇÏÁö ¾Ê´Â´Ù.
    FILE* fp = fopen(stFileName, "rb");
    if (NULL == fp)
        return true;
    fclose(fp);

    CGroupTextParseTreeLoader loader;
    if (!loader.Load(stFileName))
    {
        sys_err("%s Load fail.", stFileName);
        return false;
    }

    CGroupNode* pShopNPCGroup = loader.GetGroup("shopnpc");
    if (NULL == pShopNPCGroup)
    {
        sys_err("Group ShopNPC is not exist.");
        return false;
    }

    typedef std::multimap <DWORD, TShopTableEx> TMapNPCshop;
    TMapNPCshop map_npcShop;
    for (int i = 0; i < pShopNPCGroup->GetRowCount(); i++)
    {
        DWORD npcVnum;
        std::string shopName;
        if (!pShopNPCGroup->GetValue(i, "npc", npcVnum) || !pShopNPCGroup->GetValue(i, "group", shopName))
        {
            sys_err("Invalid row(%d). Group ShopNPC rows must have 'npc', 'group' columns", i);
            return false;
        }
        std::transform(shopName.begin(), shopName.end(), shopName.begin(), (int(*)(int))std::tolower);
        CGroupNode* pShopGroup = loader.GetGroup(shopName.c_str());
        if (!pShopGroup)
        {
            sys_err("Group %s is not exist.", shopName.c_str());
            return false;
        }
        TShopTableEx table;
        if (!ConvertToShopItemTable(pShopGroup, table))
        {
            sys_err("Cannot read Group %s.", shopName.c_str());
            return false;
        }
        if (m_map_pkShopByNPCVnum.find(npcVnum) != m_map_pkShopByNPCVnum.end())
        {
            sys_err("%d cannot have both original shop and extended shop", npcVnum);
            return false;
        }
       
        map_npcShop.insert(TMapNPCshop::value_type(npcVnum, table));  
    }

    for (TMapNPCshop::iterator it = map_npcShop.begin(); it != map_npcShop.end(); ++it)
    {
        DWORD npcVnum = it->first;
        TShopTableEx& table = it->second;
        if (m_map_pkShop.find(table.dwVnum) != m_map_pkShop.end())
        {
            sys_err("Shop vnum(%d) already exists", table.dwVnum);
            return false;
        }
        TShopMap::iterator shop_it = m_map_pkShopByNPCVnum.find(npcVnum);
       
        LPSHOPEX pkShopEx = NULL;
        if (m_map_pkShopByNPCVnum.end() == shop_it)
        {
            pkShopEx = M2_NEW CShopEx;
            pkShopEx->Create(0, npcVnum);
            m_map_pkShopByNPCVnum.insert(TShopMap::value_type(npcVnum, pkShopEx));
        }
        else
        {
            pkShopEx = dynamic_cast <CShopEx*> (shop_it->second);
            if (NULL == pkShopEx)
            {
                sys_err("WTF!!! It can't be happend. NPC(%d) Shop is not extended version.", shop_it->first);
                return false;
            }
        }

        if (pkShopEx->GetTabCount() >= SHOP_TAB_COUNT_MAX)
        {
            sys_err("ShopEx cannot have tab more than %d", SHOP_TAB_COUNT_MAX);
            return false;
        }

        if (pkShopEx->GetVnum() != 0 && m_map_pkShop.find(pkShopEx->GetVnum()) != m_map_pkShop.end())
        {
            sys_err("Shop vnum(%d) already exist.", pkShopEx->GetVnum());
            return false;
        }
        m_map_pkShop.insert(TShopMap::value_type (pkShopEx->GetVnum(), pkShopEx));
        pkShopEx->AddShopTable(table);
    }

    return true;
}

Kod:
#ifndef __INC_METIN_II_GAME_SHOP_MANAGER_H__
#define __INC_METIN_II_GAME_SHOP_MANAGER_H__

class CShop;
typedef class CShop * LPSHOP;

class CShopManager : public singleton<CShopManager>
{
public:
    typedef std::map<DWORD, CShop *> TShopMap;

public:
    CShopManager();
    virtual ~CShopManager();

    bool    Initialize(TShopTable * table, int size);
    void    Destroy();

    LPSHOP    Get(DWORD dwVnum);
    LPSHOP    GetByNPCVnum(DWORD dwVnum);

    bool    StartShopping(LPCHARACTER pkChr, LPCHARACTER pkShopKeeper, int iShopVnum = 0);
    void    StopShopping(LPCHARACTER ch);

    void    Buy(LPCHARACTER ch, BYTE pos);
    void    Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount=0);

    LPSHOP    CreatePCShop(LPCHARACTER ch, TShopItemTable * pTable, BYTE bItemCount);
    LPSHOP    FindPCShop(DWORD dwVID);
    void    DestroyPCShop(LPCHARACTER ch);

private:
    TShopMap    m_map_pkShop;
    TShopMap    m_map_pkShopByNPCVnum;
    TShopMap    m_map_pkShopByPC;

    bool    ReadShopTableEx(const char* stFileName);
};

#endif

Merhaba,

Benim eklediğim filesimdeki dosyaları atıyorum size oradan bakabilirsiniz.

https://www.dosyaupload.com/615w
 
Sorun çözüldü lakin Market NPC harici hepsii açılıyor . (Market NPC açılmıyor)

Source kısımlarını ben attım size şimdi, sonra game.py ' yide ben halletmiştim size. Ama siz gene bakın py lere. Tek orası kalıyo zaten geriye.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst