Przeglądaj źródła

Migrated atcommand aliases and help to YAML (#4487)

Merges atcommand_athena.conf and help.txt into a single file.
Removed some leftover settings that were removed before.
Removed CLI support for modifying the atcommand configuration file.
Moved atcommand and charcommand symbol definition into conf/battle/gm.conf
Removed some messages that are not needed anymore

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Lemongrass3110 5 lat temu
rodzic
commit
64b5c3082b

+ 0 - 73
conf/atcommand_athena.conf

@@ -1,73 +0,0 @@
-/* Atcommands and charcommands configuration file */
-
-/* The symbol that will be used to recognize commands.
-You can set any one character except:
- - control-characters (0x00-0x1f),
- - '%' (party chat symbol)
- - '$' (guild chat symbol)
- - '/' (client commands symbol)
-atcommand_symbol represents @commands used locally.
-charcommand_symbol represents #commands used on other players.
-*/
-
-atcommand_symbol : "@"
-charcommand_symbol: "#"
-
-/* Command aliases
-You can define aliases for any command. Aliases work just like original
-command.
-Format is
-	<commandname>: ["<alias>", ...]
-*/
-
-aliases: {
-	mobinfo: ["monsterinfo", "mi"]
-	iteminfo: ["ii"]
-	time: ["date", "serverdate", "servertime"]
-	autotrade: ["at"]
-	help: ["h"]
-	jumpto: ["goto", "warpto"]
-	mount: ["mountpeco"]
-	who: ["whois"]
-	npctalk: ["npctalkc"]
-	gvgon: ["gpvpon"]
-	gvgoff: ["gpvpoff"]
-	jobchange: ["job"]
-	load: ["return"]
-	warp: ["rura", "mapmove"]
-	dye: ["ccolor"]
-	hairstyle: ["hstyle"]
-	haircolor: ["hcolor"]
-	monster: ["spawn"]
-	blvl: ["lvup", "blevel", "baselvl", "baselvup", "baselevel", "baselvlup"]
-	jlvl: ["jlevel", "joblvl", "joblvup", "joblevel", "joblvlup"]
-	glvl: ["glevel", "guildlvl", "guildlvup", "guildlevel", "guildlvlup"]
-	resetstat: ["streset"]
-	resetskill: ["skreset"]
-	allskill: ["allskills", "skillall", "skillsall"]
-	allstats: ["allstat", "statall", "statsall"]
-	ban: ["banish"]
-	unban: ["unbanish"]
-	unjail: ["discharge"]
-	homlevel: ["hlvl", "hlevel", "homlvl", "homlvup"]
-	homevolution: ["homevolve"]
-	mutearea: ["stfu"]
-	monsterignore: ["battleignore"]
-	raise: ["revive"]
-	kill: ["die"]
-	guildstorage: ["gstorage"]
-	accinfo: ["accountinfo"]
-	itemreset: ["clearinventory"]
-	channel: ["main"]
-	autoloottype: ["aloottype"]
-	cloneequip: ["eqclone"]
-	clonestat: ["stclone"]
-	reloadnpcfile: ["reloadnpc"]
-	changedress: ["nocosplay"]
-	camerainfo: ["viewpointvalue", "setcamera"]
-}
-
-/* Commands help file */
-help: {
-	@include "conf/help.txt"
-}

+ 961 - 0
conf/atcommands.yml

@@ -0,0 +1,961 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2017 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Atcommand Database
+###########################################################################
+#
+# Atcommand Settings
+#
+###########################################################################
+# - Command                  Command name.
+#   Aliases:                 Aliases for the command. (Optional)
+#     - <AliasName>
+#   Help                     Help message for the command. (Optional)
+###########################################################################
+
+Header:
+  Type: ATCOMMAND_DB
+  Version: 1
+
+Body:
+  - Command: help
+    Aliases:
+      - h
+    Help: |
+      Params: <command>
+      Shows help for specified command.
+  - Command: noask
+    Help: |
+      Auto rejects deals/invites.
+  - Command: gmotd
+    Help: |
+      Broadcasts the Message of The Day to all players.
+  - Command: me
+    Help: |
+      Params: <message>
+      Displays normal text as a message in this format: *name message* (like /me in mIRC).
+  - Command: fakename
+    Help: |
+      Params: <name>
+      Changes your name to your choice temporarily.
+  - Command: npctalk
+    Aliases:
+      - npctalkc
+    Help: |
+      Params: <NPC name> <message>
+      Forces a NPC to display a message in normal chat.
+  - Command: broadcast
+    Help: |
+      Params: <message>
+      Broadcasts a message with your name (in yellow).
+  - Command: kami
+    Help: |
+      Params: <message>
+      Broadcasts a message without your name (in yellow).
+  - Command: kamib
+    Help: |
+      Params: <message>
+      Broadcasts a message without your name (in blue).
+  - Command: localbroadcast
+    Help: |
+      Params: <message>
+      Broadcasts a message with your name (in yellow) only on your map.
+  - Command: commands
+    Help: |
+      Displays a list of commands that you can use.
+  - Command: rates
+    Help: |
+      Displays the server's current rates.
+  - Command: uptime
+    Help: |
+      Displays how long the server has been online.
+  - Command: showdelay
+    Help: |
+      Shows/hides the "There is a delay after this skill" message.
+  - Command: exp
+    Help: |
+      Displays current levels and % progress.
+  - Command: mobinfo
+    Aliases:
+      - monsterinfo
+      - mi
+    Help: |
+      Params: <monster name|ID>
+      Shows monster info (stats, exp, drops etc).
+  - Command: iteminfo
+    Aliases:
+      - ii
+    Help: |
+      Params: <item name|ID>
+      Shows item info (type, price etc).
+  - Command: whodrops
+    Help: |
+      Params: <item name|ID>
+      Shows who drops an item (monster with highest drop rates).
+  - Command: version
+    Help: |
+      Displays SVN version of the server.
+  - Command: email
+    Help: |
+      Params: <current email> <new email>
+      Changes your account e-mail address.
+  - Command: where
+    Help: |
+      Params: <char name>
+      Tells you the location of a character.
+  - Command: time
+    Aliases:
+      - date
+      - serverdate
+      - servertime
+    Help: |
+      Shows the date and time of the server.
+  - Command: showexp
+    Help: |
+      Displays/hides experience gained.
+  - Command: showzeny
+    Help: |
+      Displays/hides Zeny gained.
+  - Command: mobsearch
+    Help: |
+      Params: <monster name|ID>
+      Shows the location of a certain mob on the current map.
+  - Command: who
+    Aliases:
+      - whois
+    Help: |
+      Params: [<name>]
+      Shows a list of online players and their party and guild.
+  - Command: who2
+    Help: |
+      Params: [<name>]
+      Shows a list of online players and their job.
+  - Command: who3
+    Help: |
+      Params: [<name>]
+      Shows a list of online players and their location.
+  - Command: whomap
+    Help: |
+      @whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specified map.
+  - Command: whogm
+    Help: |
+      Params: [match_text] - Like @who+@who2+who3, but only for GM.
+  - Command: guildspy
+    Help: |
+      Params: <guild name|id> - You will receive all messages of the guild channel (Chat logging must be enabled)
+  - Command: partyspy
+    Help: |
+      @partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)
+  - Command: mapinfo
+    Help: |
+      Params: [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: chatrooms).
+  - Command: go
+    Help: |
+      Params: <city name|number>
+      Warps you to a city.
+      -3: (Memo point 2)  14: louyang         31: mora
+      -2: (Memo point 1)  15: start point     32: dewata
+      -1: (Memo point 0)  16: prison/jail     33: malangdo island
+       0: prontera              17: jawaii             34: malaya port
+       1: morocc                18: ayothaya       35: eclage
+       2: geffen                  19: einbroch       36: lasagna
+       3: payon                  20: lighthalzen
+       4: alberta                 21: einbech
+       5: izlude                   22: hugel
+       6: aldebaran           23: rachel
+       7: xmas (lutie)        24: veins
+       8: comodo               25: moscovia
+       9: yuno                     26: midgard camp
+      10: amatsu               27: manuk
+      11: gonryun              28: splendide
+      12: umbala               29: brasilis
+      13: niflheim              30: el dicastes
+  - Command: jumpto
+    Aliases:
+      - goto
+      - warpto
+    Help: |
+      Params: <char name>
+      Warps you to selected character.
+  - Command: follow
+    Help: |
+      Params: <char name>
+      Follow a player.
+  - Command: mount
+    Aliases:
+      - mountpeco
+    Help: |
+      Give/remove a job-based mount (class is required, but not the skill).
+  - Command: mount2
+    Help: |
+      Give/remove a cash mount.
+  - Command: disguise
+    Help: |
+      Params: <monster name|ID>
+      Change your appearence to other players to a mob.
+  - Command: undisguise
+    Help: |
+      Restore your normal appearance.
+  - Command: disguiseguild
+    Help: |
+      Disguises all online characters of a guild.
+  - Command: undisguiseguild
+    Help: |
+      Restore the normal appearance of all characters of a guild.
+  - Command: model
+    Help: |
+      Params:  <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence.
+  - Command: size
+    Help: |
+      Params:  <0-2> Changes your size (0-Normal 1-Small 2-Large)
+  - Command: sizeall
+    Help: |
+      Changes the size of all players.
+  - Command: sizeguild
+    Help: |
+      Changes the size of all online characters of a guild.
+  - Command: hide
+    Help: |
+      Makes you character invisible (GM invisibility). Type again to become visible.
+  - Command: save
+    Help: |
+      Sets respawn point to current spot.
+  - Command: load
+    Aliases:
+      - return
+    Help: |
+      Warps you to your save point.
+  - Command: warp
+    Aliases:
+      - rura
+      - mapmove
+    Help: |
+      Params: <mapname> [<x> <y>]
+      Warps you to the selected map and position.
+  - Command: jump
+    Help: |
+      Params: [<x> [<y>]]
+      Randomly warps you like a flywing.
+  - Command: jobchange
+    Aliases:
+      - job
+    Help: |
+      Params: <job name|ID>
+      Changes your job.
+      ----- Novice / 1st Class -----
+         0 Novice              1 Swordman            2 Magician            3 Archer
+         4 Acolyte              5 Merchant               6 Thief
+      ----- 2nd Class -----
+         7 Knight               8 Priest                     9 Wizard               10 Blacksmith
+        11 Hunter           12 Assassin            14 Crusader          15 Monk
+        16 Sage              17 Rogue                 18 Alchemist         19 Bard
+        20 Dancer
+      ----- High Novice / High 1st Class -----
+      4001 Novice High     4002 Swordman High    4003 Magician High    4004 Archer High
+      4005 Acolyte High     4006 Merchant High       4007 Thief High
+      ----- Transcendent 2nd Class -----
+      4008 Lord Knight      4009 High Priest             4010 High Wizard      4011 Whitesmith
+      4012 Sniper               4013 Assassin Cross   4015 Paladin              4016 Champion
+      4017 Professor         4018 Stalker                    4019 Creator               4020 Clown
+      4021 Gypsy
+      ----- 3rd Class (Regular) -----
+      4054 Rune Knight    4055 Warlock                 4056 Ranger            4057 Arch Bishop
+      4058 Mechanic         4059 Guillotine Cross  4066 Royal Guard   4067 Sorcerer
+      4068 Minstrel            4069 Wanderer              4070 Sura                 4071 Genetic
+      4072 Shadow Chaser
+      ----- 3rd Class (Transcendent) -----
+      4060 Rune Knight    4061 Warlock                 4062 Ranger             4063 Arch Bishop
+      4064 Mechanic         4065 Guillotine Cross  4073 Royal Guard    4074 Sorcerer
+      4075 Minstrel            4076 Wanderer              4077 Sura                  4078 Genetic
+      4079 Shadow Chaser
+      ----- Expanded Class -----
+           23 Super Novice      24 Gunslinger              25 Ninja                 4045 Super Baby
+      4046 Taekwon           4047 Star Gladiator     4049 Soul Linker            4050 Gangsi
+      4051 Death Knight    4052 Dark Collector    4190 Ex. Super Novice  4191 Ex. Super Baby
+      4211 Kagerou            4212 Oboro             4215 Rebellion        4218 Summoner
+      4239 Star Emperor   4240 Soul Reaper
+      ----- Baby Novice And Baby 1st Class -----
+      4023 Baby Novice      4024 Baby Swordman    4025 Baby Magician   4026 Baby Archer
+      4027 Baby Acolyte      4028 Baby Merchant       4029 Baby Thief
+      ---- Baby 2nd Class ----
+      4030 Baby Knight     4031 Baby Priest         4032 Baby Wizard         4033 Baby Blacksmith
+      4034 Baby Hunter    4035 Baby Assassin   4037 Baby Crusader    4038 Baby Monk
+      4039 Baby Sage       4040 Baby Rogue        4041 Baby Alchemist   4042 Baby Bard
+      4043 Baby Dancer
+      ---- Baby 3rd Class ----
+      4096 Baby Rune Knight  4097 Baby Warlock     4098 Baby Ranger           4099 Baby Arch Bishop
+      4100 Baby Mechanic       4101 Baby Glt. Cross  4102 Baby Royal Guard  4103 Baby Sorcerer
+      4104 Baby Minstrel          4105 Baby Wanderer   4106 Baby Sura             4107 Baby Genetic
+      4108 Baby Shadow Chaser
+      ---- Expanded Baby Class ----
+      4220 Baby Summoner        4222 Baby Ninja        4223 Baby Kagero         4224 Baby Oboro
+      4225 Baby Taekwon       4226 Baby Star Glad    4227 Baby Soul Linker    4228 Baby Gunslinger
+      4229 Baby Rebellion   4241 Baby Star Emperor    4242 Baby Soul Reaper
+      ---- Modes And Others ----
+       22 Wedding            26 Christmas          27 Summer           28 Hanbok
+       29 Oktoberfest       30 Summer 2
+       4048 Star Gladiator (Union)	    4238 Baby Star Glad (Union)
+  - Command: option
+    Help: |
+      Params: <param1> <param2>(stackable) <param3>(stackable)
+      Adds different visual effects on or around your character.
+       <param1>       <param2>        <param3>
+      01: Stone      01: Sight       01: Sight          512: Cart Lv. 4
+      02: Frozen     02: Curse       02: Hiding        1024: Cart Lv. 5
+      03: Stun       04: Silence     04: Cloaking      2048: Orc Head
+      04: Sleep      08: Signum      08: Cart Lv. 1    4096: Wedding
+      06: Petrify    16: Blind       16: Falcon        8192: Ruwach
+      07: Burning    32: Angelus     32: Riding       16384: Chasewalk
+      08: Imprison   64: Bleeding    64: Invisible
+      16: (Nothing) 128: D. Poison  128: Cart Lv. 2
+      32: (Nothing) 256: Fear       256: Cart Lv. 3
+  - Command: heal
+    Help: |
+      Params: [<HP> <SP>]
+      Heals the desired amount of HP and SP. No value specified will do a full heal.
+  - Command: dye
+    Aliases:
+      - ccolor
+    Help: |
+      Params: <clothes palette no.>
+      Changes your characters clothes color.
+  - Command: hairstyle
+    Aliases:
+      - hstyle
+    Help: |
+      Params: <hairstyle no.>
+      Changes your hair style.
+  - Command: haircolor
+    Aliases:
+      - hcolor
+    Help: |
+      Params <hair palette no.>
+      Changes your hair color.
+  - Command: speed
+    Help: |
+      Params: <1-1000>
+      Changes you walking speed. 1 being the fastest and 1000 the slowest. Default is 150.
+  - Command: effect
+    Help: |
+      Params: <effect id> [<flag>]
+      Give an effect to your character.
+  - Command: dropall
+    Help: |
+      Params: [<item type>]
+      Throws all your possession on the ground. No type specified will drop all items.
+  - Command: storeall
+    Help: |
+      Puts all your possessions in storage.
+  - Command: killable
+    Help: |
+      Make your character killable.
+  - Command: memo
+    Help: |
+      Params: [memo position]
+      Set/change a memo location (no position: display memo points).
+  - Command: spiritball
+    Help: |
+      Params: <1-100>
+      Gives you "spirit spheres" like from the skill "Call Spirits".
+  - Command: questskill
+    Help: |
+      Params: <#>
+      Gives you the specified quest skill
+      Novice = 142: First Aid, 143: Act Dead
+      Archer = 147: Create Arrow, 148: Charge Arrow
+      Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk
+      Acolyte = 156: Holy Light
+      Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone
+      Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store
+      Magician = 157: Energy Coat
+      Hunter = 1009: Phantasmic Arrow
+      Bard = 1010: Pang Voice
+      Dancer = 1011: Wink of Charm
+      Knight = 1001: Charge Attack
+      Crusader = 1002: Shrink
+      Priest = 1014: Redemptio
+      Monk = 1015: Ki Translation, 1016: Ki Explosio
+      Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife
+      Rogue = 1005: Close Confine
+      Blacksmith = 1012: Unfair Trick, 1013: Greed
+      Alchemist = 238: Basis of Life
+      Wizard = 1006: Sight Blaster
+      Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)
+  - Command: lostskill
+    Help: |
+      Params: <#>
+      Takes away the specified quest skill from you
+      Novice = 142: First Aid, 143: Act Dead
+      Archer = 147: Create Arrow, 148: Charge Arrow
+      Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk
+      Acolyte = 156: Holy Light
+      Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone
+      Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store
+      Magician = 157: Energy Coat
+      Hunter = 1009: Phantasmic Arrow
+      Bard = 1010: Pang Voice
+      Dancer = 1011: Wink of Charm
+      Knight = 1001: Charge Attack
+      Crusader = 1002: Shrink
+      Priest = 1014: Redemptio
+      Monk = 1015: Ki Translation, 1016: Ki Explosio
+      Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife
+      Rogue = 1005: Close Confine
+      Blacksmith = 1012: Unfair Trick, 1013: Greed
+      Alchemist = 238: Basis of Life
+      Wizard = 1006: Sight Blaster
+      Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)
+  - Command: skillid
+    Help: |
+      Params: <name>
+      Look up a skill by name
+  - Command: useskill
+    Help: |
+      Params: <skillid> <skillv> <target>
+      Use a skill on target
+  - Command: skilltree
+    Help: |
+      Params: <skillnum> <charname>
+      Prints the skill tree needed to get a skill for the target player.
+  - Command: marry
+    Help: |
+      Params: <player name>
+      Marry another player.
+  - Command: divorce
+    Help: |
+      Divorce player.
+  - Command: alive
+    Help: |
+      Revives yourself from death.
+  - Command: blvl
+    Aliases:
+      - lvup
+      - blevel
+      - baselvl
+      - baselvup
+      - baselevel
+      - baselvlup
+    Help: |
+      Params: <number of levels>
+      Raises your base level the desired number of levels.
+  - Command: jlvl
+    Aliases:
+      - jlevel
+      - joblvl
+      - joblvup
+      - joblevel
+      - joblvlup
+    Help: |
+      Params: <number of levels>
+      Raises your job level the desired number of levels.
+  - Command: allskill
+    Aliases:
+      - allskills
+      - skillall
+      - skillsall
+    Help: |
+      Give you all skills.
+  - Command: stpoint
+    Help: |
+      Params: <number of points> - Gives you the desired number of stat points.
+  - Command: skpoint
+    Help: |
+      Params: <number of points> - Gives you the desired number of skill points.
+  - Command: zeny
+    Help: |
+      Params: <amount> - Gives you desired amount of Zeny.
+  - Command: cash
+    Help: |
+      Params: <amount> - Gives you the specified amount of cash points.
+  - Command: points
+    Help: |
+      Params: <amount> - Gives you the specified amount of Kafra Points.
+  - Command: str
+    Help: |
+      Params: <amount>
+      Raises STR by given amount.
+  - Command: agi
+    Help: |
+      Params: <amount>
+      Raises AGI by given amount.
+  - Command: dex
+    Help: |
+      Params: <amount>
+      Raises DEX by given amount.
+  - Command: vit
+    Help: |
+      Params: <amount>
+      Raises VIT by given amount.
+  - Command: int
+    Help: |
+      Params: <amount>
+      Raises INT by given amount.
+  - Command: luk
+    Help: |
+      Params: <amount>
+      Raises LUK by given amount.
+  - Command: allstats
+    Aliases:
+      - allstat
+      - statall
+      - statsall
+    Help: |
+      Params: <value>
+      Adds value in all stats (maximum if no value).
+  - Command: addwarp
+    Help: |
+      Params: <map name> <x coord> <y coord> <NPC name>
+  - Command: killmonster2
+    Help: |
+      Kills all monsters of your map (without drops).
+  - Command: monster
+    Aliases:
+      - spawn
+    Help: |
+      Params: <monster name|ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
+      @monster2 <desired_monster_name> <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]
+      @spawn/@monster/@summon/@monster2 "desired monster name" <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]
+      @spawn/@monster/@summon/@monster2 <monster name|ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
+      Spawns the desired monster with any desired name.
+  - Command: monstersmall
+    Help: |
+      Params: <monster name|ID>
+      Spawns a smaller version of a monster.
+  - Command: monsterbig
+    Help: |
+      Params: <monster name|ID>
+      Spawns a larger version of a monster.
+  - Command: killmonster
+    Help: |
+      Params: <map>
+      Kill all monsters of the map (they drop)
+  - Command: autoloot
+    Help: |
+      Params: <on|off|#>
+      Makes items go straight into your inventory.
+  - Command: autotrade
+    Aliases:
+      - at
+    Help: |
+      Allows you to vend while you are offline.
+  - Command: changegm
+    Help: |
+      Params: <charname>
+      Changes the leader of your guild (You must be guild leader)
+  - Command: changeleader
+    Help: |
+      Params: <charname>
+      Changes the leader of your party (You must be party leader)
+  - Command: request
+    Help: |
+      Params: <message>
+      Sends a message to all connected GMs (via the gm whisper system)
+  - Command: sound
+    Help: |
+      Params: <path to file in data folder or GRF file>
+      Plays a sound from the data folder or GRF file located on the client.
+  - Command: clone
+    Help: |
+      Params: <charname>
+      Spawns a supportive clone of the given player.
+  - Command: slaveclone
+    Help: |
+      Params: <charname>
+      Spawns a supportive clone of the given player that follows the creator around.
+  - Command: evilclone
+    Help: |
+      Params: <charname>
+      Spawns an aggressive clone of the given player.
+  - Command: changesex
+    Help: |
+      Changes your gender.
+  - Command: duel
+    Help: |
+      Starts a duel.
+  - Command: invite
+    Help: |
+      Invites a player to a duel.
+  - Command: accept
+    Help: |
+      Accepts an invitation to a duel.
+  - Command: reject
+    Help: |
+      Rejects an invitation to a duel.
+  - Command: leave
+    Help: |
+      Leaves a duel.
+  - Command: mail
+    Help: |
+      Open mail box.
+  - Command: storage
+    Help: |
+      Opens storage.
+  - Command: itemreset
+    Aliases:
+      - clearinventory
+    Help: |
+      Remove all your items.
+  - Command: guildstorage
+    Aliases:
+      - gstorage
+    Help: |
+      Opens guild storage.
+  - Command: idsearch
+    Help: |
+      Params: <part_of_item_name>
+      Search all items that name have part_of_item_name
+  - Command: refine
+    Help: |
+      Params: <equip position> <+/- amount>
+  - Command: produce
+    Help: |
+      Params: <equip name or equip ID> <element> <# of very's>
+      Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
+      You can add up to 3 Star Crumbs and 1 element
+  - Command: repairall
+    Help: |
+      Repair all items of your inventory
+  - Command: item
+    Help: |
+      Params: <item name or ID> <quantity>
+      Gives you the desired item.
+  - Command: item2
+    Help: |
+      Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>
+      Gives you the desired item.
+  - Command: pvpon
+    Help: |
+      Turns pvp on on the current map
+  - Command: pvpoff
+    Help: |
+      Turns pvp off on the current map
+  - Command: gvgon
+    Aliases:
+      - gpvpon
+    Help: |
+      Turns gvg on on the current map
+  - Command: gvgoff
+    Aliases:
+      - gpvpoff
+    Help: |
+      Turns gvg off on the current map
+  - Command: agitstart
+    Help: |
+      Starts War of Emperium
+  - Command: agitend
+    Help: |
+      End War of Emperium
+  - Command: party
+    Help: |
+      Params: <party_name>
+      Create a party.
+  - Command: guild
+    Help: |
+      Params: <guild_name>
+      Create a guild.
+  - Command: glvl
+    Aliases:
+      - glevel
+      - guildlvl
+      - guildlvup
+      - guildlevel
+      - guildlvlup
+    Help: |
+      Params: <# of levels>
+      Raise Guild by desired number of levels
+  - Command: guildrecall
+    Help: |
+      Params: <guild name|ID>
+      Warps all online characters of a guild to you.
+  - Command: partyrecall
+    Help: |
+      Params: <party name|ID>
+      Warps all online characters of a party to you.
+  - Command: petrename
+    Help: |
+      Re-enable pet rename
+  - Command: pettalk
+    Help: |
+      Params: <message>
+      Makes your pet say a message.
+  - Command: petfriendly
+    Help: |
+      Params: <#>
+      Set pet friendly amount (0-1000) 1000 = Max
+  - Command: pethungry
+    Help: |
+      Params: <#>
+      Set pet hungry amount (0-100) 100 = Max
+  - Command: hatch
+    Help: |
+      Create a pet from your inventory eggs list.
+  - Command: makeegg
+    Help: |
+      Params: <pet_id>
+      Gives pet egg for monster number in pet DB
+  - Command: kick
+    Help: |
+      Params: <char name>
+      Kicks specified character off the server
+  - Command: unjail
+    Aliases:
+      - discharge
+    Help: |
+      Params: <char name>
+      Discharges specified character/prisoner
+  - Command: kill
+    Aliases:
+      - die
+    Help: |
+      Kills player.
+  - Command: recall
+    Help: |
+      Params: <char name>
+      Warps target character to you.
+  - Command: raise
+    Aliases:
+      - revive
+    Help: |
+      Params: <char name>
+      Revives target character.
+  - Command: block
+    Help: |
+      Params: <char name>
+      Permanently blocks an account.
+  - Command: unblock
+    Help: |
+      Params: <char name>
+      Unblocks an account.
+  - Command: ban
+    Aliases:
+      - banish
+    Help: |
+      Params: <time> <name>\n" "Temporarily ban an account.
+      time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)
+      Example: @ban +1m-2mn1s-6y testplayer
+  - Command: unban
+    Aliases:
+      - unbanish
+    Help: |
+      Params: <name> - Unban a account
+  - Command: jail
+    Help: |
+      Params: <char name> - Sends specified character in jails
+  - Command: trade
+    Help: |
+      Params: <char name> - Open a trade window with a another player
+  - Command: recallall
+    Help: |
+      Warps every character online to you.
+  - Command: doom
+    Help: |
+      Kills all NON GM chars on the server.
+  - Command: doommap
+    Help: |
+      Kills all non GM characters on the map.
+  - Command: raisemap
+    Help: |
+      Resurrects all characters on the map.
+  - Command: night
+    Help: |
+      Enables night mode on all maps, all characters are affected.
+  - Command: day
+    Help: |
+      Disables night mode and restores regular lighting, all characters are affected.
+  - Command: skillon
+    Help: |
+      Turn skills on for a map.
+  - Command: skilloff
+    Help: |
+      Turn skills off for a map.
+  - Command: snow
+    Help: |
+      Makes all maps to have the snow weather effect.
+  - Command: clouds
+    Help: |
+      Makes all maps to have the cloudy weather effect.
+  - Command: clouds2
+    Help: |
+      Makes all maps to have another cloudy weather effect.
+  - Command: fog
+    Help: |
+      Makes all maps to have the fog weather effect.
+  - Command: fireworks
+    Help: |
+      Makes all maps to have the fireworks weather effect.
+  - Command: sakura
+    Help: |
+      Makes all maps to have the sakura weather effect.
+  - Command: leaves
+    Help: |
+      Makes all maps to have the leaves weather effect.
+  - Command: shownpc
+    Help: |
+      Params: <NPC name>
+      Enable a NPC.
+  - Command: hidenpc
+    Help: |
+      Params: <NPC name>
+      Disable a NPC.
+  - Command: npcmove
+    Help: |
+      Params: <x coord> <y coord> <NPC name>
+      Move a NPC.
+  - Command: loadnpc
+    Help: |
+      Params: <path to script>
+      Load the specified script file path.
+  - Command: unloadnpc
+    Help: |
+      Params: <NPC name>
+      Unload the specified NPC according to name.
+  - Command: unloadnpcfile
+    Help: |
+      Params: <path>
+      Unload the specified script file path.
+  - Command: adjgroup
+    Help: |
+      Params: <level> <char name>
+      Do a temporary adjustment of the group level of a player.
+  - Command: addperm
+    Help: |
+      Params: <permission_name>
+      Temporarily add a permission to a player.
+  - Command: rmvperm
+    Help: |
+      Params: <permission_name>
+      Temporarily remove a permission from a player.
+  - Command: kickall
+    Help: |
+      Kick all characters off the server
+  - Command: mapexit
+    Help: |
+      Kick all players and shut down map-server.
+  - Command: gat
+    Help: |
+      For debugging (you inspect around gat)
+  - Command: send
+    Help: |
+      Params: <Hex Number> [<value>]
+      For debugging (packet variety)
+  - Command: nuke
+    Help: |
+      Params: <char name>
+      Blow somebody up, including those surrounding them.
+  - Command: reloadatcommand
+    Help: |
+      Reload atcommand settings.
+  - Command: reloadbattleconf
+    Help: |
+      Reload battle settings.
+  - Command: reloaditemdb
+    Help: |
+      Reload item database.
+  - Command: reloadmobdb
+    Help: |
+      Reload monster database.
+  - Command: reloadmotd
+    Help: |
+      Reload Message of the Day.
+  - Command: reloadmsgconf
+    Help: |
+      Reload message configuration.
+  - Command: reloadpcdb
+    Help: |
+      Reload player settings.
+  - Command: reloadquestdb
+    Help: |
+      Reload quest database.
+  - Command: reloadscript
+    Help: |
+      Reload all scripts.
+  - Command: reloadskilldb
+    Help: |
+      Reload skills definition database.
+  - Command: reloadstatusdb
+    Help: |
+      Reload status settings.
+  - Command: reload
+    Help: |
+      Params: <type>
+      Reload a database or configuration file.
+      itemdb                mobdb          skilldb
+      atcommand       battleconf     statusdb
+      pcdb                    motd             script
+      questdb              msgconf       packetdb
+  - Command: langtype
+    Help: |
+      Params: <language>
+      Changes your language setting.
+  - Command: limitedsale
+    Help: |
+      Opens the limited sale window.
+  - Command: changedress
+    Aliases:
+      - nocosplay
+    Help: |
+      Removes all character costumes.
+  - Command: camerainfo
+    Aliases:
+      - viewpointvalue
+      - setcamera
+    Help: |
+      Shows or updates the client's camera settings.
+  - Command: resetstat
+    Aliases:
+      - streset
+  - Command: resetskill
+    Aliases:
+      - skreset
+  - Command: homlevel
+    Aliases:
+      - hlvl
+      - hlevel
+      - homlvl
+      - homlvup
+  - Command: homevolution
+    Aliases:
+      - homevolve
+  - Command: mutearea
+    Aliases:
+      - stfu
+  - Command: monsterignore
+    Aliases:
+      - battleignore
+  - Command: accinfo
+    Aliases:
+      - accountinfo
+  - Command: channel
+    Aliases:
+      - main
+  - Command: autoloottype
+    Aliases:
+      - aloottype
+  - Command: cloneequip
+    Aliases:
+      - eqclone
+  - Command: clonestat
+    Aliases:
+      - stclone
+  - Command: reloadnpcfile
+    Aliases:
+      - reloadnpc
+
+Footer:
+  Imports:
+    - Path: conf/import/atcommands.yml

