Bläddra i källkod

Removed charcommand code while allowing atcommand code to support its functionality.
Charcommands still retain their '#' symbol but now looks for a character name as the first parameter instead of last.
Atcommand configs now support charcommand level configurations by comma seperation (e.g. 60,99)
As a result of this, all atcommands that don't affect multiple users already (@kickall, @doom, @mapexit) are capable of remote usage.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13403 54d463be-8e91-2dee-dedb-b68131a5f0ec

sketchyphoenix 16 år sedan
förälder
incheckning
76ff905e03

+ 5 - 0
Changelog-Trunk.txt

@@ -3,6 +3,11 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2008/12/17
+	* Removed charcommand code and allowed atcommand code to support its functionality. [SketchyPhoenix]
+	- Charcommands still retain their '#' symbol but now looks for a character name as the first parameter instead of last.
+	- Atcommand configs now support charcommand level configurations by comma seperation (e.g. 60,99).
+	- As a result of this, all atcommands that don't affect multiple users already (@kickall, @doom, @mapexit) are capable of remote usage.
 2008/12/01
 	* Fixed rare crash when using Flying Kick on clones (bugreport:2506) [ultramage]
 	* Corrected Flying Kick's debuff rules to match official servers

+ 288 - 287
conf/atcommand_athena.conf

@@ -9,8 +9,9 @@
 // The symbol must also be different from from the GM charcommand symbol.
 command_symbol: @
 
-// The following settings in this file use the format "<command name>: level".
+// The following settings in this file use the format "<command name>: level(@),level(#)".
 // They define the minimum GM level required to execute the associated command.
+// @ = self use, # = useable on other players
 // Adjust values as you like. Note that to activate commands for normal players,
 // (GM level 0), you also need to change the 'atcommand_gm_only' option to 'no'.
 // To completely disable a command, set its required GM level to 100.
@@ -46,728 +47,728 @@ command_symbol: @
 // 1: Super player commands
 
 // Displays a list of @ commands available to the player.
-commands: 1
+commands: 1,1
 
 // Displays the server rates.
-rates: 1
+rates: 1,1
 
 // Show server uptime
-uptime: 1
+uptime: 1,1
 
 // Shows/Hides the "there is a delay after a skill" message.
-showdelay: 1
+showdelay: 1,1
 
 // Displays current levels and % progress.
-exp: 1
+exp: 1,1
 
 // To change your (own) email (characters protection)
 // note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
 //       if you want be sure of each e-mail disable this option (value: 100)
-email: 1
+email: 1,1
 
 // Show Monster info (rates, stats, drops, MVP stuff)
-mobinfo: 1
-monsterinfo: 1
-mi: 1
+mobinfo: 1,1
+monsterinfo: 1,1
+mi: 1,1
 
 // Show Item info (type, price, etc)
-iteminfo: 1
-ii: 1
+iteminfo: 1,1
+ii: 1,1
 
 // Show who drops an item (mobs with highest drop rate)
-whodrops: 1
+whodrops: 1,1
 
 // Syncs the player's position on the client with the one stored on the server.
-refresh: 1
+refresh: 1,1
 
 // Give server time. (6 same commands)
-time: 1
-date: 1
-serverdate: 1
-servertime: 1
+time: 1,1
+date: 1,1
+serverdate: 1,1
+servertime: 1,1
 
 // Displays SVN version of the server.
-version: 1
+version: 1,1
 
 // Suicide your character.
-die: 1
+die: 1,1
 
 // Enables you to rename your pet.
-petrename: 1
+petrename: 1,1
 
 // Organize a new party, with you as the party leader.
-party: 1
+party: 1,1
 
 // Brings up your personal storage wherever you are.
-storage: 1
+storage: 1,1
 
 // Opens your mailbox.
-mail: 1
+mail: 1,1
 
 // Opens auctions window.
-auction: 1
+auction: 1,1
 
 // Locate someone on a map, returns your coordinates if the person isn't on.
-where: 1
+where: 1,1
 
 // Duel organizing commands
-duel: 1
-invite: 1
-accept: 1
-reject: 1
-leave: 1
+duel: 1,1
+invite: 1,1
+accept: 1,1
+reject: 1,1
+leave: 1,1
 
 // Away messsage
-away: 1
-aw: 1
+away: 1,1
+aw: 1,1
 
 // Main chat
-main: 1
+main: 1,1
 
 // Autorejecting Deals/Invites
-noask: 1
+noask: 1,1
 
 // Displays remaining jail time
-jailtime: 1
+jailtime: 1,1
 
 // Homunculus commands for players
-hominfo: 1
-homstats: 1
+hominfo: 1,1
+homstats: 1,1
 
 // Kill Steal Protection
-noks: 1
+noks: 1,1
 
 //---------------------------
 // 10: Super player+ commands
 
 // Displays/Hides Experience gained
-showexp: 10
+showexp: 10,10
 
 // Displays/Hides Zeny gained
-showzeny: 10
+showzeny: 10,10
 
 // Warps you to predefined locations in major cities.
-go: 10
+go: 10,10
 
 // Enables/disables autolooting from killed mobs.
-autoloot: 10
+autoloot: 10,10
 
 // Enables/disables autolooting an item.
-alootid: 10
+alootid: 10,10
 
 // Allows you continue vending offline.
-autotrade: 10
-at: 10
+autotrade: 10,10
+at: 10,10
 
 // Change Guild Master of your Guild
-changegm: 10
+changegm: 10,10
 
 // Change the leader of your party.
-changeleader: 10
+changeleader: 10,10
 
 // Change the party exp- and item share rules.
-partyoption: 10
+partyoption: 10,10
 
 // Command what the player's pet will say.
-pettalk: 10
+pettalk: 10,10
 
 // Command what the player's homunculus will say.
-homtalk: 10
+homtalk: 10,10
 
 // Locates and displays the position of a certain mob on the current map.
-mobsearch: 10
+mobsearch: 10,10
 // Locates and displays the position of a certain mob on your mini-map
-showmobs: 10
+showmobs: 10,10
 // Prints out in which maps a monster normally spawns at (does not count script-invoked mobs)
-whereis: 10
+whereis: 10,10
 
 // Resets a Star Gladiator's marked maps
-feelreset: 10
+feelreset: 10,10
 
 //----------------------
 // 20: Mediator commands
 
 // Displays helpfile in eAthena base directory (2 same commands).
-help: 20
-h: 20
-help2: 20
-h2: 20
+help: 20,20
+h: 20,20
+help2: 20,20
+h2: 20,20
 
 // Warp yourself to a person (3 same commands + /shift).
-jumpto: 20
-goto: 20
-warpto: 20
+jumpto: 20,20
+goto: 20,20
+warpto: 20,20
 
 // Displays the motd file to all players
-gmotd: 20
+gmotd: 20,20
 
 // Follow a player (including warping to them)
-follow: 20
+follow: 20,20
 
 // Sends a request to all connected GMs (via the gm whisper system)
-request: 20
+request: 20,20
 
 // Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
-kick: 20
+kick: 20,20
 
 // Changes your appearance.
-model: 20
+model: 20,20
 
 // To get a peco to (un)ride (2 same commands).
-mountpeco: 20
-mount: 20
+mountpeco: 20,20
+mount: 20,20
 
 // Returns list of logged in characters with their position (2 same commands).
-who: 20
-whois: 20
+who: 20,20
+whois: 20,20
 
 // Returns list of logged in characters with their job.
-who2: 20
+who2: 20,20
 
 // Returns list of logged in characters with their party/guild.
-who3: 20
+who3: 20,20
 
 // Returns list of logged in characters with their position in a specifical map.
-whomap: 20
+whomap: 20,20
 
 // Returns list of logged in characters with their job in a specifical map.
-whomap2: 20
+whomap2: 20,20
 
 // Returns list of logged in characters with their party/guild in a specifical map.
-whomap3: 20
+whomap3: 20,20
 
 // Displays GMs online. For those who are higher GM level than yourself,
 // only the name is shown, for the rest, it displays the same info of
 // @who+@who2+who3
-whogm: 20
+whogm: 20,20
 
 // Change your appearence to other players to a mob.
-disguise: 20
+disguise: 20,20
 
 // Restore your normal appearance.
-undisguise: 20
+undisguise: 20,20
 
 // Displays the text as a normal message with the format "*name message*" 
 // instead of "name : message" (Like the /me command in IRC)
-me: 20
+me: 20,20
 
 // Changes your name to your choice temporarily.
-fakename: 20
+fakename: 20,20
 
 // Changes your size.
-size: 20
+size: 20,20
 
 // Can command what other npcs (by name) can say.
-npctalk: 20
+npctalk: 20,20
 
 //--------------------
 // 40: Sub-GM commands
 
 // Broadcast to the whole server. Using (1 command + /nb, /b).
-broadcast: 40
+broadcast: 40,40
 
 // Broadcast to the map you are on (1 command + /lb, /nlb).
-localbroadcast: 40
+localbroadcast: 40,40
 
 // Broadcast (with or without name)
-kami: 40
+kami: 40,40
 // Same as kami but with blue color
-kamib: 40
+kamib: 40,40
 // Same as kami but you can choose the color (uses different packet)
-kamic: 40
+kamic: 40,40
 
 // Enables GvG on a map (2 same commands).
-gvgon: 40
-gpvpon: 40
+gvgon: 40,40
+gpvpon: 40,40
 
 // Turns GvG (Guild vs. Guild) off on a map (2 same commands).
-gvgoff: 40
-gpvpoff: 40
+gvgoff: 40,40
+gpvpoff: 40,40
 
 // Activate/Deactivate kill steal protection on a map
-allowks: 40
+allowks: 40,40
 
 // Modifies your HP/SP.
-heal: 40
+heal: 40,40
 
 // GM Hide (total invisibility to characters and monsters) (1 command + /hide).
-hide: 40
+hide: 40,40
 
 // Changes your job to one you specify (2 same commands).
-job: 40
-jobchange: 40
+job: 40,40
+jobchange: 40,40
 
 // Enables you to to jump randomly on a map (that you are already on).
-jump: 40
+jump: 40,40
 
 // Warps you to your last save point (2 same commands).
-load: 40
-return: 40
+load: 40,40
+return: 40,40
 
 // Warps you to a specific npc
-tonpc: 40
+tonpc: 40,40
 
 // Saves a warp point.
-memo: 40
+memo: 40,40
 
 // Set your character display options. (Visual effects of your character)
-option: 40
+option: 40,40
 
 // Sets the level of intemecy of your pet.
-petfriendly: 40
+petfriendly: 40,40
 
 // Sets hunger level of your pet.
-pethungry: 40
+pethungry: 40,40
 
 // Turns PvP (Person vs. Person) off on a map.
-pvpoff: 40
+pvpoff: 40,40
 
 // Enables PvP on a map.
-pvpon: 40
+pvpon: 40,40
 
 // Permanently adds/removes a quest skill
-questskill: 40
-lostskill: 40
+questskill: 40,40
+lostskill: 40,40
 
 // Sets the speed you can walk/attack at. Default is 150.
-speed: 40
+speed: 40,40
 
 // Summons spirit spheres around you.
-spiritball: 40
+spiritball: 40,40
 
 // Warp yourself to a certain map, at (x,y) coordinates (2 same commands).
-mapmove: 40 // (also /mm or /mapmove)
-rura: 40
-warp: 40
+mapmove: 40,40 // (also /mm or /mapmove)
+rura: 40,40
+warp: 40,40
 
 // Changes GM clothes color (2 same commands)
-dye: 40
-ccolor: 40
+dye: 40,40
+ccolor: 40,40
 
 // Changes GM hair style (2 same commands)
-hairstyle: 40
-hstyle: 40
+hairstyle: 40,40
+hstyle: 40,40
 
 // Changes GM hair color (2 same commands)
-haircolor: 40
-hcolor: 40
+haircolor: 40,40
+hcolor: 40,40
 
 // Deletes all your items.
-itemreset: 40
+itemreset: 40,40
 
 // Does a skill/stat reset.
-reset: 40
+reset: 40,40
 
 // Displays distribution of players on the server per map (% on each map which has players)
-users: 40
+users: 40,40
 
 // Deletes floor items in your range of sight
-cleanmap: 40
+cleanmap: 40,40
 
 // Kill all monsters in map (without drops)
-killmonster2: 40
+killmonster2: 40,40
 
 // Sets your spawn point (aka save point).
-save: 40
+save: 40,40
 
 // Do some visual effect on your character
-effect: 40
+effect: 40,40
 
 // Do some visual effect on your character (misceffect)
-misceffect: 40
+misceffect: 40,40
 
 // GM's magnifier
-identify: 40
+identify: 40,40
 
 // Drop all your items
-dropall: 40
+dropall: 40,40
 
 // Store all your items
-storeall: 40
+storeall: 40,40
 
 // Allow other players to hit you out of PvP
-killable: 40
+killable: 40,40
 
 // Look up a skill by name
-skillid: 40
+skillid: 40,40
 
 // Use a skill by id
-useskill: 40
+useskill: 40,40
 
 // What skills are required to get this skill
-skilltree: 40
+skilltree: 40,40
 
 // Marriage commands
-marry: 40
-divorce: 40
+marry: 40,40
+divorce: 40,40
 
 // Adopt a novice into a family
-adopt: 40
+adopt: 40,40
 
 // Play a Sound!
-sound: 40
+sound: 40,40
 
 //---------------------
 // 50: Sub-GM+ commands
 
 // Creates a new guild, with you as the guildmaster.
-guild: 50
+guild: 50,50
 
 // Brings up your guild storage wherever you are.
-gstorage: 50
+gstorage: 50,50
 
 // Spawns a monster, and a certain amount (2 same commands + /monster).
-monster: 50
-spawn: 50
+monster: 50,50
+spawn: 50,50
 
 // Spawns a smaller sized version of a monster.
-monstersmall: 50
+monstersmall: 50,50
 
 // Spawns a larger sized version of a monster.
-monsterbig: 50
+monsterbig: 50,50
 
 // Spawns mobs that treat you as their master (they disappear after some time)
-summon: 50
+summon: 50,50
 
 // It will spawn a supportive clone of the given player.
-clone: 50
+clone: 50,50
 
 // It will spawn a supportive clone of the given player that follows the creator around.
-slaveclone: 50
+slaveclone: 50,50
 
 // It will spawn an aggresive clone of the given player.
-evilclone: 50
+evilclone: 50,50
 
 
 //----------------
 // 60: GM commands
 
 // Add or Remove Cash/Kafra points to yourself
-cash: 60
-points: 60
+cash: 60,60
+points: 60,60
 
 // Starts Guild Wars
-agitstart: 60
+agitstart: 60,60
 
 // Ends Guild Wars
-agitend: 60
+agitend: 60,60
 
 // Resurects yourself.
-alive: 60
+alive: 60,60
 
 // Levels your character to specified level (adds to your level) (7 same commands).
-blvl: 60
-lvup: 60
-blevel: 60
-baselvl: 60
-baselvup: 60
-baselevel: 60
-baselvlup: 60
+blvl: 60,60
+lvup: 60,60
+blevel: 60,60
+baselvl: 60,60
+baselvup: 60,60
+baselevel: 60,60
+baselvlup: 60,60
 
 // Raises your job level (6 same commands).
-jlvl: 60
-jlevel: 60
-joblvl: 60
-joblvup: 60
-joblevel: 60
-joblvlup: 60
+jlvl: 60,60
+jlevel: 60,60
+joblvl: 60,60
+joblvup: 60,60
+joblevel: 60,60
+joblvlup: 60,60
 
 // Changes the sex of yourself
-changesex: 60
+changesex: 60,60
 
 // Levels your guild to specified level (2 same commands).
-glvl: 60
-glevel: 60
-guildlvl: 60
-guildlvup: 60
-guildlevel: 60
-guildlvlup: 60
+glvl: 60,60
+glevel: 60,60
+guildlvl: 60,60
+guildlvup: 60,60
+guildlevel: 60,60
+guildlvlup: 60,60
 
 // Find an itemID based on item name
-idsearch: 60
+idsearch: 60,60
 
 // Creates an item of your choosing, either Item ID or Name (1 command + /item).
-item: 60
+item: 60,60
 
 // Creates a complet item (card, etc...) of your choosing, either Item ID or Name.
-item2: 60
+item2: 60,60
 
 // Kill another character without hitting them.
-kill: 60
+kill: 60,60
 
 // Kill all monsters in map (with drops)
-killmonster: 60
+killmonster: 60,60
 
 // Creates yourself a pet egg.
-makeegg: 60
+makeegg: 60,60
 
 // Hatches an egg
-hatch: 60
+hatch: 60,60
 
 // Instantly kills player whose name is entered and deals insane damage to everything around
-nuke: 60
+nuke: 60,60
 
 // Enable hitting a player even when not in PvP
-killer: 60
+killer: 60,60
 
 // Creates weapon of desired element.
-produce: 60
+produce: 60,60
 
 // Warps a character to you (1 command + /recall).
-recall: 60
+recall: 60,60
 
 // Refines all weapons in your items list.
-refine: 60
+refine: 60,60
 
 // Will repair all broken items in inventory.
-repairall: 60
+repairall: 60,60
 
 // Change Status of your character
-str: 60
-agi: 60
-vit: 60
-int: 60
-dex: 60
-luk: 60
+str: 60,60
+agi: 60,60
+vit: 60,60
+int: 60,60
+dex: 60,60
+luk: 60,60
 
 // Gets all skills (4 same commands)
-allskill: 60
-allskills: 60
-skillall: 60
-skillsall: 60
+allskill: 60,60
+allskills: 60,60
+skillall: 60,60
+skillsall: 60,60
 
 // Sets GM stats to maximum (4 same commands)
-statall: 60
-statsall: 60
-allstats: 60
-allstat: 60
+statall: 60,60
+statsall: 60,60
+allstats: 60,60
+allstat: 60,60
 
 // Gives you job points.
-stpoint: 60
+stpoint: 60,60
 
 // Gives you skill points of desired amount.
-skpoint: 60
+skpoint: 60,60
 
 // Warps all online character of a guild to you. (at least one member of that guild must be on.)
-guildrecall: 60
+guildrecall: 60,60
 
 // Warps all online character of a party to you. (at least one party member must be online.)
-partyrecall: 60
+partyrecall: 60,60
 
 // Allows you to spy on any Guilds Guild chat. (at least one member of that guild must be on.)
 // NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
-guildspy: 60
+guildspy: 60,60
 
 // Allows you to spy on any party's party chat. (at least one party member must be online.)
 // NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
-partyspy: 60
+partyspy: 60,60
 
 // Gives you money (zeny) of desired amount.
-zeny: 60
+zeny: 60,60
 
 // To block definitively a player (2 same commands)
-block: 60
-charblock: 60
+block: 60,60
+charblock: 60,60
 
 // To unblock a player (2 same commands)
-unblock: 60
-charunblock: 60
+unblock: 60,60
+charunblock: 60,60
 
 // To ban a player for a limited time (4 same commands)
-ban: 60
-banish: 60
-charban: 60
-charbanish: 60
+ban: 60,60
+banish: 60,60
+charban: 60,60
+charbanish: 60,60
 
 // To unban a player (4 same commands)
-unban: 60
-unbanish: 60
-charunban: 60
-charunbanish: 60
+unban: 60,60
+unbanish: 60,60
+charunban: 60,60
+charunbanish: 60,60
 
 // To send specified character in jails
-jail: 60
+jail: 60,60
 
 // To discharge a prisoner (2 same commands)
-unjail: 60
-discharge: 60
+unjail: 60,60
+discharge: 60,60
 
 // Timed jailing
-jailfor: 60
+jailfor: 60,60
 
 // Create a static warp portal that lasts until the next reboot
-addwarp: 60
+addwarp: 60,60
 
 // Open a trade window with any player
-trade: 60
+trade: 60,60
 
 // Changes the player's appearance (headgear)
-changelook: 60
+changelook: 60,60
 
 // Homunculus commands for GMs
-hlvl: 60
-hlevel: 60
-homlvl: 60
-homlvup: 60
-homlevel: 60
-homevolve: 60
-homevolution: 60
-makehomun: 60
-homfriendly: 60
-homhungry: 60
+hlvl: 60,60
+hlevel: 60,60
+homlvl: 60,60
+homlvup: 60,60
+homlevel: 60,60
+homevolve: 60,60
+homevolution: 60,60
+makehomun: 60,60
+homfriendly: 60,60
+homhungry: 60,60
 
 // Re-calculates stats, as if the homun was sent back to level 1 and re-leveled
-homshuffle: 60
+homshuffle: 60,60
 
 //----------------------
 // 80: GM Chief commands
 
 // Set the map you are on to day.
-day: 80
+day: 80,80
 
 // Kills everyone on the server.
-doom: 80
+doom: 80,80
 
 // Kills everyone on the map you are on.
-doommap: 80
+doommap: 80,80
 
 // Set the map you are currently on to night.
-night: 80
+night: 80,80
 
 // Recalls Everyone To Your Coordinates
-recallall: 80
+recallall: 80,80
 
 // Revives all players on the map.
-raisemap: 80
+raisemap: 80,80
 
 // Revives all players on the server.
-raise: 80
+raise: 80,80
 
 // Hides a NPC.
-hidenpc: 80
+hidenpc: 80,80
 
 // Unhides a NPC.
-shownpc: 80
+shownpc: 80,80
 
 // Loads a Script
-loadnpc: 80
+loadnpc: 80,80
 
 // Unloads a NPC
-unloadnpc: 80
+unloadnpc: 80,80
 
 // Move a NPC
-npcmove: 80
+npcmove: 80,80
 
 // turn skills on for a map
-skillon: 80
+skillon: 80,80
 
 // turn skills off for a map
