diff options
Diffstat (limited to 'src/map/atcommand.c')
-rw-r--r-- | src/map/atcommand.c | 745 |
1 files changed, 375 insertions, 370 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 7c7939211..a546e4b9b 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -53,6 +53,8 @@ char* msg_table[MAX_MSG]; // Server messages (0-499 reserved for GM commands, 50 // local declarations #define ACMD_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message) +DBMap* atcommand_db = NULL;//name -> AtCommandInfo + typedef struct AtCommandInfo { const char* command; @@ -62,7 +64,6 @@ typedef struct AtCommandInfo } AtCommandInfo; static AtCommandInfo* get_atcommandinfo_byname(const char* name); -static AtCommandInfo* get_atcommandinfo_byfunc(const AtCommandFunc func); ACMD_FUNC(commands); @@ -4268,9 +4269,9 @@ ACMD_FUNC(reloadskilldb) /*========================================== * @reloadatcommand - reloads atcommand_athena.conf *------------------------------------------*/ -ACMD_FUNC(reloadatcommand) -{ - atcommand_config_read(ATCOMMAND_CONF_FILENAME); +void atcommand_doload(); +ACMD_FUNC(reloadatcommand) { + atcommand_doload(); clif_displaymessage(fd, msg_txt(254)); return 0; } @@ -8800,340 +8801,289 @@ ACMD_FUNC(new_mount) { } return 0; } -/*========================================== - * atcommand_info[] structure definition - *------------------------------------------*/ - -AtCommandInfo atcommand_info[] = { - { "rura", 40,40, atcommand_mapmove }, - { "warp", 40,40, atcommand_mapmove }, - { "mapmove", 40,40, atcommand_mapmove }, // + /mm - { "where", 1,1, atcommand_where }, - { "jumpto", 20,20, atcommand_jumpto }, // + /shift - { "warpto", 20,20, atcommand_jumpto }, - { "goto", 20,20, atcommand_jumpto }, - { "jump", 40,40, atcommand_jump }, - { "who", 20,20, atcommand_who }, - { "whois", 20,20, atcommand_who }, - { "who2", 20,20, atcommand_who2 }, - { "who3", 20,20, atcommand_who3 }, - { "whomap", 20,20, atcommand_whomap }, - { "whomap2", 20,20, atcommand_whomap2 }, - { "whomap3", 20,20, atcommand_whomap3 }, - { "whogm", 20,20, atcommand_whogm }, - { "save", 40,40, atcommand_save }, - { "return", 40,40, atcommand_load }, - { "load", 40,40, atcommand_load }, - { "speed", 40,40, atcommand_speed }, - { "storage", 1,1, atcommand_storage }, - { "gstorage", 50,50, atcommand_guildstorage }, - { "option", 40,40, atcommand_option }, - { "hide", 40,40, atcommand_hide }, // + /hide - { "jobchange", 40,40, atcommand_jobchange }, - { "job", 40,40, atcommand_jobchange }, - { "die", 1,1, atcommand_die }, - { "kill", 60,60, atcommand_kill }, - { "alive", 60,60, atcommand_alive }, - { "kami", 40,40, atcommand_kami }, - { "kamib", 40,40, atcommand_kami }, - { "kamic", 40,40, atcommand_kami }, - { "heal", 40,60, atcommand_heal }, - { "item", 60,60, atcommand_item }, - { "item2", 60,60, atcommand_item2 }, - { "itemreset", 40,40, atcommand_itemreset }, - { "blvl", 60,60, atcommand_baselevelup }, - { "lvup", 60,60, atcommand_baselevelup }, - { "blevel", 60,60, atcommand_baselevelup }, - { "baselvl", 60,60, atcommand_baselevelup }, - { "baselvup", 60,60, atcommand_baselevelup }, - { "baselevel", 60,60, atcommand_baselevelup }, - { "baselvlup", 60,60, atcommand_baselevelup }, - { "jlvl", 60,60, atcommand_joblevelup }, - { "jlevel", 60,60, atcommand_joblevelup }, - { "joblvl", 60,60, atcommand_joblevelup }, - { "joblevel", 60,60, atcommand_joblevelup }, - { "joblvup", 60,60, atcommand_joblevelup }, - { "joblvlup", 60,60, atcommand_joblevelup }, - { "h", 20,20, atcommand_help }, - { "help", 20,20, atcommand_help }, - { "h2", 20,20, atcommand_help2 }, - { "help2", 20,20, atcommand_help2 }, - { "pvpoff", 40,40, atcommand_pvpoff }, - { "pvpon", 40,40, atcommand_pvpon }, - { "gvgoff", 40,40, atcommand_gvgoff }, - { "gpvpoff", 40,40, atcommand_gvgoff }, - { "gvgon", 40,40, atcommand_gvgon }, - { "gpvpon", 40,40, atcommand_gvgon }, - { "model", 20,20, atcommand_model }, - { "go", 10,10, atcommand_go }, - { "monster", 50,50, atcommand_monster }, - { "spawn", 50,50, atcommand_monster }, - { "monstersmall", 50,50, atcommand_monstersmall }, - { "monsterbig", 50,50, atcommand_monsterbig }, - { "killmonster", 60,60, atcommand_killmonster }, - { "killmonster2", 40,40, atcommand_killmonster2 }, - { "refine", 60,60, atcommand_refine }, - { "produce", 60,60, atcommand_produce }, - { "memo", 40,40, atcommand_memo }, - { "gat", 99,99, atcommand_gat }, - { "displaystatus", 99,99, atcommand_displaystatus }, - { "stpoint", 60,60, atcommand_statuspoint }, - { "skpoint", 60,60, atcommand_skillpoint }, - { "zeny", 60,60, atcommand_zeny }, - { "str", 60,60, atcommand_param }, - { "agi", 60,60, atcommand_param }, - { "vit", 60,60, atcommand_param }, - { "int", 60,60, atcommand_param }, - { "dex", 60,60, atcommand_param }, - { "luk", 60,60, atcommand_param }, - { "glvl", 60,60, atcommand_guildlevelup }, - { "glevel", 60,60, atcommand_guildlevelup }, - { "guildlvl", 60,60, atcommand_guildlevelup }, - { "guildlvup", 60,60, atcommand_guildlevelup }, - { "guildlevel", 60,60, atcommand_guildlevelup }, - { "guildlvlup", 60,60, atcommand_guildlevelup }, - { "makeegg", 60,60, atcommand_makeegg }, - { "hatch", 60,60, atcommand_hatch }, - { "petfriendly", 40,40, atcommand_petfriendly }, - { "pethungry", 40,40, atcommand_pethungry }, - { "petrename", 1,1, atcommand_petrename }, - { "recall", 60,60, atcommand_recall }, // + /recall - { "night", 80,80, atcommand_night }, - { "day", 80,80, atcommand_day }, - { "doom", 80,80, atcommand_doom }, - { "doommap", 80,80, atcommand_doommap }, - { "raise", 80,80, atcommand_raise }, - { "raisemap", 80,80, atcommand_raisemap }, - { "kick", 20,20, atcommand_kick }, // + right click menu for GM "(name) force to quit" - { "kickall", 99,99, atcommand_kickall }, - { "allskill", 60,60, atcommand_allskill }, - { "allskills", 60,60, atcommand_allskill }, - { "skillall", 60,60, atcommand_allskill }, - { "skillsall", 60,60, atcommand_allskill }, - { "questskill", 40,40, atcommand_questskill }, - { "lostskill", 40,40, atcommand_lostskill }, - { "spiritball", 40,40, atcommand_spiritball }, - { "party", 1,1, atcommand_party }, - { "guild", 50,50, atcommand_guild }, - { "agitstart", 60,60, atcommand_agitstart }, - { "agitend", 60,60, atcommand_agitend }, - { "mapexit", 99,99, atcommand_mapexit }, - { "idsearch", 60,60, atcommand_idsearch }, - { "broadcast", 40,40, atcommand_broadcast }, // + /b and /nb - { "localbroadcast", 40,40, atcommand_localbroadcast }, // + /lb and /nlb - { "recallall", 80,80, atcommand_recallall }, - { "reloaditemdb", 99,99, atcommand_reloaditemdb }, - { "reloadmobdb", 99,99, atcommand_reloadmobdb }, - { "reloadskilldb", 99,99, atcommand_reloadskilldb }, - { "reloadscript", 99,99, atcommand_reloadscript }, - { "reloadatcommand", 99,99, atcommand_reloadatcommand }, - { "reloadbattleconf", 99,99, atcommand_reloadbattleconf }, - { "reloadstatusdb", 99,99, atcommand_reloadstatusdb }, - { "reloadpcdb", 99,99, atcommand_reloadpcdb }, - { "reloadmotd", 99,99, atcommand_reloadmotd }, - { "mapinfo", 99,99, atcommand_mapinfo }, - { "dye", 40,40, atcommand_dye }, - { "ccolor", 40,40, atcommand_dye }, - { "hairstyle", 40,40, atcommand_hair_style }, - { "hstyle", 40,40, atcommand_hair_style }, - { "haircolor", 40,40, atcommand_hair_color }, - { "hcolor", 40,40, atcommand_hair_color }, - { "statall", 60,60, atcommand_stat_all }, - { "statsall", 60,60, atcommand_stat_all }, - { "allstats", 60,60, atcommand_stat_all }, - { "allstat", 60,60, atcommand_stat_all }, - { "block", 60,60, atcommand_char_block }, - { "charblock", 60,60, atcommand_char_block }, - { "ban", 60,60, atcommand_char_ban }, - { "banish", 60,60, atcommand_char_ban }, - { "charban", 60,60, atcommand_char_ban }, - { "charbanish", 60,60, atcommand_char_ban }, - { "unblock", 60,60, atcommand_char_unblock }, - { "charunblock", 60,60, atcommand_char_unblock }, - { "unban", 60,60, atcommand_char_unban }, - { "unbanish", 60,60, atcommand_char_unban }, - { "charunban", 60,60, atcommand_char_unban }, - { "charunbanish", 60,60, atcommand_char_unban }, - { "mount", 20,20, atcommand_mount_peco }, - { "mountpeco", 20,20, atcommand_mount_peco }, - { "guildspy", 60,60, atcommand_guildspy }, - { "partyspy", 60,60, atcommand_partyspy }, - { "repairall", 60,60, atcommand_repairall }, - { "guildrecall", 60,60, atcommand_guildrecall }, - { "partyrecall", 60,60, atcommand_partyrecall }, - { "nuke", 60,60, atcommand_nuke }, - { "shownpc", 80,80, atcommand_shownpc }, - { "hidenpc", 80,80, atcommand_hidenpc }, - { "loadnpc", 80,80, atcommand_loadnpc }, - { "unloadnpc", 80,80, atcommand_unloadnpc }, - { "time", 1,1, atcommand_servertime }, - { "date", 1,1, atcommand_servertime }, - { "serverdate", 1,1, atcommand_servertime }, - { "servertime", 1,1, atcommand_servertime }, - { "jail", 60,60, atcommand_jail }, - { "unjail", 60,60, atcommand_unjail }, - { "discharge", 60,60, atcommand_unjail }, - { "jailfor", 60,60, atcommand_jailfor }, - { "jailtime", 1,1, atcommand_jailtime }, - { "disguise", 20,20, atcommand_disguise }, - { "undisguise", 20,20, atcommand_undisguise }, - { "email", 1,1, atcommand_email }, - { "effect", 40,40, atcommand_effect }, - { "follow", 20,20, atcommand_follow }, - { "addwarp", 60,60, atcommand_addwarp }, - { "skillon", 80,80, atcommand_skillon }, - { "skilloff", 80,80, atcommand_skilloff }, - { "killer", 60,60, atcommand_killer }, - { "npcmove", 80,80, atcommand_npcmove }, - { "killable", 40,40, atcommand_killable }, - { "dropall", 40,40, atcommand_dropall }, - { "storeall", 40,40, atcommand_storeall }, - { "skillid", 40,40, atcommand_skillid }, - { "useskill", 40,40, atcommand_useskill }, - { "displayskill", 99,99, atcommand_displayskill }, - { "snow", 99,99, atcommand_snow }, - { "sakura", 99,99, atcommand_sakura }, - { "clouds", 99,99, atcommand_clouds }, - { "clouds2", 99,99, atcommand_clouds2 }, - { "fog", 99,99, atcommand_fog }, - { "fireworks", 99,99, atcommand_fireworks }, - { "leaves", 99,99, atcommand_leaves }, - { "summon", 60,60, atcommand_summon }, - { "adjgmlvl", 99,99, atcommand_adjgmlvl }, - { "adjcmdlvl", 99,99, atcommand_adjcmdlvl }, - { "trade", 60,60, atcommand_trade }, - { "send", 99,99, atcommand_send }, - { "setbattleflag", 99,99, atcommand_setbattleflag }, - { "unmute", 80,80, atcommand_unmute }, - { "clearweather", 99,99, atcommand_clearweather }, - { "uptime", 1,1, atcommand_uptime }, - { "changesex", 60,60, atcommand_changesex }, - { "mute", 80,80, atcommand_mute }, - { "refresh", 1,1, atcommand_refresh }, - { "identify", 40,40, atcommand_identify }, - { "gmotd", 20,20, atcommand_gmotd }, - { "misceffect", 50,50, atcommand_misceffect }, - { "mobsearch", 10,10, atcommand_mobsearch }, - { "cleanmap", 40,40, atcommand_cleanmap }, - { "npctalk", 20,20, atcommand_npctalk }, - { "npctalkc", 20,20, atcommand_npctalk }, - { "pettalk", 10,10, atcommand_pettalk }, - { "users", 40,40, atcommand_users }, - { "reset", 40,40, atcommand_reset }, - { "skilltree", 40,40, atcommand_skilltree }, - { "marry", 40,40, atcommand_marry }, - { "divorce", 40,40, atcommand_divorce }, - { "sound", 40,40, atcommand_sound }, - { "undisguiseall", 99,99, atcommand_undisguiseall }, - { "disguiseall", 99,99, atcommand_disguiseall }, - { "changelook", 60,60, atcommand_changelook }, - { "autoloot", 10,10, atcommand_autoloot }, - { "alootid", 10,10, atcommand_autolootitem }, - { "mobinfo", 1,1, atcommand_mobinfo }, - { "monsterinfo", 1,1, atcommand_mobinfo }, - { "mi", 1,1, atcommand_mobinfo }, - { "exp", 1,1, atcommand_exp }, - { "adopt", 40,40, atcommand_adopt }, - { "version", 1,1, atcommand_version }, - { "mutearea", 99,99, atcommand_mutearea }, - { "stfu", 99,99, atcommand_mutearea }, - { "rates", 1,1, atcommand_rates }, - { "iteminfo", 1,1, atcommand_iteminfo }, - { "ii", 1,1, atcommand_iteminfo }, - { "whodrops", 1,1, atcommand_whodrops }, - { "whereis", 10,10, atcommand_whereis }, - { "mapflag", 99,99, atcommand_mapflag }, - { "me", 20,20, atcommand_me }, - { "monsterignore", 99,99, atcommand_monsterignore }, - { "battleignore", 99,99, atcommand_monsterignore }, - { "fakename", 20,20, atcommand_fakename }, - { "size", 20,20, atcommand_size }, - { "showexp", 10,10, atcommand_showexp}, - { "showzeny", 10,10, atcommand_showzeny}, - { "showdelay", 1,1, atcommand_showdelay}, - { "autotrade", 10,10, atcommand_autotrade }, - { "at", 10,10, atcommand_autotrade }, - { "changegm", 10,10, atcommand_changegm }, - { "changeleader", 10,10, atcommand_changeleader }, - { "partyoption", 10,10, atcommand_partyoption}, - { "invite", 1,1, atcommand_invite }, - { "duel", 1,1, atcommand_duel }, - { "leave", 1,1, atcommand_leave }, - { "accept", 1,1, atcommand_accept }, - { "reject", 1,1, atcommand_reject }, - { "main", 1,1, atcommand_main }, - { "clone", 50,50, atcommand_clone }, - { "slaveclone", 50,50, atcommand_clone }, - { "evilclone", 50,50, atcommand_clone }, - { "tonpc", 40,40, atcommand_tonpc }, - { "commands", 1,1, atcommand_commands }, - { "noask", 1,1, atcommand_noask }, - { "request", 20,20, atcommand_request }, - { "hlvl", 60,60, atcommand_homlevel }, - { "hlevel", 60,60, atcommand_homlevel }, - { "homlvl", 60,60, atcommand_homlevel }, - { "homlvup", 60,60, atcommand_homlevel }, - { "homlevel", 60,60, atcommand_homlevel }, - { "homevolve", 60,60, atcommand_homevolution }, - { "homevolution", 60,60, atcommand_homevolution }, - { "makehomun", 60,60, atcommand_makehomun }, - { "homfriendly", 60,60, atcommand_homfriendly }, - { "homhungry", 60,60, atcommand_homhungry }, - { "homtalk", 10,10, atcommand_homtalk }, - { "hominfo", 1,1, atcommand_hominfo }, - { "homstats", 1,1, atcommand_homstats }, - { "homshuffle", 60,60, atcommand_homshuffle }, - { "showmobs", 10,10, atcommand_showmobs }, - { "feelreset", 10,10, atcommand_feelreset }, - { "auction", 1,1, atcommand_auction }, - { "mail", 1,1, atcommand_mail }, - { "noks", 1,1, atcommand_ksprotection }, - { "allowks", 40,40, atcommand_allowks }, - { "cash", 60,60, atcommand_cash }, - { "points", 60,60, atcommand_cash }, - { "agitstart2", 60,60, atcommand_agitstart2 }, - { "agitend2", 60,60, atcommand_agitend2 }, - { "skreset", 60,60, atcommand_resetskill }, - { "streset", 60,60, atcommand_resetstat }, - { "storagelist", 40,40, atcommand_itemlist }, - { "cartlist", 40,40, atcommand_itemlist }, - { "itemlist", 40,40, atcommand_itemlist }, - { "stats", 40,40, atcommand_stats }, - { "delitem", 60,60, atcommand_delitem }, - { "charcommands", 1,1, atcommand_commands }, - { "font", 1,1, atcommand_font }, + +/** + * Fills the reference of available commands in atcommand DBMap + **/ +void atcommand_basecommands(void) { /** - * For Testing Purposes, not going to be here after we're done. + * Command reference list, place the base of your commands here + * Dev note: I'd love to get rid of this, if you have a better idea on this please share with the poor mortals **/ - { "newmount", 0,99, atcommand_new_mount }, -}; + AtCommandInfo atcommand_base[] = { + { "warp", 40,40, atcommand_mapmove }, // + /mm + { "where", 1,1, atcommand_where }, + { "goto", 20,20, atcommand_jumpto }, // + /shift + { "jump", 40,40, atcommand_jump }, + { "who", 20,20, atcommand_who }, + { "who2", 20,20, atcommand_who2 }, + { "who3", 20,20, atcommand_who3 }, + { "whomap", 20,20, atcommand_whomap }, + { "whomap2", 20,20, atcommand_whomap2 }, + { "whomap3", 20,20, atcommand_whomap3 }, + { "whogm", 20,20, atcommand_whogm }, + { "save", 40,40, atcommand_save }, + { "load", 40,40, atcommand_load }, + { "speed", 40,40, atcommand_speed }, + { "storage", 1,1, atcommand_storage }, + { "gstorage", 50,50, atcommand_guildstorage }, + { "option", 40,40, atcommand_option }, + { "hide", 40,40, atcommand_hide }, // + /hide + { "job", 40,40, atcommand_jobchange }, + { "die", 1,1, atcommand_die }, + { "kill", 60,60, atcommand_kill }, + { "alive", 60,60, atcommand_alive }, + { "kami", 40,40, atcommand_kami }, + { "kamib", 40,40, atcommand_kami }, + { "kamic", 40,40, atcommand_kami }, + { "heal", 40,60, atcommand_heal }, + { "item", 60,60, atcommand_item }, + { "item2", 60,60, atcommand_item2 }, + { "itemreset", 40,40, atcommand_itemreset }, + { "blvl", 60,60, atcommand_baselevelup }, + { "jlvl", 60,60, atcommand_joblevelup }, + { "help", 20,20, atcommand_help }, + { "help2", 20,20, atcommand_help2 }, + { "pvpoff", 40,40, atcommand_pvpoff }, + { "pvpon", 40,40, atcommand_pvpon }, + { "gvgoff", 40,40, atcommand_gvgoff }, + { "gvgon", 40,40, atcommand_gvgon }, + { "model", 20,20, atcommand_model }, + { "go", 10,10, atcommand_go }, + { "monster", 50,50, atcommand_monster }, + { "monstersmall", 50,50, atcommand_monstersmall }, + { "monsterbig", 50,50, atcommand_monsterbig }, + { "killmonster", 60,60, atcommand_killmonster }, + { "killmonster2", 40,40, atcommand_killmonster2 }, + { "refine", 60,60, atcommand_refine }, + { "produce", 60,60, atcommand_produce }, + { "memo", 40,40, atcommand_memo }, + { "gat", 99,99, atcommand_gat }, + { "displaystatus", 99,99, atcommand_displaystatus }, + { "stpoint", 60,60, atcommand_statuspoint }, + { "skpoint", 60,60, atcommand_skillpoint }, + { "zeny", 60,60, atcommand_zeny }, + { "str", 60,60, atcommand_param }, + { "agi", 60,60, atcommand_param }, + { "vit", 60,60, atcommand_param }, + { "int", 60,60, atcommand_param }, + { "dex", 60,60, atcommand_param }, + { "luk", 60,60, atcommand_param }, + { "glvl", 60,60, atcommand_guildlevelup }, + { "makeegg", 60,60, atcommand_makeegg }, + { "hatch", 60,60, atcommand_hatch }, + { "petfriendly", 40,40, atcommand_petfriendly }, + { "pethungry", 40,40, atcommand_pethungry }, + { "petrename", 1,1, atcommand_petrename }, + { "recall", 60,60, atcommand_recall }, // + /recall + { "night", 80,80, atcommand_night }, + { "day", 80,80, atcommand_day }, + { "doom", 80,80, atcommand_doom }, + { "doommap", 80,80, atcommand_doommap }, + { "raise", 80,80, atcommand_raise }, + { "raisemap", 80,80, atcommand_raisemap }, + { "kick", 20,20, atcommand_kick }, // + right click menu for GM "(name) force to quit" + { "kickall", 99,99, atcommand_kickall }, + { "allskill", 60,60, atcommand_allskill }, + { "questskill", 40,40, atcommand_questskill }, + { "lostskill", 40,40, atcommand_lostskill }, + { "spiritball", 40,40, atcommand_spiritball }, + { "party", 1,1, atcommand_party }, + { "guild", 50,50, atcommand_guild }, + { "agitstart", 60,60, atcommand_agitstart }, + { "agitend", 60,60, atcommand_agitend }, + { "mapexit", 99,99, atcommand_mapexit }, + { "idsearch", 60,60, atcommand_idsearch }, + { "broadcast", 40,40, atcommand_broadcast }, // + /b and /nb + { "localbroadcast", 40,40, atcommand_localbroadcast }, // + /lb and /nlb + { "recallall", 80,80, atcommand_recallall }, + { "reloaditemdb", 99,99, atcommand_reloaditemdb }, + { "reloadmobdb", 99,99, atcommand_reloadmobdb }, + { "reloadskilldb", 99,99, atcommand_reloadskilldb }, + { "reloadscript", 99,99, atcommand_reloadscript }, + { "reloadatcommand", 99,99, atcommand_reloadatcommand }, + { "reloadbattleconf", 99,99, atcommand_reloadbattleconf }, + { "reloadstatusdb", 99,99, atcommand_reloadstatusdb }, + { "reloadpcdb", 99,99, atcommand_reloadpcdb }, + { "reloadmotd", 99,99, atcommand_reloadmotd }, + { "mapinfo", 99,99, atcommand_mapinfo }, + { "dye", 40,40, atcommand_dye }, + { "hairstyle", 40,40, atcommand_hair_style }, + { "haircolor", 40,40, atcommand_hair_color }, + { "allstats", 60,60, atcommand_stat_all }, + { "block", 60,60, atcommand_char_block }, + { "ban", 60,60, atcommand_char_ban }, + { "unblock", 60,60, atcommand_char_unblock }, + { "unban", 60,60, atcommand_char_unban }, + { "mount", 20,20, atcommand_mount_peco }, + { "guildspy", 60,60, atcommand_guildspy }, + { "partyspy", 60,60, atcommand_partyspy }, + { "repairall", 60,60, atcommand_repairall }, + { "guildrecall", 60,60, atcommand_guildrecall }, + { "partyrecall", 60,60, atcommand_partyrecall }, + { "nuke", 60,60, atcommand_nuke }, + { "shownpc", 80,80, atcommand_shownpc }, + { "hidenpc", 80,80, atcommand_hidenpc }, + { "loadnpc", 80,80, atcommand_loadnpc }, + { "unloadnpc", 80,80, atcommand_unloadnpc }, + { "time", 1,1, atcommand_servertime }, + { "jail", 60,60, atcommand_jail }, + { "unjail", 60,60, atcommand_unjail }, + { "jailfor", 60,60, atcommand_jailfor }, + { "jailtime", 1,1, atcommand_jailtime }, + { "disguise", 20,20, atcommand_disguise }, + { "undisguise", 20,20, atcommand_undisguise }, + { "email", 1,1, atcommand_email }, + { "effect", 40,40, atcommand_effect }, + { "follow", 20,20, atcommand_follow }, + { "addwarp", 60,60, atcommand_addwarp }, + { "skillon", 80,80, atcommand_skillon }, + { "skilloff", 80,80, atcommand_skilloff }, + { "killer", 60,60, atcommand_killer }, + { "npcmove", 80,80, atcommand_npcmove }, + { "killable", 40,40, atcommand_killable }, + { "dropall", 40,40, atcommand_dropall }, + { "storeall", 40,40, atcommand_storeall }, + { "skillid", 40,40, atcommand_skillid }, + { "useskill", 40,40, atcommand_useskill }, + { "displayskill", 99,99, atcommand_displayskill }, + { "snow", 99,99, atcommand_snow }, + { "sakura", 99,99, atcommand_sakura }, + { "clouds", 99,99, atcommand_clouds }, + { "clouds2", 99,99, atcommand_clouds2 }, + { "fog", 99,99, atcommand_fog }, + { "fireworks", 99,99, atcommand_fireworks }, + { "leaves", 99,99, atcommand_leaves }, + { "summon", 60,60, atcommand_summon }, + { "adjgmlvl", 99,99, atcommand_adjgmlvl }, + { "adjcmdlvl", 99,99, atcommand_adjcmdlvl }, + { "trade", 60,60, atcommand_trade }, + { "send", 99,99, atcommand_send }, + { "setbattleflag", 99,99, atcommand_setbattleflag }, + { "unmute", 80,80, atcommand_unmute }, + { "clearweather", 99,99, atcommand_clearweather }, + { "uptime", 1,1, atcommand_uptime }, + { "changesex", 60,60, atcommand_changesex }, + { "mute", 80,80, atcommand_mute }, + { "refresh", 1,1, atcommand_refresh }, + { "identify", 40,40, atcommand_identify }, + { "gmotd", 20,20, atcommand_gmotd }, + { "misceffect", 50,50, atcommand_misceffect }, + { "mobsearch", 10,10, atcommand_mobsearch }, + { "cleanmap", 40,40, atcommand_cleanmap }, + { "npctalk", 20,20, atcommand_npctalk }, + { "pettalk", 10,10, atcommand_pettalk }, + { "users", 40,40, atcommand_users }, + { "reset", 40,40, atcommand_reset }, + { "skilltree", 40,40, atcommand_skilltree }, + { "marry", 40,40, atcommand_marry }, + { "divorce", 40,40, atcommand_divorce }, + { "sound", 40,40, atcommand_sound }, + { "undisguiseall", 99,99, atcommand_undisguiseall }, + { "disguiseall", 99,99, atcommand_disguiseall }, + { "changelook", 60,60, atcommand_changelook }, + { "autoloot", 10,10, atcommand_autoloot }, + { "alootid", 10,10, atcommand_autolootitem }, + { "monsterinfo", 1,1, atcommand_mobinfo }, + { "exp", 1,1, atcommand_exp }, + { "adopt", 40,40, atcommand_adopt }, + { "version", 1,1, atcommand_version }, + { "mutearea", 99,99, atcommand_mutearea }, + { "rates", 1,1, atcommand_rates }, + { "iteminfo", 1,1, atcommand_iteminfo }, + { "whodrops", 1,1, atcommand_whodrops }, + { "whereis", 10,10, atcommand_whereis }, + { "mapflag", 99,99, atcommand_mapflag }, + { "me", 20,20, atcommand_me }, + { "battleignore", 99,99, atcommand_monsterignore }, + { "fakename", 20,20, atcommand_fakename }, + { "size", 20,20, atcommand_size }, + { "showexp", 10,10, atcommand_showexp}, + { "showzeny", 10,10, atcommand_showzeny}, + { "showdelay", 1,1, atcommand_showdelay}, + { "autotrade", 10,10, atcommand_autotrade }, + { "changegm", 10,10, atcommand_changegm }, + { "changeleader", 10,10, atcommand_changeleader }, + { "partyoption", 10,10, atcommand_partyoption}, + { "invite", 1,1, atcommand_invite }, + { "duel", 1,1, atcommand_duel }, + { "leave", 1,1, atcommand_leave }, + { "accept", 1,1, atcommand_accept }, + { "reject", 1,1, atcommand_reject }, + { "main", 1,1, atcommand_main }, + { "clone", 50,50, atcommand_clone }, + { "slaveclone", 50,50, atcommand_clone }, + { "evilclone", 50,50, atcommand_clone }, + { "tonpc", 40,40, atcommand_tonpc }, + { "commands", 1,1, atcommand_commands }, + { "noask", 1,1, atcommand_noask }, + { "request", 20,20, atcommand_request }, + { "hlvl", 60,60, atcommand_homlevel }, + { "homevolve", 60,60, atcommand_homevolution }, + { "makehomun", 60,60, atcommand_makehomun }, + { "homfriendly", 60,60, atcommand_homfriendly }, + { "homhungry", 60,60, atcommand_homhungry }, + { "homtalk", 10,10, atcommand_homtalk }, + { "hominfo", 1,1, atcommand_hominfo }, + { "homstats", 1,1, atcommand_homstats }, + { "homshuffle", 60,60, atcommand_homshuffle }, + { "showmobs", 10,10, atcommand_showmobs }, + { "feelreset", 10,10, atcommand_feelreset }, + { "auction", 1,1, atcommand_auction }, + { "mail", 1,1, atcommand_mail }, + { "noks", 1,1, atcommand_ksprotection }, + { "allowks", 40,40, atcommand_allowks }, + { "cash", 60,60, atcommand_cash }, + { "points", 60,60, atcommand_cash }, + { "agitstart2", 60,60, atcommand_agitstart2 }, + { "agitend2", 60,60, atcommand_agitend2 }, + { "skreset", 60,60, atcommand_resetskill }, + { "streset", 60,60, atcommand_resetstat }, + { "storagelist", 40,40, atcommand_itemlist }, + { "cartlist", 40,40, atcommand_itemlist }, + { "itemlist", 40,40, atcommand_itemlist }, + { "stats", 40,40, atcommand_stats }, + { "delitem", 60,60, atcommand_delitem }, + { "charcommands", 1,1, atcommand_commands }, + { "font", 1,1, atcommand_font }, + /** + * For Testing Purposes, not going to be here after we're done. + **/ + { "newmount", 0,99, atcommand_new_mount }, + }; + AtCommandInfo* atcommand; + int i; + + for( i = 0; i < ARRAYLENGTH(atcommand_base); i++ ) { + CREATE(atcommand, AtCommandInfo, 1); + + atcommand->command = atcommand_base[i].command; + atcommand->level = atcommand_base[i].level; + atcommand->level2 = atcommand_base[i].level2; + atcommand->func = atcommand_base[i].func; + + strdb_put(atcommand_db, atcommand->command, atcommand); + } + return; +} /*========================================== * Command lookup functions *------------------------------------------*/ -static AtCommandInfo* get_atcommandinfo_byname(const char* name) -{ - int i; +static AtCommandInfo* get_atcommandinfo_byname(const char* name) { if( *name == atcommand_symbol || *name == charcommand_symbol ) name++; // for backwards compatibility - ARR_FIND( 0, ARRAYLENGTH(atcommand_info), i, strcmpi(atcommand_info[i].command, name) == 0 ); - return ( i < ARRAYLENGTH(atcommand_info) ) ? &atcommand_info[i] : NULL; -} - -static AtCommandInfo* get_atcommandinfo_byfunc(const AtCommandFunc func) -{ - int i; - ARR_FIND( 0, ARRAYLENGTH(atcommand_info), i, atcommand_info[i].func == func ); - return ( i < ARRAYLENGTH(atcommand_info) ) ? &atcommand_info[i] : NULL; + if( strdb_exists(atcommand_db,name) ) + return (AtCommandInfo*)strdb_get(atcommand_db, name); + return NULL; } /*========================================== * Retrieve the command's required gm level *------------------------------------------*/ -int get_atcommand_level(const AtCommandFunc func) -{ - AtCommandInfo* info = get_atcommandinfo_byfunc(func); +int get_atcommand_level(const char* name) { + AtCommandInfo* info = (AtCommandInfo*)strdb_get(atcommand_db, name); return ( info != NULL ) ? info->level : 100; // 100: command can not be used } @@ -9247,8 +9197,7 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message params[0] = '\0'; //Grab the command information and check for the proper GM level required to use it or if the command exists - info = get_atcommandinfo_byname(command); - if( info == NULL || info->func == NULL || ( type && ((*atcmd_msg == atcommand_symbol && pc_isGM(sd) < info->level) || (*atcmd_msg == charcommand_symbol && pc_isGM(sd) < info->level2)) ) ) + if( (info = (AtCommandInfo*)strdb_get(atcommand_db, command+1)) == NULL || info->func == NULL || ( type && ((*atcmd_msg == atcommand_symbol && pc_isGM(sd) < info->level) || (*atcmd_msg == charcommand_symbol && pc_isGM(sd) < info->level2)) ) ) { if( pc_isGM(sd) ) { sprintf(output, msg_txt(153), command); // "%s is Unknown Command." @@ -9260,10 +9209,9 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message //Log atcommands if( *atcmd_msg == atcommand_symbol ) - log_atcommand(sd, info->level, atcmd_msg); - + log_atcommand(sd, info->level, atcmd_msg); //Log Charcommands - if( *atcmd_msg == charcommand_symbol && ssd != NULL ) + else if( *atcmd_msg == charcommand_symbol && ssd != NULL ) log_atcommand(sd, info->level2, message); //Attempt to use the command @@ -9277,61 +9225,97 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message return true; } +/** + * Splits and parses command aliases field + * Note: I'm not good (at all) with string manipulation, if you think you can improve, please do. I beg you. + **/ +void atcommand_parse_aliases(char aliases[1024],AtCommandInfo* base) { + char *str[99], *p; + int i, max = 0; + + p = aliases; + while( ISSPACE(*p) )//trim + ++p; + + //I assume nobody is getting over 98 alises in the same command lol + for( i = 0; i < 99; i++ ) { + str[i] = p; + p = strchr(p,','); + if( p == NULL ) { + max = i+1; + break;// comma not found + } + *p = '\0'; + ++p; + } + if( !str[0] )//no aliases at all + return; + + for(i = 0; i < max;i++) { + AtCommandInfo* atcommand; + + if( strdb_exists(atcommand_db, str[i]) ) { + ShowError("atcommand_conf: duplicate alises error: %s (from %s)\n",str[i],base->command); + continue; + } + + CREATE(atcommand, AtCommandInfo, 1); + + atcommand->command = str[i]; + atcommand->level = base->level; + atcommand->level2 = base->level2; + atcommand->func = base->func; + + strdb_put(atcommand_db, atcommand->command, atcommand); + } + return; +} /*========================================== * *------------------------------------------*/ int atcommand_config_read(const char* cfgName) { - char line[1024], w1[1024], w2[1024], w3[1024]; + char line[1024], w1[1024], w2[1024], w3[1024], w4[1024]; AtCommandInfo* p; FILE* fp; - - if( (fp = fopen(cfgName, "r")) == NULL ) - { + + if( (fp = fopen(cfgName, "r")) == NULL ) { ShowError("AtCommand configuration file not found: %s\n", cfgName); return 1; } - while( fgets(line, sizeof(line), fp) ) - { + while( fgets(line, sizeof(line), fp) ) { if( line[0] == '/' && line[1] == '/' ) continue; - - if( (sscanf(line, "%1023[^:]:%1023[^,],%1023s", w1, w2, w3)) != 3 && ( sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2 - && strcmpi(w1, "import") != 0 ) && strcmpi(w1, "command_symbol") != 0 && strcmpi(w1, "char_symbol") != 0 ) - continue; - p = get_atcommandinfo_byname(w1); - if( p != NULL ) - { - p->level = atoi(w2); - p->level = cap_value(p->level, 0, 100); - if( (sscanf(line, "%1023[^:]:%1023s", w1, w2) == 2) && (sscanf(line, "%1023[^:]:%1023[^,],%1023s", w1, w2, w3)) != 3 ) - { - ShowWarning("atcommand_conf: setting %s:%d is deprecated! Please see atcommand_athena.conf for the new setting format.\n",w1,atoi(w2)); - ShowWarning("atcommand_conf: defaulting %s charcommand level to %d.\n",w1,atoi(w2)); - p->level2 = atoi(w2); + if( ( sscanf(line,"%1023[^:]:%1023[^,],%1023[^[][%1023[^]]",w1,w2,w3,w4) ) == 4 ) { + if( ( p = (AtCommandInfo*)strdb_get(atcommand_db, w1) ) != NULL ) { + + p->level = atoi(w2);//update @level + p->level2 = atoi(w3);//update #level + + /** + * Parse the alises + **/ + atcommand_parse_aliases(w4,p); + + continue;//we're done move on } - else { - p->level2 = atoi(w3); - } - p->level2 = cap_value(p->level2, 0, 100); - } - else + } else if( strcmpi(w1, "import") != 0 && strcmpi(w1, "command_symbol") != 0 && strcmpi(w1, "char_symbol") != 0 ) + continue; + if( strcmpi(w1, "import") == 0 ) atcommand_config_read(w2); - else - if( strcmpi(w1, "command_symbol") == 0 && + else if( strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 && // control characters w2[0] != '/' && // symbol of standard ragnarok GM commands w2[0] != '%' && // symbol of party chat speaking w2[0] != '$' && // symbol of guild chat speaking w2[0] != '#' ) // remote symbol atcommand_symbol = w2[0]; - else - if( strcmpi(w1, "char_symbol") == 0 && + else if( strcmpi(w1, "char_symbol") == 0 && w2[0] > 31 && w2[0] != '/' && w2[0] != '%' && @@ -9346,14 +9330,33 @@ int atcommand_config_read(const char* cfgName) return 0; } -void do_init_atcommand() -{ +void atcommand_doload() { + + if( atcommand_db != NULL ) + db_destroy(atcommand_db); + + atcommand_db = strdb_alloc(DB_OPT_DUP_KEY, 0); + atcommand_basecommands();//fills initial atcommand_db with known commands + + atcommand_config_read(ATCOMMAND_CONF_FILENAME); + + return; +} + +void do_init_atcommand() { + + atcommand_doload(); + add_timer_func_list(atshowmobs_timer, "atshowmobs_timer"); + return; } -void do_final_atcommand() -{ +void do_final_atcommand() { + + db_destroy(atcommand_db); + + return; } @@ -9365,24 +9368,25 @@ void do_final_atcommand() ACMD_FUNC(commands) { char line_buff[CHATBOX_SIZE]; - int i, gm_lvl = pc_isGM(sd), count = 0; + int gm_lvl = pc_isGM(sd), count = 0; char* cur = line_buff; + AtCommandInfo* cmd; + DBIterator* iter = atcommand_db->iterator(atcommand_db); memset(line_buff,' ',CHATBOX_SIZE); line_buff[CHATBOX_SIZE-1] = 0; clif_displaymessage(fd, msg_txt(273)); // "Commands available:" - for( i = 0; i < ARRAYLENGTH(atcommand_info); i++ ) - { + for( cmd = (AtCommandInfo*)iter->first(iter,NULL); iter->exists(iter); cmd = (AtCommandInfo*)iter->next(iter,NULL) ) { unsigned int slen; - if( gm_lvl < atcommand_info[i].level && stristr(command,"commands") ) + if( gm_lvl < cmd->level && stristr(command,"commands") ) continue; - if( gm_lvl < atcommand_info[i].level2 && stristr(command,"charcommands") ) + if( gm_lvl < cmd->level2 && stristr(command,"charcommands") ) continue; - slen = strlen(atcommand_info[i].command); + slen = strlen(cmd->command); // flush the text buffer if this command won't fit into it if( slen + cur - line_buff >= CHATBOX_SIZE ) @@ -9393,11 +9397,12 @@ ACMD_FUNC(commands) line_buff[CHATBOX_SIZE-1] = 0; } - memcpy(cur,atcommand_info[i].command,slen); + memcpy(cur,cmd->command,slen); cur += slen+(10-slen%10); count++; } + iter->destroy(iter); clif_displaymessage(fd,line_buff); sprintf(atcmd_output, msg_txt(274), count); // "%d commands found." |