+ 11 - 0
conf/battle/gm.conf

@@ -7,6 +7,17 @@
 // Note 2: Value is in percents (100 means 100%)
 //--------------------------------------------------------------
 
+// The symbol that will be used to recognize commands.
+// You can set any one character except:
+// - control-characters (0x00-0x1f),
+// - '%' (party chat symbol)
+// - '$' (guild chat symbol)
+// - '/' (client commands symbol)
+// atcommand_symbol represents @commands used locally.
+// charcommand_symbol represents #commands used on other players.
+atcommand_symbol: @
+charcommand_symbol: #
+
 // The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
 atcommand_spawn_quantity_limit: 100
 

+ 0 - 328
conf/help.txt

@@ -1,328 +0,0 @@
-// This is help file that contains help messages for atcommands/charcommands.
-// Format:
-// <command>: "<help message>"
-// This file uses libconfig syntax.
-
-help: "Params: <command>\n" "Shows help for specified command."
-noask: "Auto rejects deals/invites."
-gmotd: "Broadcasts the Message of The Day to all players."
-me: "Params: <message>\n" "Displays normal text as a message in this format: *name message* (like /me in mIRC)."
-fakename: "Params: <name>\n" "Changes your name to your choice temporarily."
-npctalk: "Params: <NPC name> <message>\n" "Forces a NPC to display a message in normal chat."
-broadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow)."
-kami: "Params: <message>\n" "Broadcasts a message without your name (in yellow)."
-kamib: "Params: <message>\n" "Broadcasts a message without your name (in blue)."
-localbroadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow) only on your map."
-commands: "Displays a list of commands that you can use."
-rates: "Displays the server's current rates."
-uptime: "Displays how long the server has been online."
-showdelay: "Shows/hides the \"There is a delay after this skill\" message."
-exp: "Displays current levels and % progress."
-mobinfo: "Params: <monster name|ID>\n" "Shows monster info (stats, exp, drops etc)."
-iteminfo: "Params: <item name|ID>\n" "Shows item info (type, price etc)."
-whodrops: "Params: <item name|ID>\n" "Shows who drops an item (monster with highest drop rates)."
-version: "Displays SVN version of the server."
-email: "Params: <current email> <new email>\n" "Changes your account e-mail address."
-where: "Params: <char name>\n" "Tells you the location of a character."
-time: "Shows the date and time of the server."
-showexp: "Displays/hides experience gained."
-showzeny: "Displays/hides Zeny gained."
-mobsearch: "Params: <monster name|ID>\n" "Shows the location of a certain mob on the current map."
-who: "Params: [<name>]\n" "Shows a list of online players and their party and guild."
-who2: "Params: [<name>]\n" "Shows a list of online players and their job."
-who3: "Params: [<name>]\n" "Shows a list of online players and their location."
-whomap: "@whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specified map."
-whogm: "Params: [match_text] - Like @who+@who2+who3, but only for GM."
-guildspy: "Params: <guild name|id> - You will receive all messages of the guild channel (Chat logging must be enabled)"
-partyspy: "@partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)"
-mapinfo: "Params: [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: chatrooms)."
-go: "Params: <city name|number>\n" "Warps you to a city.\n"
-	"  -3: (Memo point 2)  14: louyang         31: mora\n"
-	"  -2: (Memo point 1)  15: start point     32: dewata\n"
-	"  -1: (Memo point 0)  16: prison/jail     33: malangdo island\n"
-	"   0: prontera              17: jawaii             34: malaya port\n"
-	"   1: morocc                18: ayothaya       35: eclage\n"
-	"   2: geffen                  19: einbroch       36: lasagna\n"
-	"   3: payon                  20: lighthalzen\n"
-	"   4: alberta                 21: einbech\n"
-	"   5: izlude                   22: hugel\n"
-	"   6: aldebaran           23: rachel\n"
-	"   7: xmas (lutie)        24: veins\n"
-	"   8: comodo               25: moscovia\n"
-	"   9: yuno                     26: midgard camp\n"
-	"  10: amatsu               27: manuk\n"
-	"  11: gonryun              28: splendide\n"
-	"  12: umbala               29: brasilis\n"
-	"  13: niflheim              30: el dicastes\n"
-jumpto: "Params: <char name>\n" "Warps you to selected character."
-follow: "Params: <char name>\n" "Follow a player."
-mount: "Give/remove a job-based mount (class is required, but not the skill)."
-mount2: "Give/remove a cash mount."
-disguise: "Params: <monster name|ID>\n" "Change your appearence to other players to a mob."
-undisguise: "Restore your normal appearance."
-disguiseguild: "Disguises all online characters of a guild."
-undisguiseguild: "Restore the normal appearance of all characters of a guild."
-model: "Params:  <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence."
-size: "Params:  <0-2> Changes your size (0-Normal 1-Small 2-Large)"
-sizeall: "Changes the size of all players."
-sizeguild: "Changes the size of all online characters of a guild."
-hide: "Makes you character invisible (GM invisibility). Type again to become visible."
-save: "Sets respawn point to current spot."
-load: "Warps you to your save point."
-warp: "Params: <mapname> [<x> <y>]\n" "Warps you to the selected map and position."
-jump: "Params: [<x> [<y>]]\n" "Randomly warps you like a flywing."
-jobchange: "Params: <job name|ID>\n" "Changes your job.\n"
-	"----- Novice / 1st Class -----\n"
-	"   0 Novice              1 Swordman            2 Magician            3 Archer\n"
-	"   4 Acolyte              5 Merchant               6 Thief\n"
-	"----- 2nd Class -----\n"
-	"   7 Knight               8 Priest                     9 Wizard               10 Blacksmith\n"
-	"  11 Hunter           12 Assassin            14 Crusader          15 Monk\n"
-	"  16 Sage              17 Rogue                 18 Alchemist         19 Bard\n"
-	"  20 Dancer\n"
-	"----- High Novice / High 1st Class -----\n"
-	"4001 Novice High     4002 Swordman High    4003 Magician High    4004 Archer High\n"
-	"4005 Acolyte High     4006 Merchant High       4007 Thief High\n"
-	"----- Transcendent 2nd Class -----\n"
-	"4008 Lord Knight      4009 High Priest             4010 High Wizard      4011 Whitesmith\n"
-	"4012 Sniper               4013 Assassin Cross   4015 Paladin              4016 Champion\n"
-	"4017 Professor         4018 Stalker                    4019 Creator               4020 Clown\n"
-	"4021 Gypsy\n"
-	"----- 3rd Class (Regular) -----\n"
-	"4054 Rune Knight    4055 Warlock                 4056 Ranger            4057 Arch Bishop\n"
-	"4058 Mechanic         4059 Guillotine Cross  4066 Royal Guard   4067 Sorcerer\n"
-	"4068 Minstrel            4069 Wanderer              4070 Sura                 4071 Genetic\n"
-	"4072 Shadow Chaser\n"
-	"----- 3rd Class (Transcendent) -----\n"
-	"4060 Rune Knight    4061 Warlock                 4062 Ranger             4063 Arch Bishop\n"
-	"4064 Mechanic         4065 Guillotine Cross  4073 Royal Guard    4074 Sorcerer\n"
-	"4075 Minstrel            4076 Wanderer              4077 Sura                  4078 Genetic\n"
-	"4079 Shadow Chaser\n"
-	"----- Expanded Class -----\n"
-	"     23 Super Novice      24 Gunslinger              25 Ninja                 4045 Super Baby\n"
-	"4046 Taekwon           4047 Star Gladiator     4049 Soul Linker            4050 Gangsi\n"
-	"4051 Death Knight    4052 Dark Collector    4190 Ex. Super Novice  4191 Ex. Super Baby\n"
-	"4211 Kagerou            4212 Oboro             4215 Rebellion        4218 Summoner\n"
-	"4239 Star Emperor   4240 Soul Reaper\n"
-	"----- Baby Novice And Baby 1st Class -----\n"
-	"4023 Baby Novice      4024 Baby Swordman    4025 Baby Magician   4026 Baby Archer\n"
-	"4027 Baby Acolyte      4028 Baby Merchant       4029 Baby Thief\n"
-	"---- Baby 2nd Class ----\n"
-	"4030 Baby Knight     4031 Baby Priest         4032 Baby Wizard         4033 Baby Blacksmith\n"
-	"4034 Baby Hunter    4035 Baby Assassin   4037 Baby Crusader    4038 Baby Monk\n"
-	"4039 Baby Sage       4040 Baby Rogue        4041 Baby Alchemist   4042 Baby Bard\n"
-	"4043 Baby Dancer\n"
-	"---- Baby 3rd Class ----\n"
-	"4096 Baby Rune Knight  4097 Baby Warlock     4098 Baby Ranger           4099 Baby Arch Bishop\n"
-	"4100 Baby Mechanic       4101 Baby Glt. Cross  4102 Baby Royal Guard  4103 Baby Sorcerer\n"
-	"4104 Baby Minstrel          4105 Baby Wanderer   4106 Baby Sura             4107 Baby Genetic\n"
-	"4108 Baby Shadow Chaser\n"
-	"---- Expanded Baby Class ----\n"
-	"4220 Baby Summoner        4222 Baby Ninja        4223 Baby Kagero         4224 Baby Oboro\n"
-	"4225 Baby Taekwon       4226 Baby Star Glad    4227 Baby Soul Linker    4228 Baby Gunslinger\n"
-	"4229 Baby Rebellion   4241 Baby Star Emperor    4242 Baby Soul Reaper\n"
-	"---- Modes And Others ----\n"
-	" 22 Wedding            26 Christmas          27 Summer           28 Hanbok\n"
-	" 29 Oktoberfest       30 Summer 2\n"
-	" 4048 Star Gladiator (Union)	    4238 Baby Star Glad (Union)\n"
-option: "Params: <param1> <param2>(stackable) <param3>(stackable)\n" "Adds different visual effects on or around your character.\n"
-" <param1>       <param2>        <param3>\n"
-"01: Stone      01: Sight       01: Sight          512: Cart Lv. 4\n"
-"02: Frozen     02: Curse       02: Hiding        1024: Cart Lv. 5\n"
-"03: Stun       04: Silence     04: Cloaking      2048: Orc Head\n"
-"04: Sleep      08: Signum      08: Cart Lv. 1    4096: Wedding\n"
-"06: Petrify    16: Blind       16: Falcon        8192: Ruwach\n"
-"07: Burning    32: Angelus     32: Riding       16384: Chasewalk\n"
-"08: Imprison   64: Bleeding    64: Invisible\n"
-"16: (Nothing) 128: D. Poison  128: Cart Lv. 2\n"
-"32: (Nothing) 256: Fear       256: Cart Lv. 3"
-heal: "Params: [<HP> <SP>]\n" "Heals the desired amount of HP and SP. No value specified will do a full heal."
-dye: "Params: <clothes palette no.>\n" "Changes your characters clothes color."
-hairstyle: "Params: <hairstyle no.>\n" "Changes your hair style."
-haircolor: "Params <hair palette no.>\n" "Changes your hair color."
-speed: "Params: <1-1000>\n" "Changes you walking speed. 1 being the fastest and 1000 the slowest. Default is 150."
-effect: "Params: <effect id> [<flag>]\n" "Give an effect to your character."
-dropall: "Params: [<item type>]\n" "Throws all your possession on the ground. No type specified will drop all items."
-storeall: "Puts all your possessions in storage."
-killable: "Make your character killable."
-memo: "Params: [memo position]\n" "Set/change a memo location (no position: display memo points)."
-spiritball: "Params: <1-100>\n" "Gives you \"spirit spheres\" like from the skill \"Call Spirits\".\n"
-questskill: "Params: <#>\n" "Gives you the specified quest skill\n"
-"Novice = 142: First Aid, 143: Act Dead\n"
-"Archer = 147: Create Arrow, 148: Charge Arrow\n"
-"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
-"Acolyte = 156: Holy Light\n"
-"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
-"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
-"Magician = 157: Energy Coat\n"
-"Hunter = 1009: Phantasmic Arrow\n"
-"Bard = 1010: Pang Voice\n"
-"Dancer = 1011: Wink of Charm\n"
-"Knight = 1001: Charge Attack\n"
-"Crusader = 1002: Shrink\n"
-"Priest = 1014: Redemptio\n"
-"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
-"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
-"Rogue = 1005: Close Confine\n"
-"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
-"Alchemist = 238: Basis of Life\n"
-"Wizard = 1006: Sight Blaster\n"
-"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
-lostskill: "Params: <#>\n" "Takes away the specified quest skill from you\n"
-"Novice = 142: First Aid, 143: Act Dead\n"
-"Archer = 147: Create Arrow, 148: Charge Arrow\n"
-"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
-"Acolyte = 156: Holy Light\n"
-"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
-"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
-"Magician = 157: Energy Coat\n"
-"Hunter = 1009: Phantasmic Arrow\n"
-"Bard = 1010: Pang Voice\n"
-"Dancer = 1011: Wink of Charm\n"
-"Knight = 1001: Charge Attack\n"
-"Crusader = 1002: Shrink\n"
-"Priest = 1014: Redemptio\n"
-"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
-"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
-"Rogue = 1005: Close Confine\n"
-"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
-"Alchemist = 238: Basis of Life\n"
-"Wizard = 1006: Sight Blaster\n"
-"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
-skillid: "Params: <name>\n" "Look up a skill by name"
-useskill: "Params: <skillid> <skillv> <target>\n" "Use a skill on target"
-skilltree: "Params: <skillnum> <charname>\n" "Prints the skill tree needed to get a skill for the target player."
-marry: "Params: <player name>\n" "Marry another player."
-divorce: "Divorce player."
-alive: "Revives yourself from death."
-blvl: "Params: <number of levels>\n" "Raises your base level the desired number of levels."
-jlvl: "Params: <number of levels>\n" "Raises your job level the desired number of levels."
-allskill: "Give you all skills."
-stpoint: "Params: <number of points> - Gives you the desired number of stat points."
-skpoint: "Params: <number of points> - Gives you the desired number of skill points."
-zeny: "Params: <amount> - Gives you desired amount of Zeny."
-cash: "Params: <amount> - Gives you the specified amount of cash points."
-points: "Params: <amount> - Gives you the specified amount of Kafra Points."
-str: "Params: <amount>\n" "Raises STR by given amount."
-agi: "Params: <amount>\n" "Raises AGI by given amount."
-dex: "Params: <amount>\n" "Raises DEX by given amount."
-vit: "Params: <amount>\n" "Raises VIT by given amount."
-int: "Params: <amount>\n" "Raises INT by given amount."
-luk: "Params: <amount>\n" "Raises LUK by given amount."
-allstats: "Params: <value>\n" "Adds value in all stats (maximum if no value)."
-addwarp: "Params: <map name> <x coord> <y coord> <NPC name>\n"
-killmonster2: "Kills all monsters of your map (without drops)."
-monster: "Params: <monster name|ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]\n"
- "@monster2 <desired_monster_name> <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
-"@spawn/@monster/@summon/@monster2 \"desired monster name\" <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
-"@spawn/@monster/@summon/@monster2 <monster name|ID> \"desired monster name\" [<number to spawn> [<x coord> [<y coord>]]]\n"
-"	Spawns the desired monster with any desired name."
-monstersmall: "Params: <monster name|ID>\n" "Spawns a smaller version of a monster."
-monsterbig: "Params: <monster name|ID>\n" "Spawns a larger version of a monster."
-killmonster: "Params: <map>\n" "Kill all monsters of the map (they drop)"
-autoloot: "Params: <on|off|#>\n" "Makes items go straight into your inventory."
-autotrade: "Allows you to vend while you are offline."
-changegm: "Params: <charname>\n" "Changes the leader of your guild (You must be guild leader)"
-changeleader: "Params: <charname>\n" "Changes the leader of your party (You must be party leader)"
-request: "Params: <message>\n" "Sends a message to all connected GMs (via the gm whisper system)"
-sound: "Params: <path to file in data folder or GRF file>\n" "Plays a sound from the data folder or GRF file located on the client."
-clone: "Params: <charname>\n" "Spawns a supportive clone of the given player."
-slaveclone: "Params: <charname>\n" "Spawns a supportive clone of the given player that follows the creator around."
-evilclone: "Params: <charname>\n" "Spawns an aggressive clone of the given player."
-changesex: "Changes your gender."
-duel: "Starts a duel."
-invite: "Invites a player to a duel."
-accept: "Accepts an invitation to a duel."
-reject: "Rejects an invitation to a duel."
-leave: "Leaves a duel."
-mail: "Open mail box."
-storage: "Opens storage."
-itemreset: "Remove all your items."
-guildstorage: "Opens guild storage."
-idsearch: "Params: <part_of_item_name>\n" "Search all items that name have part_of_item_name"
-refine: "Params: <equip position> <+/- amount>"
-produce: "Params: <equip name or equip ID> <element> <# of very's>\n"
-"	Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind\n"
-"	You can add up to 3 Star Crumbs and 1 element\n"
-repairall: "Repair all items of your inventory"
-item: "Params: <item name or ID> <quantity>\n" "Gives you the desired item."
-item2: "Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>\n" "Gives you the desired item."
-pvpon: "Turns pvp on on the current map"
-pvpoff: "Turns pvp off on the current map"
-gvgon: "Turns gvg on on the current map"
-gvgoff: "Turns gvg off on the current map"
-agitstart: "Starts War of Emperium"
-agitend: "End War of Emperium"
-party: "Params: <party_name>\n" "Create a party."
-guild: "Params: <guild_name>\n" "Create a guild."
-glvl: "Params: <# of levels>\n" "Raise Guild by desired number of levels"
-guildrecall: "Params: <guild name|ID>\n" "Warps all online characters of a guild to you."
-partyrecall: "Params: <party name|ID>\n" "Warps all online characters of a party to you."
-petrename: "Re-enable pet rename"
-pettalk: "Params: <message>\n" "Makes your pet say a message."
-petfriendly: "Params: <#>\n" "Set pet friendly amount (0-1000) 1000 = Max"
-pethungry: "Params: <#>\n" "Set pet hungry amount (0-100) 100 = Max"
-hatch: "Create a pet from your inventory eggs list."
-makeegg: "Params: <pet_id>\n" "Gives pet egg for monster number in pet DB"
-kick: "Params: <char name>\n" "Kicks specified character off the server"
-unjail: "Params: <char name>\n" "Discharges specified character/prisoner"
-kill: "Kills player."
-recall: "Params: <char name>\n" "Warps target character to you."
-raise: "Params: <char name>\n" "Revives target character."
-block: "Params: <char name>\n" "Permanently blocks an account."
-unblock: "Params: <char name>\n" "Unblocks an account."
-ban: "Params: <time> <name>\n" "Temporarily ban an account.\n"
- "	time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)\n"
- "	Example: @ban +1m-2mn1s-6y testplayer\n"
-unban: "Params: <name> - Unban a account"
-jail: "Params: <char name> - Sends specified character in jails"
-trade: "Params: <char name> - Open a trade window with a another player"
-recallall: "Warps every character online to you."
-doom: "Kills all NON GM chars on the server."
-doommap: "Kills all non GM characters on the map."
-raisemap: "Resurrects all characters on the map."
-night: "Enables night mode on all maps, all characters are affected."
-day: "Disables night mode and restores regular lighting, all characters are affected."
-skillon: "Turn skills on for a map."
-skilloff: "Turn skills off for a map."
-snow: "Makes all maps to have the snow weather effect."
-clouds: "Makes all maps to have the cloudy weather effect."
-clouds2: "Makes all maps to have another cloudy weather effect."
-fog: "Makes all maps to have the fog weather effect."
-fireworks: "Makes all maps to have the fireworks weather effect."
-sakura: "Makes all maps to have the sakura weather effect."
-leaves: "Makes all maps to have the leaves weather effect."
-shownpc: "Params: <NPC name>\n" "Enable a NPC."
-hidenpc: "Params: <NPC name>\n" "Disable a NPC."
-npcmove: "Params: <x coord> <y coord> <NPC name>\n" "Move a NPC."
-loadnpc: "Params: <path to script>\n" "Load the specified script file path."
-unloadnpc: "Params: <NPC name>\n" "Unload the specified NPC according to name."
-unloadnpcfile: "Params: <path>\n" "Unload the specified script file path."
-adjgroup: "Params: <level> <char name>\n" "Do a temporary adjustment of the group level of a player."
-addperm: "Params: <permission_name>\n" "Temporarily add a permission to a player."
-rmvperm: "Params: <permission_name>\n" "Temporarily remove a permission from a player."
-kickall: "Kick all characters off the server"
-mapexit: "Kick all players and shut down map-server."
-gat: "For debugging (you inspect around gat)"
-send: "Params: <Hex Number> [<value>]\n" "For debugging (packet variety)"
-nuke: "Params: <char name>\n" "Blow somebody up, including those surrounding them."
-reloadatcommand: "Reload atcommand settings."
-reloadbattleconf: "Reload battle settings."
-reloaditemdb: "Reload item database."
-reloadmobdb: "Reload monster database."
-reloadmotd: "Reload Message of the Day."
-reloadmsgconf: "Reload message configuration."
-reloadpcdb: "Reload player settings."
-reloadquestdb: "Reload quest database."
-reloadscript: "Reload all scripts."
-reloadskilldb: "Reload skills definition database."
-reloadstatusdb: "Reload status settings."
-reload: "Params: <type>\n" "Reload a database or configuration file.\n"
-	"   itemdb                mobdb          skilldb\n"
-	"   atcommand       battleconf     statusdb\n"
-	"   pcdb                    motd             script\n"
-	"   questdb              msgconf       packetdb\n"
-langtype: "Params: <language>\n" "Changes your language setting."
-limitedsale: "Opens the limited sale window."
-changedress: "Removes all character costumes."
-camerainfo: "Shows or updates the client's camera settings."