-skilloff: 80
+skilloff: 80,80
 
 // Mute a player (prevents talking, usage of skills and commands)
-mute: 80
+mute: 80,80
 
 // Unmute a player
-unmute: 80
+unmute: 80,80
 
 //---------------------------
 // 99: Administrator commands
 
 // Disconnect all users from the server
-kickall: 99
+kickall: 99,99
 
 // Closes Map-Server
-mapexit: 99
+mapexit: 99,99
 
 // Used for testing packet sends from the client (debug function)
-send: 99
+send: 99,99
 
 // Give information about terrain/area (debug function)
-gat: 99
+gat: 99,99
 
 // Displays a status change without really applying it (debug function)
-displaystatus: 99
+displaystatus: 99,99
 
 // Displays the animation of a skill without really using it (debug function)
-displayskill: 99
+displayskill: 99,99
 
 // Shows information about the map
-mapinfo: 99
+mapinfo: 99,99
 
 // Set Map Flags (WIP)
-mapflag: 99
+mapflag: 99,99
 
 // Re-load item database (admin command)
-reloaditemdb: 99
+reloaditemdb: 99,99
 
 // Re-load monsters database (admin command)
-reloadmobdb: 99
+reloadmobdb: 99,99
 
 // Re-load skills database (admin command)
-reloadskilldb: 99
+reloadskilldb: 99,99
 
 // Re-load scripts (admin command)
-reloadscript: 99
+reloadscript: 99,99
 
 // Change a battle_config flag without rebooting server
-setbattleflag: 99
+setbattleflag: 99,99
 
 // Re-load gm command config (admin command)
-reloadatcommand: 99
+reloadatcommand: 99,99
 
 // Re-load battle config (admin command)
 // Note that some player config settings won't take effect until relog
 // (display exp, display zeny, display skill delay fail, ...)
-reloadbattleconf: 99
+reloadbattleconf: 99,99
 
 // Re-load status database (admin command)
-reloadstatusdb: 99
+reloadstatusdb: 99,99
 
 // Re-load player info database (admin command)
-reloadpcdb: 99
+reloadpcdb: 99,99
 
 // Re-load the Message of the Day (admin command)
-reloadmotd: 99
+reloadmotd: 99,99
 
 // Changes the GM level of another character
 // (lasts until reboot, or gm list reload)
-adjgmlvl: 99
+adjgmlvl: 99,99
 
 // Changes the required GM level of an @ command
 // (effect lasts until restart or command reload)
-adjcmdlvl: 99
+adjcmdlvl: 99,99
 
 // [Un]Disguise All Players (admin command)
-disguiseall: 99
-undisguiseall: 99
+disguiseall: 99,99
+undisguiseall: 99,99
 
 // Mutes every player on screen (admin command)
-mutearea: 99
-stfu: 99
+mutearea: 99,99
+stfu: 99,99
 
 // Makes you immune to attacks (monsters/players/skills cannot target/hit you, admin command)
-monsterignore: 99
-battleignore: 99
+monsterignore: 99,99
+battleignore: 99,99
 
 //---------------------------------------------------------------
 // 99: Weather effects
 
-snow: 99
+snow: 99,99
 
-clouds: 99
+clouds: 99,99
 
-clouds2: 99
+clouds2: 99,99
 
-fog: 99
+fog: 99,99
 
-fireworks: 99
+fireworks: 99,99
 
-sakura: 99
+sakura: 99,99
 
 leaves:99
 
 // Stop all weather effects
-clearweather: 99
+clearweather: 99,99
 
 //---------------------------------------------------------------
 // 100: Disabled commands

+ 0 - 275
conf/charcommand_athena.conf

@@ -1,275 +0,0 @@
-//--------------------------------------------------------------
-// eAthena charcommand configuration file.
-// Originally translated by Peter Kieser <pfak@telus.net>
-//--------------------------------------------------------------
-
-// The symbol that will be used to recognize commands.
-// You can set any one character except control-characters (0x00-0x1f),
-// '%', '$' (party/guild chat speaking) and '/' (standard client commands).
-// The symbol must also be different from from the GM atcommand symbol.
-command_symbol: #
-
-
-//--------------------------
-// 0: normal player commands
-// None for security purposes.
-
-//-------------------------
-// 1: Super player commands
-
-//---------------------------
-// 10: Super player+ commands
-
-//----------------------
-// 20: Mediator commands
-
-// Displays helpfile in eAthena base directory
-help: 20
-
-//--------------------
-// 40: Sub-GM commands
-
-
-// View the items in a character's cart
-cartlist: 40
-
-// Apply an effect onto another character
-effect: 40
-
-// View the exp of a character
-exp: 40
-
-// List a chacter's items
-itemlist: 40
-
-// View the jail time remaining
-jailtime: 40
-
-// Refresh a character
-refresh: 40
-
-// List a chacter's stats
-stats: 40
-
-// List a chacter's storage items
-storagelist: 40
-
-//---------------------
-// 50: Sub-GM+ commands
-
-// Change a character's clothing color
-dye: 50
-
-// Give another character a fake name
-fakename: 50
-
-// Open the hatch dialog for a character
-hatch: 50
-
-// Change a character's hair color
-hcolor: 50
-haircolor: 50
-
-// Change a character's hair style
-hstyle: 50
-hairstyle: 50
-
-// Changes character's model
-model: 50
-
-// Give or remove a peco from a character
-mount: 50
-mountpeco: 50
-
-// Make another character's pet friendly/not
-petfriendly: 50
-
-// Rename another character's pet
-petrename: 50
-
-// Change a character's size
-size: 50
-
-//----------------
-// 60: GM commands
-
-// Resurrects a dead character
-alive: 60
-revive: 60
-
-// Add or removes cash/kafra points to a character
-cash: 60
-points: 60
-
-// Give a player all the skills available to him/her
-allskill: 60
-allskills: 60
-skillall: 60
-skillsall: 60
-
-// Give a character the maximum possible stats
-allstat: 60
-allstats: 60
-statall: 60
-statsall: 60
-
-// Change another character's base level (3 same commands)
-blvl: 60
-blevel: 60
-baselvl: 60
-baselevel: 60
-
-// Changes the sex of an online player (all characters on the account)
-changesex: 60
-
-// Delete items from a character
-delitem: 60
-
-// Disguise a character
-disguise: 60
-undisguise: 60
-
-// Drop a players possessions on the ground
-dropall: 60
-
-// Put a players possessions in storage
-storeall: 60
-
-// Resets another character's designated maps
-feelreset: 60
-
-// Change the guild level for a character's guild
-glvl: 60
-glevel: 60
-guildlvl: 60
-guildlevel: 60
-
-// Open guild storage for a character
-gstorage: 60
-
-// Heal a character
-heal: 60
-
-// Invoke GM Hide on a character
-hide: 60
-
-// Increase a character's homunculus' level
-hlvl: 60
-hlevel: 60
-homlvl: 60
-homlevel: 60
-
-// Evolve a character's homunculus
-homevolve: 60
-homevolution: 60
-
-// Change a character's homunculus' friendly value
-homfriendly: 60
-
-// Change a character's homunculus' hunger value
-homhungry: 60
-
-// View a character's homunculus' stats
-hominfo: 40
-
-// Give another character an item
-item: 60
-
-// Create a specific item (with cards, refines, etc
-item2: 60
-
-// Remove all of a character's possessions
-itemreset: 60
-
-// Change another character's job (2 same commands)
-job: 60
-jobchange: 60
-
-// Change another character's job level (3 same commands)
-jlvl: 60
-jlevel: 60
-joblvl: 60
-joblevel: 60
-
-// Allow a character to attack anybody
-killer: 60
-
-// Make a character killable by anybody
-killable: 60
-
-// Return a character to their respawn point
-load: 60
-
-// Take away a character's platinum skill
-lostskill: 60
-
-// Make a character immune to monsters
-monsterignore: 60
-
-// Apply a certain option to another character
-option: 60
-
-// Change a character's pet's hungry value
-pethungry: 60
-
-// Produce forged equipment on a character (as if he/she was a blacksmith)
-produce: 60
-
-// Give another character a platinum skill
-questskill: 60
-
-// Performs a stat and skill reset on someone else.
-reset: 60
-
-// Save another character
-save: 60
-
-// Gives another character skill points
-skpoint: 60
-
-// Change a character's walking speed
-speed: 60
-
-// Give another character spiritball effect
-spiritball: 60
-
-// Open storage for a character
-storage: 60
-
-// Gives another character status points
-stpoint: 60
-
-// Change a character's stats
-str: 60
-agi: 60
-vit: 60
-int: 60
-dex: 60
-luk: 60
-
-// Resets another character's status, skills
-streset: 60
-skreset: 60
-
-// Warp a player somewhere else (3 same commands)
-warp: 60
-rura: 60
-rura+: 60
-
-//----------------------
-// 80: GM Chief commands
-
-// Refine a character's equipment
-refine: 80
-
-// Give another character zeny
-zeny: 80
-
-//---------------------------
-// 99: Administrator commands
-
-//---------------------------------------------------------------
-// 100: Disabled commands
-
-
-import: conf/import/charcommand_conf.txt

+ 0 - 0
conf/import-tmpl/charcommand_conf.txt


+ 3 - 16
doc/script_commands.txt

@@ -5770,23 +5770,10 @@ one.
 
 *charcommand <command>;
 
-NOTE: This command is changed a bit on newer trunk versions, 
-scroll down a bit for the new version!
-
-On older trunk versions and stable:
-
-command is the name of the current character (strcharinfo(0))
-followed by ':' and the command and it's parameters.
-
-Example(s):
-
-//Will be executed as if a lvl 99 GM done the #option command.
-	charCommand strcharinfo(0)+":#option 0 0 0 Roy";
-
-Newer Trunk version:
+This command will run the given command line exactly as if it was typed in from 
+the keyboard from a character that belonged to an account which had GM level 99.
 
-The big change is that the character name is no longer needed.
-This also enabled the commands to run without a player attached (according to Lance).
+The commands can also run without an attached rid.
 
 Example(s):
 

+ 2 - 2
src/map/Makefile.in

@@ -15,7 +15,7 @@ COMMON_SQL_H = ../common/sql.h
 
 MAP_OBJ = map.o chrif.o clif.o pc.o status.o npc.o \
 	npc_chat.o chat.o path.o itemdb.o mob.o script.o \
-	storage.o skill.o atcommand.o charcommand.o battle.o \
+	storage.o skill.o atcommand.o battle.o \
 	intif.o trade.o party.o vending.o guild.o pet.o \
 	log.o mail.o date.o unit.o homunculus.o mercenary.o quest.o
 MAP_TXT_OBJ = $(MAP_OBJ:%=obj_txt/%) \
@@ -24,7 +24,7 @@ MAP_SQL_OBJ = $(MAP_OBJ:%=obj_sql/%) \
 	obj_sql/mapreg_sql.o
 MAP_H = map.h chrif.h clif.h pc.h status.h npc.h \
 	chat.h itemdb.h mob.h script.h path.h \
-	storage.h skill.h atcommand.h charcommand.h battle.h \
+	storage.h skill.h atcommand.h battle.h \
 	intif.h trade.h party.h vending.h guild.h pet.h \
 	log.h mail.h date.h unit.h homunculus.h mercenary.h quest.h mapreg.h
 

+ 394 - 327
src/map/atcommand.c

@@ -46,6 +46,7 @@
 
 // extern variables
 char atcommand_symbol = '@'; // first char of the commands
+char charcommand_symbol = '#';
 char* msg_table[MAX_MSG]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
 
 // local declarations
@@ -55,6 +56,7 @@ typedef struct AtCommandInfo
 {
 	const char* command;
 	int level;
+	int level2;
 	AtCommandFunc func;
 } AtCommandInfo;
 
