# This patch file was generated by NetBeans IDE
# Following Index: paths are relative to: /home/lighta/Documents/Myscript/RO/Servs/rathena
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: conf/msg_conf/char_msg.conf
--- conf/msg_conf/char_msg.conf No Base Revision
+++ conf/msg_conf/char_msg.conf Locally New
@@ -0,0 +1,129 @@
+// rAthena msg_athena.conf
+// Message Configuration of char-server
+// -----------------------
+0: Novice
+1: Swordsman
+2: Magician
+3: Archer
+4: Acolyte
+5: Merchant
+6: Thief
+7: Knight
+8: Priest
+9: Wizard
+10: Blacksmith
+11: Hunter
+12: Assassin
+13: Crusader
+14: Monk
+15: Sage
+16: Rogue
+17: Alchemist
+18: Bard
+19: Dancer
+20: Wedding
+21: Super Novice
+22: Gunslinger
+23: Ninja
+24: Christmas
+25: High Novice
+26: High Swordsman
+27: High Magician
+28: High Archer
+29: High Acolyte
+30: High Merchant
+31: High Thief
+32: Lord Knight
+33: High Priest
+34: High Wizard
+35: Whitesmith
+//35: Mastersmith //IRO name
+36: Sniper
+37: Assassin Cross
+38: Paladin
+39: Champion
+40: Professor
+//40: Scholar //IRO name
+41: Stalker
+42: Creator
+//42: Biochemist //IRO Name
+43: Clown
+//43: Minstrel //IRO Name
+44: Gypsy
+45: Baby Novice
+46: Baby Swordsman
+47: Baby Magician
+48: Baby Archer
+49: Baby Acolyte
+50: Baby Merchant
+51: Baby Thief
+52: Baby Knight
+53: Baby Priest
+54: Baby Wizard
+55: Baby Blacksmith
+56: Baby Hunter
+57: Baby Assassin
+58: Baby Crusader
+59: Baby Monk
+60: Baby Sage
+61: Baby Rogue
+62: Baby Alchemist
+63: Baby Bard
+64: Baby Dancer
+65: Super Baby
+66: Taekwon
+67: Star Gladiator
+68: Soul Linker
+//79: FREE
+//70: FREE
+71: Summer
+72: Gangsi
+73: Death Knight
+74: Dark Collector
+75: Rune Knight
+76: Warlock
+77: Ranger
+78: Arch Bishop
+79: Mechanic
+80: Guillotine Cross
+81: Royal Guard
+82: Sorcerer
+83: Minstrel
+//83: Maestro //IRO Name
+84: Wanderer
+85: Sura
+86: Genetic
+//86: Geneticist //IRO Name
+87: Shadow Chaser
+88: Baby Rune Knight
+89: Baby Warlock
+90: Baby Ranger
+91: Baby Arch Bishop
+92: Baby Mechanic
+93: Baby Guillotine Cross
+94: Baby Royal Guard
+95: Baby Sorcerer
+96: Baby Minstrel
+97: Baby Wanderer
+98: Baby Sura
+99: Baby Genetic
+100: Baby Shadow Chaser
+101: Expanded Super Novice
+102: Expanded Super Baby
+103: Kagerou
+104: Oboro
+105: Unknown Job
+
+//Auction
+200: Auction Manager
+201: Auction
+202: Thanks, you won the auction!.
+203: Payment for your auction!.
+204: No buyers have been found for your auction.
+205: Auction canceled.
+206: Auction closed.
+207: Auction winner.
+208: Someone has placed a higher bid.
+209: You have placed a higher bid.
+210: You have won the auction.
+211: Payment for your auction!.
Index: conf/msg_conf/login_msg.conf
--- conf/msg_conf/login_msg.conf No Base Revision
+++ conf/msg_conf/login_msg.conf Locally New
@@ -0,0 +1,26 @@
+// rAthena msg_athena.conf
+// Message Configuration of login-server
+// -----------------------
+0: Unregistered ID.
+1: Incorrect Password.
+2: Account Expired.
+3: Rejected from server.
+4: Blocked by GM.
+5: Not latest game EXE.
+6: Banned.
+7: Server Over-population.
+8: Account limit from company
+9: Ban by DBA
+10: Email not confirmed
+11: Ban by GM
+12: Working in DB
+13: Self Lock
+14: Not Permitted Group
+15: Not Permitted Group
+16: Account gone.
+17: Login info remains.
+18: Hacking investigation.
+19: Bug investigation.
+20: Deleting char.
+21: Deleting spouse char.
+22: Unknown Error.
Index: conf/msg_conf/map_msg.conf
--- conf/msg_conf/map_msg.conf No Base Revision
+++ conf/msg_conf/map_msg.conf Locally New
@@ -0,0 +1,1413 @@
+// rAthena msg_athena.conf
+// Message Configuration
+// For translation, just change msg here (second line), no need to modify source code,
+// or alternatively, use conf/import/msg_conf.txt
+// Format:
+// // English message
+// msg_number: translated message
+
+// 0-410: reserved for GM commands
+// 500-900 reserved for others
+// 900-1300: @atcommand
+
+// To disable a string (%s) field, make it's max length 0:
+// eg:
+// 270: *%s %s* (@me format)
+// 270: *%.0s%s* (remove the character's name from it)
+
+// Messages of GM commands
+// -----------------------
+
+0: Warped.
+1: Map not found.
+2: Invalid coordinates, using random target cell.
+3: Character not found.
+4: Jump to %s
+5: Jump to %d %d
+6: Your save point has been changed.
+7: Warping to save point.
+8: Speed changed.
+9: Options changed.
+10: Invisible: Off
+11: Invisible: On
+12: Your job has been changed.
+13: You've died.
+14: Character killed.
+15: Player warped (message sent to player too).
+16: You've been revived!
+17: HP, SP recovered.
+18: Item created.
+19: Invalid item ID or name.
+20: All of your items have been removed.
+21: Base level raised.
+22: Base level lowered.
+23: Job level can't go any higher.
+24: Job level raised.
+25: Job level lowered.
+26: Help commands:
+27: Commands help is not available.
+28: No player found.
+29: 1 player found.
+30: %d players found.
+31: PvP: Off.
+32: PvP: On.
+33: GvG: Off.
+34: GvG: On.
+35: You can't use this command with this class.
+36: Appearance changed.
+37: An invalid number was specified.
+38: Invalid location number, or name.
+39: All monsters summoned!
+40: Invalid monster ID or name.
+41: Unable to decrease the number/value.
+42: Stat changed.
+43: You're not in a guild.
+44: You're not the master of your guild.
+45: Guild level change failed.
+46: %s recalled!
+47: Base level can't go any higher.
+48: Character's job changed.
+49: Invalid job ID.
+50: You already have some GM powers.
+51: Character revived.
+52: This option cannot be used in PK Mode.
+53: '%s' stats:
+54: No player found in map '%s'.
+55: 1 player found in map '%s'.
+56: %d players found in map '%s'.
+57: Character's save point changed.
+58: Character's options changed.
+59: Night Mode Activated.
+60: Day Mode Activated.
+61: The holy messenger has given judgement.
+62: Judgement has passed.
+63: Mercy has been shown.
+64: Mercy has been granted.
+65: Character's base level raised.
+66: Character's base level lowered.
+67: Character's job level can't go any higher.
+68: character's job level raised.
+69: Character's job level lowered.
+70: You have learned the skill.
+71: You have forgotten the skill.
+72: War of Emperium has been initiated.
+73: War of Emperium is currently in progress.
+74: War of Emperium has been ended.
+75: War of Emperium is currently not in progress.
+76: All skills have been added to your skill tree.
+77: The reference result of '%s' (name: id):
+78: %s: %d
+79: It is %d affair above.
+80: Give the display name or monster name/id please.
+81: Your GM level doesn't authorize you to preform this action on the specified player.
+82: Please provide a name or number from the list provided:
+83: Monster 'Emperium' cannot be spawned.
+84: All stats changed!
+85: Invalid time for ban command.
+86: Sorry, player names have to be at least 4 characters.
+87: Sorry, player names can be no longer than 23 characters.
+88: Sending request to login server...
+89: Night mode is already enabled.
+90: Day mode is already enabled.
+91: Character's base level can't go any higher.
+92: All characters recalled!
+93: All online characters of the %s guild have been recalled to your position.
+94: Incorrect name/ID, or no one from the specified guild is online.
+95: All online characters of the %s party have been recalled to your position.
+96: Incorrect name/ID, or no one from the specified party is online.
+97: Item database has been reloaded.
+98: Monster database has been reloaded.
+99: Skill database has been reloaded.
+100: Scripts have been reloaded.
+101: Login-server asked to reload GM accounts and their level.
+102: You have mounted a Peco Peco.
+103: No longer spying on the %s guild.
+104: Spying on the %s guild.
+105: No longer spying on the %s party.
+106: Spying on the %s party.
+107: All items have been repaired.
+108: No item need to be repaired.
+109: Player has been nuked!
+110: NPC Enabled.
+111: This NPC doesn't exist.
+112: NPC Disabled.
+113: %d item(s) removed by a GM.
+114: %d item(s) removed from the player.
+115: %d item(s) removed. Player had only %d on %d items.
+116: Character does not have the specified item.
+117: You have been placed in jail by a GM.
+118: Player warped to jail.
+119: This player is not in jail.
+120: A GM has discharged you from jail.
+121: Player unjailed.
+122: Disguise applied.
+123: Invalid Monster/NPC name/ID specified.
+124: Undisguise applied.
+125: You're not disguised.
+//Clone Messages
+126: Cannot clone a player of higher GM level than yourself.
+127: You've reached your slave clones limit.
+128: Evil clone spawned.
+129: Unable to spawn evil clone.
+130: Clone spawned.
+131: Unable to spawn clone.
+132: Slave clone spawned.
+133: Unable to spawn slave clone.
+//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations of @clone)
+140: Character's disguise applied.
+141: Character's undisguise applied.
+142: Character is not disguised.
+143: Commands are disabled on this map.
+144: Invalid e-mail. If you have default e-mail, type [email protected].
+145: Invalid new e-mail. Please enter a real e-mail.
+146: New e-mail must be a real e-mail.
+147: New e-mail must be different from the current e-mail.
+148: Information sent to login-server via char-server.
+149: Impossible to increase the number/value.
+150: No GM found.
+151: 1 GM found.
+152: %d GMs found.
+153: %s is Unknown Command.
+154: %s failed.
+155: You are unable to change your job.
+156: HP or/and SP modified.
+157: HP and SP have already been recovered.
+158: Base level can't go any lower.
+159: Job level can't go any lower.
+160: PvP is already Off.
+161: PvP is already On.
+162: GvG is already Off.
+163: GvG is already On.
+164: Your memo point #%d doesn't exist.
+165: All monsters killed!
+166: No item has been refined.
+167: 1 item has been refined.
+168: %d items have been refined.
+169: The item (%d: '%s') is not equipable.
+170: The item is not equipable.
+171: %d - void
+//172: You replace previous memo position %d - %s (%d,%d).
+//173: Note: you don't have the 'Warp' skill level to use it.
+174: Number of status points changed.
+175: Number of skill points changed.
+176: Current amount of zeny changed.
+177: You cannot decrease that stat anymore.
+178: You cannot increase that stat anymore.
+179: Guild level changed.
+180: The monster/egg name/ID doesn't exist.
+181: You already have a pet.
+182: Pet intimacy changed.
+183: Pet intimacy is already at maximum.
+184: Sorry, but you have no pet.
+185: Pet hunger changed.
+186: Pet hunger is already at maximum.
+187: You can now rename your pet.
+188: You can already rename your pet.
+189: This player can now rename his/her pet.
+190: This player can already rename his/her pet.
+191: Sorry, but this player has no pet.
+192: Unable to change the specified character's job.
+193: Character's base level can't go any lower.
+194: Character's job level can't go any lower.
+195: All players have been kicked!
+196: You already have this quest skill.
+197: This skill number doesn't exist or isn't a quest skill.
+198: This skill number doesn't exist.
+199: This player has learned the skill.
+200: This player already has this quest skill.
+201: You don't have this quest skill.
+202: This player has forgotten the skill.
+203: This player doesn't have this quest skill.
+204: You can't open a shop on this cell.
+205: Maybe you meant:
+206: '%s' skill points reset.
+207: '%s' stats points reset.
+208: '%s' skill and stat points have been reset.
+209: Character's skill points changed.
+210: Character's status points changed.
+211: Character's current zeny changed.
+212: Cannot mount while in disguise.
+213: You can not mount a Peco Peco with your current job.
+214: You have released your Peco Peco.
+215: This player cannot mount a Peco Peco while in disguise.
+216: This player has mounted a Peco Peco.
+217: This player cannot mount a Peco Peco with his/her current job.
+218: This player's Peco Peco has been released.
+219: %d day
+220: %d days
+221: %s %d hour
+222: %s %d hours
+223: %s %d minute
+224: %s %d minutes
+225: %s and %d second
+226: %s and %d seconds
+227: Party modification is disabled on this map.
+228: Guild modification is disabled on this map.
+229: Your effect has changed.
+230: Server time (normal time): %A, %B %d %Y %X.
+231: Game time: The game is in permanent daylight.
+232: Game time: The game is in permanent night.
+233: Game time: The game is in night for %s.
+234: Game time: After, the game will be in permanent daylight.
+235: Game time: The game is in daylight for %s.
+236: Game time: After, the game will be in permanent night.
+237: Game time: After, the game will be in night for %s.
+238: Game time: A day cycle has a normal duration of %s.
+239: Game time: After, the game will be in daylight for %s.
+240: %d monster(s) summoned!
+241: You can now attack and kill players freely.
+242: You can now be attacked and killed by players.
+243: Skills have been disabled on this map.
+244: Skills have been enabled on this map.
+245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
+246: Your GM level doesn't authorize you to preform this action.
+247: You are not authorized to warp to this map.
+248: You are not authorized to warp from your current map.
+249: You are not authorized to warp to your save map.
+250: You have already opened your storage. Close it first.
+251: You have already opened your guild storage. Close it first.
+252: You are not in a guild.
+//253: You are not authorized to memo this map.
+254: GM command configuration has been reloaded.
+255: Battle configuration has been reloaded.
+256: Status database has been reloaded.
+257: Player database has been reloaded.
+258: Sent packet 0x%x (%d)
+259: Invalid packet
+260: This item cannot be traded.
+261: Script could not be loaded.
+262: Script loaded.
+263: This item cannot be dropped.
+264: This item cannot be stored.
+265: %s has bought your item(s).
+266: Some of your items cannot be vended and were removed from the shop.
+267: '%s' designated maps reset.
+268: Reloaded the Message of the Day.
+269: Displaying first %d out of %d matches
+//@me output format
+270: * :%s %s: *
+271: You can't drop items on this map
+272: You can't trade on this map
+273: Commands available:
+274: %d commands found.
+275: No commands found.
+276: You can't open a shop on this map
+277: Usage: @request <petition/message to online GMs>.
+278: (@request): %s
+279: @request sent.
+280: Invalid name.
+281: You can't create chat rooms on this map
+//Party-related
+282: You need to be a party leader to use this command.
+283: Target character must be online and in your current party.
+284: Leadership transferred.
+285: You've become the party leader.
+286: There's been no change in the setting.
+287: You cannot change party leaders on this map.
+//Missing stuff for @killer related commands.
+288: You are no longer killable.
+289: The player is now killable.
+290: The player is no longer killable.
+291: Weather effects will dispell on warp/refresh
+292: Killer state reset.
+// Guild Castles Number
+// --------------------
+//299: ?? Castles
+300: None Taken
+301: One Castle
+302: Two Castles
+303: Three Castles
+304: Four Castles
+305: Five Castles
+306: Six Castles
+307: Seven Castles
+308: Eight Castles
+309: Nine Castles
+310: Ten Castles
+311: Eleven Castles
+312: Twelve Castles
+313: Thirteen Castles
+314: Fourteen Castles
+315: Fifteen Castles
+316: Sixteen Castles
+317: Seventeen Castles
+318: Eighteen Castles
+319: Nineteen Castles
+320: Twenty Castles
+321: Twenty-One Castles
+322: Twenty-Two Castles
+323: Twenty-Three Castles
+324: Twenty-Four Castles
+325: Twenty-Five Castles
+326: Twenty-Six Castles
+327: Twenty-Seven Castles
+328: Twenty-Eight Castles
+329: Twenty-Nine Castles
+330: Thirty Castles
+331: Thirty-One Castles
+332: Thirty-Two Castles
+333: Thirty-Three Castles
+// 334: Thirty-Four Castles
+334: Total Domination
+
+// Templates for @who output
+343: Name: %s
+344: (%s)
+345: | Party: '%s'
+346: | Guild: '%s'
+//You may ommit the last %s, then you won't see players job name
+347: | Lv:%d/%d | Job: %s
+//You may ommit 2 last %d, then you won't see players coords, just map name
+348: | Location: %s %d %d
+
+// @duel (part 1)
+350: Duel: You can't use @invite. You aren't a duelist.
+351: Duel: The limit of players has been reached.
+352: Duel: Player name not found.
+353: Duel: The Player is in the duel already.
+354: Duel: Invitation has been sent.
+355: Duel: You can't use @duel without @reject.
+356: Duel: You can take part in duel once per %d minutes.
+357: Duel: Invalid value.
+358: Duel: You can't use @leave. You aren't a duelist.
+359: Duel: You've left the duel.
+360: Duel: You can't use @accept without a duel invitation.
+361: Duel: The duel invitation has been accepted.
+362: Duel: You can't use @reject without a duel invitation.
+363: Duel: The duel invitation has been rejected.
+364: Duel: You can't invite %s because he/she isn't on the same map.
+365: Duel: Can't use %s in duel.
+// @duel (part 2)
+370: -- Duels: %d/%d, Members: %d/%d, Max players: %d --
+371: -- Duels: %d/%d, Members: %d/%d --
+372: -- Duel has been created (Use @invite/@leave) --
+373: -- Player %s invites %s to duel --
+374: Blue -- Player %s invites you to PVP duel (Use @accept/@reject) --
+375: <- Player %s has left the duel --
+376: -> Player %s has accepted the duel --
+377: -- Player %s has rejected the duel --
+// Main chat
+380: Main chat has been activated.
+381: Main chat already activated.
+382: Main chat has been disabled.
+383: Main chat already disabled.
+384: Main chat is currently enabled. Usage: @main <on|off>, @main <message>.
+385: Main chat is currently disabled. Usage: @main <on|off>, @main <message>.
+386: %s :Main: %s
+387: You cannot use Main chat while muted.
+388: You should enable main chat with "@main on" command.
+//NoAsk
+390: Autorejecting is activated.
+391: Autorejecting is deactivated.
+392: You request has been rejected by autoreject option.
+393: Autorejected trade request from %s.
+394: Autorejected party invite from %s.
+395: Autorejected guild invite from %s.
+396: Autorejected alliance request from %s.
+397: Autorejected opposition request from %s.
+398: Autorejected friend request from %s.
+400: Usage: @jailfor <time> <character name>
+401: You have been jailed for %d years, %d months, %d days, %d hours and %d minutes
+402: %s in jail for %d years, %d months, %d days, %d hours and %d minutes
+// WoE SE (@agitstart2)
+403: War of Emperium SE has been initiated.
+404: War of Emperium SE is currently in progress.
+405: War of Emperium SE has been ended.
+406: War of Emperium SE is currently not in progress.
+//407 free
+//chrif related
+408: Need disconnection to perform change-sex request...
+409: Your sex has been changed (need disconnection by the server)...
+//410-411 used by cash shop
+412: Your account has 'Unregistered'.
+413: Your account has an 'Incorrect Password'...
+414: Your account has expired.
+415: Your account has been rejected from server.
+416: Your account has been blocked by the GM Team.
+417: Your Game's EXE file is not the latest version.
+418: Your account has been prohibited to log in.
+419: Server is jammed due to over populated.
+420: Your account has not more authorised.
+421: Your account has been totally erased.
+423: Your account has been banished until
+424: Login-server has been asked to %s the player '%.*s'.
+425: The player '%.*s' doesn't exist.
+426: Your GM level don't authorise you to %s the player '%.*s'.
+427: Login-server is offline. Impossible to %s the player '%.*s'.
+428: block
+429: ban
+430: unblock
+431: unban
+432: change the sex of
+
+// Homunculus messages
+450: You already have a homunculus
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+//500: FREE
+501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+502: Day Mode is activated
+503: Night Mode is activated
+
+// Cash point change messages
+504: Used %d kafra points and %d cash points. %d kafra and %d cash points remaining.
+505: Gained %d cash points. Total %d points.
+506: Gained %d kafra points. Total %d points.
+410: Removed %d cash points. Total %d points.
+411: Removed %d kafra points. Total %d points.
+
+// Trade Spoof Messages
+507: This player has been banned for %d minute(s).
+508: This player hasn't been banned (Ban option is disabled).
+//509 Available....
+
+// mail system
+//----------------------
+510: You have %d new emails (%d unread)
+
+// Bot detect messages (currently unused)
+535: Possible use of BOT (99%% of chance) or modified client by '%s' (account: %d, char_id: %d). This player ask your name when you are hidden.
+
+536: Character '%s' (account: %d) is trying to use a bot (it tries to detect a fake player).
+537: Character '%s' (account: %d) is trying to use a bot (it tries to detect a fake mob).
+// Trade Spoof Messages
+538: Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+539: This player has %d of a kind of item (id: %d), and tried to trade %d of them.
+540: This player has been definitivly blocked.
+// Rare Items Drop/Steal announce
+541: '%s' got %s's %s (chance: %0.02f%%)
+//541: %.0s%.0sSomeone got %s
+542: '%s' stole %s's %s (chance: %0.02f%%)
+//542: %.0s%.0sSomeone stole %s
+// 543~548 are not used (previously @away messages)
+// @Autotrade
+549: You should have a shop open to use @autotrade.
+
+//550 -> 650: Job Names
+550: Novice
+551: Swordsman
+552: Magician
+553: Archer
+554: Acolyte
+555: Merchant
+556: Thief
+557: Knight
+558: Priest
+559: Wizard
+560: Blacksmith
+561: Hunter
+562: Assassin
+563: Crusader
+564: Monk
+565: Sage
+566: Rogue
+567: Alchemist
+568: Bard
+569: Dancer
+570: Wedding
+571: Super Novice
+572: Gunslinger
+573: Ninja
+574: Christmas
+575: High Novice
+576: High Swordsman
+577: High Magician
+578: High Archer
+579: High Acolyte
+580: High Merchant
+581: High Thief
+582: Lord Knight
+583: High Priest
+584: High Wizard
+585: Whitesmith
+//585: Mastersmith //IRO name
+586: Sniper
+587: Assassin Cross
+588: Paladin
+589: Champion
+590: Professor
+//590: Scholar //IRO name
+591: Stalker
+592: Creator
+//592: Biochemist //IRO Name
+593: Clown
+//593: Minstrel //IRO Name
+594: Gypsy
+595: Baby Novice
+596: Baby Swordsman
+597: Baby Magician
+598: Baby Archer
+599: Baby Acolyte
+600: Baby Merchant
+601: Baby Thief
+602: Baby Knight
+603: Baby Priest
+604: Baby Wizard
+605: Baby Blacksmith
+606: Baby Hunter
+607: Baby Assassin
+608: Baby Crusader
+609: Baby Monk
+610: Baby Sage
+611: Baby Rogue
+612: Baby Alchemist
+613: Baby Bard
+614: Baby Dancer
+615: Super Baby
+616: Taekwon
+617: Star Gladiator
+618: Soul Linker
+//619: FREE
+//620: FREE
+621: Summer
+622: Gangsi
+623: Death Knight
+624: Dark Collector
+625: Rune Knight
+626: Warlock
+627: Ranger
+628: Arch Bishop
+629: Mechanic
+630: Guillotine Cross
+631: Royal Guard
+632: Sorcerer
+633: Minstrel
+//633: Maestro //IRO Name
+634: Wanderer
+635: Sura
+636: Genetic
+//636: Geneticist //IRO Name
+637: Shadow Chaser
+638: Baby Rune Knight
+639: Baby Warlock
+640: Baby Ranger
+641: Baby Arch Bishop
+642: Baby Mechanic
+643: Baby Guillotine Cross
+644: Baby Royal Guard
+645: Baby Sorcerer
+646: Baby Minstrel
+647: Baby Wanderer
+648: Baby Sura
+649: Baby Genetic
+650: Baby Shadow Chaser
+651: Expanded Super Novice
+652: Expanded Super Baby
+653: Kagerou
+654: Oboro
+655: Unknown Job
+
+// MvP Tomb
+// Added here so it can be easily translated
+656: Tomb
+657: [ ^EE0000%s^000000 ]
+658: Has met its demise
+659: Time of death : ^EE0000%s^000000
+660: Defeated by
+661: [^EE0000%s^000000]
+
+// Etc messages from source
+662: You're too close to a NPC, you must be at least %d cells away from any NPC.
+663: Duel: Can't use this item in duel.
+664: You cannot use this command when dead.
+665: Can't create chat rooms in this area.
+666: Pets are not allowed in Guild Wars.
+667: You're not dead.
+668: Your actual memo positions are:
+669: You broke the target's weapon.
+670: You can't leave battleground guilds.
+671: Friend already exists.
+672: Name not found in list.
+673: This action can't be performed at the moment. Please try again later.
+674: Friend removed.
+675: Cannot send mails too fast!!
+676: Alliances cannot be made during Guild Wars!
+677: Alliances cannot be broken during Guild Wars!
+678: You are no longer the Guild Master.
+679: You have become the Guild Master!
+680: You have been recovered!
+//681-899 free
+
+681: Rune Knight T
+682: Warlock T
+683: Ranger T
+684: Arch Bishop T
+685: Mechanic T
+686: Guillotine Cross T
+687: Royal Guard T
+688: Sorcerer T
+689: Minstrel T
+690: Wanderer T
+691: Sura T
+692: Genetic T
+693: Shadow Chaser T
+
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+900: Usage:
+901: @send len <packet hex number>
+902: @send <packet hex number> {<value>}*
+903: Value: <type=B(default),W,L><number> or S<length>"<string>"
+904: Packet 0x%x length: %d
+905: Unknown packet: 0x%x
+906: Not a string:
+907: Not a hexadecimal digit:
+908: Unknown type of value in:
+
+// @rura
+909: Please enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).
+
+// @where
+910: Please enter a player name (usage: @where <char name>).
+
+// @jumpto
+911: Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>).
+
+// @who
+912: (CID:%d/AID:%d)
+
+// @whogm
+913: Name: %s (GM)
+914: Name: %s (GM:%d) | Location: %s %d %d
+915: BLvl: %d | Job: %s (Lvl: %d)
+916: Party: '%s' | Guild: '%s'
+917: None
+
+// @speed
+918: Please enter a speed value (usage: @speed <%d-%d>).
+
+// @storage
+919: Storage opened.
+
+// @guildstorage
+920: Guild storage opened.
+
+// @option
+921: Please enter at least one option.
+
+// @jobchange
+922: Please enter a job ID.
+923: You can not change to this job by command.
+//924-979 free (future jobs?)
+
+// @kami
+980: Please enter a message (usage: @kami <message>).
+981: Please enter color and message (usage: @kamic <color> <message>).
+982: Invalid color.
+
+// @item
+983: Please enter an item name or ID (usage: @item <item name/ID> <quantity>).
+
+// @item2
+984: Please enter all parameters (usage: @item2 <item name/ID> <quantity>
+985: <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>).
+
+// @baselevelup
+986: Please enter a level adjustment (usage: @lvup/@blevel/@baselvlup <number of levels>).
+
+// @joblevelup
+987: Please enter a level adjustment (usage: @joblvup/@jlevel/@joblvlup <number of levels>).
+
+// @help
+988: There is no help for %c%s.
+989: Help for command %c%s:
+990: Available aliases:
+
+// @model
+991: Please enter at least one value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).
+
+// @dye
+992: Please enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).
+
+// @hairstyle
+993: Please enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).
+
+// @haircolor
+994: Please enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).
+
+// @go
+995: You cannot use @go on this map.
+
+// @refine
+996: Please enter a position and an amount (usage: @refine <equip position> <+/- amount>).
+997: %d: Lower Headgear
+998: %d: Right Hand
+999: %d: Garment
+1000: %d: Left Accessory
+1001: %d: Body Armor
+1002: %d: Left Hand
+1003: %d: Shoes
+1004: %d: Right Accessory
+1005: %d: Top Headgear
+1006: %d: Mid Headgear
+
+// @produce
+1007: Please enter at least one item name/ID (usage: @produce <equip name/ID> <element> <# of very's>).
+
+// @memo
+1008: Please enter a valid position (usage: @memo <memo_position:%d-%d>).
+
+// @displaystatus
+1009: Please enter a status type/flag (usage: @displaystatus <status type> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Please enter a number (usage: @stpoint <number of points>).
+
+// @skpoint
+1011: Please enter a number (usage: @skpoint <number of points>).
+
+// @zeny
+1012: Please enter an amount (usage: @zeny <amount>).
+
+// @param
+1013: Please enter a valid value (usage: @str/@agi/@vit/@int/@dex/@luk <+/-adjustment>).
+
+// @guildlevelup
+1014: Please enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).
+
+// @makeeg
+1015: Please enter a monster/egg name/ID (usage: @makeegg <pet>).
+
+// @petfriendly
+1016: Please enter a valid value (usage: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Please enter a valid number (usage: @pethungry <0-100>).
+
+// @recall
+1018: Please enter a player name (usage: @recall <char name/ID>).
+1019: You are not authorized to warp someone to this map.
+
+// @recall
+1020: You are not authorized to warp this player from their map.
+
+// @charblock
+1021: Please enter a player name (usage: @charblock/@block <char name>).
+
+// @charban
+1022: Please enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <char name>).
+1023: You are not allowed to reduce the length of a ban.
+
+// @charunblock
+1024: Please enter a player name (usage: @charunblock <char name>).
+
+// @charunban
+1025: Please enter a player name (usage: @charunban <char name>).
+
+// @kick
+1026: Please enter a player name (usage: @kick <char name/ID>).
+
+// @questskill / @lostskill
+1027: Please enter a quest skill number.
+
+// @spiritball
+1028: Please enter an amount (usage: @spiritball <number: 0-%d>).
+
+// @party
+1029: Please enter a party name (usage: @party <party_name>).
+
+// @guild
+1030: Please enter a guild name (usage: @guild <guild_name>).
+
+// @idsearch
+1031: Please enter part of an item name (usage: @idsearch <part_of_item_name>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: You are not authorized to warp somenone to your current map.
+1033: Because you are not authorized to warp from some maps, %d player(s) have not been recalled.
+
+// @guildrecall
+1034: Please enter a guild name/ID (usage: @guildrecall <guild_name/ID>).
+
+// @partyrecall
+1035: Please enter a party name/ID (usage: @partyrecall <party_name/ID>).
+
+// @reloadatcommand
+1036: Error reading groups.conf, reload failed.
+1037: Error reading atcommand_athena.conf, reload failed.
+
+// @mapinfo
+1038: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+1039: ------ Map Info ------
+1040: Map Name: %s | Players In Map: %d | NPCs In Map: %d | Chats In Map: %d
+1041: ------ Map Flags ------
+1042: Town Map
+1043: Autotrade Enabled
+1044: Autotrade Disabled
+1045: Battlegrounds ON
+1046: PvP Flags:
+1047: Pvp ON |
+1048: NoGuild |
+1049: NoParty |
+1050: NightmareDrop |
+1051: NoCalcRank |
+1052: GvG Flags:
+1053: GvG ON |
+1054: GvG Dungeon |
+1055: GvG Castle |
+1056: NoParty |
+1057: Teleport Flags:
+1058: NoTeleport |
+1059: Monster NoTeleport |
+1060: NoWarp |
+1061: NoWarpTo |
+1062: NoReturn |
+1063: NoGo |
+1064: NoMemo |
+1065: No Exp Penalty: %s | No Zeny Penalty: %s
+1066: On
+1067: Off
+1068: No Save (Return to last Save Point)
+1069: No Save, Save Point: %s,Random
+1070: No Save, Save Point: %s,%d,%d
+1071: Weather Flags:
+1072: Snow |
+1073: Fog |
+1074: Sakura |
+1075: Clouds |
+1076: Clouds2 |
+1077: Fireworks |
+1078: Leaves |
+//1079: Rain |
+1080: Displays Night |
+1081: Other Flags:
+1082: NoBranch |
+1083: NoTrade |
+1084: NoVending |
+1085: NoDrop |
+1086: NoSkill |
+1087: NoIcewall |
+1088: AllowKS |
+1089: Reset |
+1090: Other Flags:
+1091: NoCommand |
+1092: NoBaseEXP |
+1093: NoJobEXP |
+1094: NoMobLoot |
+1095: NoMVPLoot |
+1096: PartyLock |
+1097: GuildLock |
+1098: ----- Players in Map -----
+1099: Player '%s' (session #%d) | Location: %d,%d
+1100: ----- NPCs in Map -----
+1101: North
+1102: North West
+1103: West
+1104: South West
+1105: South
+1106: South East
+1107: East
+1108: North East
+1109: North
+1110: Unknown
+1111: NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d
+1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d
+1113: ----- Chats in Map -----
+1114: Chat: %s | Player: %s | Location: %d %d
+1115: Users: %d/%d | Password: %s | Public: %s
+1116: Yes
+1117: No
+1118: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+
+// @mount
+1119: You have mounted your Dragon.
+1120: You have released your Dragon.
+1121: You have mounted your Warg.
+1122: You have released your Warg.
+1123: You have mounted your Mado Gear.
+1124: You have released your Mado Gear.
+
+// @guildspy
+1125: The mapserver has spy command support disabled.
+1126: Please enter a guild name/ID (usage: @guildspy <guild_name/ID>).
+
+// @partyspy
+1127: Please enter a party name/ID (usage: @partyspy <party_name/ID>).
+
+// @nuke
+1128: Please enter a player name (usage: @nuke <char name>).
+
+// @tonpc
+1129: Please enter a NPC name (usage: @tonpc <NPC_name>).
+
+// @enablenpc
+1130: Please enter a NPC name (usage: @enablenpc <NPC_name>).
+
+// @hidenpc
+1131: Please enter a NPC name (usage: @hidenpc <NPC_name>).
+
+// @loadnpc
+1132: Please enter a script file name (usage: @loadnpc <file name>).
+
+// @npcoff
+1133: Please enter a NPC name (usage: @npcoff <NPC_name>).
+
+// @jail
+1134: Please enter a player name (usage: @jail <char_name>).
+
+// @unjail
+1135: Please enter a player name (usage: @unjail/@discharge <char_name>).
+
+// @jailfor
+1136: Invalid time for jail command.
+1137: You are now
+1138: This player is now
+
+// @jailtime
+1139: You are not in jail.
+1140: You have been jailed indefinitely.
+1141: You have been jailed for an unknown amount of time.
+1142: You will remain
+
+// @disguise
+1143: Please enter a Monster/NPC name/ID (usage: @disguise <name/ID>).
+1144: Character cannot be disguised while mounted.
+
+// @disguiseall
+1145: Please enter a Monster/NPC name/ID (usage: @disguiseall <name/ID>).
+
+// @disguiseguild
+1146: Please enter a mob name/ID and guild name/ID (usage: @disguiseguild <mob name/ID>, <guild name/ID>).
+
+// @undisguiseguild
+1147: Please enter guild name/ID (usage: @undisguiseguild <guild name/ID>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: Please enter a message (usage: @broadcast <message>).
+
+// @localbroadcast
+1150: Please enter a message (usage: @localbroadcast <message>).
+
+// @email
+1151: Please enter 2 emails (usage: @email <actual@email> <new@email>).
+
+// @effect
+1152: Please enter an effect number (usage: @effect <effect number>).
+
+// @npcmove
+1153: Usage: @npcmove <X> <Y> <npc_name>
+1154: NPC is not on this map.
+1155: NPC moved.
+
+// @addwarp
+1156: Usage: @addwarp <mapname> <X> <Y> <npc name>
+1157: Unknown map '%s'.
+1158: New warp NPC '%s' created.
+
+// @follow
+1159: Follow mode OFF.
+1160: Follow mode ON.
+
+// @storeall
+1161: You currently cannot open your storage.
+1162: All items stored.
+
+// @skillid
+1163: Please enter a skill name to look up (usage: @skillid <skill name>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Usage: @useskill <skill ID> <skill level> <target>
+
+// @displayskill
+1166: Usage: @displayskill <skill ID> {<skill level>}
+
+// @skilltree
+1167: Usage: @skilltree <skill ID> <target>
+1168: Player is using %s skill tree (%d basic points).
+1169: The player cannot use that skill.
+1170: Player requires level %d of skill %s.
+1171: The player meets all the requirements for that skill.
+
+// @marry
+1172: Usage: @marry <char name>
+1173: They are married... wish them well.
+1174: The two cannot wed because one is either a baby or already married.
+
+// @divorce
+1175: '%s' is not married.
+1176: '%s' and his/her partner are now divorced.
+
+// @changelook
+1177: Usage: @changelook {<position>} <view id>
+1178: Position: 1-Top 2-Middle 3-Bottom 4-Weapon 5-Shield 6-Shoes 7-Robe
+
+// @autotrade
+1179: Autotrade is not allowed on this map.
+1180: You cannot autotrade when dead.
+
+// @changegm
+1181: You need to be a Guild Master to use this command.
+1182: You cannot change guild leaders on this map.
+1183: Usage: @changegm <guild_member_name>
+1184: Target character must be online and be a guild member.
+
+// @changeleader
+1185: Usage: @changeleader <party_member_name>
+
+// @partyoption
+1186: Usage: @partyoption <pickup share: yes/no> <item distribution: yes/no>
+
+// @autoloot
+1187: Autolooting items with drop rates of %0.02f%% and below.
+1188: Autoloot is now off.
+
+// @autolootitem
+1189: Item not found.
+1190: You're already autolooting this item.
+1191: Your autolootitem list is full. Remove some items first with @autolootid -<item name or ID>.
+1192: Autolooting item: '%s'/'%s' {%d}
+1193: You're currently not autolooting this item.
+1194: Removed item: '%s'/'%s' {%d} from your autolootitem list.
+1195: You can have %d items on your autolootitem list.
+1196: To add an item to the list, use "@alootid +<item name or ID>". To remove an item, use "@alootid -<item name or ID>".
+1197: "@alootid reset" will clear your autolootitem list.
+1198: Your autolootitem list is empty.
+1199: Items on your autolootitem list:
+1200: Your autolootitem list has been reset.
+
+// @rain
+//1201: The rain has stopped.
+//1202: It has started to rain.
+
+// @snow
+1203: Snow has stopped falling.
+1204: It has started to snow.
+
+// @sakura
+1205: Cherry tree leaves no longer fall.
+1206: Cherry tree leaves have begun to fall.
+
+// @clouds
+1207: The clouds has disappear.
+1208: Clouds appear.
+
+// @clouds2
+1209: The alternative clouds disappear.
+1210: Alternative clouds appear.
+
+// @fog
+1211: The fog has gone.
+1212: Fog hangs over.
+
+// @leaves
+1213: Leaves no longer fall.
+1214: Fallen leaves fall.
+
+// @fireworks
+1215: Fireworks have ended.
+1216: Fireworks are launched.
+
+// @sound
+1217: Please enter a sound filename (usage: @sound <filename>).
+
+// @mobsearch
+1218: Please enter a monster name (usage: @mobsearch <monster name>).
+1219: Invalid mob ID %s!
+1220: Mob Search... %s %s
+
+// @cleanmap
+1221: All dropped items have been cleaned up.
+
+// @npctalk
+1222: Please enter the correct parameters (usage: @npctalk <npc name>, <message>).
+1223: Please enter the correct parameters (usage: @npctalkc <color> <npc name>, <message>).
+
+// @pettalk
+1224: Please enter a message (usage: @pettalk <message>).
+
+// @summon
+1225: Please enter a monster name (usage: @summon <monster name> {duration}).
+
+// @adjgroup
+1226: Usage: @adjgroup <group_id>
+1227: Specified group does not exist.
+1228: Group changed successfully.
+1229: Your group has changed.
+
+// @trade
+1230: Please enter a player name (usage: @trade <char name>).
+
+// @setbattleflag
+1231: Usage: @setbattleflag <flag> <value>
+1232: Unknown battle_config flag.
+1233: Set battle_config as requested.
+
+// @unmute
+1234: Please enter a player name (usage: @unmute <char name>).
+1235: Player is not muted.
+1236: Player unmuted.
+
+// @mute
+1237: Usage: @mute <time> <char name>
+
+// @identify
+1238: There are no items to appraise.
+
+// @mobinfo
+1239: Please enter a monster name/ID (usage: @mobinfo <monster_name_or_monster_ID>).
+1240: MVP Monster: '%s'/'%s'/'%s' (%d)
+1241: Monster: '%s'/'%s'/'%s' (%d)
+1242: Lv:%d HP:%d Base EXP:%u Job EXP:%u HIT:%d FLEE:%d
+1243: DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d
+1244: ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d)
+1245: Drops:
+1246: This monster has no drops.
+1247: MVP Bonus EXP:%u
+1248: MVP Items:
+1249: This monster has no MVP prizes.
+
+// @showmobs
+1250: Invalid mob id %s!
+1251: Can't show boss mobs!
+1252: Mob Search... %s %s
+
+// @homlevel
+1253: Please enter a level adjustment (usage: @homlevel <number of levels>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: You do not have a homunculus.
+
+// @homevolve
+1255: Your homunculus doesn't evolve.
+
+// @makehomun
+1256: Please enter a homunculus ID (usage: @makehomun <homunculus id>).
+1257: Invalid Homunculus ID.
+
+// @homfriendly
+1258: Please enter a friendly value (usage: @homfriendly <friendly value [0-1000]>).
+
+// @homhungry
+1259: Please enter a hunger value (usage: @homhungry <hunger value [0-100]>).
+
+// @homtalk
+1260: Please enter a message (usage: @homtalk <message>).
+
+// @hominfo
+1261: Homunculus stats:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: Hungry: %d - Intimacy: %u
+1265: Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Homunculus growth stats (Lv %d %s):
+1267: Max HP: %d (%d~%d)
+1268: Max SP: %d (%d~%d)
+1269: Str: %d (%d~%d)
+1270: Agi: %d (%d~%d)
+1271: Vit: %d (%d~%d)
+1272: Int: %d (%d~%d)
+1273: Dex: %d (%d~%d)
+1274: Luk: %d (%d~%d)
+
+// @homshuffle
+1275: Homunculus stats altered.
+
+// @iteminfo
+1276: Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>).
+1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
+1278: None
+1279: With script
+1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
+1281: - Available in the shops only.
+1282: - Maximal monsters drop chance: %02.02f%%
+1283: - Monsters don't drop this item.
+
+// @whodrops
+1284: Please enter item name/ID (usage: @whodrops <item name/ID>).
+1285: Item: '%s'[%d]
+1286: - Item is not dropped by mobs.
+1287: - Common mobs with highest drop chance (only max %d are listed):
+
+// @whereis
+1288: Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>).
+1289: %s spawns in:
+1290: This monster does not spawn normally.
+
+// @adopt
+1291: Usage: @adopt <father>,<mother>,<child>
+1292: Adopting: --%s--%s--%s--\n
+1293: Cannot find player %s online.
+1294: They are family... wish them luck.
+
+// @version
+1295: rAthena Version SVN r%s
+1296: Cannot determine SVN revision.
+
+// @mutearea
+1297: Please enter a time in minutes (usage: @mutearea/@stfu <time in minutes>).
+
+// @rates
+1298: Experience rates: Base %.2fx / Job %.2fx
+1299: Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1300: Boss Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1301: Other Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Please enter a message (usage: @me <message>).
+
+// @size / @sizeall / @sizeguild
+1303: Size change applied.
+
+// @sizeguild
+1304: Please enter guild name/ID (usage: @sizeguild <size> <guild name/ID>).
+
+// @monsterignore
+1305: You are now immune to attacks.
+1306: Returned to normal state.
+
+// @fakename
+1307: Returned to real name.
+1308: You must enter a name.
+1309: Fake name must be at least two characters.
+1310: Fake name enabled.
+
+// @mapflag
+1311: Enabled Mapflags in this map:
+1312: Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Type "@mapflag available" to list the available mapflags.
+1314: Invalid flag name or flag.
+1315: Available Flags:
+
+// @showexp
+1316: Gained exp will not be shown.
+1317: Gained exp is now shown.
+
+// @showzeny
+1318: Gained zeny will not be shown.
+1319: Gained zeny is now shown.
+
+// @showdelay
+1320: Skill delay failures will not be shown.
+1321: Skill delay failures are now shown.
+
+// @cash
+1322: Please enter an amount.
+
+// @clone
+1323: You must enter a player name or ID.
+
+// @feelreset
+1324: Reset 'Feeling' maps.
+
+// @noks
+1325: [ K.S Protection Inactive ]
+1326: [ K.S Protection Active - Option: Party ]
+1327: [ K.S Protection Active - Option: Self ]
+1328: [ K.S Protection Active - Option: Guild ]
+1329: Usage: @noks <self|party|guild>
+
+// @allowks
+1330: [ Map K.S Protection Active ]
+1331: [ Map K.S Protection Inactive ]
+
+// @itemlist
+1332: ------ %s items list of '%s' ------
+1333: | equipped:
+1334: garment,
+1335: left accessory,
+1336: body/armor,
+1337: right hand,
+1338: left hand,
+1339: both hands,
+1340: feet,
+1341: right accessory,
+1342: lower head,
+1343: top head,
+1344: lower/top head,
+1345: mid head,
+1346: lower/mid head,
+1347: lower/mid/top head,
+1348: -> (pet egg, pet id: %u, named)
+1349: -> (pet egg, pet id: %u, unnamed)
+1350: -> (crafted item, creator id: %u, star crumbs %d, element %d)
+1351: -> (produced item, creator id: %u)
+1352: -> (card(s):
+1353: No item found in this player's %s.
+1354: %d item(s) found in %d %s slots.
+
+// @delitem
+1355: Please enter an item name/ID, a quantity, and a player name (usage: #delitem <player> <item_name_or_ID> <quantity>).
+
+// @font
+1356: Returning to normal font.
+1357: Use @font <1-9> to change your message font.
+1358: Use 0 or no parameter to return to normal font.
+1359: Invalid font. Use a value from 0 to 9.
+1360: Font changed.
+1361: Already using this font.
+
+// @new_mount
+1362: NOTICE: If you crash with mount your LUA is outdated.
+1363: You have mounted.
+1364: You have released your mount.
+
+// @accinfo
+1365: Usage: @accinfo/@accountinfo <account_id/char name>
+1366: You may search partial name by making use of '%' in the search, ex. "@accinfo %Mario%" lists all characters whose name contains "Mario".
+
+// @set
+1367: Usage: @set <variable name> <value>
+1368: Usage: ex. "@set PoringCharVar 50"
+1369: Usage: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: Usage: ex. "@set PoringCharVarSTR$" outputs its value, Super Duper String.
+1371: NPC variables may not be used with @set.
+1372: Instance variables may not be used with @set.
+1373: %s value is now :%d
+1374: %s value is now :%s
+1375: %s is empty
+1376: %s data type is not supported :%u
+
+// @reloadquestdb
+1377: Quest database has been reloaded.
+
+// @addperm
+1378: Usage: %s <permission_name>
+1379: -- Permission List
+1380: '%s' is not a known permission.
+1381: User '%s' already possesses the '%s' permission.
+1382: User '%s' doesn't possess the '%s' permission.
+1383: -- User '%s' Permissions
+1384: User '%s' permissions updated successfully. The changes are temporary.
+
+// @unloadnpcfile
+1385: Usage: @unloadnpcfile <file name>
+1386: File unloaded. Be aware that mapflags and monsters spawned directly are not removed.
+1387: File not found.
+
+// General command messages
+1388: Charcommand failed (usage: %c<command> <char name> <parameters>).
+1389: %s failed. Player not found.
+
+// @cart
+1390: Unknown Cart (usage: %s <0-%d>).
+1391: You do not possess a cart to be removed
+1392: Cart Added.
+
+// atcommand.c::is_atcommand
+1393: You can't use commands while dead.
+
+// @clearstorage
+1394: Your storage was cleaned.
+1395: Your guild storage was cleaned.
+
+// @clearcart
+1396: You do not have a cart to be cleaned.
+1397: Your cart was cleaned.
+
+// @skillid (extension)
+1398: -- Displaying first %d partial matches:
+
+//Custom translations
+import: conf/import/msg_conf.txt
Index: src/char/char.c
--- src/char/char.c Base (BASE)
+++ src/char/char.c Locally Modified (Based On LOCAL)
@@ -30,10 +30,14 @@
#include <stdlib.h>
// private declarations
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-#define LAN_CONF_NAME "conf/subnet_athena.conf"
-#define SQL_CONF_NAME "conf/inter_athena.conf"
+char* CHAR_CONF_NAME;
+char* LAN_CONF_NAME;
+char* SQL_CONF_NAME;
+char* MSG_CONF_NAME;
+#define CHAR_MAX_MSG 200
+static char* msg_table[CHAR_MAX_MSG]; // Login Server messages_conf
+
char char_db[256] = "char";
char scdata_db[256] = "sc_data";
char cart_db[256] = "cart_inventory";
@@ -4701,6 +4705,7 @@
flush_fifos();
+ do_final_msg();
do_final_mapif();
do_final_loginif();
@@ -4755,14 +4760,116 @@
}
+/*======================================================
+ * Login-Server help option info
+ *------------------------------------------------------*/
+static void char_helpscreen(bool do_exit)
+{
+ ShowInfo("Usage: %s [options]\n", SERVER_NAME);
+ ShowInfo("\n");
+ ShowInfo("Options:\n");
+ ShowInfo(" -?, -h [--help]\t\tDisplays this help screen.\n");
+ ShowInfo(" -v [--version]\t\tDisplays the server's version.\n");
+ ShowInfo(" --run-once\t\t\tCloses server after loading (testing).\n");
+ ShowInfo(" --char-config <file>\t\tAlternative char-server configuration.\n");
+ ShowInfo(" --lan-config <file>\tAlternative lag configuration.\n");
+ ShowInfo(" --inter-config <file>\t\tAlternative inter-server configuration.\n");
+ ShowInfo(" --msg-config <file>\t\tAlternative message configuration.\n");
+ if( do_exit )
+ exit(EXIT_SUCCESS);
+}
+
int do_init(int argc, char **argv)
{
+ int i=0;
//Read map indexes
mapindex_init();
start_point.map = mapindex_name2id("new_zone01");
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- char_lan_config_read((argc > 3) ? argv[3] : LAN_CONF_NAME);
+ CHAR_CONF_NAME = "conf/char_athena.conf";
+ LAN_CONF_NAME = "conf/subnet_athena.conf";
+ SQL_CONF_NAME = "conf/inter_athena.conf";
+ MSG_CONF_NAME = "conf/msg_conf/char_msg.conf";
+
+ msg_config_read(MSG_CONF_NAME); //for debug test
+
+ for( i = 1; i < argc ; i++ )
+ {
+ const char* arg = argv[i];
+
+ if( arg[0] != '-' && ( arg[0] != '/' || arg[1] == '-' ) )
+ {// -, -- and /
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ else if( (++arg)[0] == '-' )
+ {// long option
+ arg++;
+
+ if( strcmp(arg, "help") == 0 )
+ {
+ char_helpscreen(true);
+ }
+ else if( strcmp(arg, "version") == 0 )
+ {
+ display_versionscreen(true);
+ }
+ else if( strcmp(arg, "char-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ CHAR_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "lan-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ LAN_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "inter-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ SQL_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "msg-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ MSG_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "run-once") == 0 ) // close the login-server as soon as its done.. for testing [Celest]
+ {
+ runflag = CORE_ST_STOP;
+ }
+ else if( strcmp(arg, "display_msg") == 0 ) // close the login-server as soon as its done.. for testing [Celest]
+ {
+ int j;
+ ShowInfo("My msg_conf are\n");
+ for(j=0; j<10; j++){
+ ShowInfo("j=%i => %s\n",j,msg_txt(j));
+ }
+ exit(EXIT_SUCCESS);
+ }
+ else
+ {
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ else switch( arg[0] )
+ {// short option
+ case '?':
+ case 'h':
+ char_helpscreen(true);
+ break;
+ case 'v':
+ display_versionscreen(true);
+ break;
+ default:
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ msg_config_read(MSG_CONF_NAME);
+ char_config_read(CHAR_CONF_NAME);
+ char_lan_config_read(LAN_CONF_NAME);
sql_config_read(SQL_CONF_NAME);
if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
@@ -4846,3 +4953,13 @@
return 0;
}
+
+int char_msg_config_read(char *cfgName){
+ return _msg_config_read(cfgName,CHAR_MAX_MSG,msg_table);
+}
+const char* char_msg_txt(int msg_number){
+ return _msg_txt(msg_number,CHAR_MAX_MSG,msg_table);
+}
+void char_do_final_msg(void){
+ return _do_final_msg(CHAR_MAX_MSG,msg_table);
+}
\ No newline at end of file
Index: src/char/char.h
--- src/char/char.h Base (BASE)
+++ src/char/char.h Locally Modified (Based On LOCAL)
@@ -6,6 +6,7 @@
#include "../config/core.h"
#include "../common/core.h" // CORE_ST_LAST
+#include "../common/msg_conf.h"
enum E_CHARSERVER_ST
{
@@ -20,6 +21,13 @@
#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+#define msg_config_read(cfgName) char_msg_config_read(cfgName)
+#define msg_txt(msg_number) char_msg_txt(msg_number)
+#define do_final_msg() char_do_final_msg()
+int char_msg_config_read(char *cfgName);
+const char* char_msg_txt(int msg_number);
+void char_do_final_msg(void);
+
enum {
TABLE_INVENTORY,
TABLE_CART,
Index: src/char/int_auction.c
--- src/char/int_auction.c Base (BASE)
+++ src/char/int_auction.c Locally Modified (Based On LOCAL)
@@ -145,12 +145,12 @@
{
if( auction->buyer_id )
{
- mail_sendmail(0, "Auction Manager", auction->buyer_id, auction->buyer_name, "Auction", "Thanks, you won the auction!.", 0, &auction->item);
+ mail_sendmail(0, msg_txt(200), auction->buyer_id, auction->buyer_name, msg_txt(201), msg_txt(202), 0, &auction->item);
mapif_Auction_message(auction->buyer_id, 6); // You have won the auction
- mail_sendmail(0, "Auction Manager", auction->seller_id, auction->seller_name, "Auction", "Payment for your auction!.", auction->price, NULL);
+ mail_sendmail(0, msg_txt(200), auction->seller_id, auction->seller_name, msg_txt(201), msg_txt(203), auction->price, NULL);
}
else
- mail_sendmail(0, "Auction Manager", auction->seller_id, auction->seller_name, "Auction", "No buyers have been found for your auction.", 0, &auction->item);
+ mail_sendmail(0, msg_txt(200), auction->seller_id, auction->seller_name, msg_txt(201), msg_txt(204), 0, &auction->item);
ShowInfo("Auction End: id %u.\n", auction->auction_id);
@@ -353,7 +353,7 @@
return;
}
- mail_sendmail(0, "Auction Manager", auction->seller_id, auction->seller_name, "Auction", "Auction canceled.", 0, &auction->item);
+ mail_sendmail(0, msg_txt(200), auction->seller_id, auction->seller_name, msg_txt(201), msg_txt(205), 0, &auction->item);
auction_delete(auction);
mapif_Auction_cancel(fd, char_id, 0); // The auction has been canceled
@@ -392,9 +392,9 @@
}
// Send Money to Seller
- mail_sendmail(0, "Auction Manager", auction->seller_id, auction->seller_name, "Auction", "Auction closed.", auction->price, NULL);
+ mail_sendmail(0, msg_txt(200), auction->seller_id, auction->seller_name, msg_txt(201), msg_txt(206), auction->price, NULL);
// Send Item to Buyer
- mail_sendmail(0, "Auction Manager", auction->buyer_id, auction->buyer_name, "Auction", "Auction winner.", 0, &auction->item);
+ mail_sendmail(0, msg_txt(200), auction->buyer_id, auction->buyer_name, msg_txt(201), msg_txt(207), 0, &auction->item);
mapif_Auction_message(auction->buyer_id, 6); // You have won the auction
auction_delete(auction);
@@ -433,11 +433,11 @@
{ // Send Money back to the previous Buyer
if( auction->buyer_id != char_id )
{
- mail_sendmail(0, "Auction Manager", auction->buyer_id, auction->buyer_name, "Auction", "Someone has placed a higher bid.", auction->price, NULL);
+ mail_sendmail(0, msg_txt(200), auction->buyer_id, auction->buyer_name, msg_txt(201), msg_txt(208), auction->price, NULL);
mapif_Auction_message(auction->buyer_id, 7); // You have failed to win the auction
}
else
- mail_sendmail(0, "Auction Manager", auction->buyer_id, auction->buyer_name, "Auction", "You have placed a higher bid.", auction->price, NULL);
+ mail_sendmail(0, msg_txt(200), auction->buyer_id, auction->buyer_name, msg_txt(201), msg_txt(209), auction->price, NULL);
}
auction->buyer_id = char_id;
@@ -448,9 +448,9 @@
{ // Automatic won the auction
mapif_Auction_bid(fd, char_id, bid - auction->buynow, 1); // You have successfully bid in the auction
- mail_sendmail(0, "Auction Manager", auction->buyer_id, auction->buyer_name, "Auction", "You have won the auction.", 0, &auction->item);
+ mail_sendmail(0, msg_txt(200), auction->buyer_id, auction->buyer_name, msg_txt(201), msg_txt(210), 0, &auction->item);
mapif_Auction_message(char_id, 6); // You have won the auction
- mail_sendmail(0, "Auction Manager", auction->seller_id, auction->seller_name, "Auction", "Payment for your auction!.", auction->buynow, NULL);
+ mail_sendmail(0, msg_txt(200), auction->seller_id, auction->seller_name, msg_txt(201), msg_txt(211), auction->buynow, NULL);
auction_delete(auction);
return;
Index: src/char/inter.c
--- src/char/inter.c Base (BASE)
+++ src/char/inter.c Locally Modified (Based On LOCAL)
@@ -67,70 +67,6 @@
static DBMap* wis_db = NULL; // int wis_id -> struct WisData*
static int wis_dellist[WISDELLIST_MAX], wis_delnum;
-#define MAX_JOB_NAMES 106
-static char* msg_table[MAX_JOB_NAMES]; // messages 550 ~ 655 are job names
-
-const char* msg_txt(int msg_number) {
- msg_number -= 550;
- if (msg_number >= 0 && msg_number < MAX_JOB_NAMES &&
- msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
- return msg_table[msg_number];
-
- return "Unknown";
-}
-
-/*==========================================
- * Read Message Data -- at char server we only keep job names.
- *------------------------------------------*/
-int msg_config_read(const char* cfgName) {
- int msg_number;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- static int called = 1;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowError("Messages file not found: %s\n", cfgName);
- return 1;
- }
-
- if ((--called) == 0)
- memset(msg_table, 0, sizeof(msg_table[0]) * MAX_JOB_NAMES);
-
- while(fgets(line, sizeof(line), fp) ) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if (strcmpi(w1, "import") == 0)
- msg_config_read(w2);
- else {
- msg_number = atoi(w1);
- if( msg_number < 550 || msg_number > (550+MAX_JOB_NAMES) )
- continue;
- msg_number -= 550;
- if (msg_number >= 0 && msg_number < MAX_JOB_NAMES) {
- if (msg_table[msg_number] != NULL)
- aFree(msg_table[msg_number]);
- msg_table[msg_number] = (char *)aMalloc((strlen(w2) + 1)*sizeof (char));
- strcpy(msg_table[msg_number],w2);
- }
- }
- }
-
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * Cleanup Message Data
- *------------------------------------------*/
-void do_final_msg(void) {
- int i;
- for (i = 0; i < MAX_JOB_NAMES; i++)
- aFree(msg_table[i]);
-}
/* from pc.c due to @accinfo. any ideas to replace this crap are more than welcome. */
const char* job_name(int class_) {
switch (class_) {
@@ -141,7 +77,7 @@
case JOB_ACOLYTE:
case JOB_MERCHANT:
case JOB_THIEF:
- return msg_txt(550 - JOB_NOVICE+class_);
+ return msg_txt(JOB_NOVICE+class_);
case JOB_KNIGHT:
case JOB_PRIEST:
@@ -149,10 +85,10 @@
case JOB_BLACKSMITH:
case JOB_HUNTER:
case JOB_ASSASSIN:
- return msg_txt(557 - JOB_KNIGHT+class_);
+ return msg_txt(7 - JOB_KNIGHT+class_);
case JOB_KNIGHT2:
- return msg_txt(557);
+ return msg_txt(7);
case JOB_CRUSADER:
case JOB_MONK:
@@ -161,20 +97,20 @@
case JOB_ALCHEMIST:
case JOB_BARD:
case JOB_DANCER:
- return msg_txt(563 - JOB_CRUSADER+class_);
+ return msg_txt(13 - JOB_CRUSADER+class_);
case JOB_CRUSADER2:
- return msg_txt(563);
+ return msg_txt(13);
case JOB_WEDDING:
case JOB_SUPER_NOVICE:
case JOB_GUNSLINGER:
case JOB_NINJA:
case JOB_XMAS:
- return msg_txt(570 - JOB_WEDDING+class_);
+ return msg_txt(20 - JOB_WEDDING+class_);
case JOB_SUMMER:
- return msg_txt(621);
+ return msg_txt(71);
case JOB_NOVICE_HIGH:
case JOB_SWORDMAN_HIGH:
@@ -183,7 +119,7 @@
case JOB_ACOLYTE_HIGH:
case JOB_MERCHANT_HIGH:
case JOB_THIEF_HIGH:
- return msg_txt(575 - JOB_NOVICE_HIGH+class_);
+ return msg_txt(25 - JOB_NOVICE_HIGH+class_);
case JOB_LORD_KNIGHT:
case JOB_HIGH_PRIEST:
@@ -191,10 +127,10 @@
case JOB_WHITESMITH:
case JOB_SNIPER:
case JOB_ASSASSIN_CROSS:
- return msg_txt(582 - JOB_LORD_KNIGHT+class_);
+ return msg_txt(32 - JOB_LORD_KNIGHT+class_);
case JOB_LORD_KNIGHT2:
- return msg_txt(582);
+ return msg_txt(32);
case JOB_PALADIN:
case JOB_CHAMPION:
@@ -203,10 +139,10 @@
case JOB_CREATOR:
case JOB_CLOWN:
case JOB_GYPSY:
- return msg_txt(588 - JOB_PALADIN + class_);
+ return msg_txt(38 - JOB_PALADIN + class_);
case JOB_PALADIN2:
- return msg_txt(588);
+ return msg_txt(38);
case JOB_BABY:
case JOB_BABY_SWORDMAN:
@@ -215,7 +151,7 @@
case JOB_BABY_ACOLYTE:
case JOB_BABY_MERCHANT:
case JOB_BABY_THIEF:
- return msg_txt(595 - JOB_BABY + class_);
+ return msg_txt(45 - JOB_BABY + class_);
case JOB_BABY_KNIGHT:
case JOB_BABY_PRIEST:
@@ -223,10 +159,10 @@
case JOB_BABY_BLACKSMITH:
case JOB_BABY_HUNTER:
case JOB_BABY_ASSASSIN:
- return msg_txt(602 - JOB_BABY_KNIGHT + class_);
+ return msg_txt(52 - JOB_BABY_KNIGHT + class_);
case JOB_BABY_KNIGHT2:
- return msg_txt(602);
+ return msg_txt(52);
case JOB_BABY_CRUSADER:
case JOB_BABY_MONK:
@@ -235,26 +171,26 @@
case JOB_BABY_ALCHEMIST:
case JOB_BABY_BARD:
case JOB_BABY_DANCER:
- return msg_txt(608 - JOB_BABY_CRUSADER + class_);
+ return msg_txt(58 - JOB_BABY_CRUSADER + class_);
case JOB_BABY_CRUSADER2:
- return msg_txt(608);
+ return msg_txt(58);
case JOB_SUPER_BABY:
- return msg_txt(615);
+ return msg_txt(65);
case JOB_TAEKWON:
- return msg_txt(616);
+ return msg_txt(66);
case JOB_STAR_GLADIATOR:
case JOB_STAR_GLADIATOR2:
- return msg_txt(617);
+ return msg_txt(67);
case JOB_SOUL_LINKER:
- return msg_txt(618);
+ return msg_txt(68);
case JOB_GANGSI:
case JOB_DEATH_KNIGHT:
case JOB_DARK_COLLECTOR:
- return msg_txt(622 - JOB_GANGSI+class_);
+ return msg_txt(72 - JOB_GANGSI+class_);
case JOB_RUNE_KNIGHT:
case JOB_WARLOCK:
@@ -262,7 +198,7 @@
case JOB_ARCH_BISHOP:
case JOB_MECHANIC:
case JOB_GUILLOTINE_CROSS:
- return msg_txt(625 - JOB_RUNE_KNIGHT+class_);
+ return msg_txt(75 - JOB_RUNE_KNIGHT+class_);
case JOB_RUNE_KNIGHT_T:
case JOB_WARLOCK_T:
@@ -270,7 +206,7 @@
case JOB_ARCH_BISHOP_T:
case JOB_MECHANIC_T:
case JOB_GUILLOTINE_CROSS_T:
- return msg_txt(625 - JOB_RUNE_KNIGHT_T+class_);
+ return msg_txt(75 - JOB_RUNE_KNIGHT_T+class_);
case JOB_ROYAL_GUARD:
case JOB_SORCERER:
@@ -279,7 +215,7 @@
case JOB_SURA:
case JOB_GENETIC:
case JOB_SHADOW_CHASER:
- return msg_txt(631 - JOB_ROYAL_GUARD+class_);
+ return msg_txt(81 - JOB_ROYAL_GUARD+class_);
case JOB_ROYAL_GUARD_T:
case JOB_SORCERER_T:
@@ -288,23 +224,23 @@
case JOB_SURA_T:
case JOB_GENETIC_T:
case JOB_SHADOW_CHASER_T:
- return msg_txt(631 - JOB_ROYAL_GUARD_T+class_);
+ return msg_txt(81 - JOB_ROYAL_GUARD_T+class_);
case JOB_RUNE_KNIGHT2:
case JOB_RUNE_KNIGHT_T2:
- return msg_txt(625);
+ return msg_txt(75);
case JOB_ROYAL_GUARD2:
case JOB_ROYAL_GUARD_T2:
- return msg_txt(631);
+ return msg_txt(81);
case JOB_RANGER2:
case JOB_RANGER_T2:
- return msg_txt(627);
+ return msg_txt(77);
case JOB_MECHANIC2:
case JOB_MECHANIC_T2:
- return msg_txt(629);
+ return msg_txt(79);
case JOB_BABY_RUNE:
case JOB_BABY_WARLOCK:
@@ -319,30 +255,30 @@
case JOB_BABY_SURA:
case JOB_BABY_GENETIC:
case JOB_BABY_CHASER:
- return msg_txt(638 - JOB_BABY_RUNE+class_);
+ return msg_txt(88 - JOB_BABY_RUNE+class_);
case JOB_BABY_RUNE2:
- return msg_txt(638);
+ return msg_txt(88);
case JOB_BABY_GUARD2:
- return msg_txt(644);
+ return msg_txt(94);
case JOB_BABY_RANGER2:
- return msg_txt(640);
+ return msg_txt(90);
case JOB_BABY_MECHANIC2:
- return msg_txt(642);
+ return msg_txt(92);
case JOB_SUPER_NOVICE_E:
case JOB_SUPER_BABY_E:
- return msg_txt(651 - JOB_SUPER_NOVICE_E+class_);
+ return msg_txt(101 - JOB_SUPER_NOVICE_E+class_);
case JOB_KAGEROU:
case JOB_OBORO:
- return msg_txt(653 - JOB_KAGEROU+class_);
+ return msg_txt(103 - JOB_KAGEROU+class_);
default:
- return msg_txt(655);
+ return msg_txt(105);
}
}
@@ -791,7 +727,6 @@
inter_auction_sql_init();
geoip_readdb();
- msg_config_read("conf/msg_athena.conf");
return 0;
}
@@ -812,7 +747,6 @@
if (accreg_pt) aFree(accreg_pt);
- do_final_msg();
return;
}
Index: src/common/Makefile.in
--- src/common/Makefile.in Base (BASE)
+++ src/common/Makefile.in Locally Modified (Based On LOCAL)
@@ -3,7 +3,8 @@
obj_all/nullpo.o obj_all/malloc.o obj_all/showmsg.o obj_all/strlib.o obj_all/utils.o \
obj_all/grfio.o obj_all/mapindex.o obj_all/ers.o obj_all/md5calc.o \
obj_all/minicore.o obj_all/minisocket.o obj_all/minimalloc.o obj_all/random.o obj_all/des.o \
- obj_all/conf.o obj_all/thread.o obj_all/mutex.o obj_all/raconf.o obj_all/mempool.o
+ obj_all/conf.o obj_all/thread.o obj_all/mutex.o obj_all/raconf.o obj_all/mempool.o \
+ obj_all/msg_conf.o
COMMON_H = $(shell ls ../common/*.h)
Index: src/common/core.c
--- src/common/core.c Base (BASE)
+++ src/common/core.c Locally Modified (Based On LOCAL)
@@ -1,17 +1,19 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
+#include "mmo.h"
+#include "showmsg.h"
+#include "malloc.h"
#include "core.h"
#ifndef MINICORE
-#include "../common/db.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/thread.h"
-#include "../common/mempool.h"
-#include "../common/sql.h"
+#include "db.h"
+#include "socket.h"
+#include "timer.h"
+#include "thread.h"
+#include "mempool.h"
+#include "sql.h"
+#include "cbasetypes.h"
+#include "msg_conf.h"
#endif
#include <stdio.h>
@@ -258,6 +260,30 @@
}
#endif
+
+bool opt_has_next_value(const char* option, int i, int argc)
+{
+ if( i >= argc-1 )
+ {
+ ShowWarning("Missing value for option '%s'.\n", option);
+ return false;
+ }
+
+ return true;
+}
+
+/*======================================================
+ * Servers Version Screen [MC Cameri]
+ *------------------------------------------------------*/
+void display_versionscreen(bool do_exit)
+{
+ ShowInfo(CL_WHITE"rAthena SVN version: %s" CL_RESET"\n", get_svn_revision());
+ ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://rathena.org/\n");
+ ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rathena.net/#rathena\n");
+ ShowInfo("Open "CL_WHITE"readme.txt"CL_RESET" for more information.\n");
+ if( do_exit )
+ exit(EXIT_SUCCESS);
+}
/*======================================
* CORE : Display title
* ASCII By CalciumKid 1/12/2011
@@ -324,7 +350,6 @@
mempool_init();
db_init();
signals_init();
-
#ifdef _WIN32
cevents_init();
#endif
Index: src/common/core.h
--- src/common/core.h Base (BASE)
+++ src/common/core.h Locally Modified (Based On LOCAL)
@@ -4,6 +4,8 @@
#ifndef _CORE_H_
#define _CORE_H_
+#include "cbasetypes.h"
+
/* so that developers with --enable-debug can raise signals from any section of the code they'd like */
#ifdef DEBUG
#include <signal.h>
@@ -31,6 +33,8 @@
extern char SERVER_TYPE;
extern int parse_console(const char* buf);
+bool opt_has_next_value(const char* option, int i, int argc);
+void display_versionscreen(bool do_exit);
extern const char *get_svn_revision(void);
extern int do_init(int,char**);
extern void set_server_type(void);
Index: src/common/msg_conf.c
--- src/common/msg_conf.c No Base Revision
+++ src/common/msg_conf.c Locally New
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "malloc.h"
+#include "msg_conf.h"
+#include "showmsg.h"
+
+//-----------------------------------------------------------
+// Return the message string of the specified number by [Yor]
+//-----------------------------------------------------------
+
+const char* _msg_txt(int msg_number,int size, char ** msg_table)
+{
+ if (msg_number >= 0 && msg_number < size &&
+ msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
+ return msg_table[msg_number];
+
+ return "??";
+}
+
+/*==========================================
+ * Read Message Data
+ *------------------------------------------*/
+int _msg_config_read(const char* cfgName,int size, char ** msg_table)
+{
+ int msg_number;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+ static int called = 1;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ ShowError("Messages file not found: %s\n", cfgName);
+ return 1;
+ }
+
+ if ((--called) == 0)
+ memset(msg_table, 0, sizeof (msg_table[0]) * size);
+
+ while (fgets(line, sizeof (line), fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ if (strcmpi(w1, "import") == 0)
+ _msg_config_read(w2,size,msg_table);
+ else {
+ msg_number = atoi(w1);
+ if (msg_number >= 0 && msg_number < size) {
+ if (msg_table[msg_number] != NULL)
+ aFree(msg_table[msg_number]);
+ msg_table[msg_number] = (char *) aMalloc((strlen(w2) + 1) * sizeof (char));
+ strcpy(msg_table[msg_number], w2);
+ }
+ }
+ }
+
+ fclose(fp);
+ ShowInfo("Finished reading %s.\n",cfgName);
+
+ return 0;
+}
+
+/*==========================================
+ * Cleanup Message Data
+ *------------------------------------------*/
+void _do_final_msg(int size, char ** msg_table){
+ int i;
+ for (i = 0; i < size; i++)
+ aFree(msg_table[i]);
+}
\ No newline at end of file
Index: src/common/msg_conf.h
--- src/common/msg_conf.h No Base Revision
+++ src/common/msg_conf.h Locally New
@@ -0,0 +1,20 @@
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef MSG_CONF_H
+#define MSG_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char* _msg_txt(int msg_number,int size, char ** msg_table);
+int _msg_config_read(const char* cfgName,int size, char ** msg_table);
+void _do_final_msg(int size, char ** msg_table);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MSG_CONF_H */
+
Index: src/common/sql.c
--- src/common/sql.c Base (BASE)
+++ src/common/sql.c Locally Modified (Based On LOCAL)
@@ -15,6 +15,8 @@
#include <string.h>// strlen/strnlen/memcpy/memset
#include <stdlib.h>// strtoul
+#define SQL_CONF_NAME "conf/inter_athena.conf"
+
void ra_mysql_error_handler(unsigned int ecode);
int mysql_reconnect_type;
@@ -1020,5 +1022,5 @@
}
void Sql_Init(void) {
- Sql_inter_server_read("conf/inter_athena.conf",true);
+ Sql_inter_server_read(SQL_CONF_NAME,true);
}
Index: src/login/login.c
--- src/login/login.c Base (BASE)
+++ src/login/login.c Locally Modified (Based On LOCAL)
@@ -10,6 +10,7 @@
#include "../common/socket.h"
#include "../common/strlib.h"
#include "../common/timer.h"
+#include "../common/msg_conf.h"
#include "account.h"
#include "ipban.h"
#include "login.h"
@@ -19,6 +20,12 @@
#include <stdlib.h>
#include <string.h>
+char* LOGIN_CONF_NAME;
+char* LAN_CONF_NAME;
+char* MSG_CONF_NAME;
+
+#define LOGIN_MAX_MSG 30
+static char* msg_table[LOGIN_MAX_MSG]; // Login Server messages_conf
struct Login_Config login_config;
int login_fd; // login server socket
@@ -1238,6 +1245,32 @@
}
}
+/* Log the result of a failed connection attempt by sd
+ * result: nb (msg define in conf)
+ 0 = Unregistered ID
+ 1 = Incorrect Password
+ 2 = This ID is expired
+ 3 = Rejected from Server
+ 4 = You have been blocked by the GM Team
+ 5 = Your Game's EXE file is not the latest version
+ 6 = Your are Prohibited to log in until %s
+ 7 = Server is jammed due to over populated
+ 8 = No more accounts may be connected from this company
+ 9 = MSI_REFUSE_BAN_BY_DBA
+ 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
+ 11 = MSI_REFUSE_BAN_BY_GM
+ 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
+ 13 = MSI_REFUSE_SELF_LOCK
+ 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ 99 = This ID has been totally erased
+ 100 = Login information remains at %s
+ 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
+ 102 = This account has been temporarily prohibited from login due to a bug-related investigation
+ 103 = This character is being deleted. Login is temporarily unavailable for the time being
+ 104 = This character is being deleted. Login is temporarily unavailable for the time being
+ default = Unknown Error.
+ */
void login_auth_failed(struct login_session_data* sd, int result)
{
int fd = sd->fd;
@@ -1245,36 +1278,14 @@
if (login_config.log_login)
{
- const char* error;
- switch( result ) {
- case 0: error = "Unregistered ID."; break; // 0 = Unregistered ID
- case 1: error = "Incorrect Password."; break; // 1 = Incorrect Password
- case 2: error = "Account Expired."; break; // 2 = This ID is expired
- case 3: error = "Rejected from server."; break; // 3 = Rejected from Server
- case 4: error = "Blocked by GM."; break; // 4 = You have been blocked by the GM Team
- case 5: error = "Not latest game EXE."; break; // 5 = Your Game's EXE file is not the latest version
- case 6: error = "Banned."; break; // 6 = Your are Prohibited to log in until %s
- case 7: error = "Server Over-population."; break; // 7 = Server is jammed due to over populated
- case 8: error = "Account limit from company"; break; // 8 = No more accounts may be connected from this company
- case 9: error = "Ban by DBA"; break; // 9 = MSI_REFUSE_BAN_BY_DBA
- case 10: error = "Email not confirmed"; break; // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
- case 11: error = "Ban by GM"; break; // 11 = MSI_REFUSE_BAN_BY_GM
- case 12: error = "Working in DB"; break; // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
- case 13: error = "Self Lock"; break; // 13 = MSI_REFUSE_SELF_LOCK
- case 14: error = "Not Permitted Group"; break; // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 15: error = "Not Permitted Group"; break; // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 99: error = "Account gone."; break; // 99 = This ID has been totally erased
- case 100: error = "Login info remains."; break; // 100 = Login information remains at %s
- case 101: error = "Hacking investigation."; break; // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
- case 102: error = "Bug investigation."; break; // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
- case 103: error = "Deleting char."; break; // 103 = This character is being deleted. Login is temporarily unavailable for the time being
- case 104: error = "Deleting spouse char."; break; // 104 = This character is being deleted. Login is temporarily unavailable for the time being
- default : error = "Unknown Error."; break;
+ if(result >= 0 && result <= 15)
+ login_log(ip, sd->userid, result, msg_txt(result));
+ else if(result >= 99 && result <= 104)
+ login_log(ip, sd->userid, result, msg_txt(result-83)); //-83 offset
+ else
+ login_log(ip, sd->userid, result, msg_txt(22)); //unknow error
}
- login_log(ip, sd->userid, result, error);
- }
-
if( result == 1 && login_config.dynamic_pass_failure_ban )
ipban_log(ip); // log failed password attempt
@@ -1744,6 +1755,7 @@
if( login_config.log_login )
loginlog_final();
+ do_final_msg();
ipban_final();
for( i = 0; account_engines[i].constructor; ++i )
@@ -1802,6 +1814,26 @@
}
+/*======================================================
+ * Login-Server help option info
+ *------------------------------------------------------*/
+static void login_helpscreen(bool do_exit)
+{
+ ShowInfo("Usage: %s [options]\n", SERVER_NAME);
+ ShowInfo("\n");
+ ShowInfo("Options:\n");
+ ShowInfo(" -?, -h [--help]\t\tDisplays this help screen.\n");
+ ShowInfo(" -v [--version]\t\tDisplays the server's version.\n");
+ ShowInfo(" --run-once\t\t\tCloses server after loading (testing).\n");
+ ShowInfo(" --login-config <file>\t\tAlternative login-server configuration.\n");
+ ShowInfo(" --lan-config <file>\tAlternative lag configuration.\n");
+ ShowInfo(" --msg-config <file>\t\tAlternative message configuration.\n");
+ if( do_exit )
+ exit(EXIT_SUCCESS);
+}
+
+
+
//------------------------------
// Login server initialization
//------------------------------
@@ -1815,9 +1847,86 @@
// read login-server configuration
login_set_defaults();
- login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME);
- login_lan_config_read((argc > 2) ? argv[2] : LAN_CONF_NAME);
+ LOGIN_CONF_NAME = "conf/login_athena.conf";
+ LAN_CONF_NAME = "conf/subnet_athena.conf";
+ MSG_CONF_NAME = "conf/msg_conf/login_msg.conf";
+
+ msg_config_read(MSG_CONF_NAME); //for debug test
+
+ for( i = 1; i < argc ; i++ )
+ {
+ const char* arg = argv[i];
+
+ if( arg[0] != '-' && ( arg[0] != '/' || arg[1] == '-' ) )
+ {// -, -- and /
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ else if( (++arg)[0] == '-' )
+ {// long option
+ arg++;
+
+ if( strcmp(arg, "help") == 0 )
+ {
+ login_helpscreen(true);
+ }
+ else if( strcmp(arg, "version") == 0 )
+ {
+ display_versionscreen(true);
+ }
+ else if( strcmp(arg, "login-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ LOGIN_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "lan-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ LAN_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "msg-config") == 0 )
+ {
+ if( opt_has_next_value(arg, i, argc) )
+ MSG_CONF_NAME = argv[++i];
+ }
+ else if( strcmp(arg, "run-once") == 0 ) // close the login-server as soon as its done.. for testing [Celest]
+ {
+ runflag = CORE_ST_STOP;
+ }
+ else if( strcmp(arg, "display_msg") == 0 ) // close the login-server as soon as its done.. for testing [Celest]
+ {
+ int j;
+ ShowInfo("My msg_conf are\n");
+ for(j=0; j<10; j++){
+ ShowInfo("j=%i => %s\n",j,msg_txt(j));
+ }
+ exit(EXIT_SUCCESS);
+ }
+ else
+ {
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ else switch( arg[0] )
+ {// short option
+ case '?':
+ case 'h':
+ login_helpscreen(true);
+ break;
+ case 'v':
+ display_versionscreen(true);
+ break;
+ default:
+ ShowError("Unknown option '%s'.\n", argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ msg_config_read(MSG_CONF_NAME);
+ login_config_read(LOGIN_CONF_NAME);
+ login_lan_config_read(LAN_CONF_NAME);
+
rnd_init();
for( i = 0; i < ARRAYLENGTH(server); ++i )
@@ -1883,3 +1992,14 @@
return 0;
}
+
+int login_msg_config_read(char *cfgName){
+ return _msg_config_read(cfgName,LOGIN_MAX_MSG,msg_table);
+}
+const char* login_msg_txt(int msg_number){
+ return _msg_txt(msg_number,LOGIN_MAX_MSG,msg_table);
+}
+void login_do_final_msg(void){
+ return _do_final_msg(LOGIN_MAX_MSG,msg_table);
+}
+
Index: src/login/login.h
--- src/login/login.h Base (BASE)
+++ src/login/login.h Locally Modified (Based On LOCAL)
@@ -14,9 +14,6 @@
LOGINSERVER_ST_LAST
};
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define LAN_CONF_NAME "conf/subnet_athena.conf"
-
// supported encryption types: 1- passwordencrypt, 2- passwordencrypt2, 3- both
#define PASSWORDENC 3
@@ -94,6 +91,15 @@
#define sex_num2str(num) ( (num == SEX_FEMALE ) ? 'F' : (num == SEX_MALE ) ? 'M' : 'S' )
#define sex_str2num(str) ( (str == 'F' ) ? SEX_FEMALE : (str == 'M' ) ? SEX_MALE : SEX_SERVER )
+#define msg_config_read(cfgName) login_msg_config_read(cfgName)
+#define msg_txt(msg_number) login_msg_txt(msg_number)
+#define do_final_msg() login_do_final_msg()
+
+int login_msg_config_read(char *cfgName);
+const char* login_msg_txt(int msg_number);
+void login_do_final_msg(void);
+
+
#define MAX_SERVERS 30
extern struct mmo_char_server server[MAX_SERVERS];
extern struct Login_Config login_config;
Index: src/map/atcommand.c
--- src/map/atcommand.c Base (BASE)
+++ src/map/atcommand.c Locally Modified (Based On LOCAL)
@@ -100,73 +100,6 @@
return ( i < atcmd_binding_count ) ? atcmd_binding[i] : NULL;
}
-//-----------------------------------------------------------
-// Return the message string of the specified number by [Yor]
-//-----------------------------------------------------------
-const char* msg_txt(int msg_number)
-{
- if (msg_number >= 0 && msg_number < MAX_MSG &&
- msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
- return msg_table[msg_number];
-
- return "??";
-}
-
-/*==========================================
- * Read Message Data
- *------------------------------------------*/
-int msg_config_read(const char* cfgName)
-{
- int msg_number;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- static int called = 1;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowError("Messages file not found: %s\n", cfgName);
- return 1;
- }
-
- if ((--called) == 0)
- memset(msg_table, 0, sizeof(msg_table[0]) * MAX_MSG);
-
- while(fgets(line, sizeof(line), fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if (strcmpi(w1, "import") == 0)
- msg_config_read(w2);
- else
- {
- msg_number = atoi(w1);
- if (msg_number >= 0 && msg_number < MAX_MSG)
- {
- if (msg_table[msg_number] != NULL)
- aFree(msg_table[msg_number]);
- msg_table[msg_number] = (char *)aMalloc((strlen(w2) + 1)*sizeof (char));
- strcpy(msg_table[msg_number],w2);
- }
- }
- }
-
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * Cleanup Message Data
- *------------------------------------------*/
-void do_final_msg(void)
-{
- int i;
- for (i = 0; i < MAX_MSG; i++)
- aFree(msg_table[i]);
-}
-
/**
* retrieves the help string associated with a given command.
*
Index: src/map/atcommand.h
--- src/map/atcommand.h Base (BASE)
+++ src/map/atcommand.h Locally Modified (Based On LOCAL)
@@ -30,10 +30,6 @@
bool atcommand_exists(const char* name);
-const char* msg_txt(int msg_number);
-int msg_config_read(const char* cfgName);
-void do_final_msg(void);
-
extern int atcmd_binding_count;
// @commands (script based)
Index: src/map/map.c
--- src/map/map.c Base (BASE)
+++ src/map/map.c Locally Modified (Based On LOCAL)
@@ -114,6 +114,9 @@
static struct block_list *bl_list[BL_LIST_MAX];
static int bl_list_count = 0;
+#define MAX_MSG 1500
+static char* msg_table[MAX_MSG]; // map Server messages
+
struct map_data map[MAX_MAP_PER_SERVER];
int map_num = 0;
int map_port=0;
@@ -3666,7 +3669,7 @@
}
/*======================================================
- * Map-Server Version Screen [MC Cameri]
+ * Map-Server help options screen
*------------------------------------------------------*/
static void map_helpscreen(bool do_exit)
{
@@ -3689,19 +3692,6 @@
}
/*======================================================
- * Map-Server Version Screen [MC Cameri]
- *------------------------------------------------------*/
-static void map_versionscreen(bool do_exit)
-{
- ShowInfo(CL_WHITE"rAthena SVN version: %s" CL_RESET"\n", get_svn_revision());
- ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://rathena.org/\n");
- ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rathena.net/#rathena\n");
- ShowInfo("Open "CL_WHITE"readme.txt"CL_RESET" for more information.\n");
- if( do_exit )
- exit(EXIT_SUCCESS);
-}
-
-/*======================================================
* Map-Server Init and Command-line Arguments [Valaris]
*------------------------------------------------------*/
void set_server_type(void)
@@ -3729,17 +3719,6 @@
}
}
-static bool map_arg_next_value(const char* option, int i, int argc)
-{
- if( i >= argc-1 )
- {
- ShowWarning("Missing value for option '%s'.\n", option);
- return false;
- }
-
- return true;
-}
-
int do_init(int argc, char *argv[])
{
int i;
@@ -3754,10 +3733,10 @@
BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
SCRIPT_CONF_NAME = "conf/script_athena.conf";
- MSG_CONF_NAME = "conf/msg_athena.conf";
+ MSG_CONF_NAME = "conf/msg_conf/map_msg.conf";
GRF_PATH_FILENAME = "conf/grf-files.txt";
- rnd_init();
+ msg_config_read(MSG_CONF_NAME); //for debug test
for( i = 1; i < argc ; i++ )
{
@@ -3778,52 +3757,61 @@
}
else if( strcmp(arg, "version") == 0 )
{
- map_versionscreen(true);
+ display_versionscreen(true);
}
else if( strcmp(arg, "map-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
MAP_CONF_NAME = argv[++i];
}
else if( strcmp(arg, "battle-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
BATTLE_CONF_FILENAME = argv[++i];
}
else if( strcmp(arg, "atcommand-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
ATCOMMAND_CONF_FILENAME = argv[++i];
}
else if( strcmp(arg, "script-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
SCRIPT_CONF_NAME = argv[++i];
}
else if( strcmp(arg, "msg-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
MSG_CONF_NAME = argv[++i];
}
else if( strcmp(arg, "grf-path-file") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
GRF_PATH_FILENAME = argv[++i];
}
else if( strcmp(arg, "inter-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
INTER_CONF_NAME = argv[++i];
}
else if( strcmp(arg, "log-config") == 0 )
{
- if( map_arg_next_value(arg, i, argc) )
+ if( opt_has_next_value(arg, i, argc) )
LOG_CONF_NAME = argv[++i];
}
else if( strcmp(arg, "run-once") == 0 ) // close the map-server as soon as its done.. for testing [Celest]
{
runflag = CORE_ST_STOP;
}
+ else if( strcmp(arg, "display_msg") == 0 ) // close the login-server as soon as its done.. for testing [Celest]
+ {
+ int j;
+ ShowInfo("My msg_conf are\n");
+ for(j=0; j<10; j++){
+ ShowInfo("j=%i => %s\n",j,msg_txt(j));
+ }
+ exit(EXIT_SUCCESS);
+ }
else
{
ShowError("Unknown option '%s'.\n", argv[i]);
@@ -3837,7 +3825,7 @@
map_helpscreen(true);
break;
case 'v':
- map_versionscreen(true);
+ display_versionscreen(true);
break;
default:
ShowError("Unknown option '%s'.\n", argv[i]);
@@ -3845,6 +3833,7 @@
}
}
+ rnd_init();
map_config_read(MAP_CONF_NAME);
/* only temporary until sirius's datapack patch is complete */
@@ -3952,3 +3941,13 @@
return 0;
}
+
+int map_msg_config_read(char *cfgName){
+ return _msg_config_read(cfgName,MAX_MSG,msg_table);
+}
+const char* map_msg_txt(int msg_number){
+ return _msg_txt(msg_number,MAX_MSG,msg_table);
+}
+void map_do_final_msg(void){
+ return _do_final_msg(MAX_MSG,msg_table);
+}
Index: src/map/map.h
--- src/map/map.h Base (BASE)
+++ src/map/map.h Locally Modified (Based On LOCAL)
@@ -9,6 +9,7 @@
#include "../common/mmo.h"
#include "../common/mapindex.h"
#include "../common/db.h"
+#include "../common/msg_conf.h"
/**
* [rAthena.org]
@@ -27,6 +28,12 @@
MAPSERVER_ST_LAST
};
+#define msg_config_read(cfgName) map_msg_config_read(cfgName)
+#define msg_txt(msg_number) map_msg_txt(msg_number)
+#define do_final_msg() map_do_final_msg()
+int map_msg_config_read(char *cfgName);
+const char* map_msg_txt(int msg_number);
+void map_do_final_msg(void);
#define MAX_NPC_PER_MAP 512
#define AREA_SIZE battle_config.area_size
Index: tools/config.pl
--- tools/config.pl Base (BASE)
+++ tools/config.pl Locally Modified (Based On LOCAL)
@@ -2,6 +2,9 @@
# config script by lighta
#TODO list :
#- don't always override import/file, sed grep ?
+#- auto apply updates .sql check version main, log
+#- auto enable coredump
+#- auto enable backup
\ No newline at end of file
use CPAN;
use strict;