+ 33 - 0
conf/import-tmpl/atcommands.yml

@@ -0,0 +1,33 @@
+# This file is a part of rAthena.
+#   Copyright(C) 2017 rAthena Development Team
+#   https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+###########################################################################
+# Atcommand Database
+###########################################################################
+#
+# Atcommand Settings
+#
+###########################################################################
+# - Command                  Command name.
+#   Aliases:                 Aliases for the command. (Optional)
+#     - <AliasName>
+#   Help                     Help message for the command. (Optional)
+###########################################################################
+
+Header:
+  Type: ATCOMMAND_DB
+  Version: 1

+ 0 - 2
conf/map_athena.conf

@@ -117,8 +117,6 @@ save_settings: 4095
 motd_txt: conf/motd.txt
 
 // When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
-help_txt: conf/help.txt
-help2_txt: conf/help2.txt
 charhelp_txt: conf/charhelp.txt
 
 // Load channel config from

+ 2 - 2
conf/msg_conf/map_msg.conf

@@ -41,7 +41,7 @@
 24: Job level raised.
 25: Job level lowered.
 26: Help commands:
-27: Commands help is not available.
+//27: free
 28: No player found.
 29: 1 player found.
 30: %d players found.
@@ -1046,7 +1046,7 @@
 
 // @reloadatcommand
 1036: Error reading groups.conf, reload failed.