@@ -6578,15 +6580,15 @@ int atcommand_summon(const int fd, struct map_session_data* sd, const char* comm
  *------------------------------------------*/
 int atcommand_adjcmdlvl(const int fd, struct map_session_data* sd, const char* command, const char* message)
 {
-	int newlev;
+	int newlev, newremotelev;
 	char name[100];
 	AtCommandInfo* cmd;
 
 	nullpo_retr(-1, sd);
 
-	if (!message || !*message || sscanf(message, "%d %99s", &newlev, name) != 2)
+	if (!message || !*message || sscanf(message, "%d %d %99s", &newlev, &newremotelev, name) != 2)
 	{
-		clif_displaymessage(fd, "Usage: @adjcmdlvl <lvl> <command>.");
+		clif_displaymessage(fd, "Usage: @adjcmdlvl <lvl> <remote lvl> <command>.");
 		return -1;
 	}
 
@@ -6596,12 +6598,12 @@ int atcommand_adjcmdlvl(const int fd, struct map_session_data* sd, const char* c
 		clif_displaymessage(fd, "@command not found.");
 		return -1;
 	}
-	else if (newlev > pc_isGM(sd))
+	else if (newlev > pc_isGM(sd) || newremotelev > pc_isGM(sd) )
 	{
 		clif_displaymessage(fd, "You can't make a command require higher GM level than your own.");
 		return -1;
 	}
-	else if (cmd->level > pc_isGM(sd))
+	else if (cmd->level > pc_isGM(sd) || cmd->level2 > pc_isGM(sd) )
 	{
 		clif_displaymessage(fd, "You can't adjust the level of a command which's level is above your own.");
 		return -1;
@@ -6609,6 +6611,7 @@ int atcommand_adjcmdlvl(const int fd, struct map_session_data* sd, const char* c
 	else
 	{
 		cmd->level = newlev;
+		cmd->level2 = newremotelev;
 		clif_displaymessage(fd, "@command level changed.");
 		return 0;
 	}
@@ -8238,295 +8241,295 @@ int atcommand_allowks(const int fd, struct map_session_data *sd, const char *com
  *------------------------------------------*/
 
 AtCommandInfo atcommand_info[] = {
-	{ "rura",              40,     atcommand_mapmove },
-	{ "warp",              40,     atcommand_mapmove },
-	{ "mapmove",           40,     atcommand_mapmove }, // + /mm
-	{ "where",              1,     atcommand_where },
-	{ "jumpto",            20,     atcommand_jumpto }, // + /shift
-	{ "warpto",            20,     atcommand_jumpto },
-	{ "goto",              20,     atcommand_jumpto },
-	{ "jump",              40,     atcommand_jump },
-	{ "who",               20,     atcommand_who },
-	{ "whois",             20,     atcommand_who },
-	{ "who2",              20,     atcommand_who2 },
-	{ "who3",              20,     atcommand_who3 },
-	{ "whomap",            20,     atcommand_whomap },
-	{ "whomap2",           20,     atcommand_whomap2 },
-	{ "whomap3",           20,     atcommand_whomap3 },
-	{ "whogm",             20,     atcommand_whogm },
-	{ "save",              40,     atcommand_save },
-	{ "return",            40,     atcommand_load },
-	{ "load",              40,     atcommand_load },
-	{ "speed",             40,     atcommand_speed },
-	{ "storage",            1,     atcommand_storage },
-	{ "gstorage",          50,     atcommand_guildstorage },
-	{ "option",            40,     atcommand_option },
-	{ "hide",              40,     atcommand_hide }, // + /hide
-	{ "jobchange",         40,     atcommand_jobchange },
-	{ "job",               40,     atcommand_jobchange },
-	{ "die",                1,     atcommand_die },
-	{ "kill",              60,     atcommand_kill },
-	{ "alive",             60,     atcommand_alive },
-	{ "kami",              40,     atcommand_kami },
-	{ "kamib",             40,     atcommand_kami },
-	{ "kamic",             40,     atcommand_kami },
-	{ "heal",              40,     atcommand_heal },
-	{ "item",              60,     atcommand_item },
-	{ "item2",             60,     atcommand_item2 },
-	{ "itemreset",         40,     atcommand_itemreset },
-	{ "blvl",              60,     atcommand_baselevelup },
-	{ "lvup",              60,     atcommand_baselevelup },
-	{ "blevel",            60,     atcommand_baselevelup },
-	{ "baselvl",           60,     atcommand_baselevelup },
-	{ "baselvup",          60,     atcommand_baselevelup },
-	{ "baselevel",         60,     atcommand_baselevelup },
-	{ "baselvlup",         60,     atcommand_baselevelup },
-	{ "jlvl",              60,     atcommand_joblevelup },
-	{ "jlevel",            60,     atcommand_joblevelup },
-	{ "joblvl",            60,     atcommand_joblevelup },
-	{ "joblevel",          60,     atcommand_joblevelup },
-	{ "joblvup",           60,     atcommand_joblevelup },
-	{ "joblvlup",          60,     atcommand_joblevelup },
-	{ "h",                 20,     atcommand_help },
-	{ "help",              20,     atcommand_help },
-	{ "h2",                20,     atcommand_help2 },
-	{ "help2",             20,     atcommand_help2 },
-	{ "pvpoff",            40,     atcommand_pvpoff },
-	{ "pvpon",             40,     atcommand_pvpon },
-	{ "gvgoff",            40,     atcommand_gvgoff },
-	{ "gpvpoff",           40,     atcommand_gvgoff },
-	{ "gvgon",             40,     atcommand_gvgon },
-	{ "gpvpon",            40,     atcommand_gvgon },
-	{ "model",             20,     atcommand_model },
-	{ "go",                10,     atcommand_go },
-	{ "monster",           50,     atcommand_monster },
-	{ "spawn",             50,     atcommand_monster },
-	{ "monstersmall",      50,     atcommand_monstersmall },
-	{ "monsterbig",        50,     atcommand_monsterbig },
-	{ "killmonster",       60,     atcommand_killmonster },
-	{ "killmonster2",      40,     atcommand_killmonster2 },
-	{ "refine",            60,     atcommand_refine },
-	{ "produce",           60,     atcommand_produce },
-	{ "memo",              40,     atcommand_memo },
-	{ "gat",               99,     atcommand_gat },
-	{ "displaystatus",     99,     atcommand_displaystatus },
-	{ "stpoint",           60,     atcommand_statuspoint },
-	{ "skpoint",           60,     atcommand_skillpoint },
-	{ "zeny",              60,     atcommand_zeny },
-	{ "str",               60,     atcommand_param },
-	{ "agi",               60,     atcommand_param },
-	{ "vit",               60,     atcommand_param },
-	{ "int",               60,     atcommand_param },
-	{ "dex",               60,     atcommand_param },
-	{ "luk",               60,     atcommand_param },
-	{ "glvl",              60,     atcommand_guildlevelup },
-	{ "glevel",            60,     atcommand_guildlevelup },
-	{ "guildlvl",          60,     atcommand_guildlevelup },
-	{ "guildlvup",         60,     atcommand_guildlevelup },
-	{ "guildlevel",        60,     atcommand_guildlevelup },
-	{ "guildlvlup",        60,     atcommand_guildlevelup },
-	{ "makeegg",           60,     atcommand_makeegg },
-	{ "hatch",             60,     atcommand_hatch },
-	{ "petfriendly",       40,     atcommand_petfriendly },
-	{ "pethungry",         40,     atcommand_pethungry },
-	{ "petrename",          1,     atcommand_petrename },
-	{ "recall",            60,     atcommand_recall }, // + /recall
-	{ "night",             80,     atcommand_night },
-	{ "day",               80,     atcommand_day },
-	{ "doom",              80,     atcommand_doom },
-	{ "doommap",           80,     atcommand_doommap },
-	{ "raise",             80,     atcommand_raise },
-	{ "raisemap",          80,     atcommand_raisemap },
-	{ "kick",              20,     atcommand_kick }, // + right click menu for GM "(name) force to quit"
-	{ "kickall",           99,     atcommand_kickall },
-	{ "allskill",          60,     atcommand_allskill },
-	{ "allskills",         60,     atcommand_allskill },
-	{ "skillall",          60,     atcommand_allskill },
-	{ "skillsall",         60,     atcommand_allskill },
-	{ "questskill",        40,     atcommand_questskill },
-	{ "lostskill",         40,     atcommand_lostskill },
-	{ "spiritball",        40,     atcommand_spiritball },
-	{ "party",              1,     atcommand_party },
-	{ "guild",             50,     atcommand_guild },
-	{ "agitstart",         60,     atcommand_agitstart },
-	{ "agitend",           60,     atcommand_agitend },
-	{ "mapexit",           99,     atcommand_mapexit },
-	{ "idsearch",          60,     atcommand_idsearch },
-	{ "broadcast",         40,     atcommand_broadcast }, // + /b and /nb
-	{ "localbroadcast",    40,     atcommand_localbroadcast }, // + /lb and /nlb
-	{ "recallall",         80,     atcommand_recallall },
-	{ "reloaditemdb",      99,     atcommand_reloaditemdb },
-	{ "reloadmobdb",       99,     atcommand_reloadmobdb },
-	{ "reloadskilldb",     99,     atcommand_reloadskilldb },
-	{ "reloadscript",      99,     atcommand_reloadscript },
-	{ "reloadatcommand",   99,     atcommand_reloadatcommand },
-	{ "reloadbattleconf",  99,     atcommand_reloadbattleconf },
-	{ "reloadstatusdb",    99,     atcommand_reloadstatusdb },
-	{ "reloadpcdb",        99,     atcommand_reloadpcdb },
-	{ "reloadmotd",        99,     atcommand_reloadmotd },
-	{ "mapinfo",           99,     atcommand_mapinfo },
-	{ "dye",               40,     atcommand_dye },
-	{ "ccolor",            40,     atcommand_dye },
-	{ "hairstyle",         40,     atcommand_hair_style },
-	{ "hstyle",            40,     atcommand_hair_style },
-	{ "haircolor",         40,     atcommand_hair_color },
-	{ "hcolor",            40,     atcommand_hair_color },
-	{ "statall",           60,     atcommand_stat_all },
-	{ "statsall",          60,     atcommand_stat_all },
-	{ "allstats",          60,     atcommand_stat_all },
-	{ "allstat",           60,     atcommand_stat_all },
-	{ "block",             60,     atcommand_char_block },
-	{ "charblock",         60,     atcommand_char_block },
-	{ "ban",               60,     atcommand_char_ban },
-	{ "banish",            60,     atcommand_char_ban },
-	{ "charban",           60,     atcommand_char_ban },
-	{ "charbanish",        60,     atcommand_char_ban },
-	{ "unblock",           60,     atcommand_char_unblock },
-	{ "charunblock",       60,     atcommand_char_unblock },
-	{ "unban",             60,     atcommand_char_unban },
-	{ "unbanish",          60,     atcommand_char_unban },
-	{ "charunban",         60,     atcommand_char_unban },
-	{ "charunbanish",      60,     atcommand_char_unban },
-	{ "mount",             20,     atcommand_mount_peco },
-	{ "mountpeco",         20,     atcommand_mount_peco },
-	{ "guildspy",          60,     atcommand_guildspy },
-	{ "partyspy",          60,     atcommand_partyspy },
-	{ "repairall",         60,     atcommand_repairall },
-	{ "guildrecall",       60,     atcommand_guildrecall },
-	{ "partyrecall",       60,     atcommand_partyrecall },
-	{ "nuke",              60,     atcommand_nuke },
-	{ "shownpc",           80,     atcommand_shownpc },
-	{ "hidenpc",           80,     atcommand_hidenpc },
-	{ "loadnpc",           80,     atcommand_loadnpc },
-	{ "unloadnpc",         80,     atcommand_unloadnpc },
-	{ "time",               1,     atcommand_servertime },
-	{ "date",               1,     atcommand_servertime },
-	{ "serverdate",         1,     atcommand_servertime },
-	{ "servertime",         1,     atcommand_servertime },
-	{ "jail",              60,     atcommand_jail },
-	{ "unjail",            60,     atcommand_unjail },
-	{ "discharge",         60,     atcommand_unjail },
-	{ "jailfor",           60,     atcommand_jailfor },
-	{ "jailtime",           1,     atcommand_jailtime },
-	{ "disguise",          20,     atcommand_disguise },
-	{ "undisguise",        20,     atcommand_undisguise },
-	{ "email",              1,     atcommand_email },
-	{ "effect",            40,     atcommand_effect },
-	{ "follow",            20,     atcommand_follow },
-	{ "addwarp",           60,     atcommand_addwarp },
-	{ "skillon",           80,     atcommand_skillon },
-	{ "skilloff",          80,     atcommand_skilloff },
-	{ "killer",            60,     atcommand_killer },
-	{ "npcmove",           80,     atcommand_npcmove },
-	{ "killable",          40,     atcommand_killable },
-	{ "dropall",           40,     atcommand_dropall },
-	{ "storeall",          40,     atcommand_storeall },
-	{ "skillid",           40,     atcommand_skillid },
-	{ "useskill",          40,     atcommand_useskill },
-	{ "displayskill",      99,     atcommand_displayskill },
-	{ "snow",              99,     atcommand_snow },
-	{ "sakura",            99,     atcommand_sakura },
-	{ "clouds",            99,     atcommand_clouds },
-	{ "clouds2",           99,     atcommand_clouds2 },
-	{ "fog",               99,     atcommand_fog },
-	{ "fireworks",         99,     atcommand_fireworks },
-	{ "leaves",            99,     atcommand_leaves },
-	{ "summon",            60,     atcommand_summon },
-	{ "adjgmlvl",          99,     atcommand_adjgmlvl },
-	{ "adjcmdlvl",         99,     atcommand_adjcmdlvl },
-	{ "trade",             60,     atcommand_trade },
-	{ "send",              99,     atcommand_send },
-	{ "setbattleflag",     99,     atcommand_setbattleflag },
-	{ "unmute",            80,     atcommand_unmute },
-	{ "clearweather",      99,     atcommand_clearweather },
-	{ "uptime",             1,     atcommand_uptime },
-	{ "changesex",         60,     atcommand_changesex },
-	{ "mute",              80,     atcommand_mute },
-	{ "refresh",            1,     atcommand_refresh },
-	{ "identify",          40,     atcommand_identify },
-	{ "gmotd",             20,     atcommand_gmotd },
-	{ "misceffect",        50,     atcommand_misceffect },
-	{ "mobsearch",         10,     atcommand_mobsearch },
-	{ "cleanmap",          40,     atcommand_cleanmap },
-	{ "npctalk",           20,     atcommand_npctalk },
-	{ "pettalk",           10,     atcommand_pettalk },
-	{ "users",             40,     atcommand_users },
-	{ "reset",             40,     atcommand_reset },
-	{ "skilltree",         40,     atcommand_skilltree },
-	{ "marry",             40,     atcommand_marry },
-	{ "divorce",           40,     atcommand_divorce },
-	{ "sound",             40,     atcommand_sound },
-	{ "undisguiseall",     99,     atcommand_undisguiseall },
-	{ "disguiseall",       99,     atcommand_disguiseall },
-	{ "changelook",        60,     atcommand_changelook },
-	{ "autoloot",          10,     atcommand_autoloot },
-	{ "alootid",           10,     atcommand_autolootitem },
-	{ "mobinfo",            1,     atcommand_mobinfo },
-	{ "monsterinfo",        1,     atcommand_mobinfo },
-	{ "mi",                 1,     atcommand_mobinfo },
-	{ "exp",                1,     atcommand_exp },
-	{ "adopt",             40,     atcommand_adopt },
-	{ "version",            1,     atcommand_version },
-	{ "mutearea",          99,     atcommand_mutearea },
-	{ "stfu",              99,     atcommand_mutearea },
-	{ "rates",              1,     atcommand_rates },
-	{ "iteminfo",           1,     atcommand_iteminfo },
-	{ "ii",                 1,     atcommand_iteminfo },
-	{ "whodrops",           1,     atcommand_whodrops },
-	{ "whereis",           10,     atcommand_whereis },
-	{ "mapflag",           99,     atcommand_mapflag },
-	{ "me",                20,     atcommand_me },
-	{ "monsterignore",     99,     atcommand_monsterignore },
-	{ "battleignore",      99,     atcommand_monsterignore },
-	{ "fakename",          20,     atcommand_fakename },
-	{ "size",              20,     atcommand_size },
-	{ "showexp",           10,     atcommand_showexp},
-	{ "showzeny",          10,     atcommand_showzeny},
-	{ "showdelay",          1,     atcommand_showdelay},
-	{ "autotrade",         10,     atcommand_autotrade },
-	{ "at",                10,     atcommand_autotrade },
-	{ "changegm",          10,     atcommand_changegm },
-	{ "changeleader",      10,     atcommand_changeleader },
-	{ "partyoption",       10,     atcommand_partyoption},
-	{ "invite",             1,     atcommand_invite },
-	{ "duel",               1,     atcommand_duel },
-	{ "leave",              1,     atcommand_leave },
-	{ "accept",             1,     atcommand_accept },
-	{ "reject",             1,     atcommand_reject },
-	{ "away",               1,     atcommand_away },
-	{ "aw",                 1,     atcommand_away },
-	{ "main",               1,     atcommand_main },
-	{ "clone",             50,     atcommand_clone },
-	{ "slaveclone",        50,     atcommand_clone },
-	{ "evilclone",         50,     atcommand_clone },
-	{ "tonpc",             40,     atcommand_tonpc },
-	{ "commands",           1,     atcommand_commands },
-	{ "noask",              1,     atcommand_noask },
-	{ "request",           20,     atcommand_request },
-	{ "hlvl",              60,     atcommand_homlevel },
-	{ "hlevel",            60,     atcommand_homlevel },
-	{ "homlvl",            60,     atcommand_homlevel },
-	{ "homlvup",           60,     atcommand_homlevel },
-	{ "homlevel",          60,     atcommand_homlevel },
-	{ "homevolve",         60,     atcommand_homevolution },
-	{ "homevolution",      60,     atcommand_homevolution },
-	{ "makehomun",         60,     atcommand_makehomun },
-	{ "homfriendly",       60,     atcommand_homfriendly },
-	{ "homhungry",         60,     atcommand_homhungry },
-	{ "homtalk",           10,     atcommand_homtalk },
-	{ "hominfo",            1,     atcommand_hominfo },
-	{ "homstats",           1,     atcommand_homstats },
-	{ "homshuffle",        60,     atcommand_homshuffle },
-	{ "showmobs",          10,     atcommand_showmobs },
-	{ "feelreset",         10,     atcommand_feelreset },
-	{ "auction",           60,     atcommand_auction },
-	{ "mail",               1,     atcommand_mail },
-	{ "noks",               0,     atcommand_ksprotection },
-	{ "allowks",            6,     atcommand_allowks },
-	{ "cash",              60,     atcommand_cash },
-	{ "points",            60,     atcommand_cash },
-	{ "agitstart2",         60,     atcommand_agitstart2 },
-	{ "agitend2",           60,     atcommand_agitend2 },
+	{ "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 },
+	{ "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 },
+	{ "away",               1,1,      atcommand_away },
+	{ "aw",                 1,1,      atcommand_away },
+	{ "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",           60,60,     atcommand_auction },
+	{ "mail",               1,1,      atcommand_mail },
+	{ "noks",               0,0,      atcommand_ksprotection },
+	{ "allowks",            6,6,      atcommand_allowks },
+	{ "cash",              60,60,     atcommand_cash },
+	{ "points",            60,60,     atcommand_cash },
+	{ "agitstart2",         60,60,    atcommand_agitstart2 },
+	{ "agitend2",           60,60,    atcommand_agitend2 },
 };
 
 
@@ -8536,7 +8539,7 @@ AtCommandInfo atcommand_info[] = {
 static AtCommandInfo* get_atcommandinfo_byname(const char* name)
 {
 	int i;
-	if( *name == atcommand_symbol ) name++; // for backwards compatibility
+	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;
 }
@@ -8561,8 +8564,9 @@ int get_atcommand_level(const AtCommandFunc func)
 
 /// Executes an at-command.
 /// To be called by internal server code (bypasses various restrictions).
-bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl)
+bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl, const char charname[NAME_LENGTH])
 {
+	struct map_session_data* ssd;
 	AtCommandInfo* info;
 	char command[100];
 	char args[100];
@@ -8570,15 +8574,15 @@ bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str
 	
 	if( !str || !*str )
 		return false;
-
-	if( *str != atcommand_symbol ) // check first char
+	
+	if( *str != atcommand_symbol && *str != charcommand_symbol ) // check first char
 		return false;
-
+	
 	if( sscanf(str, "%99s %99[^\n]", command, args) < 2 )
 		args[0] = '\0';
 
 	info = get_atcommandinfo_byname(command);
-	if( info == NULL || info->func == NULL || gmlvl < info->level )
+	if( info == NULL || info->func == NULL || ( *str == atcommand_symbol && gmlvl < info->level ) || ( *str == charcommand_symbol && gmlvl < info->level2 ) )
 	{
 		if( gmlvl == 0 )
 			return false; // will just display as normal text
@@ -8590,8 +8594,12 @@ bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str
 		}
 	}
 
-	if( log_config.gm && info->level >= log_config.gm )
-		log_atcommand(sd, str);
+	if( log_config.gm && info->level >= log_config.gm ) {
+		if( (ssd = map_nick2sd(charname)) != NULL )
+			log_atcommand(ssd, str);
+		else
+			log_atcommand(sd, str);
+	}
 
 	if( info->func(fd, sd, command, args) != 0 )
 	{
@@ -8606,6 +8614,13 @@ bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str
 /// To be used by player-invoked code (restrictions will be applied).
 bool is_atcommand(const int fd, struct map_session_data* sd, const char* message)
 {
+	struct map_session_data* pl_sd;
+	
+	char charname[NAME_LENGTH];
+	char cmd[100];
+	char param[100];
+	const char* message2;
+	
 	int gmlvl = pc_isGM(sd);
 	
 	nullpo_retr(false, sd);
@@ -8626,10 +8641,32 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 	}
 	
 	// skip 10/11-langtype's codepage indicator, if detected
-	if( message[0] == '|' && strlen(message) >= 4 && message[3] == atcommand_symbol )
+	if( message[0] == '|' && strlen(message) >= 4 && (message[3] == atcommand_symbol || message[3] == charcommand_symbol) )
 		message += 3;
+
+	if (*message == charcommand_symbol)
+	{
+		if (sscanf(message, "%99s \"%23[^\"]\" %99[^\n]", cmd, charname, param) > 2
+		|| sscanf(message, "%99s %23s %99[^\n]", cmd, charname, param) > 2)
+		{
+			if ( (pl_sd = map_nick2sd(charname)) == NULL )
+			{
+				sprintf(atcmd_output, "%s failed. Player %s not found.", cmd, charname);
+				clif_displaymessage(fd, atcmd_output);
+				return true;
+			}
+			else {
+				//we pass fd instead of pl_sd->fd otherwise command output messages are sent to the target
+				//also, the name is taken out of the message since it's not needed anymore
+				sprintf(atcmd_output, "%s %s", cmd, param);
+				memcpy(atcmd_temp, atcmd_output, sizeof(atcmd_output));
+				message2 = atcmd_temp;
+				return is_atcommand_sub(fd,pl_sd,message2,gmlvl,sd->status.name);
+			}
+		}
+	}
 	
-	return is_atcommand_sub(fd,sd,message,gmlvl);
+	return is_atcommand_sub(fd,sd,message,gmlvl,sd->status.name);
 }
 
 
@@ -8638,7 +8675,7 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
  *------------------------------------------*/
 int atcommand_config_read(const char* cfgName)
 {
-	char line[1024], w1[1024], w2[1024];
+	char line[1024], w1[1024], w2[1024], w3[1024];
 	AtCommandInfo* p;
 	FILE* fp;
 	
@@ -8653,14 +8690,17 @@ int atcommand_config_read(const char* cfgName)
 		if( line[0] == '/' && line[1] == '/' )
 			continue;
 		
-		if( sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2 )
+		if( (sscanf(line, "%1023[^:]:%1023[^,],%1023s", w1, w2, w3)) != 3 
+		&& ( sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2 && strcmpi(w1, "import") != 0 ) )
 			continue;
-		
+
 		p = get_atcommandinfo_byname(w1);
 		if( p != NULL )
 		{
 			p->level = atoi(w2);
 			p->level = cap_value(p->level, 0, 100);
+			p->level2 = atoi(w3);
+			p->level2 = cap_value(p->level2, 0, 100);
 		}
 		else
 		if( strcmpi(w1, "import") == 0 )
@@ -8671,7 +8711,7 @@ int atcommand_config_read(const char* cfgName)
 			w2[0] != '/' && // symbol of standard ragnarok GM commands
 			w2[0] != '%' && // symbol of party chat speaking
 			w2[0] != '$' && // symbol of guild chat speaking
-			w2[0] != '#' )  // symbol of charcommand
+			w2[0] != '#' ) // remote symbol
 			atcommand_symbol = w2[0];
 		else
 			ShowWarning("Unknown setting '%s' in file %s\n", w1, cfgName);
@@ -8700,7 +8740,7 @@ void do_final_atcommand()
 int atcommand_commands(const int fd, struct map_session_data* sd, const char* command, const char* message)
 {
 	char line_buff[CHATBOX_SIZE];
-	int i, gm_lvl = pc_isGM(sd), count = 0;
+	int i, gm_lvl = pc_isGM(sd), count = 0, count2 = 0;
 	char* cur = line_buff;
 
 	memset(line_buff,' ',CHATBOX_SIZE);
@@ -8708,33 +8748,60 @@ int atcommand_commands(const int fd, struct map_session_data* sd, const char* co
 
 	clif_displaymessage(fd, msg_txt(273)); // "Commands available:"
 
-	for( i = 0; i < ARRAYLENGTH(atcommand_info); i++ )
-	{
-		unsigned int slen;
+		for( i = 0; i < ARRAYLENGTH(atcommand_info); i++ )
+		{
+			unsigned int slen;
 
-		if( gm_lvl < atcommand_info[i].level )
-			continue;
+			if( gm_lvl < atcommand_info[i].level )
+				continue;
 
-		slen = (unsigned int)strlen(atcommand_info[i].command);
+			slen = (unsigned int)strlen(atcommand_info[i].command);
 
-		// flush the text buffer if this command won't fit into it
-		if( slen + cur - line_buff >= CHATBOX_SIZE )
-		{
-			clif_displaymessage(fd,line_buff);
-			cur = line_buff;
-			memset(line_buff,' ',CHATBOX_SIZE);
-			line_buff[CHATBOX_SIZE-1] = 0;
+			// flush the text buffer if this command won't fit into it
+			if( slen + cur - line_buff >= CHATBOX_SIZE )
+			{
+				clif_displaymessage(fd,line_buff);
+				cur = line_buff;
+				memset(line_buff,' ',CHATBOX_SIZE);
+				line_buff[CHATBOX_SIZE-1] = 0;
+			}
+
+			memcpy(cur,atcommand_info[i].command,slen);
+			cur += slen+(10-slen%10);
+
+			count++;
 		}
+		
+		for( i = 0; i < ARRAYLENGTH(atcommand_info); i++ )
+		{
+			unsigned int slen;
 
-		memcpy(cur,atcommand_info[i].command,slen);
-		cur += slen+(10-slen%10);
+			if( gm_lvl < atcommand_info[i].level2 )
+				continue;
 
-		count++;
-	}
+			slen = (unsigned int)strlen(atcommand_info[i].command);
+
+			// flush the text buffer if this command won't fit into it
+			if( slen + cur - line_buff >= CHATBOX_SIZE )
+			{
+				clif_displaymessage(fd,line_buff);
+				cur = line_buff;
+				memset(line_buff,' ',CHATBOX_SIZE);
+				line_buff[CHATBOX_SIZE-1] = 0;
+			}
+
+			memcpy(cur,atcommand_info[i].command,slen);
+			cur += slen+(10-slen%10);
+
+			count2++;
+		}
+		
 	clif_displaymessage(fd,line_buff);
 
 	sprintf(atcmd_output, msg_txt(274), count); // "%d commands found."
 	clif_displaymessage(fd, atcmd_output);
+	sprintf(atcmd_output, "%d charcommands found.", count2);
+	clif_displaymessage(fd, atcmd_output);
 	
 	return 0;
-}
+}

+ 2 - 1
src/map/atcommand.h

@@ -14,10 +14,11 @@ struct map_session_data;
 //#define AUTOLOOT_DISTANCE AREA_SIZE
 
 extern char atcommand_symbol;
+extern char charcommand_symbol;
 typedef int (*AtCommandFunc)(const int fd, struct map_session_data* sd, const char* command, const char* message);
 
 bool is_atcommand(const int fd, struct map_session_data* sd, const char* message);
-bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
+bool is_atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl, const char charname[NAME_LENGTH]);
 int get_atcommand_level(const AtCommandFunc func);
 
 void do_init_atcommand(void);

+ 0 - 3936
src/map/charcommand.c

@@ -1,3936 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include "../common/cbasetypes.h"
-#include "../common/mmo.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-#include "../common/strlib.h"
-#include "../common/utils.h"
-
-#include "atcommand.h" // msg_txt()
-#include "charcommand.h"
-#include "battle.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "log.h"
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "npc.h"
-#include "pet.h"
-#include "homunculus.h"
-#include "party.h"
-#include "guild.h"
-#include "script.h"
-#include "trade.h"
-#include "unit.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-char charcommand_symbol = '#';
-
-extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#define CCMD_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-
-typedef struct CharCommandInfo {
-	const char* command;
-	int level;
-	CharCommandFunc func;
-} CharCommandInfo;
-
-static CharCommandInfo* get_charcommandinfo_byname(const char* name);
-static CharCommandInfo* get_charcommandinfo_byfunc(const CharCommandFunc func);
-
-
-/*==========================================
- * 対象キャラクターを転職させる upper指定で転生や養子も可能
- *------------------------------------------*/
-int charcommand_jobchange(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[100];
-	struct map_session_data* pl_sd;
-	int job = 0, upper = -1;
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &job, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <player>).");
-		clif_displaymessage(fd, "   0 Novice            7 Knight           14 Crusader         21 Peco Crusader");
-		clif_displaymessage(fd, "   1 Swordman          8 Priest           15 Monk             22 N/A");
-		clif_displaymessage(fd, "   2 Mage              9 Wizard           16 Sage             23 Super Novice");
-		clif_displaymessage(fd, "   3 Archer           10 Blacksmith       17 Rogue            24 Gunslinger");
-		clif_displaymessage(fd, "   4 Acolyte          11 Hunter           18 Alchemist        25 Ninja");
-		clif_displaymessage(fd, "   5 Merchant         12 Assassin         19 Bard             26 N/A");
-		clif_displaymessage(fd, "   6 Thief            13 Peco Knight      20 Dancer");
-		clif_displaymessage(fd, "4001 Novice High    4008 Lord Knight      4015 Paladin        4022 Peco Paladin");
-		clif_displaymessage(fd, "4002 Swordman High  4009 High Priest      4016 Champion");
-		clif_displaymessage(fd, "4003 Mage High      4010 High Wizard      4017 Professor");
-		clif_displaymessage(fd, "4004 Archer High    4011 Whitesmith       4018 Stalker");
-		clif_displaymessage(fd, "4005 Acolyte High   4012 Sniper           4019 Creator");
-		clif_displaymessage(fd, "4006 Merchant High  4013 Assassin Cross   4020 Clown");
-		clif_displaymessage(fd, "4007 Thief High     4014 Peco Lord Knight 4021 Gypsy");
-		clif_displaymessage(fd, "4023 Baby Novice    4030 Baby Knight      4037 Baby Crusader  4044 Baby Peco Crusader");
-		clif_displaymessage(fd, "4024 Baby Swordsman 4031 Baby Priest      4038 Baby Monk      4045 Super Baby");
-		clif_displaymessage(fd, "4025 Baby Mage      4032 Baby Wizard      4039 Baby Sage      4046 Taekwon Kid");
-		clif_displaymessage(fd, "4026 Baby Archer    4033 Baby Blacksmith  4040 Baby Rogue     4047 Taekwon Master");
-		clif_displaymessage(fd, "4027 Baby Acolyte   4034 Baby Hunter      4041 Baby Alchemist 4048 N/A");
-		clif_displaymessage(fd, "4028 Baby Merchant  4035 Baby Assassin    4042 Baby Bard      4049 Soul Linker");
-		clif_displaymessage(fd, "4029 Baby Thief     4036 Baby Peco-Knight 4043 Baby Dancer");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) == NULL) {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (!pcdb_checkid(job)) {
-		clif_displaymessage(fd, msg_txt(49)); // Invalid job ID.
-		return -1;
-	}
-
-	if (pc_jobchange(pl_sd, job, upper) != 0) {
-		clif_displaymessage(fd, msg_txt(192)); // Unable to change the specified character's job.
-		return -1;
-	}
-
-	clif_displaymessage(fd, msg_txt(48)); // Character's job changed.
-	return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int charcommand_petrename(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	struct pet_data *pd;
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #petrename <player>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) == NULL) {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if (!pl_sd->status.pet_id || !pl_sd->pd) {
-		clif_displaymessage(fd, msg_txt(191)); // Sorry, but this player has no pet.
-		return -1;
-	}
-
-	pd = pl_sd->pd;
-
-	if (pd->pet.rename_flag) {
-		clif_displaymessage(fd, msg_txt(190)); // This player can already rename his/her pet.
-		return -1;
-	}
-	pd->pet.rename_flag = 0;
-	intif_save_petdata(pl_sd->status.account_id, &pd->pet);
-	clif_send_petstatus(pl_sd);
-	clif_displaymessage(fd, msg_txt(189)); // This player can now rename his/her pet.
-	return 0;
-}
-
-
-/*==========================================
- * 
- *------------------------------------------*/
-int charcommand_petfriendly(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int friendly = 0;
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	struct pet_data *pd;
-
-	memset(character, '\0', sizeof(character));
-	if (!message || !*message || sscanf(message,"%d %23s",&friendly,character) < 2) {
-		clif_displaymessage(fd, "Please, enter a valid value (usage: #petfriendly <0-1000> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (!pl_sd->status.pet_id  || !pl_sd->pd) {
-		clif_displaymessage(fd, msg_txt(191)); // Sorry, but this player has no pet.
-		return -1;
-	}
-
-	friendly = cap_value(friendly, 0, 1000);
-
-	pd = pl_sd->pd;
-	if (friendly == pd->pet.intimate) {
-		clif_displaymessage(fd, msg_txt(183)); // Pet friendly is already the good value.
-		return -1;
-	}
-	
-	pd->pet.intimate = friendly;
-	clif_send_petstatus(pl_sd);
-	clif_pet_emotion(pd,0);
-	clif_displaymessage(pl_sd->fd, msg_txt(182)); // Pet friendly value changed!
-	clif_displaymessage(sd->fd, msg_txt(182)); // Pet friendly value changed!
-	return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int charcommand_stats(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	char job_jobname[100];
-	char output[200];
-	struct map_session_data *pl_sd;
-	int i;
-	struct {
-		const char* format;
-		int value;
-	} output_table[] = {
-		{ "Base Level - %d", 0 },
-		{ NULL, 0 },
-		{ "Hp - %d", 0 },
-		{ "MaxHp - %d", 0 },
-		{ "Sp - %d", 0 },
-		{ "MaxSp - %d", 0 },
-		{ "Str - %3d", 0 },
-		{ "Agi - %3d", 0 },
-		{ "Vit - %3d", 0 },
-		{ "Int - %3d", 0 },
-		{ "Dex - %3d", 0 },
-		{ "Luk - %3d", 0 },
-		{ "Zeny - %d", 0 },
-		{ "Free SK Points - %d", 0 },
-		{ "JobChangeLvl - %d", 0 },
-		{ NULL, 0 }
-	};
-
-	memset(character, '\0', sizeof(character));
-	memset(job_jobname, '\0', sizeof(job_jobname));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #stats <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	//direct array initialization with variables is not standard C compliant.
-	output_table[0].value = pl_sd->status.base_level;
-	output_table[1].format = job_jobname;
-	output_table[1].value = pl_sd->status.job_level;
-	output_table[2].value = pl_sd->status.hp;
-	output_table[3].value = pl_sd->status.max_hp;
-	output_table[4].value = pl_sd->status.sp;
-	output_table[5].value = pl_sd->status.max_sp;
-	output_table[6].value = pl_sd->status.str;
-	output_table[7].value = pl_sd->status.agi;
-	output_table[8].value = pl_sd->status.vit;
-	output_table[9].value = pl_sd->status.int_;
-	output_table[10].value = pl_sd->status.dex;
-	output_table[11].value = pl_sd->status.luk;
-	output_table[12].value = pl_sd->status.zeny;
-	output_table[13].value = pl_sd->status.skill_point;
-	output_table[14].value = pl_sd->change_level;
-
-	sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class_), "(level %d)");
-	sprintf(output, msg_txt(53), pl_sd->status.name); // '%s' stats:
-
-	clif_displaymessage(fd, output);
-	
-	for (i = 0; output_table[i].format != NULL; i++) {
-		sprintf(output, output_table[i].format, output_table[i].value);
-		clif_displaymessage(fd, output);
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Character Reset
- *------------------------------------------*/
-int charcommand_reset(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #reset <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	pc_resetstate(pl_sd);
-	pc_resetskill(pl_sd,1);
-	sprintf(output, msg_txt(208), character); // '%s' skill and stat points have been reset.
-	clif_displaymessage(fd, output);
-
-	return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int charcommand_option(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	int opt1 = 0, opt2 = 0, opt3 = 0;
-	struct map_session_data* pl_sd;
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message ||
-		sscanf(message, "%d %d %d %23[^\n]", &opt1, &opt2, &opt3, character) < 4 ||
-		opt1 < 0 || opt2 < 0 || opt3 < 0) {
-		clif_displaymessage(fd, "Please, enter valid options and a player name (usage: #option <param1> <param2> <param3> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	pl_sd->sc.opt1 = opt1;
-	pl_sd->sc.opt2 = opt2;
-	pc_setoption(pl_sd, opt3);
-	clif_displaymessage(fd, msg_txt(58)); // Character's options changed.
-
-	return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int charcommand_save(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char map_name[MAP_NAME_LENGTH_EXT];
-	char character[NAME_LENGTH];
-	struct map_session_data* pl_sd;
-	int x = 0, y = 0;
-	int m;
-
-	memset(map_name, '\0', sizeof(map_name));
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4 || x < 0 || y < 0) {
-		clif_displaymessage(fd, "Please, enter a valid save point and a player name (usage: #save <map> <x> <y> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	m = map_mapname2mapid(map_name);
-	if (m < 0 && !mapindex_name2id(map_name)) {
-		clif_displaymessage(fd, msg_txt(1)); // Map not found.
-		return -1;
-	}
-
-	//FIXME: What do you do if the map is in another map server with the nowarpto flag?
-	if (m>=0 && map[m].flag.nosave && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
-		clif_displaymessage(fd, "You are not authorised to set this map as a save map.");
-		return -1;
-	}
-
-	if (m>=0)
-		pc_setsavepoint(pl_sd, map[m].index, x, y);
-	else
-		pc_setsavepoint(pl_sd, mapindex_name2id(map_name), x, y);
-	clif_displaymessage(fd, msg_txt(57)); // Character's save point changed.	
-
-	return 0;
-}
-
-/*==========================================
- * CharSpiritBall Function by PalasX
- *------------------------------------------*/
-int charcommand_spiritball(const int fd, struct map_session_data* sd,const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char character[NAME_LENGTH];
-	int spirit = 0;
-
-	memset(character, '\0', sizeof(character));
-
-	if(!message || !*message || sscanf(message, "%d %23[^\n]", &spirit, character) < 2 || spirit < 0 || spirit > 1000) {
-		clif_displaymessage(fd, "Usage: @spiritball <number: 0-1000> <player>.");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if (spirit >= 0 && spirit <= 0x7FFF) {
-		if (pl_sd->spiritball != spirit || spirit > 999) {
-			if (pl_sd->spiritball > 0)
-				pc_delspiritball(pl_sd, pl_sd->spiritball, 1);
-		}
-		pl_sd->spiritball = spirit;
-		clif_spiritball(pl_sd);
-		// no message, player can look the difference
-		if (spirit > 1000)
-			clif_displaymessage(fd, msg_txt(204)); // WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-	} else {
-		clif_displaymessage(fd, msg_txt(205)); // You already have that number of spiritballs.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * #itemlist <character>: Displays the list of a player's items.
- *------------------------------------------*/
-int charcommand_itemlist(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	struct item_data *item_data, *item_temp;
-	int i, j, equip, count, counter, counter2;
-	char character[NAME_LENGTH], output[200], equipstr[100], outputtmp[200];
-	struct item *i_item; //Current inventory item.
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-	memset(equipstr, '\0', sizeof(equipstr));
-	memset(outputtmp, '\0', sizeof(outputtmp));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	counter = 0;
-	count = 0;
-	for (i = 0; i < MAX_INVENTORY; i++) {
-		i_item = &pl_sd->status.inventory[i];
-		if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_exists(i_item->nameid)) != NULL) {
-			counter = counter + i_item->amount;
-			count++;
-			if (count == 1) {
-				sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
-				clif_displaymessage(fd, output);
-			}
-			if ((equip = i_item->equip)) {
-				strcpy(equipstr, "| equiped: ");
-				if (equip & EQP_GARMENT)
-					strcat(equipstr, "robe/gargment, ");
-				if (equip & EQP_ACC_L)
-					strcat(equipstr, "left accessory, ");
-				if (equip & EQP_ARMOR)
-					strcat(equipstr, "body/armor, ");
-				if ((equip & EQP_ARMS) == EQP_HAND_R)
-					strcat(equipstr, "right hand, ");
-				if ((equip & EQP_ARMS) == EQP_HAND_L)
-					strcat(equipstr, "left hand, ");
-				if ((equip & EQP_ARMS) == EQP_ARMS)
-					strcat(equipstr, "both hands, ");
-				if (equip & EQP_SHOES)
-					strcat(equipstr, "feet, ");
-				if (equip & EQP_ACC_R)
-					strcat(equipstr, "right accessory, ");
-				if ((equip & EQP_HELM) == EQP_HEAD_LOW)
-					strcat(equipstr, "lower head, ");
-				if ((equip & EQP_HELM) == EQP_HEAD_TOP)
-					strcat(equipstr, "top head, ");
-				if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_TOP))
-					strcat(equipstr, "lower/top head, ");
-				if ((equip & EQP_HELM) == EQP_HEAD_MID)
-					strcat(equipstr, "mid head, ");
-				if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_MID))
-					strcat(equipstr, "lower/mid head, ");
-				if ((equip & EQP_HELM) == EQP_HELM)
-					strcat(equipstr, "lower/mid/top head, ");
-				// remove final ', '
-				equipstr[strlen(equipstr) - 2] = '\0';
-			} else
-				memset(equipstr, '\0', sizeof(equipstr));
-			if (i_item->refine)
-				sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", i_item->amount, item_data->name, i_item->refine, item_data->jname, i_item->refine, i_item->nameid, equipstr);
-			else
-				sprintf(output, "%d %s (%s, id: %d) %s", i_item->amount, item_data->name, item_data->jname, i_item->nameid, equipstr);
-			clif_displaymessage(fd, output);
-			memset(output, '\0', sizeof(output));
-			counter2 = 0;
-
-			if(i_item->card[0]==CARD0_PET) { //pet eggs
-				if (i_item->card[3])
-					sprintf(outputtmp, " -> (pet egg, pet id: %u, named)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
-				else
-					sprintf(outputtmp, " -> (pet egg, pet id: %u, unnamed)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
-				strcat(output, outputtmp);
-			} else
-			if(i_item->card[0]==CARD0_FORGE) { //forged items.
-				sprintf(outputtmp, " -> (crafted item, creator id: %u, star crumbs %d, element %d)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]), i_item->card[1]>>8, i_item->card[1]&0x0f);
-			} else
-			if(i_item->card[0]==CARD0_CREATE) { //created items.
-				sprintf(outputtmp, " -> (produced item, creator id: %u)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]));
-				strcat(output, outputtmp);
-			} else //Normal slots
-			for (j = 0; j < item_data->slot; j++) {
-				if (pl_sd->status.inventory[i].card[j]) {
-					if ((item_temp = itemdb_exists(i_item->card[j])) != NULL) {
-						if (output[0] == '\0')
-							sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						else
-							sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						strcat(output, outputtmp);
-					}
-				}
-			}
-			if (output[0] != '\0') {
-				output[strlen(output) - 2] = ')';
-				output[strlen(output) - 1] = '\0';
-				clif_displaymessage(fd, output);
-			}
-		}
-	}
-	if (count == 0)
-	{
-		clif_displaymessage(fd, "No item found on this player.");
-		return -1;
-	}
-
-	sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
-	clif_displaymessage(fd, output);
-	return 0;
-}
-
-/*==========================================
- * #effect by [MouseJstr]
- *
- * Create a effect localized on another character
- *------------------------------------------*/
-int charcommand_effect(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd = NULL;
-	char character[NAME_LENGTH];
-	int type = 0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &type, character) != 2) {
-		clif_displaymessage(fd, "usage: #effect <type+> <target>.");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	clif_specialeffect(&pl_sd->bl, type, AREA);
-	clif_displaymessage(fd, msg_txt(229)); // Your effect has changed.
-
-	return 0;
-}
-
-/*==========================================
- * #storagelist <character>: Displays the items list of a player's storage.
- *------------------------------------------*/
-int charcommand_storagelist(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	struct item_data *item_data, *item_temp;
-	int i, j, count = 0, counter = 0, counter2 = 0;
-	char character[NAME_LENGTH], output[200], outputtmp[200];
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-	memset(outputtmp, '\0', sizeof(outputtmp));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	for (i = 0; i < MAX_STORAGE; i++)
-	{
-		struct item* it = &pl_sd->status.storage.items[i];
-		if( it->nameid > 0 && (item_data = itemdb_search(it->nameid)) != NULL )
-		{
-			counter = counter + it->amount;
-			count++;
-			if (count == 1) {
-				sprintf(output, "------ Storage items list of '%s' ------", pl_sd->status.name);
-				clif_displaymessage(fd, output);
-			}
-			if (it->refine)
-				sprintf(output, "%d %s %+d (%s %+d, id: %d)", it->amount, item_data->name, it->refine, item_data->jname, it->refine, it->nameid);
-			else
-				sprintf(output, "%d %s (%s, id: %d)", it->amount, item_data->name, item_data->jname, it->nameid);
-			clif_displaymessage(fd, output);
-
-			memset(output, '\0', sizeof(output));
-			counter2 = 0;
-			for (j = 0; j < item_data->slot; j++) {
-				if (it->card[j]) {
-					if ((item_temp = itemdb_search(it->card[j])) != NULL) {
-						if (output[0] == '\0')
-							sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						else
-							sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						strcat(output, outputtmp);
-					}
-				}
-			}
-			if (output[0] != '\0') {
-				output[strlen(output) - 2] = ')';
-				output[strlen(output) - 1] = '\0';
-				clif_displaymessage(fd, output);
-			}
-		}
-	}
-
-	if (count == 0)
-		clif_displaymessage(fd, "No item found in the storage of this player.");
-	else {
-		sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
-		clif_displaymessage(fd, output);
-	}
-
-	return 0;
-}
-
-static void charcommand_item_sub(struct map_session_data *sd,struct item_data *item_data,int number)
-{
-	int loop, get_count, pet_id, i;
-
-	if( sd == NULL || item_data == NULL )
-		return;
-	
-	if( !itemdb_isstackable2(item_data) ) {
-		loop = number; get_count = 1;
-	} else {
-		loop = 1; get_count = number;
-	}
-
-	for (i = 0; i < loop; i++)
-	{
-		if( (pet_id = search_petDB_index(item_data->nameid, PET_EGG)) >= 0 )
-		{// if pet egg
-			sd->catch_target_class = pet_db[pet_id].class_;
-			intif_create_pet(sd->status.account_id, sd->status.char_id,
-			                 (short)pet_db[pet_id].class_, (short)mob_db(pet_db[pet_id].class_)->lv,
-			                 (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
-			                 100, 0, 1, pet_db[pet_id].jname);
-		}
-		else
-		{// if not pet egg
-			int flag = 0;
-			struct item item_tmp;
-			memset(&item_tmp, 0, sizeof(item_tmp));
-			item_tmp.nameid = item_data->nameid;
-			item_tmp.identify = 1;
-
-			if ((flag = pc_additem(sd, &item_tmp, get_count)))
-				clif_additem(sd, 0, 0, flag);
-
-			//Logs (A)dmins items [Lupus]
-			if(log_config.enable_logs&0x400)
-				log_pick_pc(sd, "A", item_tmp.nameid, number, &item_tmp);
-		}
-	}
-}
-
-/*==========================================
- * #item command (usage: #item <name/id_of_item> <quantity> <player>)
- * by MC Cameri
- *------------------------------------------*/
-int charcommand_item(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char item_name[100];
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	int number = 0, item_id;
-	struct item_data *item_data;
-	int gmlvl;
-	char tmp_cmdoutput[1024];
-	nullpo_retr(-1, sd);
-
-	memset(item_name, '\0', sizeof(item_name));
-
-	if (!message || !*message || (
-		sscanf(message, "\"%99[^\"]\" %d %23[^\n]", item_name, &number, character) < 3 &&
-		sscanf(message, "%99s %d %23[^\n]", item_name, &number, character) < 3
-	)) {
-		clif_displaymessage(fd, "Please, enter an item name/id (usage: #item <item name or ID> <quantity> <char name>).");
-		return -1;
-	}
-
-	if (number <= 0)
-		number = 1;
-
-	item_id = 0;
-	if ((item_data = itemdb_searchname(item_name)) != NULL ||
-		(item_data = itemdb_exists(atoi(item_name))) != NULL)
-		item_id = item_data->nameid;
-
-	if (item_id < 500) {
-		clif_displaymessage(fd, msg_txt(19)); // Invalid item ID or name.
-		return -1;
-	}
-
-	gmlvl = pc_isGM(sd);
-	if( !pc_can_give_items(gmlvl) )
-	{
-		clif_displaymessage(fd, msg_txt(246)); // GM is not allowed to trade
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) != NULL)
-	{
-		int pl_gmlvl = pc_isGM(pl_sd);
-		if( gmlvl < pl_gmlvl || !itemdb_cantrade_sub(item_data, gmlvl, pl_gmlvl) )
-		{// you can give items only to lower or same level
-			clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-			return -1;
-		}
-
-		charcommand_item_sub(pl_sd,item_data,number);
-		clif_displaymessage(fd, msg_txt(18)); // Item created.
-	}
-	else if (strcmpi(character,"all")==0 || strcmpi(character,"everyone")==0)
-	{
-		struct s_mapiterator* iter = mapit_getallusers();
-		for( pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter) )
-		{
-			int pl_gmlvl = pc_isGM(pl_sd);
-			if( gmlvl < pl_gmlvl || !itemdb_cantrade_sub(item_data, gmlvl, pl_gmlvl) )
-				continue;
-
-			charcommand_item_sub(pl_sd,item_data,number);
-			clif_displaymessage(pl_sd->fd, msg_txt(18)); // Item created.
-		}
-		mapit_free(iter);
-
-		snprintf(tmp_cmdoutput, sizeof(tmp_cmdoutput), "Everyone received %s %d.",item_name,number);
-		clif_displaymessage(fd, tmp_cmdoutput);
-	}
-	else
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * #warp/#rura/#rura+ <mapname> <x> <y> <char name>
- *------------------------------------------*/
-int charcommand_warp(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char map_name[MAP_NAME_LENGTH_EXT];
-	char character[NAME_LENGTH];
-	int x = 0, y = 0;
-	struct map_session_data *pl_sd;
-	int m;
-
-	nullpo_retr(-1, sd);
-
-	memset(map_name, '\0', sizeof(map_name));
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4) {
-		clif_displaymessage(fd, "Usage: #warp/#rura/#rura+ <mapname> <x> <y> <char name>");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) == NULL) {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-	if (pc_isGM(sd) < pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	m = map_mapname2mapid(map_name);
-	if (m < 0) {
-		clif_displaymessage(fd, msg_txt(1)); // Map not found.
-		return -1;
-	}
-	if ((x || y) && map_getcell(m, x, y, CELL_CHKNOREACH)) {
-		clif_displaymessage(fd, msg_txt(2)); // Coordinates out of range.
-		x = y = 0;
-	}
-	if (map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
-		clif_displaymessage(fd, "You are not authorised to warp someone to this map.");
-		return -1;
-	}
-	if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
-		clif_displaymessage(fd, "You are not authorised to warp this player from its actual map.");
-		return -1;
-	}
-	if (pc_setpos(pl_sd, map[m].index, x, y, 3) == 0) {
-		clif_displaymessage(pl_sd->fd, msg_txt(0)); // Warped.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(15)); // Player warped (message sends to player too).
-		return 0;
-	}
-	//No error message specified...?
-	return -1;
-}
-
-/*==========================================
- * #zeny <charname>
- *------------------------------------------*/
-int charcommand_zeny(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char character[NAME_LENGTH];
-	int zeny = 0, new_zeny;
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &zeny, character) < 2 || zeny == 0) {
-		clif_displaymessage(fd, "Please, enter a number and a player name (usage: #zeny <zeny> <name>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) != NULL) {
-		new_zeny = pl_sd->status.zeny + zeny;
-		if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
-			new_zeny = MAX_ZENY;
-		else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow
-			new_zeny = 0;
-		if (new_zeny != pl_sd->status.zeny) {
-			pl_sd->status.zeny = new_zeny;
-			clif_updatestatus(pl_sd, SP_ZENY);
-			clif_displaymessage(fd, msg_txt(211)); // Character's current zeny changed.
-		} else {
-			if (zeny < 0)
-				clif_displaymessage(fd, msg_txt(41)); // Unable to decrease the number/value.
-			else
-				clif_displaymessage(fd, msg_txt(149)); // Unable to increase the number/value.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * #cash or #points <amount> <charname>
- *------------------------------------------*/
-int charcommand_cash(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char character[NAME_LENGTH];
-	int value = 0;
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-
-	if( !message || !*message || sscanf(message, "%d %23[^\n]", &value, character) < 2 || value == 0 )
-	{
-		clif_displaymessage(fd, "Please, enter a number and a player name (usage: #cash|#points <points> <name>).");
-		return -1;
-	}
-
-	if( (pl_sd = map_nick2sd(character)) != NULL )
-	{
-		if( !strcmpi(command+1,"cash") )
-		{
-			if( value > 0 )
-				pc_getcash(pl_sd, value, 0);
-			else
-				pc_paycash(pl_sd, -value, 0);
-
-			clif_displaymessage(fd, "Character's Cash Points changed!.");
-		}
-		else
-		{ // @points
-			if( value > 0 )
-				pc_getcash(pl_sd, 0, value);
-			else
-				pc_paycash(pl_sd, -value, -value);
-
-			clif_displaymessage(fd, "Character's Kafra Points changed!.");
-		}
-	}
-	else
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * #fakename <char name> <fake name>
- *------------------------------------------*/
-int charcommand_fakename(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char name[NAME_LENGTH];
-	char char_name[NAME_LENGTH];
-	
-	nullpo_retr(-1, sd);
-
-	name[0] = '\0'; //If you don't pass a second word, name is left as garbage, most definitely not a blank name! [Skotlex]
-	if (!message || !*message || sscanf(message, "%23s %23[^\n]", char_name, name) < 1) {
-		clif_displaymessage(sd->fd,"Usage: #fakename <char name> <fake name>.");
-		clif_displaymessage(sd->fd,"Or: #fakename <char name> to disable.");
-		return 0;
-	}
-
-	if(!(pl_sd = map_nick2sd(char_name))) {
-		clif_displaymessage(sd->fd,"Character not found.");
-		return -1;
-	}
-
-	if(!name[0]) {
-		if(strlen(pl_sd->fakename) > 1) {
-			pl_sd->fakename[0]='\0';
-			clif_charnameack(0, &pl_sd->bl);
-			clif_displaymessage(sd->fd,"Returned to real name.");
-		} else {
-			clif_displaymessage(sd->fd,"Character does not has a fake name.");
-		}
-		return 0;
-	}
-
-	if(strlen(name) < 2) {
-		clif_displaymessage(sd->fd,"Fake name must be at least two characters.");
-		return 0;
-	}
-	
-	memcpy(pl_sd->fakename, name, NAME_LENGTH);
-	clif_charnameack(0, &pl_sd->bl);
-	clif_displaymessage(sd->fd,"Fake name enabled.");
-	
-	return 0;
-}
-
-
-/*==========================================
- * #baselvl <#> <nickname> 
- * Transferred by: Kevin
- *------------------------------------------*/
-int charcommand_baselevel(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int level = 0, i, status_point=0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
-		clif_displaymessage(fd, "Please, enter a level adjustment and a player name (usage: #baselvl <#> <nickname>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) == NULL) {
-		clif_displaymessage(fd, msg_table[3]); // Character not found.
-		return -1;
-	}
-	if (pc_isGM(sd) < pc_isGM(pl_sd)) { // you can change base level only lower or same gm level
-		clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (level > 0) {
-		if (pl_sd->status.base_level == pc_maxbaselv(pl_sd)) {	// check for max level by Valaris
-			clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher.
-			return 0;
-		}	// End Addition
-		if ((unsigned int)level > pc_maxbaselv(pl_sd) ||
-			pl_sd->status.base_level > pc_maxbaselv(pl_sd) -level)
-			level = pc_maxbaselv(pl_sd) - pl_sd->status.base_level;
-		for (i = 1; i <= level; i++)
-			status_point += (pl_sd->status.base_level + i + 14) / 5;
-
-		if (pl_sd->status.status_point > USHRT_MAX -  status_point)
-			pl_sd->status.status_point = USHRT_MAX;
-		else
-			pl_sd->status.status_point += status_point;
-		pl_sd->status.base_level += (unsigned int)level;
-		status_percent_heal(&pl_sd->bl, 100, 100);
-		clif_misceffect(&pl_sd->bl, 0);
-		clif_displaymessage(fd, msg_table[65]); // Character's base level raised.
-	} else {
-		if (pl_sd->status.base_level == 1) {
-			clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower.
-			return -1;
-		}
-		level *= -1;
-		if ((unsigned int)level >= pl_sd->status.base_level)
-			level = pl_sd->status.base_level -1;
-		for (i = 0; i > -level; i--)
-			status_point += (pl_sd->status.base_level +i + 14) / 5;
-		if (pl_sd->status.status_point < status_point)
-			pc_resetstate(pl_sd);
-		if (pl_sd->status.status_point < status_point)
-			pl_sd->status.status_point = 0;
-		else
-			pl_sd->status.status_point -= status_point;
-		pl_sd->status.base_level -= (unsigned int)level;
-		clif_displaymessage(fd, msg_table[66]); // Character's base level lowered.
-	}
-	clif_updatestatus(pl_sd, SP_BASELEVEL);
-	clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
-	clif_updatestatus(pl_sd, SP_STATUSPOINT);
-	status_calc_pc(pl_sd, 0);
-	if(pl_sd->status.party_id) 
-		party_send_levelup(pl_sd); 
-	return 0; //正常終了
-}
-
-/*==========================================
- * #jlvl <#> <nickname> 
- * Transferred by: Kevin
- *------------------------------------------*/
-int charcommand_joblevel(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int level = 0;
-	//転生や養子の場合の元の職業を算出する
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
-		clif_displaymessage(fd, "Please, enter a level adjustment and a player name (usage: #joblvl <#> <nickname>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
-			if (level > 0) {
-				if (pl_sd->status.job_level == pc_maxjoblv(pl_sd)) {
-					clif_displaymessage(fd, msg_txt(67)); // Character's job level can't go any higher.
-					return -1;
-				}
-				if ((unsigned int)level > pc_maxjoblv(pl_sd) ||
-					pl_sd->status.job_level > pc_maxjoblv(pl_sd) -level)
-					level = pc_maxjoblv(pl_sd) - pl_sd->status.job_level;
-				pl_sd->status.job_level += (unsigned int)level;
-				clif_updatestatus(pl_sd, SP_JOBLEVEL);
-				clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
-
-				if (pl_sd->status.skill_point > USHRT_MAX - level)
-					pl_sd->status.skill_point = USHRT_MAX;
-				else
-					pl_sd->status.skill_point += level;
-				clif_updatestatus(pl_sd, SP_SKILLPOINT);
-				status_calc_pc(pl_sd, 0);
-				clif_misceffect(&pl_sd->bl, 1);
-				clif_displaymessage(fd, msg_txt(68)); // character's job level raised.
-			} else {
-				if (pl_sd->status.job_level == 1) {
-					clif_displaymessage(fd, msg_txt(194)); // Character's job level can't go any lower.
-					return -1;
-				}
-				level*=-1;
-				if ((unsigned int)level >= pl_sd->status.job_level)
-					level = pl_sd->status.job_level-1;
-				pl_sd->status.job_level -= (unsigned int)level;
-				clif_updatestatus(pl_sd, SP_JOBLEVEL);
-				clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
-				if (pl_sd->status.skill_point < level)
-					pc_resetskill(pl_sd, 0); //Need more skill points to substract
-				if (pl_sd->status.skill_point < level)
-					pl_sd->status.skill_point = 0;
-				else
-					pl_sd->status.skill_point -= level;
-				clif_updatestatus(pl_sd, SP_SKILLPOINT);
-				status_calc_pc(pl_sd, 0);
-				clif_displaymessage(fd, msg_txt(69)); // Character's job level lowered.
-			}
-		} else {
-			clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-
-/*==========================================
- * #questskill <skill_#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------*/
-int charcommand_questskill(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int skill_id = 0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
-		clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: #questskill <#:0+> <nickname>).");
-		return -1;
-	}
-
-	if (skill_id < 0 && skill_id >= MAX_SKILL_DB) {
-		clif_displaymessage(fd, msg_txt(198)); // This skill number doesn't exist.
-		return -1;
-	}
-	if (!(skill_get_inf2(skill_id) & INF2_QUEST_SKILL)) {
-		clif_displaymessage(fd, msg_txt(197)); // This skill number doesn't exist or isn't a quest skill.
-		return -1;
-	}
-	if ((pl_sd = map_nick2sd(player)) == NULL) {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-	if (pc_checkskill(pl_sd, skill_id) > 0) {
-		clif_displaymessage(fd, msg_txt(200)); // This player already has this quest skill.
-		return -1;
-	}
-
-	pc_skill(pl_sd, skill_id, 1, 0);
-	clif_displaymessage(fd, msg_txt(199)); // This player has learned the skill.
-
-	return 0;
-}
-
-
-/*==========================================
- * #lostskill <skill_#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------*/
-int charcommand_lostskill(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int skill_id = 0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
-		clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>).");
-		return -1;
-	}
-
-	if (skill_id < 0 && skill_id >= MAX_SKILL) {
-		clif_displaymessage(fd, msg_txt(198)); // This skill number doesn't exist.
-		return -1;
-	}
-	if (!(skill_get_inf2(skill_id) & INF2_QUEST_SKILL)) {
-		clif_displaymessage(fd, msg_txt(197)); // This skill number doesn't exist or isn't a quest skill.
-		return -1;
-	}
-	if ((pl_sd = map_nick2sd(player)) == NULL) {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-	if (pc_checkskill(pl_sd, skill_id) == 0) {
-		clif_displaymessage(fd, msg_txt(203)); // This player doesn't have this quest skill.
-		return -1;
-	}
-
-	pl_sd->status.skill[skill_id].lv = 0;
-	pl_sd->status.skill[skill_id].flag = 0;
-	clif_skillinfoblock(pl_sd);
-	clif_displaymessage(fd, msg_txt(202)); // This player has forgotten the skill.
-
-	return 0;
-}
-
-/*==========================================
- * Character Skill Reset
- *------------------------------------------*/
-int charcommand_skreset(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	char tmp_cmdoutput[1024];
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
-			pc_resetskill(pl_sd,1);
-			sprintf(tmp_cmdoutput, msg_txt(206), player); // '%s' skill points reset.
-			clif_displaymessage(fd, tmp_cmdoutput);
-		} else {
-			clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Character Stat Reset
- *------------------------------------------*/
-int charcommand_streset(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	char tmp_cmdoutput[1024];
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset stats points only lower or same gm level
-			pc_resetstate(pl_sd);
-			sprintf(tmp_cmdoutput, msg_txt(207), player); // '%s' stats points reset.
-			clif_displaymessage(fd, tmp_cmdoutput);
-		} else {
-			clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Character Model by chbrules
- *------------------------------------------*/
-int charcommand_model(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hair_style = 0, hair_color = 0, cloth_color = 0;
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	char tmp_cmdoutput[1024];
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %d %d %23[^\n]", &hair_style, &hair_color, &cloth_color, player) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
-		sprintf(tmp_cmdoutput, "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
-				MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
-		clif_displaymessage(fd, tmp_cmdoutput);
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
-			hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
-			cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
-				pc_changelook(pl_sd, LOOK_HAIR, hair_style);
-				pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color);
-				pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
-				clif_displaymessage(fd, msg_txt(36)); // Appearence changed.
-		} else {
-			clif_displaymessage(fd, msg_txt(37)); // An invalid number was specified.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Character Skill Point (Rewritten by [Yor])
- *------------------------------------------*/
-int charcommand_skpoint(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int new_skill_point;
-	int point = 0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
-		clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charskpoint <amount> <name>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (point > 0 && pl_sd->status.skill_point > USHRT_MAX - point)
-			new_skill_point = USHRT_MAX;
-		else if (point < 0 && pl_sd->status.skill_point < -point)
-			new_skill_point = 0;
-		else
-			new_skill_point = pl_sd->status.skill_point + point;
-		if (new_skill_point != (int)pl_sd->status.skill_point) {
-			pl_sd->status.skill_point = new_skill_point;
-			clif_updatestatus(pl_sd, SP_SKILLPOINT);
-			clif_displaymessage(fd, msg_txt(209)); // Character's skill points changed.
-		} else {
-			if (point < 0)
-				clif_displaymessage(fd, msg_txt(41)); // Unable to decrease the number/value.
-			else
-				clif_displaymessage(fd, msg_txt(149)); // Unable to increase the number/value.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Character Status Point (rewritten by [Yor])
- *------------------------------------------*/
-int charcommand_stpoint(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	int new_status_point;
-	int point = 0;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
-		clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charstpoint <amount> <name>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) != NULL) {
-		if (point > 0 && pl_sd->status.status_point > USHRT_MAX - point)
-			new_status_point = USHRT_MAX;
-		else if (point < 0 && pl_sd->status.status_point < -point)
-			new_status_point = 0;
-		else
-			new_status_point = pl_sd->status.status_point + point;
-		if (new_status_point != (int)pl_sd->status.status_point) {
-			pl_sd->status.status_point = new_status_point;
-			clif_updatestatus(pl_sd, SP_STATUSPOINT);
-			clif_displaymessage(fd, msg_txt(210)); // Character's status points changed.
-		} else {
-			if (point < 0)
-				clif_displaymessage(fd, msg_txt(41)); // Unable to decrease the number/value.
-			else
-				clif_displaymessage(fd, msg_txt(149)); // Unable to increase the number/value.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * charchangesex command (usage: charchangesex <player_name>)
- *------------------------------------------*/
-int charcommand_changesex(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char player[NAME_LENGTH];
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(player)) == NULL)
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-	if (pc_isGM(sd) < pc_isGM(pl_sd)) {
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	clif_displaymessage(fd, msg_table[88]); // Character name sent to char-server to ask it.
-	chrif_changesex(pl_sd);
-	return 0;
-}
-
-/*==========================================
- * Feel (SG save map) Reset
- *------------------------------------------*/
-int charcommand_feelreset(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #feelreset <charname>).");
-		return -1;
-	}
-
-	if ((pl_sd = map_nick2sd(character)) != NULL) {
-		if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
-			pc_resetfeel(pl_sd);
-			sprintf(output, msg_txt(267), character); // '%s' designated maps reset.
-			clif_displaymessage(fd, output);
-		} else {
-			clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-			return -1;
-		}
-	} else {
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * #help - Char commands [Kayla]
- *------------------------------------------*/
-int charcommand_help(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char buf[2048], w1[2048], w2[2048];
-	int i, gm_level;
-	FILE* fp;
-	nullpo_retr(-1, sd);
-
-	memset(buf, '\0', sizeof(buf));
-
-	if ((fp = fopen(charhelp_txt, "r")) != NULL) {
-		clif_displaymessage(fd, msg_txt(26)); /* Help commands: */
-		gm_level = pc_isGM(sd);
-		while(fgets(buf, sizeof(buf), fp) != NULL)
-		{
-			if (buf[0] == '/' && buf[1] == '/')
-				continue;
-			for (i = 0; buf[i] != '\0'; i++) {
-				if (buf[i] == '\r' || buf[i] == '\n') {
-					buf[i] = '\0';
-					break;
-				}
-			}
-			if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
-				clif_displaymessage(fd, buf);
-			else if (gm_level >= atoi(w1))
-				clif_displaymessage(fd, w2);
-		}
-		fclose(fp);
-	} else {
-		clif_displaymessage(fd, msg_txt(27)); /*  File help.txt not found. */
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Loads a character back to their save point [HiddenDragon]
- *------------------------------------------*/
-int charcommand_load(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int m;
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #load <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	m = map_mapindex2mapid(pl_sd->status.save_point.map);
-	if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(pl_sd)) {
-		clif_displaymessage(fd, "Not authorized to warp to target map.");
-		return -1;
-	}
-	if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(pl_sd)) {
-		clif_displaymessage(fd, "Not authorized to warp from current map.");
-		return -1;
-	}
-
-	pc_setpos(pl_sd, pl_sd->status.save_point.map, pl_sd->status.save_point.x, pl_sd->status.save_point.y, 0);
-	clif_displaymessage(pl_sd->fd, msg_txt(7)); // Warping to respawn point.
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, msg_txt(7)); // Warping to respawn point.
-	
-	return 0;
-}
-
-/*==========================================
- * Changes the targets speed [HiddenDragon]
- *------------------------------------------*/
-int charcommand_speed(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int speed;
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &speed, character) < 2) {
-		sprintf(output, "Please, enter proper values (usage: #speed <%d-%d> <player>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	pl_sd->base_status.speed = cap_value(speed, MIN_WALK_SPEED, MAX_WALK_SPEED);
-	status_calc_bl(&pl_sd->bl, SCB_SPEED);
-	clif_displaymessage(pl_sd->fd, msg_txt(8)); // Speed changed.
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, msg_txt(8)); // Speed changed.
-	return 0;
-}
-
-/*==========================================
- * Opens their storage [HiddenDragon]
- *------------------------------------------*/
-int charcommand_storage(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #storage <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (pl_sd->npc_id || pl_sd->vender_id || pl_sd->state.trading || pl_sd->state.storage_flag)
-		return -1;
-
-	if (storage_storageopen(pl_sd) == 1)
-  	{	//Already open.
-		clif_displaymessage(fd, "Players storage already open.");
-		return -1;
-	}
-	
-	clif_displaymessage(pl_sd->fd, "Storage opened.");
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, "Player's storage opened.");
-
-	return 0;
-}
-
-
-/*==========================================
- * Opens their guild storage
- *------------------------------------------*/
-int charcommand_guildstorage(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-	
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #gstorage <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (pl_sd->npc_id || pl_sd->vender_id || pl_sd->state.trading)
-		return -1;
-
-	if (pl_sd->status.guild_id == 0) {
-		clif_displaymessage(fd, "Target player is not in a guild.");
-		return -1;
-	}
-
-	if (pl_sd->state.storage_flag) {
-		clif_displaymessage(fd, "Guild storage is currently in use.");
-		return -1;
-	}
-
-	storage_guild_storageopen(pl_sd);
-
-	clif_displaymessage(pl_sd->fd, "Guild storage opened.");
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, "Player's guild storage opened.");
-
-	return 0;
-}
-
-/*==========================================
- * Applies GM Hide to a character [HiddenDragon]
- *------------------------------------------*/
-int charcommand_hide(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-	
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #hide <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (pl_sd->sc.option & OPTION_INVISIBLE) {
-		pl_sd->sc.option &= ~OPTION_INVISIBLE;
-		if (pl_sd->disguise)
-			status_set_viewdata(&pl_sd->bl, pl_sd->disguise);
-		else
-			status_set_viewdata(&pl_sd->bl, pl_sd->status.class_);
-		clif_changeoption(&pl_sd->bl);
-		clif_displaymessage(pl_sd->fd, msg_txt(10)); // Invisible: Off
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(10)); // Invisible: Off
-	} else {
-		pl_sd->sc.option |= OPTION_INVISIBLE;
-		pl_sd->vd.class_ = INVISIBLE_CLASS;
-		clif_changeoption(&pl_sd->bl);
-		clif_displaymessage(pl_sd->fd, msg_txt(11)); // Invisible: On
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(11)); // Invisible: On
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Resurrects a dead character [HiddenDragon]
- *------------------------------------------*/
-int charcommand_alive(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-	
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #alive <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (!status_revive(&pl_sd->bl, 100, 100))
-	{
-		clif_displaymessage(fd, "Target player is not dead.");
-		return -1;
-	}
-	clif_skill_nodamage(&pl_sd->bl,&pl_sd->bl,ALL_RESURRECTION,4,1);
-	clif_displaymessage(pl_sd->fd, msg_txt(16)); // You've been revived! It's a miracle!
-	return 0;
-}
-
-/*==========================================
- * Heals someone's HP and SP [HiddenDragon]
- *------------------------------------------*/
-int charcommand_heal(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hp = 0, sp = 0; // [Valaris] thanks to fov
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-	
-	if (!message || !*message || sscanf(message, "%d %d %23[^\n]", &hp, &sp, character) < 3) {
-		clif_displaymessage(fd, "Please, enter proper values (usage: #heal <hp> <sp> <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	// some overflow checks
-	if( hp == INT_MIN ) hp++;
-	if( sp == INT_MIN ) sp++;
-
-	if ( hp == 0 && sp == 0 ) {
-		if (!status_percent_heal(&pl_sd->bl, 100, 100))
-			clif_displaymessage(fd, msg_txt(157)); // HP and SP are already with the good value.
-		else
-		{
-			clif_displaymessage(pl_sd->fd, msg_txt(17)); // HP, SP recovered.
-			if (pl_sd->fd != fd)
-				clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered.
-		}
-		return 0;
-	}
-
-	if(hp > 0 && sp >= 0) {
-		if( !status_heal(&pl_sd->bl, hp, sp, 2) )
-			clif_displaymessage(fd, msg_txt(157)); // HP and SP are already with the good value.
-		else
-		{
-			clif_displaymessage(pl_sd->fd, msg_txt(17)); // HP, SP recovered.
-			if ( pl_sd->fd != fd )
-				clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered.
-		}
-		return 0;
-	}
-
-	if( hp < 0 && sp <= 0 ) {
-		status_damage(NULL, &pl_sd->bl, -hp, -sp, 0, 0);
-		clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0);
-		clif_displaymessage(pl_sd->fd, msg_txt(156)); // HP or/and SP modified.
-		if ( pl_sd->fd != fd )
-			clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified.
-		return 0;
-	}
-
-	//Opposing signs.
-	if ( hp ) {
-		if ( hp > 0 )
-			status_heal(&pl_sd->bl, hp, 0, 2);
-		else {
-			status_damage(NULL, &pl_sd->bl, -hp, 0, 0, 0);
-			clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0);
-		}
-	}
-
-	if ( sp ) {
-		if ( sp > 0 )
-			status_heal(&pl_sd->bl, 0, sp, 2);
-		else
-			status_damage(NULL, &pl_sd->bl, 0, -sp, 0, 0);
-	}
-
-	clif_displaymessage(pl_sd->fd, msg_txt(156)); // HP or/and SP modified.
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified.
-	return 0;
-}
-
-/*==========================================
- * Creates items as specified [HiddenDragon]
- *------------------------------------------*/
-int charcommand_item2(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct item item_tmp;
-	struct item_data *item_data;
-	char item_name[100];
-	int item_id, number = 0;
-	int identify = 0, refine = 0, attr = 0;
-	int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-	int flag;
-	int loop, get_count, i;
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-	
-	if (!message || !*message || (
-		sscanf(message, "\"%99[^\"]\" %d %d %d %d %d %d %d %d %23[^\n]", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, character) < 10 &&
-		sscanf(message, "%99s %d %d %d %d %d %d %d %d %23[^\n]", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, character) < 10
-	)) {
-		clif_displaymessage(fd, "Please, enter all informations (usage: @item2 <item name or ID> <quantity>");
-		clif_displaymessage(fd, "  <Identify_flag[1|0]> <refine> <attribut> <Card1> <Card2> <Card3> <Card4> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	if (number <= 0)
-		number = 1;
-
-	item_id = 0;
-	if ((item_data = itemdb_searchname(item_name)) != NULL ||
-	    (item_data = itemdb_exists(atoi(item_name))) != NULL)
-		item_id = item_data->nameid;
-
-	if (item_id > 500) {
-		loop = 1;
-		get_count = number;
-		if (item_data->type == 4 || item_data->type == 5 ||
-			item_data->type == 7 || item_data->type == 8) {
-			loop = number;
-			get_count = 1;
-			if (item_data->type == 7) {
-				identify = 1;
-				refine = 0;
-			}
-			if (item_data->type == 8)
-				refine = 0;
-			if (refine > 10)
-				refine = 10;
-		} else {
-			identify = 1;
-			refine = attr = 0;
-		}
-		for (i = 0; i < loop; i++) {
-			memset(&item_tmp, 0, sizeof(item_tmp));
-			item_tmp.nameid = item_id;
-			item_tmp.identify = identify;
-			item_tmp.refine = refine;
-			item_tmp.attribute = attr;
-			item_tmp.card[0] = c1;
-			item_tmp.card[1] = c2;
-			item_tmp.card[2] = c3;
-			item_tmp.card[3] = c4;
-			if ((flag = pc_additem(pl_sd, &item_tmp, get_count)))
-				clif_additem(pl_sd, 0, 0, flag);
-		}
-
-		//Logs (A)dmins items [Lupus]
-		if(log_config.enable_logs&0x400)
-			log_pick_pc(pl_sd, "A", item_tmp.nameid, number, &item_tmp);
-
-		clif_displaymessage(pl_sd->fd, msg_txt(18)); // Item created.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(18)); // Item created.
-	} else {
-		clif_displaymessage(fd, msg_txt(19)); // Invalid item ID or name.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Reset a character's items [HiddenDragon]
- *------------------------------------------*/
-int charcommand_itemreset(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int i, count = 0;
-	char character[NAME_LENGTH];
-	char output[200];
-
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #itemreset <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	for (i = 0; i < MAX_INVENTORY; i++) {
-		if (pl_sd->status.inventory[i].amount && pl_sd->status.inventory[i].equip == 0) {
-
-			//Logs (A)dmins items [Lupus]
-			if(log_config.enable_logs&0x400)
-				log_pick_pc(pl_sd, "A", pl_sd->status.inventory[i].nameid, -pl_sd->status.inventory[i].amount, &pl_sd->status.inventory[i]);
-
-			pc_delitem(pl_sd, i, pl_sd->status.inventory[i].amount, 0);
-			count++;
-		}
-	}
-	
-	sprintf(output, msg_txt(114), count);
-	if (pl_sd->fd != fd)
-		clif_displaymessage(pl_sd->fd, output); // %d item(s) removed from the player.
-	clif_displaymessage(fd, msg_txt(20)); // All of your items have been removed.
-
-	return 0;
-}
-
-/*==========================================
- * Refine their items [HiddenDragon]
- *------------------------------------------*/
-int charcommand_refine(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int i,j, position = 0, refine = 0, current_position, final_refine;
-	int count;
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%d %d %23[^\n]", &position, &refine, character) < 3) {
-		clif_displaymessage(fd, "Please, enter a position and a amount (usage: #refine <equip position> <+/- amount> <player>).");
-		sprintf(output, "%d: Left Accessory", EQI_ACC_L);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Right Accessory", EQI_ACC_R);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Shoes", EQI_SHOES);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Garment", EQI_GARMENT);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Lower Headgear", EQI_HEAD_LOW);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Mid Headgear", EQI_HEAD_MID);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Top Headgear", EQI_HEAD_TOP);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Body Armor", EQI_ARMOR);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Left Hand", EQI_HAND_L);
-		clif_displaymessage(fd, output);
-		sprintf(output, "%d: Right Hand", EQI_HAND_R);
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (refine < -MAX_REFINE)
-		refine = -MAX_REFINE;
-	else if (refine > MAX_REFINE)
-		refine = MAX_REFINE;
-	else if (refine == 0)
-		refine = 1;
-
-	count = 0;
-	for (j = 0; j < EQI_MAX-1; j++) {
-		if ((i = pl_sd->equip_index[j]) < 0)
-			continue;
-		if(j == EQI_HAND_R && pl_sd->equip_index[EQI_HAND_L] == i)
-			continue;
-		if(j == EQI_HEAD_MID && pl_sd->equip_index[EQI_HEAD_LOW] == i)
-			continue;
-		if(j == EQI_HEAD_TOP && (pl_sd->equip_index[EQI_HEAD_MID] == i || pl_sd->equip_index[EQI_HEAD_LOW] == i))
-			continue;
-
-		if(position && !(pl_sd->status.inventory[i].equip & position))
-			continue;
-
-		final_refine = pl_sd->status.inventory[i].refine + refine;
-		if (final_refine > MAX_REFINE)
-			final_refine = MAX_REFINE;
-		else if (final_refine < 0)
-			final_refine = 0;
-		if (pl_sd->status.inventory[i].refine != final_refine) {
-			pl_sd->status.inventory[i].refine = final_refine;
-			current_position = pl_sd->status.inventory[i].equip;
-			pc_unequipitem(pl_sd, i, 3);
-			clif_refine(fd, 0, i, pl_sd->status.inventory[i].refine);
-			clif_delitem(pl_sd, i, 1);
-			clif_additem(pl_sd, i, 1, 0);
-			pc_equipitem(pl_sd, i, current_position);
-			clif_misceffect(&pl_sd->bl, 3);
-			count++;
-		}
-	}
-
-	if (count == 0)
-		clif_displaymessage(fd, msg_txt(166)); // No item has been refined!
-	else if (count == 1)
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(167)); // 1 item has been refined!
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(167)); // 1 item has been refined!
-	}
-	else {
-		sprintf(output, msg_txt(168), count); // %d items have been refined!
-		clif_displaymessage(pl_sd->fd, output);
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, output);
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Produce a manufactured item in their inventory [HiddenDragon]
- *------------------------------------------*/
-int charcommand_produce(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char item_name[100];
-	int item_id, attribute = 0, star = 0;
-	int flag = 0;
-	struct item_data *item_data;
-	struct item tmp_item;
-	char character[NAME_LENGTH];
-	char output[200];
-
-	struct map_session_data *pl_sd;
-
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || (
-		sscanf(message, "\"%99[^\"]\" %d %d %23[^\n]", item_name, &attribute, &star, character) < 4 &&
-		sscanf(message, "%99s %d %d %23[^\n]", item_name, &attribute, &star, character) < 4
-	)) {
-		clif_displaymessage(fd, "Please, enter at least an item name/id (usage: #produce <equip name or equip ID> <element> <# of very's> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	item_id = 0;
-	if ((item_data = itemdb_searchname(item_name)) == NULL &&
-	    (item_data = itemdb_exists(atoi(item_name))) == NULL)
-	{
-		sprintf(output, msg_txt(170)); // This item is not an equipment.
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-	item_id = item_data->nameid;
-	if (itemdb_isequip2(item_data)) {
-		if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE)
-			attribute = ATTRIBUTE_NORMAL;
-		if (star < MIN_STAR || star > MAX_STAR)
-			star = 0;
-		memset(&tmp_item, 0, sizeof tmp_item);
-		tmp_item.nameid = item_id;
-		tmp_item.amount = 1;
-		tmp_item.identify = 1;
-		tmp_item.card[0] = CARD0_FORGE;
-		tmp_item.card[1] = item_data->type==IT_WEAPON?
-			((star*5) << 8) + attribute:0;
-		tmp_item.card[2] = GetWord(pl_sd->status.char_id, 0);
-		tmp_item.card[3] = GetWord(pl_sd->status.char_id, 1);
-		clif_produceeffect(pl_sd, 0, item_id);
-		clif_misceffect(&pl_sd->bl, 3);
-
-		//Logs (A)dmins items [Lupus]
-		if(log_config.enable_logs&0x400)
-			log_pick_pc(pl_sd, "A", tmp_item.nameid, 1, &tmp_item);
-
-		if ((flag = pc_additem(pl_sd, &tmp_item, 1)))
-		{
-			clif_additem(pl_sd, 0, 0, flag);
-			clif_displaymessage(fd, msg_txt(18));
-		}
-	} else {
-		sprintf(output, msg_txt(169), item_id, item_data->name); // This item (%d: '%s') is not an equipment.
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Changes a character's stats [HiddenDragon
- *------------------------------------------*/
-int charcommand_param(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int index, value = 0, new_value;
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-	const char* param[] = { "#str", "#agi", "#vit", "#int", "#dex", "#luk", NULL };
-	short* status[6];
-
-	
-	if (!message || !*message || sscanf(message, "%d %s", &value, character) < 2 || value == 0) {
-		sprintf(output, "Please, enter a valid value (usage: #str,#agi,#vit,#int,#dex,#luk <+/-adjustment> <player>).");
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	status[0] = &pl_sd->status.str;
-	status[1] = &pl_sd->status.agi;
-	status[2] = &pl_sd->status.vit;
-	status[3] = &pl_sd->status.int_;
-	status[4] = &pl_sd->status.dex;
-	status[5] = &pl_sd->status.luk;
-
-	index = -1;
-	for (index = 0; index < ARRAYLENGTH(param); index++) {
-		if (strcmpi(command, param[index]) == 0)
-			break;
-	}
-	if (index == ARRAYLENGTH(param) || index > MAX_STATUS_TYPE) {
-		// normaly impossible...
-		sprintf(output, "Please, enter a valid value (usage: #str,#agi,#vit,#int,#dex,#luk <+/-adjustment> <player>).");
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if (value > 0 && *status[index] > 999 - value)
-		new_value = 999;
-	else if (value < 0 && *status[index] <= -value)
-		new_value = 1;
-	else
-		new_value = *status[index] + value;
-	
-	if (new_value != (int)*status[index]) {
-		*status[index] = new_value;
-		clif_updatestatus(pl_sd, SP_STR + index);
-		clif_updatestatus(pl_sd, SP_USTR + index);
-		status_calc_pc(pl_sd, 0);
-		clif_displaymessage(pl_sd->fd, msg_txt(42)); // Stat changed.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(42)); // Stat changed.
-	} else {
-		if (value < 0)
-			clif_displaymessage(fd, msg_txt(41)); // Unable to decrease the number/value.
-		else
-			clif_displaymessage(fd, msg_txt(149)); // Unable to increase the number/value.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Levels up a character's guild [HiddenDragon]
- *------------------------------------------*/
-int charcommand_guildlevelup(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int level = 0;
-	short added_level;
-	struct guild *guild_info;
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %s", &level, character) < 2 || level == 0) {
-		clif_displaymessage(fd, "Please, enter a valid level and player (usage: #guildlvup/@guildlvlup <# of levels> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (pl_sd->status.guild_id <= 0 || (guild_info = guild_search(pl_sd->status.guild_id)) == NULL) {
-		clif_displaymessage(fd, "Target player is not in a guild"); // You're not in a guild.
-		return -1;
-	}
-	//if (strcmp(sd->status.name, guild_info->master) != 0) {
-	//	clif_displaymessage(fd, msg_txt(44)); // You're not the master of your guild.
-	//	return -1;
-	//}
-
-	added_level = (short)level;
-	if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short)MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow
-		added_level = (short)MAX_GUILDLEVEL - guild_info->guild_lv;
-	else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow
-		added_level = 1 - guild_info->guild_lv;
-
-	if (added_level != 0) {
-		intif_guild_change_basicinfo(guild_info->guild_id, GBI_GUILDLV, &added_level, 2);
-		clif_displaymessage(pl_sd->fd, msg_txt(179)); // Guild level changed.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(179));
-	} else {
-		clif_displaymessage(fd, msg_txt(45)); // Guild level change failed.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Opens a hatch window for them [HiddenDragon]
- *------------------------------------------*/
-int charcommand_hatch(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #hatch <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (pl_sd->status.pet_id <= 0)
-		clif_sendegg(sd);
-	else {
-		clif_displaymessage(fd, "Target player already has a pet"); // You already have a pet.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Change target pet's hunger [HiddenDragon]
- *------------------------------------------*/
-int charcommand_pethungry(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hungry;
-	struct pet_data *pd;
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &hungry, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a valid number and player (usage: #pethungry <0-100> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	pd = pl_sd->pd;
-	if (!pl_sd->status.pet_id || !pd) {
-		clif_displaymessage(fd, "Target has no pet"); // Sorry, but you have no pet.
-		return -1;
-	}
-	if (hungry < 0 || hungry > 100) {
-		clif_displaymessage(fd, msg_txt(37)); // An invalid number was specified.
-		return -1;
-	}
-	if (hungry == pd->pet.hungry) {
-		clif_displaymessage(fd, msg_txt(186)); // Pet hungry is already the good value.
-		return -1;
-	}
-
-	pd->pet.hungry = hungry;
-	clif_send_petstatus(pl_sd);
-	clif_displaymessage(pl_sd->fd, msg_txt(185)); // Pet hungry value changed!
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, msg_txt(185)); // Pet hungry value changed!
-
-	return 0;
-}
-
-/*==========================================
- * Give all skills to target [HiddenDragon]
- *------------------------------------------*/
-int charcommand_allskill(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #allskill <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	pc_allskillup(pl_sd); // all skills
-	pl_sd->status.skill_point = 0; // 0 skill points
-	clif_updatestatus(pl_sd, SP_SKILLPOINT); // update
-	clif_displaymessage(pl_sd->fd, msg_txt(76)); // You have received all skills.
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, "Player has received all skills for his/her class.");
-
-	return 0;
-}
-
-
-/*==========================================
- * Change target's clothing color [HiddenDragon]
- *------------------------------------------*/
-int charcommand_dye(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int cloth_color = 0;
-	char character[NAME_LENGTH];
-	char output[200];
-	
-	struct map_session_data *pl_sd;
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &cloth_color, character) < 2) {
-		sprintf(output, "Please, enter a clothes color (usage: #dye/@ccolor <clothes color: %d-%d> <player>).", MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
-		clif_displaymessage(fd,output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
-		pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
-		clif_displaymessage(pl_sd->fd, msg_txt(36)); // Appearence changed.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(36)); // Appearence changed.
-	} else {
-		clif_displaymessage(fd, msg_txt(37)); // An invalid number was specified.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Change target's hair style [HiddenDragon]
- *------------------------------------------*/
-int charcommand_hair_style(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hair_style = 0;
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &hair_style, character) < 2) {
-		sprintf(output, "Please, enter a hair style (usage: #hairstyle/#hstyle <hair ID: %d-%d> <player>.", MIN_HAIR_STYLE, MAX_HAIR_STYLE);
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) {
-			pc_changelook(pl_sd, LOOK_HAIR, hair_style);
-			clif_displaymessage(pl_sd->fd, msg_txt(36)); // Appearence changed.
-			if (pl_sd->fd != fd)
-				clif_displaymessage(fd, msg_txt(36)); // Appearence changed.
-	} else {
-		clif_displaymessage(fd, msg_txt(37)); // An invalid number was specified.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Change target's hair color [HiddenDragon]
- *------------------------------------------*/
-int charcommand_hair_color(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hair_color = 0;
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-	nullpo_retr(-1, sd);
-
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &hair_color, character) < 2) {
-		sprintf(output, "Please, enter a hair color (usage: #haircolor/#hcolor <hair color: %d-%d> <player>).", MIN_HAIR_COLOR, MAX_HAIR_COLOR);
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) {
-			pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color);
-			clif_displaymessage(pl_sd->fd, msg_txt(36)); // Appearence changed.
-			if (pl_sd->fd != fd)
-				clif_displaymessage(fd, msg_txt(36)); // Appearence changed.
-	} else {
-		clif_displaymessage(fd, msg_txt(37)); // An invalid number was specified.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Change all target's stats [HiddenDragon]
- *------------------------------------------*/
-int charcommand_allstats(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int index, count, value = 0, max, new_value;
-	short* status[6];
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-
- 	//we don't use direct initialization because it isn't part of the c standard.
-	nullpo_retr(-1, sd);
-	memset(character, '\0', sizeof(character));
-	
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #statall/#statsall/#allstat/#allstats <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	status[0] = &pl_sd->status.str;
-	status[1] = &pl_sd->status.agi;
-	status[2] = &pl_sd->status.vit;
-	status[3] = &pl_sd->status.int_;
-	status[4] = &pl_sd->status.dex;
-	status[5] = &pl_sd->status.luk;
-
-	count = 0;
-	max = pc_maxparameter(pl_sd);
-	for (index = 0; index < ARRAYLENGTH(status); index++) {
-
-		if (value > 0 && *status[index] > max - value)
-			new_value = max;
-		else if (value < 0 && *status[index] <= -value)
-			new_value = 1;
-		else
-			new_value = *status[index] +value;
-		
-		if (new_value != (int)*status[index]) {
-			*status[index] = new_value;
-			clif_updatestatus(pl_sd, SP_STR + index);
-			clif_updatestatus(pl_sd, SP_USTR + index);
-			status_calc_pc(pl_sd, 0);
-			count++;
-		}
-	}
-
-	if (count > 0) // if at least 1 stat modified
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(84)); // All stats changed!
-		if (fd != pl_sd->fd)
-			clif_displaymessage(fd, "Player's stats changed"); // All stats changed!
-	}
-	else {
-		if (value < 0)
-			clif_displaymessage(fd, msg_txt(177)); // Impossible to decrease a stat.
-		else
-			clif_displaymessage(fd, msg_txt(178)); // Impossible to increase a stat.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Gives/Removes a peco from a player [HiddenDragon]
- *------------------------------------------*/
-int charcommand_mount_peco(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char character[NAME_LENGTH];
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #mount/#mountpeco <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (!pc_isriding(pl_sd))
-	{ // if actually no peco
-		if (!pc_checkskill(pl_sd, KN_RIDING))
-		{
-			clif_displaymessage(fd, msg_txt(217));	// This player cannot mount a Peco Peco with his/her current job.
-			return -1;
-		}
-
-		if (pl_sd->disguise)
-		{
-			clif_displaymessage(fd, msg_txt(215)); // This player cannot mount a Peco Peco while in disguise.
-			return -1;
-		}
-
-		pc_setoption(pl_sd, pl_sd->sc.option | OPTION_RIDING);
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, "Player mounted a peco.");
-		clif_displaymessage(pl_sd->fd, msg_txt(216));	// This player has mounted a Peco Peco.
-	}
-	else
-	{	//Dismount
-		pc_setoption(pl_sd, pl_sd->sc.option & ~OPTION_RIDING);
-		clif_displaymessage(pl_sd->fd, msg_txt(218)); // This player's Peco Peco has been released.
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, "Player unmounted a peco.");
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Remove items from a player (now a char command) [HiddenDragon]
- *------------------------------------------*/
-int charcommand_delitem(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct map_session_data *pl_sd;
-	char item_name[100];
-	int i, number = 0, item_id, item_position, count;
-	struct item_data *item_data;
-	char character[NAME_LENGTH];
-	char output[200];
-
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-	memset(item_name, '\0', sizeof(item_name));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || (
-		sscanf(message, "\"%99[^\"]\" %d %23[^\n]", item_name, &number, character) < 3 &&
-		sscanf(message, "%s %d %23[^\n]", item_name, &number, character) < 3
-	) || number < 1) {
-		clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: #delitem <item_name_or_ID> <quantity> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	item_id = 0;
-	if ((item_data = itemdb_searchname(item_name)) != NULL ||
-	    (item_data = itemdb_exists(atoi(item_name))) != NULL)
-		item_id = item_data->nameid;
-	
-	if (item_id > 500) {
-		item_position = pc_search_inventory(pl_sd, item_id);
-		if (item_position >= 0) {
-			count = 0;
-			for(i = 0; i < number && item_position >= 0; i++) {
-
-				//Logs (A)dmins items [Lupus]
-				if(log_config.enable_logs&0x400)
-					log_pick_pc(pl_sd, "A", pl_sd->status.inventory[item_position].nameid, -1, &pl_sd->status.inventory[item_position]);
-
-				pc_delitem(pl_sd, item_position, 1, 0);
-				count++;
-				item_position = pc_search_inventory(pl_sd, item_id); // for next loop
-			}
-			sprintf(output, msg_txt(113), count); // %d item(s) removed by a GM.
-			clif_displaymessage(pl_sd->fd, output);
-			if (number == count)
-				sprintf(output, msg_txt(114), count); // %d item(s) removed from the player.
-			else
-				sprintf(output, msg_txt(115), count, count, number); // %d item(s) removed. Player had only %d on %d items.
-			clif_displaymessage(fd, output);
-		} else {
-			clif_displaymessage(fd, msg_txt(116)); // Character does not have the specified item.
-			return -1;
-		}
-	}
-	else
-	{
-		clif_displaymessage(fd, msg_txt(19)); // Invalid item ID or name.
-		return -1;
-	}
-
-	return 0;
-}
-
-//Added by Coltaro
-//We're using this function here instead of using time_t so that it only counts player's jail time when he/she's online (and since the idea is to reduce the amount of minutes one by one in status_change_timer...).
-//Well, using time_t could still work but for some reason that looks like more coding x_x
-static void get_jail_time(int jailtime, int* year, int* month, int* day, int* hour, int* minute) {
-	const int factor_year = 518400; //12*30*24*60 = 518400
-	const int factor_month = 43200; //30*24*60 = 43200
-	const int factor_day = 1440; //24*60 = 1440
-	const int factor_hour = 60;
-
-	*year = jailtime/factor_year;
-	jailtime -= *year*factor_year;
-	*month = jailtime/factor_month;
-	jailtime -= *month*factor_month;
-	*day = jailtime/factor_day;
-	jailtime -= *day*factor_day;
-	*hour = jailtime/factor_hour;
-	jailtime -= *hour*factor_hour;
-	*minute = jailtime;
-
-	*year = *year > 0? *year : 0;
-	*month = *month > 0? *month : 0;
-	*day = *day > 0? *day : 0;
-	*hour = *hour > 0? *hour : 0;
-	*minute = *minute > 0? *minute : 0;
-	return;
-}
-
-/*==========================================
- * Jail a player for a certain amount of time [Coltaro]
- *------------------------------------------*/
-int charcommand_jailtime(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{  
-	struct map_session_data* pl_sd;
-	int year, month, day, hour, minute;
-	char character[NAME_LENGTH];
-	char output[200];
-	memset(character, '\0', sizeof(character));
-
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #jailtime <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (!pl_sd->sc.data[SC_JAILED]) {
-		clif_displaymessage(fd, "This player is not in jail.");
-		return -1;
-	}
-
-	if (pl_sd->sc.data[SC_JAILED]->val1 == INT_MAX) {
-		clif_displaymessage(fd, "This player has been jailed indefinitely.");
-		return 0;
-	}
-
-	if (pl_sd->sc.data[SC_JAILED]->val1 <= 0) { // Was not jailed with @jailfor (maybe @jail? or warped there? or got recalled?)
-		clif_displaymessage(fd, "This player has been jailed for an unknown amount of time.");
-		return -1;
-	}
-	//Get remaining jail time
-	get_jail_time(pl_sd->sc.data[SC_JAILED]->val1,&year,&month,&day,&hour,&minute);
-	sprintf(output,msg_txt(402),"This player will remain",year,month,day,hour,minute); 
-	clif_displaymessage(fd, output);
-
-	return 0;
-}
-
-/*==========================================
- * Disguises a player [HiddenDragon]
- *------------------------------------------*/
-int charcommand_disguise(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int mob_id;
-	char mob_name[NAME_LENGTH];
-	struct map_session_data* pl_sd;
-	char character[NAME_LENGTH];
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-	memset(mob_name, '\0', sizeof(mob_name));
-
-	if (!message || !*message || sscanf(message, "%s %23[^\n]", mob_name, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a Monster/NPC name/id and a player name (usage: #disguise <monster_name_or_monster_ID> <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if ((mob_id = atoi(mob_name)) > 0)
-	{	//Acquired an ID
-		if (!mobdb_checkid(mob_id) && !npcdb_checkid(mob_id))
-			mob_id = 0; //Invalid id for either mobs or npcs.
-	}	else	{ //Acquired a Name
-		if ((mob_id = mobdb_searchname(mob_name)) == 0)
-		{
-			struct npc_data* nd = npc_name2id(mob_name);
-			if (nd != NULL)
-				mob_id = nd->class_;
-		}
-	}
-
-	if (mob_id == 0)
-	{
-		clif_displaymessage(fd, msg_txt(123)); // Monster/NPC name/id hasn't been found.
-		return -1;
-	}
-
-	if(pc_isriding(pl_sd))
-	{
-		//FIXME: wrong message [ultramage]
-		//clif_displaymessage(fd, msg_txt(228)); 	// Character cannot wear disguise while riding a PecoPeco.
-		return -1;
-	}
-
-	pc_disguise(pl_sd, mob_id);
-	clif_displaymessage(pl_sd->fd, msg_txt(122));	// Disguise applied.
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, msg_txt(140)); // Character's disguise applied.
-	
-	
-	return 0;
-}
-
-/*==========================================
- * Undisguises a player [HiddenDragon]
- *------------------------------------------*/
-int charcommand_undisguise(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data* pl_sd;
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #undisguise <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (pl_sd->disguise)
-	{
-		pc_disguise(pl_sd, 0);
-		clif_displaymessage(pl_sd->fd, msg_txt(124));	// Disguise removed from character
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(141));	// Undisguise applied
-	}
-	else {
-		clif_displaymessage(fd, msg_txt(142)); // Character is not disguised.
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Displays contents of target's cart [HiddenDragon]
- *------------------------------------------*/
-int charcommand_cart_list(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char outputtmp[200];
-	char output[200];
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	struct item_data *item_data, *item_temp;
-	int i, j, count = 0, counter = 0, counter2;
-	nullpo_retr(-1, sd);
-
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-	memset(outputtmp, '\0', sizeof(outputtmp));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #cartlist <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	for (i = 0; i < MAX_CART; i++) {
-		if (pl_sd->status.cart[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.cart[i].nameid)) != NULL) {
-			counter = counter + pl_sd->status.cart[i].amount;
-			count++;
-			if (count == 1) {
-				sprintf(output, "------ Cart items list of '%s' ------", pl_sd->status.name);
-				clif_displaymessage(fd, output);
-			}
-			if (pl_sd->status.cart[i].refine)
-				sprintf(output, "%d %s %+d (%s %+d, id: %d)", pl_sd->status.cart[i].amount, item_data->name, pl_sd->status.cart[i].refine, item_data->jname, pl_sd->status.cart[i].refine, pl_sd->status.cart[i].nameid);
-			else
-				sprintf(output, "%d %s (%s, id: %d)", pl_sd->status.cart[i].amount, item_data->name, item_data->jname, pl_sd->status.cart[i].nameid);
-			clif_displaymessage(fd, output);
-			memset(output, '\0', sizeof(output));
-			counter2 = 0;
-			for (j = 0; j < item_data->slot; j++) {
-				if (pl_sd->status.cart[i].card[j]) {
-					if ( (item_temp = itemdb_search(pl_sd->status.cart[i].card[j])) != NULL) {
-						if (output[0] == '\0')
-							sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						else
-							sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
-						strcat(output, outputtmp);
-					}
-				}
-			}
-			if (output[0] != '\0') {
-				output[strlen(output) - 2] = ')';
-				output[strlen(output) - 1] = '\0';
-				clif_displaymessage(fd, output);
-			}
-		}
-	}
-	if (count == 0)
-		clif_displaymessage(fd, "No item found in the cart of this player.");
-	else {
-		sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
-		clif_displaymessage(fd, output);
-	}
-
-	return 0;
-}
-
-static int charcommand_stopattack(struct block_list *bl,va_list ap)
-{
-	struct unit_data *ud = unit_bl2ud(bl);
-	int id = va_arg(ap, int);
-	if (ud && ud->attacktimer != INVALID_TIMER && (!id || id == ud->target))
-	{
-		unit_stop_attack(bl);
-		return 1;
-	}
-	return 0;
-}
-
-/*==========================================
- * Enable a player to kill players even when not in pvp [HiddenDragon]
- *------------------------------------------*/
-int charcommand_killer(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #killer <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	pl_sd->state.killer = !pl_sd->state.killer;
-
-	if(pl_sd->state.killer)
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(241));
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, "Target player can now kill anybody.");
-	}
-	else
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(287));
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(287));
-		pc_stop_attack(pl_sd);
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Enable other players to kill target even when not in pvp [HiddenDragon]
- *------------------------------------------*/
-int charcommand_killable(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-	
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #killable <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	pl_sd->state.killable = !pl_sd->state.killable;
-
-	if(pl_sd->state.killable)
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(242));
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(289));
-	}
-	else
-	{
-		clif_displaymessage(pl_sd->fd, msg_txt(288));
-		if (pl_sd->fd != fd)
-			clif_displaymessage(fd, msg_txt(290));
-		map_foreachinrange(charcommand_stopattack,&pl_sd->bl, AREA_SIZE, BL_CHAR, pl_sd->bl.id);
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Drop all of the target's possessions on the ground
- *------------------------------------------*/
-int charcommand_dropall(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int i;
-	struct map_session_data *pl_sd = NULL;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message)
-		return -1;
-	if((pl_sd=map_nick2sd((char *) message)) == NULL)
-		return -1;
-	for (i = 0; i < MAX_INVENTORY; i++) {
-		if (pl_sd->status.inventory[i].amount) {
-			if(pl_sd->status.inventory[i].equip != 0)
-				pc_unequipitem(pl_sd, i, 3);
-			pc_dropitem(pl_sd,  i, pl_sd->status.inventory[i].amount);
-		}
-	}
-
-	clif_displaymessage(pl_sd->fd, "All items dropped");
-	clif_displaymessage(fd, "It is done");
-
-	return 0;
-}
-
-/*==========================================
- * Put all of the target's possessions into storage
- *------------------------------------------*/
-int charcommand_storeall(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int i;
-	struct map_session_data *pl_sd = NULL;
-	nullpo_retr(-1, sd);
-
-	if (!message || !*message)
-		return -1;
-	if((pl_sd=map_nick2sd((char *) message)) == NULL)
-		return -1;
-
-	if (pl_sd->state.storage_flag != 1)
-  	{	//Open storage.
-		if( storage_storageopen(pl_sd) == 1 ) {
-			clif_displaymessage(fd, "The character currently can't use the storage.");
-			return 1;
-		}
-	}
-
-	for (i = 0; i < MAX_INVENTORY; i++) {
-		if (pl_sd->status.inventory[i].amount) {
-			if(pl_sd->status.inventory[i].equip != 0)
-				pc_unequipitem(pl_sd, i, 3);
-			storage_storageadd(pl_sd, i, sd->status.inventory[i].amount);
-		}
-	}
-	storage_storageclose(pl_sd);
-
-	clif_displaymessage(pl_sd->fd, "Everything you own has been put away for safe keeping.");
-	clif_displaymessage(pl_sd->fd, "go to the nearest kafka to retrieve it..");
-	clif_displaymessage(pl_sd->fd, "   -- the management");
-
-	clif_displaymessage(fd, "It is done");
-
-	return 0;
-}
-
-/*==========================================
- * Refreshes target [HiddenDragon]
- *------------------------------------------*/
-int charcommand_refresh(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #refresh <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	clif_refresh(pl_sd);
-	return 0;
-}
-
-
-/*==========================================
- * View target's exp [HiddenDragon]
- *------------------------------------------*/
-int charcommand_exp(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char output[200];
-	double nextb, nextj;
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-	
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #exp <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	nextb = pc_nextbaseexp(pl_sd);
-	if (nextb)
-		nextb = pl_sd->status.base_exp*100.0/nextb;
-	
-	nextj = pc_nextjobexp(pl_sd);
-	if (nextj)
-		nextj = pl_sd->status.job_exp*100.0/nextj;
-	
-	sprintf(output, "Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)", pl_sd->status.base_level, nextb, pl_sd->status.job_level, nextj);
-	clif_displaymessage(fd, output);
-	return 0;
-}
-
-/*==========================================
- * Makes monsters ignore target [HiddenDragon]
- *------------------------------------------*/ 
-int charcommand_monsterignore(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #monsterignore/#battleignore <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (!pl_sd->state.monster_ignore) {
-		pl_sd->state.monster_ignore = 1;
-		clif_displaymessage(pl_sd->fd, "You are now immune to attacks.");
-		if (fd != pl_sd->fd)
-			clif_displaymessage(pl_sd->fd, "Target player is now immune to attacks.");
-	} else {
-		pl_sd->state.monster_ignore = 0;
-		clif_displaymessage(sd->fd, "You are no longer immune to attacks.");
-		if (fd != pl_sd->fd)
-			clif_displaymessage(pl_sd->fd, "Target player is no longer immune to attacks.");
-
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Change target's size [HiddenDragon]
- *------------------------------------------*/
-int charcommand_size(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int size=0;
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &size, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #size <0-2> <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if(pl_sd->state.size) {
-		pl_sd->state.size=0;
-		pc_setpos(pl_sd, pl_sd->mapindex, pl_sd->bl.x, pl_sd->bl.y, 3);
-	}
-
-	if(size==1) {
-		pl_sd->state.size=1;
-		clif_specialeffect(&pl_sd->bl,420,AREA);
-		clif_displaymessage(fd, "Size changed."); 
-		if (fd != pl_sd->fd)
-			clif_displaymessage(pl_sd->fd, "Size changed."); 
-	} else if(size==2) {
-		pl_sd->state.size=2;
-		clif_specialeffect(&pl_sd->bl,422,AREA);
-		clif_displaymessage(fd, "Size changed."); 
-		if (fd != pl_sd->fd)
-			clif_displaymessage(pl_sd->fd, "Size changed."); 
-	}
-	else
-	{
-		clif_displaymessage(fd, "Size restored."); 
-		if (fd != pl_sd->fd)
-			clif_displaymessage(pl_sd->fd, "Size restored."); 
-	}
-
-
-	return 0;
-}
-
-/*==========================================
- * Level up target's homunculus [HiddenDragon]
- *------------------------------------------*/
-int charcommand_homlevel(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	TBL_HOM * hd;
-	int level = 0, i = 0;
-
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a player name and level (usage: #homlevel <# of levels> <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-		
-	if ( !merc_is_hom_active(pl_sd->hd) )
-	{
-		clif_displaymessage(fd, "Target player does not have a homunculus."); 
-		return 1;
-	}
-
-	hd = pl_sd->hd;
-	
-	for (i = 1; i <= level && hd->exp_next; i++){
-		hd->homunculus.exp += hd->exp_next;
-		merc_hom_levelup(hd);
-	}
-	status_calc_homunculus(hd,0);
-	status_percent_heal(&hd->bl, 100, 100);
-	clif_misceffect2(&hd->bl,568);
-	clif_displaymessage(pl_sd->fd, "Homunculus level changed."); 
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, "Player's homunculus level changed.");
-
-	return 0;
-}
-
-/*==========================================
- * Evolve target's homunculus [HiddenDragon]
- *------------------------------------------*/
-int charcommand_homevolution(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #homevolution <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if ( !merc_is_hom_active(pl_sd->hd) ) {
-		clif_displaymessage(fd, "Target player does not have a homunculus."); 
-		return -1;
-	}
-
-	if ( !merc_hom_evolution(pl_sd->hd) ) {
-		clif_displaymessage(fd, "Target homunculus cannot evolve."); 
-		return -1;
-	}
-
-	clif_displaymessage(pl_sd->fd, "Homunculus evolution initiated."); 
-	if (pl_sd->fd != fd)
-		clif_displaymessage(fd, "Homunculus evolution initiated."); 
-	return 0;
-}
-
-/*==========================================
- * Create a homunculus for target [HiddenDragon]
- *------------------------------------------*/
-int charcommand_makehomun(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int homunid;
-	
-	char character[NAME_LENGTH];
-	char output[200];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &homunid, character) < 2) {
-		sprintf(output, "Please, enter a player name (usage: #makehomun <homunculus id: %d-%d> <player>).", HM_CLASS_BASE, HM_CLASS_BASE + MAX_HOMUNCULUS_CLASS - 1);
-		clif_displaymessage(fd, output);
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-	
-	if( homunid < HM_CLASS_BASE || homunid > HM_CLASS_BASE + MAX_HOMUNCULUS_CLASS - 1 )
-	{
-		clif_displaymessage(fd, "Invalid homunculus ID."); 
-		return -1;
-	}
-	
-	if(pl_sd->status.hom_id == 0)
-	{
-		merc_create_homunculus_request(pl_sd,homunid);
-	}
-	else
-	{
-		clif_displaymessage(fd, "Target player already has a homunculus.");
-	}
-	return 0;
-}
-
-/*==========================================
- * Change Target's homunculus' friendlyness [HiddenDragon]
- *------------------------------------------*/
-int charcommand_homfriendly(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int friendly = 0;
-
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &friendly, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a player name and friendly value (usage: #homfriendly <0-1000> <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (merc_is_hom_active(pl_sd->hd)) {
-		if (friendly > 0 && friendly <= 1000) {
-			pl_sd->hd->homunculus.intimacy = friendly * 100 ;
-			clif_send_homdata(pl_sd,SP_INTIMATE,friendly);
-			clif_displaymessage(pl_sd->fd, "Homunculus friendly value changed."); 
-			if (fd != pl_sd->fd)
-				clif_displaymessage(fd, "Homunculus friendly value changed."); 
-		} else {
-			clif_displaymessage(fd, "Invalid friendly value."); 
-		}
-	}
-	else
-	{
-		clif_displaymessage(fd, "Target player's homunculus does not exist."); 
-		return -1;
-	}
-
-	return 0;
-}
-
-/*==========================================
- * Modify target's homunculus hunger [HiddenDragon]
- *------------------------------------------*/
-int charcommand_homhungry(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	int hungry = 0;
-
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-
-	if (!message || !*message || sscanf(message, "%d %23[^\n]", &hungry, character) < 2) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #homhungry <0-100> <player>).");
-		return -1;
-	}
-	
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if (pl_sd->status.hom_id > 0 && pl_sd->hd) {
-		struct homun_data *hd = pl_sd->hd;
-		if (hungry >= 0 && hungry <= 100) {
-			hd->homunculus.hunger = hungry;
-			clif_send_homdata(pl_sd,SP_HUNGRY,hd->homunculus.hunger);
-			clif_displaymessage(pl_sd->fd, "Homunculus hungry value changed."); 
-			if (fd != pl_sd->fd)
-				clif_displaymessage(fd, "Homunculus hungry value changed."); 
-		} else {
-			clif_displaymessage(fd, "Invalid hungry value."); 
-			return -1;
-		}
-	}
-	else
-	{
-		clif_displaymessage(fd, "Target player does not have a homunculus."); 
-		return -1;
-	}
-	
-
-	return 0;
-}
-
-/*==========================================
- * Show target's homunculus stats [HiddenDragon]
- *------------------------------------------*/
-int charcommand_hominfo(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
-	struct homun_data *hd;
-	struct status_data *status;
-	char output[200];
-	char character[NAME_LENGTH];
-	struct map_session_data *pl_sd;
-	memset(character, '\0', sizeof(character));
-	memset(output, '\0', sizeof(output));
-
-	if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
-		clif_displaymessage(fd, "Please, enter a player name (usage: #hominfo <player>).");
-		return -1;
-	}
-
-	if ( (pl_sd = map_nick2sd(character)) == NULL )
-	{
-		clif_displaymessage(fd, msg_txt(3)); // Character not found.
-		return -1;
-	}
-
-	if ( pc_isGM(sd) < pc_isGM(pl_sd) )
-	{
-		clif_displaymessage(fd, msg_txt(81)); // Your GM level don't authorise you to do this action on this player.
-		return -1;
-	}
-
-	if(!merc_is_hom_active(pl_sd->hd))
-		return -1;
-
-	hd = pl_sd->hd;
-	status = status_get_status_data(&hd->bl);
-	clif_displaymessage(fd, "Homunculus stats :");
-
-	snprintf(output, sizeof(output), "HP : %d/%d - SP : %d/%d", status->hp, status->max_hp, status->sp, status->max_sp);
-	clif_displaymessage(fd, output);
-
-	snprintf(output, sizeof(output), "ATK : %d - MATK : %d~%d", status->rhw.atk2 +status->batk, status->matk_min, status->matk_max);
-	clif_displaymessage(fd, output);
-
-	snprintf(output, sizeof(output), "Hungry : %d - Intimacy : %u", hd->homunculus.hunger, hd->homunculus.intimacy/100);
-	clif_displaymessage(fd, output);
-
-	snprintf(output, sizeof(output), "Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d", status->str, status->agi, status->vit, status->int_, status->dex, status->luk);
-	clif_displaymessage(fd, output);
-
-	return 0;
-}
-
-
-/*==========================================
- * charcommand_info[] structure definition
- *------------------------------------------*/
-
-CharCommandInfo charcommand_info[] = {
-	{ "job",               60,     charcommand_jobchange },
-	{ "jobchange",         60,     charcommand_jobchange },
-	{ "petrename",         50,     charcommand_petrename },
-	{ "petfriendly",       50,     charcommand_petfriendly },
-	{ "stats",             40,     charcommand_stats },
-	{ "option",            60,     charcommand_option },
-	{ "reset",             60,     charcommand_reset },
-	{ "save",              60,     charcommand_save },
-	{ "spiritball",        40,     charcommand_spiritball },
-	{ "itemlist",          40,     charcommand_itemlist },
-	{ "effect",            40,     charcommand_effect },
-	{ "storagelist",       40,     charcommand_storagelist },
-	{ "item",              60,     charcommand_item },
-	{ "warp",              60,     charcommand_warp },
-	{ "rura",              60,     charcommand_warp },
-	{ "rura+",             60,     charcommand_warp },
-	{ "zeny",              60,     charcommand_zeny },
-	{ "fakename",          50,     charcommand_fakename },
-	{ "baselvl",           60,     charcommand_baselevel },
-	{ "baselevel",         60,     charcommand_baselevel },
-	{ "blvl",              60,     charcommand_baselevel },
-	{ "blevel",            60,     charcommand_baselevel },
-	{ "joblvl",            60,     charcommand_joblevel },
-	{ "joblevel",          60,     charcommand_joblevel },
-	{ "jlvl",              60,     charcommand_joblevel },
-	{ "jlevel",            60,     charcommand_joblevel },
-	{ "questskill",        60,     charcommand_questskill },
-	{ "lostskill",         60,     charcommand_lostskill },
-	{ "skreset",           60,     charcommand_skreset },
-	{ "streset",           60,     charcommand_streset },
-	{ "model",             50,     charcommand_model },
-	{ "skpoint",           60,     charcommand_skpoint },
-	{ "stpoint",           60,     charcommand_stpoint },
-	{ "changesex",         60,     charcommand_changesex },
-	{ "feelreset",         60,     charcommand_feelreset },
-	{ "help",              20,     charcommand_help },
-	{ "load",              60,     charcommand_load },
-	{ "speed",             60,     charcommand_speed },
-	{ "storage",           60,     charcommand_storage },
-	{ "gstorage",          60,     charcommand_guildstorage },
-	{ "hide",              60,     charcommand_hide },
-	{ "alive",             60,     charcommand_alive },
-	{ "revive",            60,     charcommand_alive },
-	{ "heal",              60,     charcommand_heal },
-	{ "item2",             60,     charcommand_item2 },
-	{ "itemreset",         60,     charcommand_itemreset },
-	{ "refine",            60,     charcommand_refine },
-	{ "produce",           60,     charcommand_produce },
-	{ "str",               60,     charcommand_param },
-	{ "agi",               60,     charcommand_param },
-	{ "vit",               60,     charcommand_param },
-	{ "int",               60,     charcommand_param },
-	{ "dex",               60,     charcommand_param },
-	{ "luk",               60,     charcommand_param },
-	{ "glvl",              60,     charcommand_guildlevelup },
-	{ "glevel",            60,     charcommand_guildlevelup },
-	{ "guildlvl",          60,     charcommand_guildlevelup },
-	{ "guildlevel",        60,     charcommand_guildlevelup },
-	{ "hatch",             50,     charcommand_hatch },
-	{ "pethungry",         60,     charcommand_pethungry },
-	{ "allskill",          60,     charcommand_allskill },
-	{ "allskills",         60,     charcommand_allskill },
-	{ "skillall",          60,     charcommand_allskill },
-	{ "skillsall",         60,     charcommand_allskill },
-	{ "dye",               50,     charcommand_dye },
-	{ "hairstyle",         50,     charcommand_hair_style },
-	{ "hstyle",            50,     charcommand_hair_style },
-	{ "haircolor",         50,     charcommand_hair_color },
-	{ "hcolor",            50,     charcommand_hair_color },
-	{ "allstat",           60,     charcommand_allstats },
-	{ "allstats",          60,     charcommand_allstats },
-	{ "statall",           60,     charcommand_allstats },
-	{ "statsall",          60,     charcommand_allstats },
-	{ "mount",             50,     charcommand_mount_peco },
-	{ "mountpeco",         50,     charcommand_mount_peco },
-	{ "delitem",           60,     charcommand_delitem },
-	{ "jailtime",          40,     charcommand_jailtime },
-	{ "disguise",          60,     charcommand_disguise },
-	{ "undisguise",        60,     charcommand_undisguise },
-	{ "cartlist",          40,     charcommand_cart_list },
-	{ "killer",            60,     charcommand_killer },
-	{ "killable",          60,     charcommand_killable },
-	{ "dropall",           60,     charcommand_dropall },
-	{ "storeall",          60,     charcommand_storeall },
-	{ "refresh",           40,     charcommand_refresh },
-	{ "exp",                1,     charcommand_exp },
-	{ "monsterignore",     60,     charcommand_monsterignore },
-	{ "size",              50,     charcommand_size },
-	{ "hlvl",              60,     charcommand_homlevel },
-	{ "hlevel",            60,     charcommand_homlevel },
-	{ "homlvl",            60,     charcommand_homlevel },
-	{ "homlevel",          60,     charcommand_homlevel },
-	{ "homevolve",         60,     charcommand_homevolution },
-	{ "homevolution",      60,     charcommand_homevolution },
-	{ "homfriendly",       60,     charcommand_homfriendly },
-	{ "homhungry",         60,     charcommand_homhungry },
-	{ "hominfo",           40,     charcommand_hominfo },
-	{ "cash",              60,     charcommand_cash },
-	{ "points",            60,     charcommand_cash },
-};
-
-
-/*==========================================
- * Command lookup functions
- *------------------------------------------*/
-static CharCommandInfo* get_charcommandinfo_byname(const char* name)
-{
-	int i;
-	if( *name == charcommand_symbol ) name++; // for backwards compatibility
-	ARR_FIND( 0, ARRAYLENGTH(charcommand_info), i, strcmpi(charcommand_info[i].command, name) == 0 );
-	return ( i < ARRAYLENGTH(charcommand_info) ) ? &charcommand_info[i] : NULL;
-}
-
-static CharCommandInfo* get_charcommandinfo_byfunc(const CharCommandFunc func)
-{
-	int i;
-	ARR_FIND( 0, ARRAYLENGTH(charcommand_info), i, charcommand_info[i].func == func );
-	return ( i < ARRAYLENGTH(charcommand_info) ) ? &charcommand_info[i] : NULL;
-}
-
-
-/*==========================================
- * Retrieve the command's required gm level
- *------------------------------------------*/
-int get_charcommand_level(const CharCommandFunc func)
-{
-	CharCommandInfo* info = get_charcommandinfo_byfunc(func);
-	return ( info != NULL ) ? info->level : 100; // 100: command can not be used
-}
-
-
-/// Executes a char-command.
-/// To be called by internal server code (bypasses various restrictions).
-bool is_charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl)
-{
-	CharCommandInfo* info;
-	char command[100];
-	char args[100];
-	char output[200];
-	
-	if( !str || !*str )
-		return false;
-
-	if( *str != charcommand_symbol ) // check first char
-		return false;
-
-	if( sscanf(str, "%99s %99[^\n]", command, args) < 2 )
-		args[0] = '\0';
-
-	info = get_charcommandinfo_byname(command);
-	if( info == NULL || info->func == NULL || gmlvl < info->level )
-	{
-		if( gmlvl == 0 )
-			return false; // will just display as normal text
-		else
-		{
-			sprintf(output, msg_txt(153), command); // "%s is Unknown Command."
-			clif_displaymessage(fd, output);
-			return true;
-		}
-	}
-
-	if( log_config.gm && info->level >= log_config.gm )
-		log_atcommand(sd, str);
-
-	if( info->func(fd, sd, command, args) != 0 )
-	{
-		sprintf(output, msg_txt(154), command); // "%s failed."
-		clif_displaymessage(fd, output);
-	}
-	
-	return true;
-}
-
-/// Executes a char-command.
-/// To be used by player-invoked code (restrictions will be applied)
-bool is_charcommand(const int fd, struct map_session_data* sd, const char* message)
-{
-	int gmlvl = pc_isGM(sd);
-
-	nullpo_retr(false, sd);
-
-	if( !message || !*message )
-		return false;
-
-	if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCOMMAND )
-		return true; // so that it won't display as normal message
-
-	if( battle_config.atc_gmonly != 0 && gmlvl == 0 )
-		return false;
-
-	if( map[sd->bl.m].nocommand && gmlvl < map[sd->bl.m].nocommand )
-	{
-		clif_displaymessage(fd, msg_txt(143)); // "Commands are disabled on this map."
-		return false;
-	}
-	
-	// skip 10/11-langtype's codepage indicator, if detected
-	if( message[0] == '|' && strlen(message) >= 4 && message[3] == charcommand_symbol )
-		message += 3;
-
-	return is_charcommand_sub(fd,sd,message,gmlvl);
-}
-
-
-/*==========================================
- *
- *------------------------------------------*/
-int charcommand_config_read(const char* cfgName)
-{
-	char line[1024], w1[1024], w2[1024];
-	CharCommandInfo* p;
-	FILE* fp;
-
-	if( (fp = fopen(cfgName, "r")) == NULL )
-	{
-		ShowError("CharCommand configuration file not found: %s\n", cfgName);
-		return 1;
-	}
-
-	while( fgets(line, sizeof(line), fp) )
-	{
-		if( line[0] == '/' && line[1] == '/' )
-			continue;
-		
-		if( sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2 )
-			continue;
-		
-		p = get_charcommandinfo_byname(w1);
-		if( p != NULL )
-		{
-			p->level = atoi(w2);
-			p->level = cap_value(p->level, 0, 100);
-		}
-		else
-		if( strcmpi(w1, "import") == 0 )
-			charcommand_config_read(w2);
-		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] != '@' )  // symbol of atcommand
-			charcommand_symbol = w2[0];
-		else
-			ShowWarning("Unknown setting '%s' in file %s\n", w1, cfgName);
-	}
-	fclose(fp);
-
-	return 0;
-}

+ 0 - 19
src/map/charcommand.h

@@ -1,19 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHARCOMMAND_H_
-#define _CHARCOMMAND_H_
-
-//#include "map.h"
-struct map_session_data;
-
-extern char charcommand_symbol;
-typedef int (*CharCommandFunc)(const int fd, struct map_session_data* sd, const char* command, const char* message);
-
-bool is_charcommand(const int fd, struct map_session_data* sd, const char* message);
-bool is_charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
-int get_charcommand_level(const CharCommandFunc func);
-
-int charcommand_config_read(const char* cfgName);
-
-#endif /* _CHARCOMMAND_H_ */

+ 1 - 0
src/map/chat.c

@@ -6,6 +6,7 @@
 #include "../common/nullpo.h"
 #include "../common/showmsg.h"
 #include "../common/strlib.h"
+#include "../common/mmo.h"
 #include "atcommand.h" // msg_txt()
 #include "battle.h" // struct battle_config
 #include "clif.h"

+ 4 - 5
src/map/clif.c

@@ -23,7 +23,6 @@
 #include "script.h"
 #include "skill.h"
 #include "atcommand.h"
-#include "charcommand.h"
 #include "intif.h"
 #include "battle.h"
 #include "mob.h"
@@ -8215,7 +8214,7 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
 	if( !clif_process_message(sd, 0, &name, &namelen, &message, &messagelen) )
 		return;
 
-	if( is_atcommand(fd, sd, message) || is_charcommand(fd, sd, message) )
+	if( is_atcommand(fd, sd, message)  )
 		return;
 
 	if( sd->sc.data[SC_BERSERK] || (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT) )
@@ -8526,7 +8525,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd)
 	if( !clif_process_message(sd, 1, &target, &namelen, &message, &messagelen) )
 		return;
 
-	if (is_atcommand(fd, sd, message) || is_charcommand(fd, sd, message) )
+	if (is_atcommand(fd, sd, message)  )
 		return;
 
 	if (sd->sc.data[SC_BERSERK] || (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT))
@@ -10053,7 +10052,7 @@ void clif_parse_PartyMessage(int fd, struct map_session_data* sd)
 	if( !clif_process_message(sd, 0, &name, &namelen, &message, &messagelen) )
 		return;
 
-	if( is_atcommand(fd, sd, message) || is_charcommand(fd, sd, message) )
+	if( is_atcommand(fd, sd, message)  )
 		return;
 
 	if( sd->sc.data[SC_BERSERK] || (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT) )
@@ -10331,7 +10330,7 @@ void clif_parse_GuildMessage(int fd, struct map_session_data* sd)
 	if( !clif_process_message(sd, 0, &name, &namelen, &message, &messagelen) )
 		return;
 
-	if( is_atcommand(fd, sd, message) || is_charcommand(fd, sd, message) )
+	if( is_atcommand(fd, sd, message) )
 		return;
 
 	if( sd->sc.data[SC_BERSERK] || (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT) )

+ 1 - 5
src/map/map.c

@@ -38,7 +38,6 @@
 #include "homunculus.h"
 #include "mercenary.h"
 #include "atcommand.h"
-#include "charcommand.h"
 #include "log.h"
 #ifndef TXT_ONLY
 #include "mail.h"
@@ -2935,7 +2934,7 @@ int parse_console(char* buf)
 	ShowInfo("Type of command: '%s' || Command: '%s' || Map: '%s' Coords: %d %d\n", type, command, map, x, y);
 
 	if( n == 5 && strcmpi("admin",type) == 0 ){
-		if( !is_atcommand_sub(sd.fd,&sd,command,99) )
+		if( !is_atcommand_sub(sd.fd,&sd,command,99,sd.status.name) )
 			ShowInfo("Console: not atcommand\n");
 	} else if( n == 2 && strcmpi("server",type) == 0 ){
 		if( strcmpi("shutdown",command) == 0 ||
@@ -3468,8 +3467,6 @@ int do_init(int argc, char *argv[])
 			BATTLE_CONF_FILENAME = argv[i+1];
 		else if (strcmp(argv[i],"--atcommand_config") == 0 || strcmp(argv[i],"--atcommand-config") == 0)
 			ATCOMMAND_CONF_FILENAME = argv[i+1];
-		else if (strcmp(argv[i],"--charcommand_config") == 0 || strcmp(argv[i],"--charcommand-config") == 0)
-			CHARCOMMAND_CONF_FILENAME = argv[i+1];
 		else if (strcmp(argv[i],"--script_config") == 0 || strcmp(argv[i],"--script-config") == 0)
 			SCRIPT_CONF_NAME = argv[i+1];
 		else if (strcmp(argv[i],"--msg_config") == 0 || strcmp(argv[i],"--msg-config") == 0)
@@ -3511,7 +3508,6 @@ int do_init(int argc, char *argv[])
 	battle_config_read(BATTLE_CONF_FILENAME);
 	msg_config_read(MSG_CONF_NAME);
 	atcommand_config_read(ATCOMMAND_CONF_FILENAME);
-	charcommand_config_read(CHARCOMMAND_CONF_FILENAME);
 	script_config_read(SCRIPT_CONF_NAME);
 	inter_config_read(INTER_CONF_NAME);
 	log_config_read(LOG_CONF_NAME);

+ 0 - 1
src/map/map.h

@@ -620,7 +620,6 @@ extern char *LOG_CONF_NAME;
 extern char *MAP_CONF_NAME;
 extern char *BATTLE_CONF_FILENAME;
 extern char *ATCOMMAND_CONF_FILENAME;
-extern char *CHARCOMMAND_CONF_FILENAME;
 extern char *SCRIPT_CONF_NAME;
 extern char *MSG_CONF_NAME;
 extern char *GRF_PATH_FILENAME;

+ 1 - 0
src/map/pc.c

@@ -10,6 +10,7 @@
 #include "../common/strlib.h" // safestrncpy()
 #include "../common/timer.h"
 #include "../common/utils.h"
+#include "../common/mmo.h" //NAME_LENGTH
 
 #include "atcommand.h" // get_atcommand_level()
 #include "battle.h" // battle_config

+ 20 - 9
src/map/script.c

@@ -37,7 +37,6 @@
 #include "party.h"
 #include "guild.h"
 #include "atcommand.h"
-#include "charcommand.h"
 #include "log.h"
 #include "unit.h"
 #include "pet.h"
@@ -10686,7 +10685,7 @@ BUILDIN_FUNC(atcommand)
 			cmd++;
 	}
 
-	is_atcommand_sub(fd, sd, cmd, 99);
+	is_atcommand_sub(fd, sd, cmd, 99, sd->status.name);
 
 	return 0;
 }
@@ -10695,8 +10694,11 @@ BUILDIN_FUNC(charcommand)
 {
 	TBL_PC dummy_sd;
 	TBL_PC* sd;
+	TBL_PC* temp_sd;
+	char output[200], temp[200], command[200], charname[NAME_LENGTH], param[200];
 	int fd;
 	const char* cmd;
+	const char* message;
 
 	cmd = script_getstr(st,2);
 
@@ -10717,15 +10719,24 @@ BUILDIN_FUNC(charcommand)
 		}
 	}
 
-	// compatibility with previous implementation (deprecated!)
-	if(cmd[0] != charcommand_symbol)
+	if (*cmd == charcommand_symbol)
 	{
-		cmd += strlen(sd->status.name);
-		while(*cmd != charcommand_symbol && *cmd != 0)
-			cmd++;
+		if (sscanf(cmd, "%99s \"%23[^\"]\" %99[^\n]", command, charname, param) > 2
+		|| sscanf(cmd, "%99s %23s %99[^\n]", command, charname, param) > 2)
+		{
+			if ( (temp_sd = map_nick2sd(charname)) != NULL )
+			{
+				sprintf(output, "%s %s", cmd, param);
+				memcpy(temp, output, sizeof(output));
+				message = temp;
+				is_atcommand_sub(fd,sd,message,99,sd->status.name);
+			}
+		}
+	}
+	else {
+		ShowWarning("script: buildin_charcommand: No '#' symbol!");
+		script_reportsrc(st);
 	}
-
-	is_charcommand_sub(fd, sd, cmd, 99);
 
 	return 0;
 }

+ 0 - 8
vcproj-6/map-server_sql.dsp

@@ -215,14 +215,6 @@ SOURCE=..\src\map\battle.h
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\map\charcommand.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\map\charcommand.h
-# End Source File
-# Begin Source File
-
 SOURCE=..\src\map\chat.c
 # End Source File
 # Begin Source File

+ 0 - 8
vcproj-6/map-server_txt.dsp

@@ -199,10 +199,6 @@ SOURCE=..\src\map\battle.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\map\charcommand.c
-# End Source File
-# Begin Source File
-
 SOURCE=..\src\map\chat.c
 # End Source File
 # Begin Source File
@@ -319,10 +315,6 @@ SOURCE=..\src\map\battle.h
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\map\charcommand.h
-# End Source File
-# Begin Source File
-
 SOURCE=..\src\map\chat.h
 # End Source File
 # Begin Source File

+ 0 - 6
vcproj-7.1/map-server_sql.vcproj

@@ -160,12 +160,6 @@
 			<File
 				RelativePath="..\src\map\battle.h">
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c">
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h">
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c">
 			</File>

+ 0 - 6
vcproj-7.1/map-server_txt.vcproj

@@ -160,12 +160,6 @@
 			<File
 				RelativePath="..\src\map\battle.h">
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c">
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h">
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c">
 			</File>

+ 0 - 8
vcproj-8/map-server_sql.vcproj

@@ -353,14 +353,6 @@
 				RelativePath="..\src\map\battle.h"
 				>
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c"
-				>
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h"
-				>
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c"
 				>

+ 0 - 8
vcproj-8/map-server_txt.vcproj

@@ -218,14 +218,6 @@
 				RelativePath="..\src\map\battle.h"
 				>
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c"
-				>
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h"
-				>
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c"
 				>

+ 0 - 8
vcproj-9/map-server_sql.vcproj

@@ -358,14 +358,6 @@
 				RelativePath="..\src\map\battle.h"
 				>
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c"
-				>
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h"
-				>
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c"
 				>

+ 9 - 17
vcproj-9/map-server_txt.vcproj

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
 	ProjectType="Visual C++"
-	Version="9,00"
+	Version="9.00"
 	Name="map-server_txt"
 	ProjectGUID="{D356871D-58E1-450B-967A-E1E9646175AF}"
 	RootNamespace="map-server_txt"
@@ -217,14 +217,6 @@
 				RelativePath="..\src\map\battle.h"
 				>
 			</File>
-			<File
-				RelativePath="..\src\map\charcommand.c"
-				>
-			</File>
-			<File
-				RelativePath="..\src\map\charcommand.h"
-				>
-			</File>
 			<File
 				RelativePath="..\src\map\chat.c"
 				>
@@ -265,6 +257,14 @@
 				RelativePath="..\src\map\guild.h"
 				>
 			</File>
+			<File
+				RelativePath="..\src\map\homunculus.c"
+				>
+			</File>
+			<File
+				RelativePath="..\src\map\homunculus.h"
+				>
+			</File>
 			<File
 				RelativePath="..\src\map\intif.c"
 				>
@@ -313,14 +313,6 @@
 				RelativePath="..\src\map\mapreg_txt.c"
 				>
 			</File>
-			<File
-				RelativePath="..\src\map\homunculus.c"
-				>
-			</File>
-			<File
-				RelativePath="..\src\map\homunculus.h"
-				>
-			</File>
 			<File
 				RelativePath="..\src\map\mercenary.c"
 				>