- 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
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
İ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, ¶m, 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, ¶m, 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, <m);
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