-1037: Error reading atcommand_athena.conf, reload failed.
+//1037 free
 
 // @mapinfo
 1038: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).

+ 2 - 2
conf/msg_conf/map_msg_chn.conf

@@ -45,7 +45,7 @@
 24: 職業等級 上升
 25: 職業等級 下降
 26: 求助指令:
-27: 找不到檔案: help.txt
+//27: free
 28: 沒有玩家
 29: 有 1 位玩家
 30: 有 %d 位玩家
@@ -867,7 +867,7 @@
 
 // @reloadatcommand
 1036: Error reading groups.conf, reload failed.
-1037: Error reading atcommand_athena.conf, reload failed.
+//1037 free
 
 // @mapinfo
 1038: 請至少輸入一個有效的列表數字 (使用方法: @mapinfo <0-3> [地圖名稱])

+ 2 - 2
conf/msg_conf/map_msg_frn.conf

@@ -45,7 +45,7 @@
 24: Job level augmenté.
 25: Job level baissé.
 26: Commandes d'aide:
-27: Commandes d'aide non-disponible.
+//27: free
 28: Aucun Joueur trouvé.
 29: 1 Joueur trouvé.
 30: %d Joueurs trouvés.
@@ -879,7 +879,7 @@
 
 // @reloadatcommand
 1036: Erreur à la lecture de groups.conf, reload échoué.
-1037: Erreur à la lecture de atcommand_athena.conf, reload échoué.
+//1037 free
 
 // @mapinfo
 1038: Entrez un numéro de la liste (usage: @mapinfo <0-3> <map>).

+ 1 - 1
conf/msg_conf/map_msg_grm.conf

@@ -44,7 +44,7 @@
 24: Job Level erhöht.
 25: Job Level verringert.
 26: Hilfsbefehle:
-27: Der help-Befehl ist nicht verfügbar.
+//27: free
 28: Kein Spieler gefunden.
 29: 1 Spieler gefunden.
 30: %d Spieler gefunden.

+ 2 - 2
conf/msg_conf/map_msg_idn.conf

@@ -41,7 +41,7 @@
 24: Job Level dinaikkan.
 25: Job Level diturunkan.
 26: Bantuan command:
-27: Bantuan command tidak tersedia.
+//27: free
 28: Pemain tidak ditemukan.
 29: 1 pemain ditemukan.
 30: %d pemain ditemukan.
@@ -969,7 +969,7 @@
 
 // @reloadatcommand
 1036: Terjadi kesalahan saat membaca groups.conf, tidak berhasil dimuat ulang.
-1037: Terjadi kesalahan saat membaca atcommand_athena.conf, tidak berhasil dimuat ulang.
+//1037 free
 
 // @mapinfo
 1038: Harap masukkan setidaknya 1 pilihan. (Penggunaan: @mapinfo <0-3> <map>).

+ 2 - 2
conf/msg_conf/map_msg_por.conf

@@ -51,7 +51,7 @@
 24: Nível de classe acrescido.
 25: Nível de classe decrescido.
 26: Comandos de ajuda:
-27: Comandos de ajuda não disponível.
+//27: free
 28: Nenhum jogador encontrado.
 29: 1 jogador encontrado.
 30: %d jogadores encontrados.
@@ -1048,7 +1048,7 @@
 
 // @reloadatcommand
 1036: Erro na leitura do grups.conf, recarregamento falhou.
-1037: Erro na leitura do atcommand_athena.conf, recarregamento falhou.
+//1037 free
 
 // @mapinfo
 1038: Digite pelo menos um número válido da lista (uso: @mapinfo <0-3> <mapa>).

+ 2 - 2
conf/msg_conf/map_msg_rus.conf

@@ -43,7 +43,7 @@
 24: Уровень профессии повышен.
 25: Уровень профессии снижен.
 26: Подсказки для команд:
-27: Подсказки для команд не доступны.
+//27: free
 28: Игроки не найдены.
 29: Найден 1 игрок.
 30: Найдено %d игрока(ов).
@@ -880,7 +880,7 @@
 
 // @reloadatcommand
 1036: Ошибка чтения файла groups.conf, перезагрузка не удалась.
-1037: Ошибка чтения файла atcommand_athena.conf, перезагрузка не удалась.
+//1037 free
 
 // @mapinfo
 1038: Введите хотя бы один номер (Использование: @mapinfo <0-3> <локация>).

+ 2 - 2
conf/msg_conf/map_msg_spn.conf

@@ -41,7 +41,7 @@
 24: Has aumentado tu nivel de oficio.
 25: Has disminuido tu nivel de oficio.
 26: Ayuda sobre comandos:
-27: No hay ninguna ayuda disponible.
+//27: free
 28: No se ha encontrado ningún jugador.
 29: Se ha encontrado 1 jugador.
 30: Se han encontrado %d jugadores.
@@ -1017,7 +1017,7 @@
 
 // @reloadatcommand
 1036: Ha ocurrido un error al cargar el archivo groups.conf.
-1037: Ha ocurrido un error al cargar el archivo atcommand_athena.conf.
+//1037 free
 
 // @mapinfo
 1038: Introduce un número de la lista (instrucciones: @mapinfo <0-3> <mapa>).

+ 2 - 2
conf/msg_conf/map_msg_tha.conf

@@ -45,7 +45,7 @@
 24: Job level à¾ÔèÁ¢Öé¹.
 25: Job level Ŵŧ.
 26: Help commands:
-27: ¤ÓÊÑè§ help äÁèÊÒÁÒöãªéä´é.
+//27: free
 28: äÁ辺¼ÙéàÅè¹.
 29: ¾º¼ÙéàÅè¹ 1 ¤¹.
 30: ¾º¼ÙéàÅè¹ %d ¤¹.
@@ -873,7 +873,7 @@
 
 // @reloadatcommand
 1036: à¡Ô´¢éͼԴ¾ÅҴ㹡ÒüèÒ¹ä¿Åì groups.conf, ¡ÒÃâËÅ´ãËÁèÅéÁàËÅÇ.
-1037: à¡Ô´¢éͼԴ¾ÅҴ㹡ÒüèÒ¹ä¿Åì atcommand_athena.conf, ¡ÒÃâËÅ´ãËÁèÅéÁàËÅÇ.
+//1037 free
 
 // @mapinfo
 1038: â»Ã´ÃкØàÅ¢ÍÂèҧ˹èÍÂ˹Ö觤èÒ¨Ò¡ÃÒ¡Òà (ÇÔ¸Õãªé: @mapinfo <0-3> <map>).

+ 0 - 5
src/common/cli.cpp

@@ -23,7 +23,6 @@ const char* MAP_CONF_NAME;
 const char* INTER_CONF_NAME;
 const char* LOG_CONF_NAME;
 const char* BATTLE_CONF_FILENAME;
-const char* ATCOMMAND_CONF_FILENAME;
 const char* SCRIPT_CONF_NAME;
 const char* GRF_PATH_FILENAME;
 //char confs
@@ -148,10 +147,6 @@ int cli_get_options(int argc, char ** argv) {
 					if (opt_has_next_value(arg, i, argc))
 						BATTLE_CONF_FILENAME = argv[++i];
 				}
-				else if (strcmp(arg, "atcommand-config") == 0) {
-					if (opt_has_next_value(arg, i, argc))
-						ATCOMMAND_CONF_FILENAME = argv[++i];
-				}
 				else if (strcmp(arg, "script-config") == 0) {
 					if (opt_has_next_value(arg, i, argc))
 						SCRIPT_CONF_NAME = argv[++i];

+ 161 - 189
src/map/atcommand.cpp

@@ -3,10 +3,14 @@
 
 #include "atcommand.hpp"
 
+#include <set>
+#include <unordered_map>
+
 #include <math.h>
 #include <stdlib.h>
 
 #include "../common/cbasetypes.hpp"
+#include "../common/database.hpp"
 #include "../common/cli.hpp"
 #include "../common/conf.hpp"
 #include "../common/malloc.hpp"
@@ -50,11 +54,12 @@
 #include "storage.hpp"
 #include "trade.hpp"
 
+using namespace rathena;
+
 #define ATCOMMAND_LENGTH 50
 #define ACMD_FUNC(x) static int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
 
 typedef struct AtCommandInfo AtCommandInfo;
-typedef struct AliasInfo AliasInfo;
 
 int atcmd_binding_count = 0;
 
@@ -73,9 +78,10 @@ struct AtCommandInfo {
 	uint8 restriction; /// Restrictions see enum e_restict
 };
 
-struct AliasInfo {
+struct s_atcommand_alias_info{
 	AtCommandInfo *command;
-	char alias[ATCOMMAND_LENGTH];
+	std::set<std::string> aliases;
+	std::string help;
 };
 
 
@@ -83,8 +89,100 @@ char atcommand_symbol = '@'; // first char of the commands
 char charcommand_symbol = '#';
 
 static DBMap* atcommand_db = NULL; //name -> AtCommandInfo
-static DBMap* atcommand_alias_db = NULL; //alias -> AtCommandInfo
-static config_t atcommand_config;
+
+static AtCommandInfo* get_atcommandinfo_byname( const char* name );
+
+class AtcommandAliasDatabase : public TypesafeYamlDatabase<std::string, s_atcommand_alias_info>{
+private:
+	std::unordered_map<std::string, std::string> aliases;
+
+public:
+	AtcommandAliasDatabase() : TypesafeYamlDatabase( "ATCOMMAND_DB", 1 ){
+
+	}
+
+	void clear();
+	const std::string getDefaultLocation();
+	uint64 parseBodyNode( const YAML::Node& node );
+	const char* checkAlias( const char* alias );
+};
+
+void AtcommandAliasDatabase::clear(){
+	TypesafeYamlDatabase::clear();
+	this->aliases.clear();
+}
+
+const std::string AtcommandAliasDatabase::getDefaultLocation(){
+	return std::string(conf_path) + "/atcommands.yml";
+}
+
+uint64 AtcommandAliasDatabase::parseBodyNode( const YAML::Node& node ){
+	std::string command;
+
+	if( !this->asString( node, "Command", command ) ){
+		return 0;
+	}
+
+	AtCommandInfo* commandinfo = get_atcommandinfo_byname( command.c_str() );
+
+	if( commandinfo == nullptr ){
+		this->invalidWarning( node["Command"], "Command %s does not exist.\n", command.c_str() );
+		return 0;
+	}
+
+	std::shared_ptr<s_atcommand_alias_info> info = this->find( command );
+	bool exists = info != nullptr;
+
+	if( !exists ){
+		info = std::make_shared<s_atcommand_alias_info>();
+		info->command = commandinfo;
+	}
+
+	if( this->nodeExists( node, "Help" )  ){
+		std::string help;
+
+		if( !this->asString( node, "Help", help ) ){
+			return 0;
+		}
+
+		info->help = help;
+	}
+
+	if( this->nodeExists( node, "Aliases" ) ){
+		const YAML::Node& aliasesNode = node["Aliases"];
+
+		if( !aliasesNode.IsSequence() ){
+			this->invalidWarning( aliasesNode, "Aliases should be a sequence.\n" );
+			return 0;
+		}
+
+		for( const auto& subNode : aliasesNode ){
+			std::string alias = subNode.as<std::string>();
+
+			info->aliases.insert( alias );
+			this->aliases[alias] = command;
+		}
+	}
+
+	if( !exists ){
+		this->put( command, info );
+	}
+
+	return 1;
+}
+
+const char* AtcommandAliasDatabase::checkAlias( const char* alias ){
+	std::string alias_str( alias );
+	std::string* command = util::umap_find( this->aliases, alias_str );
+
+	if( command == nullptr ){
+		return alias;
+	}else{
+		return command->c_str();
+	}
+}
+
+AtcommandAliasDatabase atcommand_alias_db;
 
 static char atcmd_output[CHAT_SIZE_MAX];
 static char atcmd_player_name[NAME_LENGTH];
@@ -93,7 +191,6 @@ const char *parent_cmd;
 struct atcmd_binding_data** atcmd_binding;
 
 static AtCommandInfo* get_atcommandinfo_byname(const char *name); // @help
-static const char* atcommand_checkalias(const char *aliasname); // @help
 static void atcommand_get_suggestions(struct map_session_data* sd, const char *name, bool atcommand); // @help
 static void warp_get_suggestions(struct map_session_data* sd, const char *name); // @rura, @warp, @mapmove
 
@@ -115,34 +212,25 @@ struct atcmd_binding_data* get_atcommandbind_byname(const char* name) {
  * @param name the name of the command to retrieve help information for
  * @return the string associated with the command, or NULL
  */
-static const char* atcommand_help_string(const char* command)
-{
-	const char* str = NULL;
-	config_setting_t* info;
-
-	if( *command == atcommand_symbol || *command == charcommand_symbol )
-	{// remove the prefix symbol for the raw name of the command
-		command ++;
+static const char* atcommand_help_string( const char* command ){
+	// remove the prefix symbol for the raw name of the command
+	if( *command == atcommand_symbol || *command == charcommand_symbol ){
+		command++;
 	}
 
 	// convert alias to the real command name
-	command = atcommand_checkalias(command);
+	command = atcommand_alias_db.checkAlias( command );
 
 	// attempt to find the first default help command
-	info = config_lookup(&atcommand_config, "help");
-
-	if( info == NULL )
-	{// failed to find the help property in the configuration file
-		return NULL;
-	}
+	std::shared_ptr<s_atcommand_alias_info> info = atcommand_alias_db.find( command );
 
-	if( !config_setting_lookup_string( info, command, &str ) )
-	{// failed to find the matching help string
-		return NULL;
+	// failed to find the help property in the configuration file
+	if( info == nullptr ){
+		return nullptr;
 	}
 
 	// push the result from the method
-	return str;
+	return info->help.c_str();
 }
 
 
@@ -1265,7 +1353,7 @@ ACMD_FUNC(item)
 	nullpo_retr(-1, sd);
 	memset(item_name, '\0', sizeof(item_name));
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (!strcmpi(parent_cmd,"itembound")) {
 		if (!message || !*message || (
@@ -1342,7 +1430,7 @@ ACMD_FUNC(item2)
 
 	memset(item_name, '\0', sizeof(item_name));
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (!strcmpi(parent_cmd+1,"itembound2")) {
 		if (!message || !*message || (
@@ -1570,27 +1658,17 @@ ACMD_FUNC(joblevelup)
 /*==========================================
  * @help
  *------------------------------------------*/
-ACMD_FUNC(help)
-{
-	config_setting_t *help;
-	const char *text = NULL;
-	const char *command_name = NULL;
-	const char *default_command = "help";
+ACMD_FUNC(help){
+	const char *command_name = nullptr;
 
 	nullpo_retr(-1, sd);
 
-	help = config_lookup(&atcommand_config, "help");
-	if (help == NULL) {
-		clif_displaymessage(fd, msg_txt(sd,27)); // "Commands help is not available."
-		return -1;
-	}
-
 	if (!message || !*message) {
-		command_name = default_command; // If no command_name specified, display help for @help.
+		command_name = "help"; // If no command_name specified, display help for @help.
 	} else {
 		if (*message == atcommand_symbol || *message == charcommand_symbol)
 			++message;
-		command_name = atcommand_checkalias(message);
+		command_name = atcommand_alias_db.checkAlias(message);
 	}
 
 	if (!pc_can_use_command(sd, command_name, COMMAND_ATCOMMAND)) {
@@ -1600,7 +1678,12 @@ ACMD_FUNC(help)
 		return -1;
 	}
 
-	if (!config_setting_lookup_string(help, command_name, &text)) {
+	// attempt to find the first default help command
+	std::shared_ptr<s_atcommand_alias_info> info = atcommand_alias_db.find( command_name );
+
+	const char* text = info != nullptr ? info->help.c_str() : nullptr;
+
+	if( text == nullptr ){
 		sprintf(atcmd_output, msg_txt(sd,988), atcommand_symbol, command_name); // There is no help for %c%s.
 		clif_displaymessage(fd, atcmd_output);
 		atcommand_get_suggestions(sd, command_name, true);
@@ -1611,23 +1694,17 @@ ACMD_FUNC(help)
 	clif_displaymessage(fd, atcmd_output);
 
 	{   // Display aliases
-		DBIterator* iter;
-		AtCommandInfo *command_info;
-		AliasInfo *alias_info = NULL;
 		StringBuf buf;
 		bool has_aliases = false;
 
 		StringBuf_Init(&buf);
 		StringBuf_AppendStr(&buf, msg_txt(sd,990)); // Available aliases:
-		command_info = get_atcommandinfo_byname(command_name);
-		iter = db_iterator(atcommand_alias_db);
-		for (alias_info = (AliasInfo *)dbi_first(iter); dbi_exists(iter); alias_info = (AliasInfo *)dbi_next(iter)) {
-			if (alias_info->command == command_info) {
-				StringBuf_Printf(&buf, " %s", alias_info->alias);
-				has_aliases = true;
-			}
+
+		for( const std::string& alias : info->aliases ){
+			StringBuf_Printf( &buf, " %s", alias.c_str() );
+			has_aliases = true;
 		}
-		dbi_destroy(iter);
+
 		if (has_aliases)
 			clif_displaymessage(fd, StringBuf_Value(&buf));
 		StringBuf_Destroy(&buf);
@@ -2126,7 +2203,7 @@ ACMD_FUNC(monster)
 	if (battle_config.atc_spawn_quantity_limit && number > battle_config.atc_spawn_quantity_limit)
 		number = battle_config.atc_spawn_quantity_limit;
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (strcmp(parent_cmd, "monstersmall") == 0)
 		size = SZ_MEDIUM; // This is just gorgeous [mkbu95]
@@ -2201,7 +2278,7 @@ ACMD_FUNC(killmonster)
 			map_id = sd->bl.m;
 	}
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	drop_flag = strcmp(parent_cmd, "killmonster2");
 
@@ -2977,7 +3054,7 @@ ACMD_FUNC(char_ban)
 	memset(atcmd_output, '\0', sizeof(atcmd_output));
 	memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (strcmpi(parent_cmd,"charban") == 0)
 		bantype = CHRIF_OP_BAN;
@@ -3058,7 +3135,7 @@ ACMD_FUNC(char_unban){
 	memset(atcmd_output, '\0', sizeof(atcmd_output));
 	memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (strcmpi(parent_cmd,"charunban") == 0)
 		unbantype = CHRIF_OP_UNBAN;
@@ -3846,13 +3923,6 @@ ACMD_FUNC(reload) {
 
 		config_destroy(&run_test);
 
-		if (conf_read_file(&run_test, ATCOMMAND_CONF_FILENAME)) {
-			clif_displaymessage(fd, msg_txt(sd,1037)); // Error reading atcommand_athena.conf, reload failed.
-			return -1;
-		}
-
-		config_destroy(&run_test);
-
 		atcommand_doload();
 		pc_groups_reload();
 		clif_displaymessage(fd, msg_txt(sd,254)); // GM command configuration has been reloaded.
@@ -8463,7 +8533,7 @@ ACMD_FUNC(cash)
 		return -1;
 	}
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if( !strcmpi(parent_cmd,"cash") )
 	{
@@ -8534,7 +8604,7 @@ ACMD_FUNC(clone)
 		return 0;
 	}
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if (strcmpi(parent_cmd, "clone") == 0)
 		flag = 1;
@@ -8718,7 +8788,7 @@ ACMD_FUNC(itemlist)
 
 	nullpo_retr(-1, sd);
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	if( strcmp(parent_cmd, "storagelist") == 0 ) {
 		location = "storage";
@@ -9291,7 +9361,7 @@ ACMD_FUNC(addperm) {
 	bool add;
 	int i;
 
-	parent_cmd = atcommand_checkalias(command+1);
+	parent_cmd = atcommand_alias_db.checkAlias(command+1);
 
 	add = (strcmpi(parent_cmd, "addperm") == 0);
 
@@ -10390,20 +10460,10 @@ static AtCommandInfo* get_atcommandinfo_byname(const char *name)
 	return NULL;
 }
 
-static const char* atcommand_checkalias(const char *aliasname)
-{
-	AliasInfo *alias_info = NULL;
-	if ((alias_info = (AliasInfo*)strdb_get(atcommand_alias_db, aliasname)) != NULL)
-		return alias_info->command->command;
-	return aliasname;
-}
-
 /// AtCommand suggestion
 static void atcommand_get_suggestions(struct map_session_data* sd, const char *name, bool atcommand) {
 	DBIterator* atcommand_iter;
-	DBIterator* alias_iter;
 	AtCommandInfo* command_info = NULL;
-	AliasInfo* alias_info = NULL;
 	AtCommandType type = atcommand ? COMMAND_ATCOMMAND : COMMAND_CHARCOMMAND;
 	char* full_match[MAX_SUGGESTIONS];
 	char* suggestions[MAX_SUGGESTIONS];
@@ -10415,7 +10475,6 @@ static void atcommand_get_suggestions(struct map_session_data* sd, const char *n
 		return;
 
 	atcommand_iter = db_iterator(atcommand_db);
-	alias_iter = db_iterator(atcommand_alias_db);
 
 	// Build the matches
 	for (command_info = (AtCommandInfo*)dbi_first(atcommand_iter); dbi_exists(atcommand_iter); command_info = (AtCommandInfo*)dbi_next(atcommand_iter))     {
@@ -10431,16 +10490,25 @@ static void atcommand_get_suggestions(struct map_session_data* sd, const char *n
 		}
 	}
 
-	for (alias_info = (AliasInfo *)dbi_first(alias_iter); dbi_exists(alias_iter); alias_info = (AliasInfo *)dbi_next(alias_iter)) {
-		match = strstr(alias_info->alias, name);
-		can_use = pc_can_use_command(sd, alias_info->command->command, type);
-		if ( prefix_count < MAX_SUGGESTIONS && match == alias_info->alias && can_use) {
-			suggestions[prefix_count] = alias_info->alias;
-			++prefix_count;
-		}
-		if ( full_count < MAX_SUGGESTIONS && match != NULL && match != alias_info->alias && can_use ) {
-			full_match[full_count] = alias_info->alias;
-			++full_count;
+	for( auto& pair : atcommand_alias_db ){
+		std::shared_ptr<s_atcommand_alias_info> info = pair.second;
+
+		if( pc_can_use_command( sd, info->command->command, type ) ){
+			for( const std::string& alias_str : info->aliases ){
+				char* alias = const_cast<char *>(alias_str.c_str());
+
+				match = strstr( alias, name );
+
+				if( prefix_count < MAX_SUGGESTIONS && match == alias ){
+					suggestions[prefix_count] = alias;
+					++prefix_count;
+				}
+
+				if( full_count < MAX_SUGGESTIONS && match != NULL && match != alias ){
+					full_match[full_count] = alias;
+					++full_count;
+				}
+			}
 		}
 	}
 
@@ -10467,7 +10535,6 @@ static void atcommand_get_suggestions(struct map_session_data* sd, const char *n
 	}
 
 	dbi_destroy(atcommand_iter);
-	dbi_destroy(alias_iter);
 }
 
 /**
@@ -10543,7 +10610,7 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 				if (n < 1)
 					return false; // No command found. Display as normal message.
 
-				info = get_atcommandinfo_byname(atcommand_checkalias(command + 1));
+				info = get_atcommandinfo_byname(atcommand_alias_db.checkAlias(command + 1));
 				if (!info || info->char_groups[sd->group_pos] == 0)  // If we can't use or doesn't exist: don't even display the command failed message
 					return false;
 			}
@@ -10599,7 +10666,7 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 	}
 
 	//Grab the command information and check for the proper GM level required to use it or if the command exists
-	info = get_atcommandinfo_byname(atcommand_checkalias(command + 1));
+	info = get_atcommandinfo_byname(atcommand_alias_db.checkAlias(command + 1));
 	if (info == NULL) {
 		if (pc_get_group_level(sd) == 0) // TODO: remove or replace with proper permission
 			return false;
@@ -10647,98 +10714,6 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 	return true;
 }
 
-/*==========================================
- *
- *------------------------------------------*/
-static void atcommand_config_read(const char* config_filename)
-{
-	config_setting_t *aliases = NULL, *help = NULL;
-	const char *symbol = NULL;
-	int num_aliases = 0;
-
-	if (conf_read_file(&atcommand_config, config_filename))
-		return;
-
-	// Command symbols
-	if (config_lookup_string(&atcommand_config, "atcommand_symbol", &symbol)) {
-		if (ISPRINT(*symbol) && // no control characters
-			*symbol != '/' && // symbol of client commands
-			*symbol != '%' && // symbol of party chat
-			*symbol != '$' && // symbol of guild chat
-			*symbol != charcommand_symbol)
-			atcommand_symbol = *symbol;
-	}
-
-	if (config_lookup_string(&atcommand_config, "charcommand_symbol", &symbol)) {
-		if (ISPRINT(*symbol) && // no control characters
-			*symbol != '/' && // symbol of client commands
-			*symbol != '%' && // symbol of party chat
-			*symbol != '$' && // symbol of guild chat
-			*symbol != atcommand_symbol)
-			charcommand_symbol = *symbol;
-	}
-
-	// Command aliases
-	aliases = config_lookup(&atcommand_config, "aliases");
-	if (aliases != NULL) {
-		int i = 0;
-		int count = config_setting_length(aliases);
-
-		for (i = 0; i < count; ++i) {
-			config_setting_t *command;
-			const char *commandname = NULL;
-			int j = 0, alias_count = 0;
-			AtCommandInfo *commandinfo = NULL;
-
-			command = config_setting_get_elem(aliases, i);
-			if (config_setting_type(command) != CONFIG_TYPE_ARRAY)
-				continue;
-			commandname = config_setting_name(command);
-			if (!atcommand_exists(commandname)) {
-				ShowConfigWarning(command, "atcommand_config_read: can not set alias for non-existent command %s", commandname);
-				continue;
-			}
-			commandinfo = get_atcommandinfo_byname(commandname);
-			alias_count = config_setting_length(command);
-			for (j = 0; j < alias_count; ++j) {
-				const char *alias = config_setting_get_string_elem(command, j);
-				if (alias != NULL) {
-					AliasInfo *alias_info;
-					if (strdb_exists(atcommand_alias_db, alias)) {
-						ShowConfigWarning(command, "atcommand_config_read: alias %s already exists", alias);
-						continue;
-					}
-					CREATE(alias_info, AliasInfo, 1);
-					alias_info->command = commandinfo;
-					safestrncpy(alias_info->alias, alias, sizeof(alias_info->alias));
-					strdb_put(atcommand_alias_db, alias, alias_info);
-					++num_aliases;
-				}
-			}
-		}
-	}
-
-	// Commands help
-	// We only check if all commands exist
-	help = config_lookup(&atcommand_config, "help");
-	if (help != NULL) {
-		int count = config_setting_length(help);
-		int i;
-
-		for (i = 0; i < count; ++i) {
-			config_setting_t *command;
-			const char *commandname;
-
-			command = config_setting_get_elem(help, i);
-			commandname = config_setting_name(command);
-			if (!atcommand_exists(commandname))
-				ShowConfigWarning(command, "atcommand_config_read: command %s does not exist", commandname);
-		}
-	}
-
-	ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' command aliases in '" CL_WHITE "%s" CL_RESET "'.\n", num_aliases, config_filename);
-	return;
-}
 void atcommand_db_load_groups(int* group_ids) {
 	DBIterator *iter = db_iterator(atcommand_db);
 	AtCommandInfo* cmd;
@@ -10778,18 +10753,15 @@ void atcommand_db_clear(void) {
 
 		db_destroy(atcommand_db);
 	}
-	if (atcommand_alias_db != NULL)
-		db_destroy(atcommand_alias_db);
 
-	config_destroy(&atcommand_config);
+	atcommand_alias_db.clear();
 }
 
 void atcommand_doload(void) {
 	atcommand_db_clear();
 	atcommand_db = stridb_alloc((DBOptions)(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA), ATCOMMAND_LENGTH);
-	atcommand_alias_db = stridb_alloc((DBOptions)(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA), ATCOMMAND_LENGTH);
 	atcommand_basecommands(); //fills initial atcommand_db with known commands
-	atcommand_config_read(ATCOMMAND_CONF_FILENAME);
+	atcommand_alias_db.load();
 }
 
 void do_init_atcommand(void) {

+ 20 - 2
src/map/battle.cpp

@@ -17,6 +17,7 @@
 #include "../common/timer.hpp"
 #include "../common/utils.hpp"
 
+#include "atcommand.hpp"
 #include "battleground.hpp"
 #include "chrif.hpp"
 #include "clif.hpp"
@@ -8763,8 +8764,25 @@ int battle_config_read(const char* cfgName)
 				continue;
 			if (strcmpi(w1, "import") == 0)
 				battle_config_read(w2);
-			else if
-				(battle_set_value(w1, w2) == 0)
+			else if( strcmpi( w1, "atcommand_symbol" ) == 0 ){
+				const char* symbol = &w2[0];
+
+				if (ISPRINT(*symbol) && // no control characters
+					*symbol != '/' && // symbol of client commands
+					*symbol != '%' && // symbol of party chat
+					*symbol != '$' && // symbol of guild chat
+					*symbol != charcommand_symbol)
+					atcommand_symbol = *symbol;
+			}else if( strcmpi( w1, "charcommand_symbol" ) == 0 ){
+				const char* symbol = &w2[0];
+
+				if (ISPRINT(*symbol) && // no control characters
+					*symbol != '/' && // symbol of client commands
+					*symbol != '%' && // symbol of party chat
+					*symbol != '$' && // symbol of guild chat
+					*symbol != atcommand_symbol)
+					charcommand_symbol = *symbol;
+			}else if( battle_set_value(w1, w2) == 0 )
 				ShowWarning("Unknown setting '%s' in file %s\n", w1, cfgName);
 		}
 

+ 1 - 0
src/map/map-server.vcxproj

@@ -271,6 +271,7 @@
     <Copy SourceFiles="$(SolutionDir)tools\serv.bat" DestinationFolder="$(SolutionDir)" ContinueOnError="true" Condition="!Exists('$(SolutionDir)serv.bat')" />
     <Copy SourceFiles="$(SolutionDir)tools\mapserv.bat" DestinationFolder="$(SolutionDir)" ContinueOnError="true" Condition="!Exists('$(SolutionDir)mapserv.bat')" />
     <Copy SourceFiles="$(SolutionDir)tools\runserver.bat" DestinationFolder="$(SolutionDir)" ContinueOnError="true" Condition="!Exists('$(SolutionDir)runserver.bat')" />
+    <Copy SourceFiles="$(SolutionDir)conf\import-tmpl\atcommands.yml" DestinationFolder="$(SolutionDir)conf\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)conf\import\atcommands.yml')" />
     <Copy SourceFiles="$(SolutionDir)conf\import-tmpl\battle_conf.txt" DestinationFolder="$(SolutionDir)conf\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)conf\import\battle_conf.txt')" />
     <Copy SourceFiles="$(SolutionDir)conf\import-tmpl\char_conf.txt" DestinationFolder="$(SolutionDir)conf\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)conf\import\char_conf.txt')" />
     <Copy SourceFiles="$(SolutionDir)conf\import-tmpl\inter_conf.txt" DestinationFolder="$(SolutionDir)conf\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)conf\import\inter_conf.txt')" />

+ 0 - 7
src/map/map.cpp

@@ -160,8 +160,6 @@ struct map_cache_map_info {
 };
 
 char motd_txt[256] = "conf/motd.txt";
-char help_txt[256] = "conf/help.txt";
-char help2_txt[256] = "conf/help2.txt";
 char charhelp_txt[256] = "conf/charhelp.txt";
 char channel_conf[256] = "conf/channels.conf";
 
@@ -4076,10 +4074,6 @@ int map_config_read(const char *cfgName)
 			save_settings = cap_value(atoi(w2),CHARSAVE_NONE,CHARSAVE_ALL);
 		else if (strcmpi(w1, "motd_txt") == 0)
 			safestrncpy(motd_txt, w2, sizeof(motd_txt));
-		else if (strcmpi(w1, "help_txt") == 0)
-			safestrncpy(help_txt, w2, sizeof(help_txt));
-		else if (strcmpi(w1, "help2_txt") == 0)
-			safestrncpy(help2_txt, w2, sizeof(help2_txt));
 		else if (strcmpi(w1, "charhelp_txt") == 0)
 			safestrncpy(charhelp_txt, w2, sizeof(charhelp_txt));
 		else if (strcmpi(w1, "channel_conf") == 0)
@@ -5143,7 +5137,6 @@ int do_init(int argc, char *argv[])
 	LOG_CONF_NAME="conf/log_athena.conf";
 	MAP_CONF_NAME = "conf/map_athena.conf";
 	BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
-	ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
 	SCRIPT_CONF_NAME = "conf/script_athena.conf";
 	GRF_PATH_FILENAME = "conf/grf-files.txt";
 	safestrncpy(console_log_filepath, "./log/map-msg_log.log", sizeof(console_log_filepath));

+ 0 - 2
src/map/map.hpp

@@ -960,8 +960,6 @@ inline bool map_flag_gvg2_no_te(int16 m) {
 }
 
 extern char motd_txt[];
-extern char help_txt[];
-extern char help2_txt[];
 extern char charhelp_txt[];
 extern char channel_conf[];