Quellcode durchsuchen

-Releasing Multilanguage support tid:80352 hx to Lilith and all other contributors
No other langage is enable by default, change LANG_ENABLE in msg_conf.h
-- Add 2 new atcommand :
@langtype to switch over langages
@reloadmsgconf to reload the db
Langage choosen is account wide, not reseted by default on relog.

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

glighta vor 12 Jahren
Ursprung
Commit
bba1db77e0

+ 4 - 1
Makefile.in

@@ -63,10 +63,13 @@ import:
 # 1) create conf/import folder
 # 2) add missing files
 # 3) remove remaining .svn folder
-	@echo "building conf/import folder..."
+	@echo "building conf/import and conf/msg_conf/import folder..."
 	@if test ! -d conf/import ; then mkdir conf/import ; fi
 	@for f in $$(ls conf/import-tmpl) ; do if test ! -e conf/import/$$f ; then cp conf/import-tmpl/$$f conf/import ; fi ; done
 	@rm -rf conf/import/.svn
+	@if test ! -d conf/msg_conf/import ; then mkdir conf/msg_conf/import ; fi
+	@for f in $$(ls conf/msg_conf/import-tmpl) ; do if test ! -e conf/msg_conf/import/$$f ; then cp conf/msg_conf/import-tmpl/$$f conf/msg_conf/import ; fi ; done
+	@rm -rf conf/msg_conf/import/.svn
 
 clean:
 	@$(MAKE) -C src/common $@

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


+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_chn_conf.txt

@@ -0,0 +1 @@
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_eng_conf.txt

@@ -0,0 +1 @@
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_frn_conf.txt

@@ -0,0 +1 @@
+

+ 2 - 0
conf/msg_conf/import-tmpl/map_msg_grm_conf.txt

@@ -0,0 +1,2 @@
+t
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_idn_conf.txt

@@ -0,0 +1 @@
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_mal_conf.txt

@@ -0,0 +1 @@
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_rus_conf.txt

@@ -0,0 +1 @@
+

+ 1 - 0
conf/msg_conf/import-tmpl/map_msg_spn_conf.txt

@@ -0,0 +1 @@
+

+ 7 - 1
conf/msg_conf/map_msg.conf

@@ -443,6 +443,12 @@
 // Homunculus messages
 450: You already have a homunculus
 
+//msg sys
+460: Unknow syntaxe, usage : @langtype eng|rus|spn|chn|mal|ind|frn
+461: Langtype is now = %s=>%d
+462: The choosen langage is currently disable please choose another
+463: Msg_conf have been reloaded
+
 // Messages of others (not for GM commands)
 // ----------------------------------------
 
@@ -1452,4 +1458,4 @@
 1435: You're now in the '#%s' channel for '%s'.
 
 //Custom translations
-import: conf/import/msg_conf.txt
+//import: conf/msg_conf/import/map_msg_eng_conf.txt

+ 1455 - 0
conf/msg_conf/map_msg_chn.conf

@@ -0,0 +1,1455 @@
+// 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: 已傳送
+1: 找不到地圖
+2: 坐標無法到達
+3: 找不到角色
+4: 瞬移至 %s
+5: 瞬移至 %d %d
+6: 角色復活點已儲存
+7: 瞬移至復活點
+8: 移動速度改變
+9: 狀態改變
+10: 隱形模式: 關閉
+11: 隱形模式: 開啟
+12: 您的職業已經改變了
+13: 您已經死了
+14: 角色被消滅
+15: 角色已傳送
+16: 您已經復活了
+17: HP/SP已回复
+18: 道具已創造
+19: 不正確的道具編號或名稱
+20: 您所有的道具都已經移除
+21: 基本等級 上升
+22: 基本等級 下降
+23: 職業等級 不能再更高了
+24: 職業等級 上升
+25: 職業等級 下降
+26: 求助指令:
+27: 找不到檔案: help.txt
+28: 沒有玩家
+29: 有 1 位玩家
+30: 有 %d 位玩家
+31: PvP模式: 關閉
+32: PvP模式: 開啟
+33: GvG模式: 關閉
+34: GvG模式: 開啟
+35: 在這個職業下您無法使用這個命令
+36: 外型改變
+37: 指定了錯誤的編號
+38: 錯誤的座標或地圖名稱
+39: 魔物被召喚
+40: 錯誤的魔物編號或名稱
+41: 輸入的數值範圍錯誤
+42: 素質改變
+43: 您並不在公會中
+44: 您並不是公會的會長
+45: 公會等級變更失敗
+46: %s 已被召喚
+47: 基本等級 不能再更高了
+48: 角色職業被改變
+49: 錯誤的職業編號
+50: 您已經有一些 GM 的能力了
+51: 角色被復活
+52: 此選項不能被用在 PK 模式
+53: '%s' 的素質:
+54: 沒有玩家在地圖 '%s' 中
+55: 有 1 位玩家在地圖 '%s' 中
+56: 有 %d 位玩家在地圖 '%s' 中
+57: 角色的複活點已改變
+58: 角色的狀態已改變
+59: 夜晚降臨了
+60: 白晝來臨了
+61: 神聖的審判, 目前地圖內所有人死亡
+62: 神聖的審判已執行, 伺服器內所有人已消滅
+63: 大發慈悲, 復活目前地圖內所有人
+64: 復活伺服器內所有人
+65: 角色的基本等級提升了
+66: 角色的基本等級下降了
+67: 角色的職業等級已經達到了極限
+68: 角色的職業等級提升了
+69: 角色的職業等級下降了
+70: 您學會了此技能
+71: 您捨棄了此技能
+72: 公會戰開始
+73: 公會戰已經在進行了
+74: 公會戰結束
+75: 公會戰還沒開始
+76: 您學會了所有技能
+77: 委託 '%s' (名字: 編號):
+78: %s: %d
+79: 查詢到 %d 個符合條件的結果
+80: 重新讀取任務資料庫
+81: 您的GM 等級並沒有權限在這位玩家上執行這個動作
+82: 請使用下列號碼/名稱:
+83: 無法產生華麗金屬
+84: 所有素質提升到極限
+85: 不合法的時間或已取消的指令
+86: 抱歉, 角色名稱必須大於4 個位元組
+87: 抱歉, 角色名稱必須小於23 個位元組
+88: 角色名稱傳送至 Char-Server 作請求
+89: 抱歉, 已經是夜晚了, 無法再執行這個命令
+90: 抱歉, 已經是白晝了, 無法再執行這個命令
+91: 角色的基本等級已經達到了極限
+92: 所有角色被召喚
+93: 所有%s 公會的線上角色已經在您附近了
+94: 錯誤的名稱/編號, 或是指定的公會不在線上
+95: 所有%s 隊伍的線上角色已經在您附近了
+96: 不正確的名稱/編號, 或是指定的隊伍不在線上
+97: 重新讀取物品資料程式庫
+98: 重新讀取魔物資料程式庫
+99: 重新讀取技能資料程式庫
+100: 重新讀取腳本
+101: Login-Server 要求重新讀取GM 帳號清單與等級
+102: 騎乘狀態
+103: 停止監聽 %s 公會
+104: 監聽 %s 公會中
+105: 停止監聽 %s 隊伍
+106: 監聽 %s 隊伍中
+107: 所有道具已經被修復
+108: 沒有道具被修復
+109: 已經踢掉玩家
+110: NPC 開啟
+111: 此 NPC 並不存在
+112: NPC 關閉
+113: GM 移除了 %d 個道具
+114: 時裝外觀被隱藏(1=頭上,2=頭中,4=頭下,8=披肩)
+115: 時裝外觀將對外顯示
+116: 自動儲存道具: '%s'/'%s' {%d}
+117: GM 把您送到監獄
+118: 玩家已被傳送到監獄
+119: 該玩家不在監獄中.
+120: GM 把您釋放了.
+121: 玩家被釋放
+122: 您偽裝了
+123: 魔物/NPC 名稱/編號 不存在
+124: 您不再偽裝
+125: 您沒有偽裝
+//Clone Messages
+126: 不能克隆比你等級高的GM
+127: 你的護衛已經達到了最高限度
+128: 惡魔生成了
+129: 無法生成惡魔
+130: 克隆體生成了
+131: 無法生成克隆體
+132: 護衛生成了
+133: 無法生成護衛
+//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations of @clone)
+140: 改角色偽裝了
+141: 此角色不能偽裝
+142: 此角色沒有偽裝
+143: 此地圖中不能使用命令
+144: 此EMAIL無效. 默認的EMAIL是 a@a.com
+145: 此EMAIL無效. 請重新輸入
+146: 新的EMAIL必須是一個真實的EMAIL.
+147: 新的EMAIL必須不同於舊的EMAIL.
+148: 訊息通過char-server 傳送到login-server
+149: 不能增加數值或屬性
+150: GM 不在線
+151: 1 位 GM 在線
+152: %d 位 GM 在線
+153: 不明的命令: %s
+154: %s 執行失敗
+155: 不能改變您的職業
+156: HP/SP 被修改了
+157: HP/SP 已經回復了
+158: 基本等級達到了最小值
+159: 職業等級達到了最小值
+160: PvP 模式關閉
+161: PvP 模式開啟
+162: GvG 模式關閉
+163: GvG 模式開啟
+164: 您的傳送點記憶編號 #%d 不存在
+165: 所有魔物已被殺死
+166: 沒有道具被精練
+167: 1 個道具已被精練
+168: %d 個道具已被精練
+169: 此物品 (%d '%s')不是裝備
+170: 此物品不是裝備
+171: %d - 無
+//172: You replace previous memo position %d - %s (%d,%d).
+//173: Note: you don't have the 'Warp' skill level to use it.
+174: 素質點數改變
+175: 技能點數改變
+176: 當前金錢持有量已改變
+177: 素質點已經達到最小值
+178: 素質點已經達到最大值
+179: 公會等級改變
+180: 魔物/寵物蛋名/編號 不存在
+181: 您已經有寵物了
+182: 寵物親密度改變
+183: 寵物親密度已經最高了
+184: 抱歉, 您並沒有寵物
+185: 寵物飽食度改變
+186: 寵物飽食度已經最高了
+187: 您可以命名您的寵物了
+188: 您可以重新命名您的寵物了
+189: 這玩家現在可以命名他的寵物了
+190: 這玩家現在可以命名他的寵物了
+191: 抱歉, 這位玩家現在並沒有寵物
+192: 無法改變這位角色的職業
+193: 此角色的基本等級不能再更低了
+194: 此角色的職業等級不能再更低了
+195: 所有玩家已經被踢下線
+196: 您已經學習過這個新技能了
+197: 技能編號不存在, 或併不是一個可學習的新技能號碼
+198: 此技能編號不存在
+199: 這位玩家已經學會這個技能了
+200: 這位玩家已經學會了這個新技能了
+201: 您並沒有這個新技能
+202: 這位玩家已經忘記此技能
+203: 這位玩家並沒有這個新技能
+204: 你所站的位置不允許開啟商店
+205: 也許你的意思是: 
+206: '%s' 技能點已重置
+207: '%s' 素質點已重置
+208: '%s' 技能與素質點已重置
+209: 角色的技能點數已改變
+210: 角色的素質點數已改變
+211: 角色的 Zeny 數量已改變
+212: 當使用特殊外型的時候無法變更為騎乘狀態
+213: 您的職業無法變更為騎乘狀態
+214: 解除騎乘狀態
+215: 該角色使用特殊外型的時候無法變更為騎乘狀態
+216: 已讓該角色變更為騎乘狀態
+217: 該角色的職業無法變更為騎乘狀態
+218: 已將該角色解除騎乘狀態
+219: %d 天
+220: %d 天
+221: %s %d 小時
+222: %s %d 小時
+223: %s %d 分鐘
+224: %s %d 分鐘
+225: %s 分 %d 秒
+226: %s 分 %d 秒
+227: 在這張地圖組隊修正無效
+228: 在這張地圖公會修正無效
+229: 您的效果被改變
+230: 伺服器時間(正常時間): %A, %B %d %Y %X
+231: 遊戲時間: 這個世界正在白晝狀態
+232: 遊戲時間: 這個世界正在黑夜狀態
+233: 遊戲時間: 這個世界已經在黑夜中%s
+234: 遊戲時間: 不久之後, 白晝即將到來
+235: 遊戲時間: 這個世界已經在白晝中%s
+236: 遊戲時間: 不久之後, 黑夜即將降臨
+237: 遊戲時間: 夜晚將在 %s 之後降臨
+238: 遊戲時間: 白晝與黑夜的交替時間是%s
+239: 遊戲時間: 白晝將在 %s 之後到來
+240: %d 隻魔物被召喚出來
+241: 您現在可以獵殺別人
+242: 您現在可以被別人獵殺
+243: 在這地圖上將無法使用技能
+244: 在這地圖上將可以使用技能
+245: 伺服器啟動時間: %ld 天, %ld 小時, %ld 分鐘, %ld 秒
+246: 你的GM層級不允許你完成這個動作
+247: 你不允許傳送到這個地圖
+248: 你不允許在目前地圖傳送
+249: 你不允許傳送到你的儲存點地圖
+250: 你已經開啟了你的倉程式庫,請先關閉它
+251: 你已經開啟了你的工會倉程式庫,請先關閉它
+252: 你不屬於任何工會
+//253: You are not authorized to memo this map.
+254: GM 命令組態檔案已經重新載入
+255: Battle組態檔案已經重新載入
+256: Status 資料已經重新載入
+257: 玩家資料重新載入
+258: 發送封包 0x%x (%d)
+259: 無效封包
+260: 這物品不能被交易
+261: 腳本無法載入
+262: 重新載入腳本
+263: 這個物品不能被丟棄
+264: 這個物品不能被存放
+265: %s 購買了你的物品
+266: 你的某些物品不能被出售,它將從你的商店中被取消掉
+267: '%s' 該地圖被重置
+268: 重新載入今天的訊息
+269: 顯示 %d 分之 %d 關聯
+//@me output format
+270: * :%s %s: *
+271: 在這張地圖你無法丟棄物品
+272: 在這張地圖你無法交易
+273: 可使用的指令:
+274: 找到 %d 個指令
+275: 沒找到指令
+276: 在這張地圖你無法建立商店販賣
+277: 用法: @request <請願內容/給線上GM的訊息>.
+278: (@request): %s
+279: @request 寄出
+280: 無效的名稱
+281: 在這張地圖你無法建立聊天室
+//Party-related
+282: 使用此指令你必須為組隊隊長
+283: 目標角色必須在線上且必須在你的組隊隊員裡
+284: 領導權轉移
+285: 你已經變成組隊隊長
+286: 設定無改變
+287: 在這地圖上你無法更改隊長
+//Missing stuff for @killer related commands.
+288: 你無法再殺人
+289: 該角色現在可以殺人
+290: 該角色不再可以殺人
+291: 天氣狀態會消失當傳送或刷新
+292: 殺手狀態重置
+// Guild Castles Number
+// --------------------
+//299: ?? Castles
+300: 暫無
+301: 1個城堡
+302: 2個城堡
+303: 3個城堡
+304: 4個城堡
+305: 5個城堡
+306: 6個城堡
+307: 7個城堡
+308: 8個城堡
+309: 9個城堡
+310: 10個城堡
+311: 11個城堡
+312: 12個城堡
+313: 13個城堡
+314: 14個城堡
+315: 15個城堡
+316: 16個城堡
+317: 17個城堡
+318: 18個城堡
+319: 19個城堡
+320: 20個城堡
+321: 21個城堡
+322: 22個城堡
+323: 23個城堡
+324: 24個城堡
+325: 25個城堡
+326: 26個城堡
+327: 27個城堡
+328: 28個城堡
+329: 29個城堡
+330: 30個城堡
+331: 31個城堡
+332: 32個城堡
+333: 33個城堡
+// 334: Thirty-Four Castles
+324: 完全統治
+
+// Templates for @who output
+343: 名字: %s
+344: (%s) 
+345: | 隊伍: '%s'
+346: | 公會: '%s'
+//You may ommit the last %s, then you won't see players job name
+347: | 等級:%d/%d | 職業: %s
+//You may ommit 2 last %d, then you won't see players coords, just map name
+348: | 位置: %s %d %d
+
+// @duel (part 1)
+350: 決鬥: 建立決鬥模式之前無法使用@invite
+351: 決鬥: 玩家數量達到最高限度.
+352: 決鬥: 沒有找到此玩家.
+353: 決鬥: 改玩家正在決鬥
+354: 決鬥: 決鬥邀請已發送
+355: 決鬥: 拒絕決鬥邀請之前不能使用@duel
+356: 決鬥: 每%d 分鐘才能參加一次決鬥.
+357: 決鬥: 無效值.
+358: 決鬥: 建立決鬥模式之前無法使用@leave
+359: 決鬥: 你離開了決鬥.
+360: 決鬥: 收到決鬥邀請之前無法使用@accept.
+361: 決鬥: 發送的決鬥邀請已經被接受.
+362: 決鬥: 收到決鬥邀請之前無法使用@reject.
+363: 決鬥: 發送的決鬥邀請已經被拒絕.
+364: 決鬥: 你不能邀請%s 因為他不在相同地圖.
+365: 決鬥: 決鬥時無法使用 %s 
+// @duel (part 2)
+370: -- 決鬥: %d/%d, 成員: %d/%d, 最多人數: %d --
+371: -- 決鬥: %d/%d, 成員: %d/%d --
+372: -- 決鬥創建已創建 (請使用@invite 來邀請或使用@leave 離開決鬥) --
+373: -- 玩家 %s 邀請 %s 參加決鬥 --
+374: -- 有人想和你決鬥(請使用@accept 接受邀請或者使用@reject 拒絕邀請) --
+375: <- 玩家 %s 已經離開決鬥 --
+376: -> 玩家 %s 已經接受決鬥 --
+377: -- 玩家 %s 已經拒絕決鬥 --
+// Main chat
+380: 主聊天功能正在啟動
+381: 主聊天功能已經啟動
+382: 主聊天功能正在被禁止
+383: 主聊天功能已經被禁止
+384: 當前可以使用主聊天功能用法: @main <on|off>, @main <訊息>.
+385: 當前不能使用主聊天功能用法: @main <on|off>, @main <訊息>.
+386: %s :Main: %s
+387: 禁言時不能使用主聊天功能
+388: 請使用 "@main on" 打開主聊天功能
+//NoAsk
+390: 自動拒絕功能啟動
+391: 自動拒絕功能關閉
+392: 你的請求已經被自動拒絕
+393: 自動拒絕 %s 的交易要求
+394: 自動拒絕 %s 的組隊邀請
+395: 自動拒絕 %s 的工會邀請
+396: 自動拒絕來自 %s 的同盟請求
+397: 自動拒絕來自 %s 的敵對請求
+398: 自動拒絕 %s 的朋友邀請
+400: 用法: @jailfor <時間> <角色名稱>
+401: 你已被關入%d 年, %d 月, %d 日, %d 時%d 分
+402: %s 已被關入%d 年, %d 月, %d 日, %d 時%d 分
+// WoE SE (@agitstart2)
+403: 攻城戰第二版開始了
+404: 攻城戰第二版正在進行中
+405: 攻城戰第二版結束了
+406: 攻城戰第二版尚未開始
+//407 free
+//chrif related
+408: 需要斷線以更改性別
+409: 你的性別已更改(你將會被伺服器中斷連線)
+//410-411 used by cash shop
+412: 你的帳號尚未被註冊過
+413: 你的帳號匹配了錯誤的密碼
+414: 你的帳號已過期
+415: 你的帳號被伺服器拒絕
+416: 你的帳號已被管理員封鎖
+417: 你的登入器不是最新版本
+418: 你的帳號被禁止登入
+419: 伺服器因為過載而卡住
+420: 你的帳號沒有更多的授權
+421: 你的帳號已被徹底刪除
+423: 你的帳號已被禁止,直到
+424: Login-server 已被要求做 %s 在 玩家'%.*s' 上
+425: 玩家 '%.*s' doesn't exist.
+426: 你的管理等級不予許對 玩家: %s 做 '%.*s'.
+427: Login-server 已經離線. 無法做 %s 在 玩家'%.*s' 上
+428: 阻擋
+429: 禁止
+430: 取消阻擋
+431: 取消禁止
+432: 改變性別
+
+// Homunculus messages
+450: 你已經擁有一個人工生命體了
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+//500: FREE
+501: 您上次登入時間是: %d-%m-%Y %H:%M:%S
+502: 白晝到來了
+503: 夜晚降臨了
+
+// Cash point change messages
+504: 使用了%d卡普拉點數(%s)和%d現金點數(%s)。剩餘%d卡普拉點數和%d現金點數。
+505: 得到了%d現金點數。總共%d點數。
+506: 得到了%d卡普拉點數。總共%d點數。
+505: 失去了%d現金點數。總共%d點數。
+506: 失去了%d卡普拉點數。總共%d點數。
+
+// Trade Spoof Messages
+507: 此玩家被禁止發言 %d 分鐘
+508: 此玩家沒有被禁止發言(未開啟禁言功能).
+//509 Available....
+
+// mail system
+//----------------------
+510: 您有%d封新郵件(%d封未讀)
+
+// 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: 玩家'%s' (account: %d) 試圖使用外掛(它試圖偵測假的玩家)
+537: 玩家'%s' (account: %d) 試圖使用外掛(它試圖偵測假的怪物)
+// Trade Spoof Messages
+538: 危險交易: 玩家 '%s' (account: %d) 嘗試交易超過他所有的數量
+539: 這個使用者有%d 個物品(物品id: %d), 嘗試交易%d 個
+540: 這個使用者已經被伺服器屏蔽
+// Rare Items Drop/Steal announce
+541: '%s' 取得 %s's %s (機率為: %%%0.02f)
+//541: %.0s%.0sSomeone got %s
+542: '%s' 偷竊到 %s's %s (機率為: %%%0.02f)
+//542: %.0s%.0sSomeone stole %s
+// 543~548 are not used (previously @away messages)
+// @Autotrade
+549: 你可以使用@autotrade 進行自動販賣
+
+//550 -> 650: Job Names
+550: 初心者
+551: 劍士
+552: 魔法師
+553: 弓箭手
+554: 服事
+555: 商人
+556: 盜賊
+557: 騎士
+558: 祭司
+559: 巫師
+560: 鐵匠
+561: 獵人
+562: 刺客
+563: 十字軍
+564: 武道家
+565: 賢者
+566: 流氓
+567: 煉金術士
+568: 吟遊詩人
+569: 舞孃
+570: 結婚
+571: 超級初心者
+572: 槍手 //Gunslinger
+573: 忍者 //Ninja
+574: 聖誕裝 //Christmas
+575: 進階初心者
+576: 進階劍士
+577: 進階魔法師
+578: 進階弓箭手
+579: 進階服事
+580: 進階商人
+581: 進階盜賊
+582: 騎士領主
+583: 神官
+584: 超魔導士
+585: 神工匠
+//585: Mastersmith //IRO name
+586: 神射手
+587: 十字刺客
+588: 聖殿十字軍
+589: 武術宗師
+590: 智者
+//590: Scholar //IRO name
+591: 神行太保
+592: 創造者
+//592: Biochemist //IRO Name
+593: 搞笑藝人
+//593: Minstrel //IRO Name
+594: 冷艷舞姬
+595: 寶寶初心者
+596: 寶寶劍士
+597: 寶寶魔法師
+598: 寶寶弓箭手
+599: 寶寶服侍
+600: 寶寶商人
+601: 寶寶盜賊
+602: 寶寶騎士
+603: 寶寶祭司
+604: 寶寶巫師
+605: 寶寶鐵匠
+606: 寶寶獵人
+607: 寶寶刺客
+608: 寶寶十字軍
+609: 寶寶武道家
+610: 寶寶賢者
+611: 寶寶流氓
+612: 寶寶煉金術士
+613: 寶寶吟遊詩人
+614: 寶寶舞孃
+615: 寶寶超級初心者
+616: 跆拳少年/少女
+617: 拳聖
+618: 悟靈士
+//619: FREE
+//620: FREE
+620: 忍者
+621: 夏裝
+623: Death Knight
+624: Dark Collector
+625: 盧恩騎士
+626: 咒術士
+627: 遊俠
+628: 大主教
+629: 機械工匠
+630: 十字斬首者
+631: 皇家禁衛隊
+632: 妖術師
+633: 宮廷樂師
+//633: Maestro //IRO Name
+634: 冷豔舞者
+635: 修羅
+636: 基因學者
+//636: Geneticist //IRO Name
+637: 魅影追蹤者
+638: 盧恩騎士寶寶
+639: 咒術士寶寶
+640: 遊俠寶寶
+641: 大主教寶寶
+642: 機械工匠寶寶
+643: 十字斬首者寶寶
+644: 皇家禁衛隊寶寶
+645: 妖術師寶寶
+646: 宮廷樂師寶寶
+647: 冷豔舞者寶寶
+648: 修羅寶寶
+649: 基因學者寶寶
+650: 魅影追蹤者寶寶
+651: 擴充超級初心者
+652: 擴充超級初心者寶寶
+653: 影狼
+654: 朧
+655: 未知職業
+
+// MvP Tomb
+// Added here so it can be easily translated
+656: 墓碑
+657: [ ^EE0000%s^000000 ]
+658: 已逝世
+659: 死亡日期 : ^EE0000%s^000000
+660: 被此人擊敗
+661: [^EE0000%s^000000]
+
+// Etc messages from source
+662: 你至少遠離NPC %d格的距離
+663: 決鬥: 決鬥時無法使用這物品
+664: 決鬥時你無法使用這指令
+665: 這區域無法創建聊天室
+666: 公會戰不允許有寵物
+667: 你沒死亡
+668: 你實際儲存點是:
+669: 你破壞目標的武器
+670: 你無法離開戰場公會
+671: 這朋友已存在
+672: 該名稱不在清單內
+673: 這動作無法執行,請稍後片刻
+674: 移除好友
+675: 請勿濫發郵件
+676: 公會戰期間無法結盟
+677: 公會戰期間無法取消盟約
+678: 你不再是公會會長
+679: 你現在是公會會長
+680: 你已經被恢復
+//681-899 free
+
+681: 盧恩騎士 T
+682: 咒術士 T
+683: 遊俠 T
+684: 大主教 T
+685: 機械工匠 T
+686: 十字斬首者 T
+687: 皇家禁衛隊 T
+688: 妖術師 T
+689: 宮廷樂師 T
+690: 漫遊舞者 T
+691: 修羅 T
+692: 基因學者 T
+693: 魅影追蹤者 T
+694: 韓服
+
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+900: 用法:
+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: 封包 0x%x 長度: %d
+905: 未知封包: 0x%x
+906: 不是字串:
+907: 不是十六進制數字:
+908: 未知數值類型在:
+
+// @rura
+909: 請輸入地圖名稱 (用法: @warp/@rura/@mapmove <地圖名稱> <x> <y>).
+
+// @where
+910: 請輸入角色名稱 (用法: @where <角色名稱>).
+
+// @jumpto
+911: 請輸入角色名稱 (用法: @jumpto/@warpto/@goto <角色名稱/ID>).
+
+// @who
+912: (CID:%d/AID:%d) 
+
+// @whogm
+913: 名稱: %s (GM)
+914: 名稱: %s (GM:%d) | 位置: %s %d %d
+915:       職業等級: %d | 職業: %s (Lvl: %d)
+916:       隊伍: '%s' | 公會: '%s'
+917: None
+
+// @speed
+918: 請輸入速度值 (用法: @speed <%d-%d>).
+
+// @storage
+919: 開起個人倉庫
+
+// @guildstorage
+920: 開啟公會倉庫
+
+// @option
+921: 請至少輸入一個選項值
+
+// @jobchange
+922: 請輸入職業ID
+923: 你無法用指令變成這職業
+//924-979 free (future jobs?)
+
+// @kami
+980: 請輸入訊息 (用法: @kami <訊息>)
+981: 請輸入顏色代碼(RGB)和訊息 (用法: @kamic <顏色代碼(RGB)> <訊息>)
+982: 無效顏色代碼(RGB)
+
+// @item
+983: Please enter an 物品名稱 or ID (用法: @item <物品名稱/ID> <quantity>).
+
+// @item2
+984: Please enter all parameters (用法: @item2 <物品名稱/ID> <quantity>
+985:   <鑑定狀態> <精煉> <屬性> <卡片1> <卡片2> <卡片3> <卡片4>).
+
+// @baselevelup
+986: 請輸入調整等級的數值 (用法: @lvup/@blevel/@baselvlup <number of levels>).
+
+// @joblevelup
+987: 請輸入調整等級的數值 (用法: @joblvup/@jlevel/@joblvlup <number of levels>).
+
+// @help
+988: 沒有 %c%s的幫助存在
+989: 命令幫助 %c%s:
+990: 可用的別名:
+
+// @model
+991: 至少輸入一個數值 (用法: @model <髮型ID: %d-%d> <髮色: %d-%d> <衣服顏色: %d-%d>).
+
+// @dye
+992: 請輸入衣服顏色 (用法: @dye/@ccolor <衣服顏色: %d-%d>).
+
+// @hairstyle
+993: 請輸入髮型ID (用法: @hairstyle/@hstyle <髮型ID: %d-%d>).
+
+// @haircolor
+994: 請輸入髮色 (用法: @haircolor/@hcolor <髮色: %d-%d>).
+
+// @go
+995: 你無法用 @go到這地圖
+
+// @refine
+996: 請輸入位置和數值 (用法: @refine <裝備位置> <+/- 數值>).
+997: %d: 頭下
+998: %d: 右手
+999: %d: 服飾
+1000: %d: 飾品(左)
+1001: %d: 披肩
+1002: %d: 左手
+1003: %d: 鞋子
+1004: %d: 飾品(右)
+1005: %d: 頭上
+1006: %d: 頭中
+
+// @produce
+1007: 至少輸入 物品名稱/ID (用法: @produce <裝備名稱/ID> <屬性> <# of very's>).
+
+// @memo
+1008: 請輸入有效位置 (用法: @memo <memo_position:%d-%d>).
+
+// @displaystatus
+1009: Please enter a status type/flag (用法: @displaystatus <status type> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Please enter a number (用法: @stpoint <number of points>).
+
+// @skpoint
+1011: Please enter a number (用法: @skpoint <number of points>).
+
+// @zeny
+1012: 請輸入數量 (用法: @zeny <amount>).
+
+// @param
+1013: Please enter a valid value (用法: @str/@agi/@vit/@int/@dex/@luk <+/-adjustment>).
+
+// @guildlevelup
+1014: Please enter a valid level (用法: @guildlvup/@guildlvlup <# of levels>).
+
+// @makeeg
+1015: Please enter a monster/egg name/ID (用法: @makeegg <pet>).
+
+// @petfriendly
+1016: Please enter a valid value (用法: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Please enter a valid number (用法: @pethungry <0-100>).
+
+// @recall
+1018: 請輸入角色名稱 (用法: @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: 請輸入角色名稱 (用法: @charblock/@block <char name>).
+
+// @charban
+1022: Please enter ban time and a player name (用法: @charban/@ban/@banish/@charbanish <time> <char name>).
+1023: You are not allowed to reduce the length of a ban.
+
+// @charunblock
+1024: 請輸入角色名稱 (用法: @charunblock <char name>).
+
+// @charunban
+1025: 請輸入角色名稱 (用法: @charunban <char name>).
+
+// @kick
+1026: 請輸入角色名稱 (用法: @kick <char name/ID>).
+
+// @questskill / @lostskill
+1027: Please enter a quest skill number.
+
+// @spiritball
+1028: 請輸入數量 (用法: @spiritball <number: 0-%d>).
+
+// @party
+1029: 請輸入隊伍名稱 (用法: @party <party_name>).
+
+// @guild
+1030: 請輸入公會名稱 (用法: @guild <guild_name>).
+
+// @idsearch
+1031: Please enter part of an 物品名稱 (用法: @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: 請輸入公會名稱/ID (用法: @guildrecall <guild_name/ID>).
+
+// @partyrecall
+1035: 請輸入隊伍名稱/ID (用法: @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 (用法: @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 (用法: @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: 請輸入公會名稱/ID (用法: @guildspy <guild_name/ID>).
+
+// @partyspy
+1127: 請輸入隊伍名稱/ID (用法: @partyspy <party_name/ID>).
+
+// @nuke
+1128: 請輸入角色名稱 (用法: @nuke <char name>).
+
+// @tonpc
+1129: 請輸入NPC名稱 (用法: @tonpc <NPC_name>).
+
+// @enablenpc
+1130: 請輸入NPC名稱 (用法: @enablenpc <NPC_name>).
+
+// @hidenpc
+1131: 請輸入NPC名稱 (用法: @hidenpc <NPC_name>).
+
+// @loadnpc
+1132: Please enter a script file name (用法: @loadnpc <file name>).
+
+// @npcoff
+1133: 請輸入NPC名稱 (用法: @npcoff <NPC_name>).
+
+// @jail
+1134: 請輸入角色名稱 (用法: @jail <char_name>).
+
+// @unjail
+1135: 請輸入角色名稱 (用法: @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 (用法: @disguise <name/ID>).
+1144: Character cannot be disguised while mounted.
+
+// @disguiseall
+1145: Please enter a Monster/NPC name/ID (用法: @disguiseall <name/ID>).
+
+// @disguiseguild
+1146: Please enter a mob name/ID and guild name/ID (用法: @disguiseguild <mob name/ID>, <guild name/ID>).
+
+// @undisguiseguild
+1147: Please enter guild name/ID (用法: @undisguiseguild <guild name/ID>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: 請輸入訊息 (用法: @broadcast <訊息>).
+
+// @localbroadcast
+1150: 請輸入訊息 (用法: @localbroadcast <訊息>).
+
+// @email
+1151: Please enter 2 emails (用法: @email <actual@email> <new@email>).
+
+// @effect
+1152: Please enter an effect number (用法: @effect <effect number>).
+
+// @npcmove
+1153: 用法: @npcmove <X> <Y> <npc_name>
+1154: NPC is not on this map.
+1155: NPC moved.
+
+// @addwarp
+1156: 用法: @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 (用法: @skillid <skill name>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: 用法: @useskill <skill ID> <skill level> <target>
+
+// @displayskill
+1166: 用法: @displayskill <skill ID> {<skill level>}
+
+// @skilltree
+1167: 用法: @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: 用法: @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: 用法: @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: 用法: @changegm <guild_member_name>
+1184: Target character must be online and be a guild member.
+
+// @changeleader
+1185: 用法: @changeleader <party_member_name>
+
+// @partyoption
+1186: 用法: @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 -<物品名稱 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 +<物品名稱 or ID>". To remove an item, use "@alootid -<物品名稱 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 (用法: @sound <filename>).
+
+// @mobsearch
+1218: Please enter a monster name (用法: @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 (用法: @npctalk <npc name>, <訊息>).
+1223: Please enter the correct parameters (用法: @npctalkc <color> <npc name>, <訊息>).
+
+// @pettalk
+1224: 請輸入訊息 (用法: @pettalk <訊息>).
+
+// @summon
+1225: Please enter a monster name (用法: @summon <monster name> {duration}).
+
+// @adjgroup
+1226: 用法: @adjgroup <group_id>
+1227: Specified group does not exist.
+1228: Group changed successfully.
+1229: Your group has changed.
+
+// @trade
+1230: 請輸入角色名稱 (用法: @trade <char name>).
+
+// @setbattleflag
+1231: 用法: @setbattleflag <flag> <value>
+1232: Unknown battle_config flag.
+1233: Set battle_config as requested.
+
+// @unmute
+1234: 請輸入角色名稱 (用法: @unmute <char name>).
+1235: Player is not muted.
+1236: Player unmuted.
+
+// @mute
+1237: 用法: @mute <time> <char name>
+
+// @identify
+1238: There are no items to appraise.
+
+// @mobinfo
+1239: Please enter a monster name/ID (用法: @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: 請輸入調整等級的值 (用法: @homlevel <number of levels>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: 你沒有人工生命體
+
+// @homevolve
+1255: 你的人工生命體沒有進化
+
+// @makehomun
+1256: 請輸入人工生命體ID (用法: @makehomun <homunculus id>).
+1257: 無效人工生命體ID
+
+// @homfriendly
+1258: 請輸入友好值 (用法: @homfriendly <友好值 [0-1000]>).
+
+// @homhungry
+1259: 請輸入飢餓度 (用法: @homhungry <飢餓度 [0-100]>).
+
+// @homtalk
+1260: 請輸入訊息 (用法: @homtalk <訊息>).
+
+// @hominfo
+1261: 人工生命體能力:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: 飢餓度: %d - 親密度: %u
+1265: Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: 人工生命體成長統計 (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: 人工生命體能力 altered.
+
+// @iteminfo
+1276: 請輸入 物品名稱/ID (用法: @ii/@iteminfo <物品名稱/ID>).
+1277: 物品: '%s'/'%s'[%d] (%d) 類型: %s | 額外效果: %s
+1278: None
+1279: With script
+1280: NPC 買價:%dz, 賣價:%dz | 重量: %.1f 
+1281:  - 只允許在商店
+1282:  - 最小魔物掉落機率: %02.02f%%
+1283:  - 魔物不掉這物品
+
+// @whodrops
+1284: Please enter 物品名稱/ID (用法: @whodrops <物品名稱/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 (用法: @whereis <monster_name_or_monster_ID>).
+1289: %s spawns in:
+1290: This monster does not spawn normally.
+
+// @adopt
+1291: 用法: @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 (用法: @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: 請輸入訊息 (用法: @me <訊息>).
+
+// @size / @sizeall / @sizeguild
+1303: Size change applied.
+
+// @sizeguild
+1304: Please enter guild name/ID (用法: @sizeguild <size> <guild name/ID>).
+
+// @monsterignore
+1305: You are now immune to attacks.
+1306: Returned to normal state.
+
+// @fakename
+1307: 返回真實名稱
+1308: 你必須輸入名稱
+1309: 假名稱至少要有兩個字
+1310: 使用假名稱
+
+// @mapflag
+1311: Enabled Mapflags in this map:
+1312: 用法: "@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: 不顯示取得多少經驗值
+1317: 顯示取得多少經驗值
+
+// @showzeny
+1318: 不顯示取得多少zeny
+1319: 顯示取得多少zeny
+
+// @showdelay
+1320: Skill delay failures will not be shown.
+1321: Skill delay failures are now shown.
+
+// @cash
+1322: 請輸入數量
+
+// @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: 用法: @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 物品名稱/ID, a quantity, and a player name (用法: #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: 用法: @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: 用法: @set <variable name> <value>
+1368: 用法: ex. "@set PoringCharVar 50"
+1369: 用法: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: 用法: 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: 用法: %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: 用法: @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 (用法: %c<command> <char name> <parameters>).
+1389: %s failed. Player not found.
+
+// @cart
+1390: Unknown Cart (用法: %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:
+
+// @join
+1399: 未知頻道 (usage: %s <#channel_name>)
+1400: 未知頻道 '%s' (usage: %s <#channel_name>)
+1401: '%s' 頻道被密碼保護 (usage: %s <#channel_name> <password>)
+1402: 你不在那頻道裡, 請輸入 '@join <#channel_name>' 
+1403: 你現在在 '%s' 頻道裡了
+
+// @channel 
+1404: %s 失敗
+1405: 頻道名稱必須以 '#' 開頭
+1406: 頻道名稱長度必須介於 3 到 %d 之間
+1407: 頻道 '%s' 不被允許
+1408: 頻道密碼不可以包含空白字元
+1409: - #%s (人數: %d)
+1410: ---- 公開頻道 ----
+1411: 未知顏色 '%s'.
+1412: 你現在不再能管理 '%s' 頻道
+1413: '%s' 頻道顏色更新為 '%s'.
+1414: ---- 可用的選項:
+1415: * %s create <#channel_name> <channel_password>
+1416: -- 建立新的頻道
+1417: * %s list
+1418: -- 公開頻道表
+1419: * %s list colors
+1420: -- 允許的頻道顏色表
+1421: * %s setcolor <#channel_name> <color_name>
+1422: -- 更改頻道訊息的顏色(管理者專用)
+1423: * %s leave <#channel_name>
+1424: -- 離開特定頻道
+1425: 你不在 '%s' 頻道裡面
+1426: 你已經離開 '%s' 頻道
+1427: * %s bindto <#channel_name>
+1428: -- 將你的聊天室與特定頻道建立綁定, 並發送訊息到那頻道
+1429: * %s 解除
+1430: -- 解除任何跟你聊天是有關的頻道
+1431: 你的聊天室被綁定到 '%s' 頻道
+1432: 你的聊天室沒被綁定到任何頻道
+1433: 你的聊天室被 '#%s' 頻道解除綁定 
+1434: 你已經在 '%s' 頻道裡面
+1435: 你現在在 '#%s' 頻道裡面('%s')
+
+//Custom translations
+//import: conf/msg_conf/import/map_msg_chn_conf.txt

+ 1455 - 0
conf/msg_conf/map_msg_frn.conf

@@ -0,0 +1,1455 @@
+// rAlena msg_alena.conf
+// Configuration des Messages
+// Pour changer la traduction, changez seulement le message (seconde colonne), vous n'avez pas besoin de modifier le code source,
+// ou bien utilisez conf/import/msg_conf.txt
+// Format:
+// // Message en français
+// msg_nombre: Message
+
+//   0-410: réservés pour les commandes GM
+// 500-900: autres
+// 900-1300: @atcommand
+
+// Pour désactiver une ligne (%s), mettez sa longueur max à 0:
+// eg:
+// 270: *%s %s* (format de @me)
+// 270: *%.0s%s* (supprime le nom du personnage de la ligne)
+
+// Messages de commandes GM
+// ------------------------
+
+0: Téléporté(e).
+1: Map introuvable.
+2: Coordonnées invalide, utilisation de coordonnées aléatoires.
+3: Personnage non trouvé.
+4: Téléporté(e) à %s
+5: Téléporté(e) à %d %d
+6: Votre Point de sauvegarde a été changé.
+7: Téléporté(e) au point de sauvegarde.
+8: Vitesse changée.
+9: Options changées.
+10: Invisible: Off
+11: Invisible: On
+12: Vous avez changé de Job.
+13: Vous êtes mort(e).
+14: Personnage tué.
+15: Joueur(se) téléporté(e) (message également envoyé au Joueur(se)).
+16: Vous avez été ressuscité(e)!
+17: HP, SP récupérés.
+18: Item créé.
+19: Item ID ou nom de l'Item invalide.
+20: Tous vos Items ont été supprimés.
+21: Base level augmenté.
+22: Base level baissé.
+23: Le Job level ne peut pas être plus haut.
+24: Job level augmenté.
+25: Job level baissé.
+26: Commandes d'aide:
+27: Commandes d'aide non-disponible.
+28: Aucun Joueur trouvé.
+29: 1 Joueur trouvé.
+30: %d Joueurs trouvés.
+31: PvP: Off.
+32: PvP: On.
+33: GvG: Off.
+34: GvG: On.
+35: Vous ne pouvez pas utiliser cette commande avec cette classe.
+36: Apparence changée.
+37: Vous avez spécifié un nombre invalide.
+38: Nombre, ou nom du lieu Invalide.
+39: Tous les monstres ont été invoqués!
+40: Monstre ID ou nom Invalide.
+41: Impossible de diminuer le nombre/valeur.
+42: Stats changées.
+43: Vous n'êtes pas dans une guilde.
+44: Vous n'êtes pas le maître de votre guilde.
+45: Changement du niveau de Guilde échoué.
+46: %s appelé!
+47: Le Niveau de Base ne peut pas aller plus haut.
+48: Job du personnage changé.
+49: Job ID Invalide.
+50: Vous possédez déjà des compétences de GM.
+51: Personnage réssuscité.
+52: Cette option ne peut pas être utilisée en Mode PK.
+53: '%s' stats:
+54: Aucun Joueur trouvé sur la carte '%s'.
+55: 1 Joueur trouvé sur la carte '%s'.
+56: %d Joueurs trouvés sur la carte '%s'.
+57: Point de sauvegarde du personnage changé.
+58: Option du personnage changée.
+59: Mode Nuit activé.
+60: Mode Jour activé.
+61: Le messager divin a rendu son jugement.
+62: Le jugement a été rendu.
+63: Le Ciel a eu pitié des morts.
+64: Le Ciel a eu pitié de vous.
+65: Niveau de Base (Base Level) du personnage augmenté.
+66: Niveau de Base (Base Level) du personnage diminué.
+67: Le niveau de Job du personnage ne peut pas être augmenté.
+68: Niveau de Job (Job Level) du personnage augmenté.
+69: Niveau de Job (Job Level) du personnage diminué.
+70: Vous avez appris la compétence.
+71: Vous avez oublié la compétence.
+72: La War of Emperium a commencé.
+73: La War of Emperium est en cours.
+74: La War of Emperium est terminée.
+75: La War of Emperium n'est pas en cours.
+76: Toutes les compétences ont été ajoutées à votre arbre de compétence.
+77: Résultat de '%s' (nom: id):
+78: %s: %d
+79: It is %d affair above.
+80: Veuillez donner le nom affiché ou le nom/id du montre.
+81: Votre niveau de GM ne vous autorise pas à effectuer cette action sur le Joueur spécifié.
+82: Veuiillez fournir un nom ou un nombre comme le stipule la liste suivante:
+83: Le Monstre 'Emperium' ne peut pas être invoqué.
+84: Toutes les stats sont changées!
+85: Temps Invalide pour la commande ban.
+86: Désolé, le nom du Joueur doit faire au moins 4 caractères de long.
+87: Désolé, le nom du Joueur ne peut pas contenir plus de 23 caractères.
+88: Envoie de la requête au login server...
+89: Le Mode Nuit est déjà activé.
+90: Le Mode Jour est déjà activé.
+91: Le niveau de Base du peronnage ne peut pas aller plus haut.
+92: Tous les personnages sont téléportés sur votre position!
+93: Tous les personnages en ligne de la guilde %s ont été téléportés sur votre position.
+94: Nom/ID Incorrecte, ou aucun joueur de la guilde spécifiée n'est en ligne.
+95: Tous les personnages online de l'Equipe %s ont été téléportés sur votre position.
+96: Nom/ID Incorrecte, ou aucun joueur de l'Equipe spécifiée n'est en ligne.
+97: Base de donnée des Items rechargée.
+98: Base de donnée des Monstres rechargée.
+99: Base de donnée des Skills rechargée.
+100: Les Scripts ont été rechargés.
+101: Login-server demande de recharger les comptes GM et leur niveau.
+102: Vous êtes monté sur un Peco Peco.
+103: Vous n'espionnez plus la guilde %s.
+104: Espionnage sur la guilde %s.
+105: Vous n'espionnez plus l'Equipe %s.
+106: Espionnage sur l'Equipe %s.
+107: Tous les Items ont été réparés.
+108: Aucun Item n'a besoin d'être réparé.
+109: Le Joueur s'est fait exploser !
+110: NPC Activé.
+111: Cet NPC n'existe pas.
+112: NPC Désactivé.
+113: %d item(s) supprimé(s) par un GM.
+114: %d item(s) supprimé(s) sur ce Joueur.
+115: %d item(s) supprimé(s). Le Joueur n'avait que %d sur les %d items.
+116: Ce Personnage ne possède pas l'objet spécifié.
+117: Vous avez été envoyé en prison par un GM.
+118: Joueur téléporté en prison.
+119: Ce Joueur n'est pas en prison.
+120: Un GM vous a fait sortir de prison.
+121: Joueur sortie de prison.
+122: Déguisement appliqué.
+123: Invalide Monstre/NPC nom/ID specifié.
+124: De-déguisement appliqué.
+125: Vous n'êtes pas déguisé.
+//Clone Messages
+126: Impossible de Cloner un Joueur de plus au niveau GM que vous-même.
+127: Vous avez atteint la limite du nombre de clone esclave.
+128: Clone démoniaque invoqué.
+129: Impossible de créer un Clone Démoniaque.
+130: Clone invoqué.
+131: Impossible d'invoquer un clone.
+132: clone esclave invoqué.
+133: Impossible d'invoquer un clone esclave.
+//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations de @clone)
+140: Déguisement du personnage effectué.
+141: De-déguisement du personnage effectué.
+142: Le Personnage n'est pas déguisé.
+143: Les Commandes sont désactivées sur cette carte.
+144: E-mail Invalide. Si vous avez l'e-mail par défaut, taper a@a.com.
+145: Nouvel E-mail Invalide. Veuillez entrer un e-mail valide.
+146: Le nouvel e-mail doit être un e-mail valide.
+147: Le nouvel e-mail doit être différent de l'e-mail précédent.
+148: Information envoyée au login-server via le char-server.
+149: Impossible d'augmenter le nombre/valeur.
+150: Aucun GM n'a été trouvé.
+151: 1 GM trouvé.
+152: %d GMs trouvé.
+153: %s est une Commande inconnue.
+154: %s échoué.
+155: Vous êtes dans l'incapacité de changer votre job.
+156: HP et/ou SP modifiés.
+157: HP et SP sont déjà au maximum.
+158: Le Base level ne peut pas être plus bas.
+159: Le Job level ne peut pas être plus bas.
+160: PvP est déjà Off.
+161: PvP est déjà On.
+162: GvG est déjà Off.
+163: GvG est déjà On.
+164: Votre point de memo #%d n'existe pas.
+165: Tous les monstres ont été tués!
+166: Aucun équipement n'a été raffiné.
+167: 1 objet a été raffiné.
+168: %d objets ont été raffinés.
+169: L'objet (%d: '%s') ne peut pas s'équiper.
+170: L'objet ne peut pas s'équiper.
+171: %d - void
+//172: You replace previous memo position %d - %s (%d,%d).
+//173: Note: you don't have le 'Warp' skill level to use it.
+174: Nombre de points de status changé.
+175: Nombre de points de skill changé.
+176: Quantité actuelle de Zeny changée.
+177: Vous ne pouvez pas baisser davantage cette stat.
+178: Vous ne pouvez pas augmenter davantage cette stat.
+179: Niveau de Guilde changé.
+180: Le monstre/egg nom/ID n'existe pas.
+181: Vous possédez déjà un pet.
+182: Affinité du Pet changée.
+183: Affinité du Pet est déjà au maximum.
+184: Désolé mais vous ne possédez pas de pet.
+185: Etat de faim du Pet changé.
+186: Etat de faim du Pet est déjà au maximum.
+187: Vous pouvez maintenant renommer votre pet.
+188: Vous pouvez déjà renommer votre pet.
+189: Ce Joueur peut maintenant renommer son pet.
+190: Ce Joueur peut déjà renommer son pet.
+191: Désolé mais ce Joueur n'a pas de pet.
+192: Impossible de changer le job du personnage spécifié.
+193: Le niveau de Base du personnage ne peut pas aller plus bas.
+194: Le niveau de compétence (Skill) du personnage ne peut pas aller plus bas.
+195: Tous les Joueurs ont été 'kick'!
+196: Vous possédez déjà ce skill de quête.
+197: Ce numéro de skill n'existe pas ou n'est pas un skill de quête.
+198: Ce numéro de skill n'existe pas.
+199: Ce Joueur a déjà appris le skill.
+200: Ce Joueur possède déjà ce skill de quête.
+201: Vous n'avez pas ce skill de quête.
+202: Ce Joueur vient d'oublier le skill.
+203: Ce Joueur ne possède pas ce skill de quête.
+204: Vous ne pouvez pas ouvrir de shop sur cette case.
+205: Peut-être vouliez-vous dire:
+206: '%s' skill points réinitialisés.
+207: '%s' stats points réinitialisés.
+208: '%s' skill et stat points ont été réinitialisés.
+209: Points de Skill du personnage changés.
+210: Points de Status du personnage changés.
+211: Zeny du personnage changés.
+212: Impossible d'utiliser une monture en étant déguisé.
+213: Votre Job ne vous permet pas de monter un Peco Peco.
+214: Vous avez relâché votre Peco Peco.
+215: Ce Joueur ne peut pas monter un Peco Peco en étant déguisé.
+216: Ce Joueur monte un Peco Peco.
+217: Le Job du Joueur ne lui permet pas monter un Peco Peco.
+218: Le Peco Peco du Joueur a été relaché.
+219: %d jour
+220: %d jours
+221: %s %d heure
+222: %s %d heures
+223: %s %d minute
+224: %s %d minutes
+225: %s et %d seconde
+226: %s et %d secondes
+227: L'option modification de l'Equipe (party) est désactivée sur cette carte.
+228: L'option modification de la guilde est désactivée sur cette carte.
+229: Votre effet a changé.
+230: Heure du serveur (heure normale): %A, %B %d %Y %X.
+231: Temps de jeu: le jeu est en permanence en mode jour.
+232: Temps de jeu: le jeu est en permanence en mode nuit.
+233: Temps de jeu: le jeu est en mode nuit pendant %s.
+234: Temps de jeu: Après, le jeu sera en mode jour en permanence.
+235: Temps de jeu: le jeu est en mode jour pendant %s.
+236: Temps de jeu: Après, le jeu sera en mode nuit en permanence.
+237: Temps de jeu: Après, le jeu sera en mode nuit pendant %s.
+238: Temps de jeu: une journée a un cycle d'un durée de %s.
+239: Temps de jeu: Après, le jeu sera en mode jour pendant %s.
+240: %d monstre(s) invoqués!
+241: Vous pouvez maintenant attaquer et tuer des Joueurs en toute liberté.
+242: Vous pouvez maintenant être attaqué et tué par les Joueurs.
+243: Les Skills ont été désactivés sur cette carte.
+244: Les Skills sont maintenant permis sur cette carte.
+245: Durée de fonctionnement du Serveur: %ld jours, %ld heures, %ld minutes, %ld secondes.
+246: Votre niveau de GM ne vous autorise pas à effectuer cette action.
+247: Vous n'êtes pas autorisé à vous téléporter sur cette carte.
+248: Vous n'êtes pas autorisé à vous téléporter depuis votre carte actuelle.
+249: Vous n'êtes pas autorisé à vous téléporter à votre point de sauvegarde.
+250: Votre storage est déjà ouvert. Fermez-le avant.
+251: Votre storage de guilde est déjà ouvert. Fermez-le avant.
+252: Vous n'êtes pas dans une guilde.
+//253: You are not authorized to memo ce map.
+254: La configuration des commandes GM a été rechargée.
+255: Battle configuration a été rechargée.
+256: Base de données des Status rechargée.
+257: Base de données des Joueurs rechargée.
+258: Envoie du packet 0x%x (%d)
+259: Packet Invalide.
+260: Cet objet ne peut pas être échangé.
+261: Le Script n'a pas pu être chargé.
+262: Script chargé.
+263: Cet objet ne peut pas être déposé.
+264: Cet objet ne peut pas être stocké.
+265: %s a acheté votre objet(s).
+266: Certains de vos objets ne peut pas être vendus et ont été supprimés du magasin.
+267: La carte '%s' désignée a été réinitialisée.
+268: Re-lancement du message du jour.
+269: Affichage des premiers %d parmis %d trouvés
+//@me output format
+270: * :%s %s: *
+271: Vous ne pouvez pas déposer d'objets sur cette carte.
+272: Vous ne pouvez pas faire d'échange sur cette carte.
+273: Commandes disponibles:
+274: %d commandes trouvées.
+275: Aucune commande trouvée.
+276: Vous ne pouvez pas ouvrir de magasin sur cette carte.
+277: Usage: @request <petition/message au GMs en ligne>.
+278: (@request): %s
+279: @request envoyée.
+280: Nom Invalide.
+281: Vous ne pouvez pas créer de chat rooms sur cette carte.
+//Equipe-related
+282: Vous devez être le chef de l'Equipe pour pouvoir utiliser cette commande.
+283: Le personnage désigné doit être en ligne et doit être dans votre Equipe actuelle.
+284: Leadership transféré.
+285: Vous êtes devenu le chef de l'Equipe.
+286: Il n'y a eu aucun changement d'options.
+287: Vous ne pouvez pas changer de chef d'Equipe sur cette carte.
+//Missing stuff for @killer related commands.
+288: Vous n'êtes plus 'tuable'.
+289: Le Joueur est maintenant 'tuable'.
+290: Le Joueur n'est plus 'tuable'.
+291: Les effets météorologiques se dissiperont avec téléportation/refresh
+292: Etat de 'Killer' reinitialisé.
+// guilde Châteaux nombre
+// --------------------
+//299: ?? Châteaux
+300: Aucun pris
+301: Un Château
+302: Deux Châteaux
+303: Trois Châteaux
+304: Quatre Châteaux
+305: Cinq Châteaux
+306: Six Châteaux
+307: Sept Châteaux
+308: Huit Châteaux
+309: Neuf Châteaux
+310: Dix Châteaux
+311: Onze Châteaux
+312: Douze Châteaux
+313: Treize Châteaux
+314: Quatorze Châteaux
+315: Quinze Châteaux
+316: Seize Châteaux
+317: Dix-sept Châteaux
+318: Dix-huit Châteaux
+319: Dix-neuf Châteaux
+320: Vingt Châteaux
+321: Vingt-Un Châteaux
+322: Vingt-Deux Châteaux
+323: Vingt-Trois Châteaux
+324: Vingt-Quatre Châteaux
+325: Vingt-Cinq Châteaux
+326: Vingt-Six Châteaux
+327: Vingt-Sept Châteaux
+328: Vingt-Huit Châteaux
+329: Vingt-Neuf Châteaux
+330: Trente Châteaux
+331: Trente-Un Châteaux
+332: Trente-Deux Châteaux
+333: Trente-Trois Châteaux
+// 334: Trente-Quatre Châteaux
+334: Domination Totale
+
+// Templates for @who output
+343: Nom: %s 
+344: (%s) 
+345: | Equipe (party): '%s' 
+346: | Guilde: '%s'
+//You may ommit the last %s, then you won't see player job name
+347: | Lv:%d/%d | Job: %s
+//You may ommit 2 last %d, then you won't see player coords, just map name
+348: | Situation: %s %d %d
+
+// @duel (part 1)
+350: Duel: Vous ne pouvez pas utiliser @invite. Vous n'êtes pas un duelliste.
+351: Duel: La limite du nombre de Joueurs a été atteinte.
+352: Duel: Nom du Joueur introuvé.
+353: Duel: Le Joueur est déjà dans un duel.
+354: Duel: L'Invitation a été envoyée.
+355: Duel: Vous ne pouvez pas utiliser @duel sans @reject.
+356: Duel: Vous ne pouvez faire un duel qu'une fois toutes les %d minutes.
+357: Duel: Valeur invalide.
+358: Duel: Vous ne pouvez pas utiliser @leave. Vous n'êtes pas un duelliste.
+359: Duel: Vous avez quitté le duel.
+360: Duel: Vous ne pouvez pas utiliser @accept sans être invité en duel.
+361: Duel: L'invitation au duel a été acceptée.
+362: Duel: Vous ne pouvez pas utiliser @reject sans être invité en duel.
+363: Duel: Votre invitation au duel a été rejetée.
+364: Duel: Vous ne pouvez pas inviter %s car il/elle n'est pas sur la même carte.
+365: Duel: Impossible d'utiliser %s en plein duel.
+// @duel (part 2)
+370:  -- Duels: %d/%d, Membres: %d/%d, Max Joueurs: %d --
+371:  -- Duels: %d/%d, Membres: %d/%d --
+372:  -- Duel a été créé (Utilisez @invite/@leave) --
+373:  -- Joueur %s invite %s en duel --
+374: Blue -- Joueur %s vous invite à faire un PVP duel (Utilisez @accept/@reject) --
+375:  <- Joueur %s a quitté le duel --
+376:  -> Joueur %s a accepté le duel --
+377:  -- Joueur %s a rejeté la demande de duel --
+// Main chat
+380: Le chat principal a été activé.
+381: Le chat principal déjà activé.
+382: Le chat principal a été désactivé.
+383: Le chat principal déjà désactivé.
+384: Le chat principal est activé. Usage: @main <on|off>, @main <message>.
+385: Le chat principalt est désactivé. Usage: @main <on|off>, @main <message>.
+386: %s :Main: %s
+387: Vous ne pouvez pas utiliser le chat principal en étant mute.
+388: Vous devriez activer le chat principal avec la commande "@main on".
+//NoAsk
+390: Le rejet automatique est activé.
+391: Le rejet automatique est désactivé.
+392: Votre demande a été rejetée automatiquement par l'option d'auto-rejet.
+393: Auto-rejet des demandes d'échange de %s.
+394: Auto-rejet des invitations en Equipe de %s.
+395: Auto-rejet des invitations de guilde de %s.
+396: Auto-rejet des demandes d'alliance de %s.
+397: Auto-rejet des demandes antagonistes de %s.
+398: Auto-rejet de demande d'amis de %s.
+400: Usage: @jailfor <temps> <Nom du Personnage>
+401: Vous avez été enfermé en prison pendant %d années, %d mois, %d jours, %d heures et %d minutes
+402: %s en prison pendant %d années, %d mois, %d jours, %d heures et %d minutes
+// WoE SE (@agitstart2)
+403: War of Emperium SE a commencé.
+404: War of Emperium SE est en cours.
+405: War of Emperium SE est terminée.
+406: War of Emperium SE n'est pas en cours.
+//407 free
+//chrif related
+408: Besoin de vous déconnecter pour effectuer la demande de changement de sexe...
+409: Votre sexe a été changé (le serveur a besoin de vous déconnecter)...
+//410-411 used by cash shop
+412: Votre compte n'est pas enregistré.
+413: Votre compte a un mot de passe incorrecte...
+414: Votre compte a expiré.
+415: Votre compte a été rejecté par le serveur.
+416: Votre compte a été bloqué par les GM.
+417: Votre Fichier EXE n'est pas à jour.
+418: Votre compte n'est plus autorisé à se connecter.
+419: Le Serveur est bloqué à cause de la surpopulation.
+420: Votre compte n'est plus autorisé.
+421: Votre compte a été totallement supprimé.
+423: Votre compte a été bannie jusqu'à
+424: Login-server a demandé de %s le Joueur '%.*s'.
+425: Le Joueur '%.*s' n'existe pas.
+426: Votre niveau de GM ne vous autorise pas à %s le Joueur '%.*s'.
+427: Login-server est déconnecté. Impossible de %s le Joueur '%.*s'.
+428: bloqué
+429: bannie
+430: débloqué
+431: débannie
+432: change le genre de
+
+// Homunculus messages
+450: Vous possédez déjà un homunculus
+
+// Messages de olers (not for GM commands)
+// ----------------------------------------
+
+//500: FREE
+501: La date limite de votre compte est: %d-%m-%Y %H:%M:%S.
+502: Le Mode Jour s'est activé
+503: Le Mode Nuit s'est activé
+
+// Cash point change messages
+504: Utilisé %d kafra points et %d cash points. %d kafra et %d cash points restant.
+505: Gagné %d cash points. Total: %d points.
+506: Gagné %d kafra points. Total: %d points.
+410: Supprimé %d cash points. Total: %d points.
+411: Supprimé %d kafra points. Total: %d points.
+
+// Trade Spoof Messages
+507: Ce Joueur a été bannie pendant %d minute(s).
+508: Ce Joueur n'a pas été bannie (Option Ban désactivée).
+//509 Available....
+
+// mail system
+//----------------------
+510: Vous avez %d nouveau(x) email(s) (%d non-lu(s))
+
+// Bot detect messages (currently unused)
+535: Utilisation possible d'un BOT (99%% de chance) ou client modifié par '%s' (compte: %d, char_id: %d). Ce Joueur demande votre nom alors que vous êtes caché.
+
+536: Personnage '%s' (compte: %d) essaie d'utiliser un bot (il essaie de détecter un faux joueur).
+537: Personnage '%s' (compte: %d) essaie d'utiliser un bot (il essaie de détecter un faux mob).
+// Trade Spoof Messages
+538: Hack sur échange: Personnage '%s' (account: %d) essaie d'échanger plus d'Objets qu'il ne possède.
+539: Ce Joueur a %d d'une sorte d'Objet (id: %d), et tente d'en échanger %d.
+540: Ce Joueur a été définitivement bloqué.
+// Rare Items Drop/Steal announce
+541: '%s' obtient de %s l'Objet %s (chance: %0.02f%%)
+//541: %.0s%.0sSomeone got %s
+542: '%s' a volé à %s l'Objet %s (chance: %0.02f%%)
+//542: %.0s%.0sSomeone stole %s
+// 543~548 are not used (previously @away messages)
+// @Autotrade
+549: Vous devez ouvrir un shop pour pouvoir utiliser @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: Job Inconnu
+
+// MvP Tomb
+// Added here so it can be easily translated
+656: Tombe
+657: [ ^EE0000%s^000000 ]
+658: A trépassé
+659: Heure de la mort : ^EE0000%s^000000
+660: Défait par
+661: [^EE0000%s^000000]
+
+// Etc messages from source
+662: Vous devez être au moins à %d cases des NPC.
+663: Duel: Impossible d'utiliser cet Objet en duel.
+664: Vous ne pouvez pas utiliser cette commande lorsque vous êtes mort.
+665: Impossible de créer de salle de chat dans cette zone.
+666: Pets non-autorisés lors d'une guerre entre guilde.
+667: Vous n'êtes pas mort(e).
+668: Votre position memo actuelle est:
+669: Vous brisez l'arme de la cible.
+670: Vous ne pouvez pas You can't leave battleground guildes.
+671: Cette personne est déjà dans votre liste d'ami.
+672: Nom introuvable dans la liste.
+673: Cette action ne peut pas être effectuée pour le moment. Veuillez re-essayer plus tard.
+674: Ami(e) supprimé(e).
+675: Impossible d'envoyer des mails aussi vite!!
+676: Les Alliances ne peuvent pas être créées pendant les WoE!
+677: Les Alliances ne peuvent pas être supprimées pendant les WoE!
+678: Vous n'êtes plus le maître de la guilde.
+679: Vous êtes devenu le maître de la guilde!
+680: Vous avez été soigné!
+//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
+694: Hanbok
+
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+900: Usage:
+901:	@send len <packet hex number>
+902: 	@send <packet hex nombre> {<valeur>}*
+903: 	valeur: <type=B(défaut),W,L><nombre> ou S<longueur>"<chaine de caractère>"
+904: Packet 0x%x longueur: %d
+905: Packet inconnu: 0x%x
+906: N'est pas une chaine de caractère:
+907: N'est pas un digit hexadecimal:
+908: Type de valeur inconnu dans:
+
+// @rura
+909: Veuillez entrer une map (usage: @warp/@rura/@mapmove <nom_de_map> <x> <y>).
+
+// @where
+910: Veuillez entrer un nom de Joueur (usage: @where <nom_du_personnage>).
+
+// @jumpto
+911: Veuillez entrer un nom de Joueur (usage: @jumpto/@warpto/@goto <nom_du_personnage/ID>).
+
+// @who
+912: (CID:%d/AID:%d) 
+
+// @whogm
+913: Nom: %s (GM)
+914: Nom: %s (GM:%d) | Localisation: %s %d %d
+915:       BLvl: %d | Job: %s (Lvl: %d)
+916:       Equipe: '%s' | Guilde: '%s'
+917: Aucune
+
+// @speed
+918: Veuillez entrer une valeur de vitesse (usage: @speed <%d-%d>).
+
+// @storage
+919: Storage ouvert.
+
+// @guildstorage
+920: Storage de Guilde ouvert.
+
+// @option
+921: Veuillez entrer au moins une option.
+
+// @jobchange
+922: Veuillez entrer un ID de job.
+923: Vous ne pouvez pas vous changer en ce Job avec cette commande.
+//924-979 free (future jobs?)
+
+// @kami
+980: Veuillez entrer un message (usage: @kami <message>).
+981: Veuillez entrer une couleur et un message (usage: @kamic <couleur> <message>).
+982: Couleur Invalide.
+
+// @item
+983: Veuillez entrer un nom ou un ID d'objet (usage: @item <nom/ID de l'objet> <quantité>).
+
+// @item2
+984: Veuillez entrer tous les paramètres (usage: @item2 <nom_item/ID> <quantité>
+985:   <identifié_flag> <raffinage> <attribut> <card1> <card2> <card3> <card4>).
+
+// @baselevelup
+986: Veuillez entrer une valeur pour ajuster le Niveau (BaseLevel) (usage: @lvup/@blevel/@baselvlup <nombre de levels>).
+
+// @joblevelup
+987: Veuillez entrer une valeur pour ajuster le Niveau (usage: @joblvup/@jlevel/@joblvlup <nombre de levels>).
+
+// @help
+988: Il n'y a aucune information au sujet de %c%s.
+989: Aide pour la commande %c%s:
+990: Alias disponibles:
+
+// @model
+991: Veuillez entrer au moins une valeur (usage: @model <coiffure (hair) ID: %d-%d> <couleur des cheveux: %d-%d> <couleur du vêtement: %d-%d>).
+
+// @dye
+992: Veuillez entrer une couleur de vêtement (usage: @dye/@ccolor <couleur du vêtement: %d-%d>).
+
+// @hairstyle
+993: Veuillez entrer un style de coiffure (usage: @hairstyle/@hstyle <coiffure (hair) ID: %d-%d>).
+
+// @haircolor
+994: Veuillez entrer une couleur de cheveux (usage: @haircolor/@hcolor <couleur: %d-%d>).
+
+// @go
+995: Vous ne pouvez pas utiliser @go sur cette carte.
+
+// @refine
+996: Veuillez entrer une position et une valeur (usage: @refine <position de l'équipement> <+/- valeur>).
+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: Veuillez entrer au moins un item nom/ID (usage: @produce <nom/ID de l'équipement> <élément> <# de very's>).
+
+// @memo
+1008: Veuillez entrer une position valide (usage: @memo <position_du_memo:%d-%d>).
+
+// @displaystatus
+1009: Veuillez entrer un type/flag status (usage: @displaystatus <type de status> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Veuillez entrer un nombre (usage: @stpoint <nombre de points>).
+
+// @skpoint
+1011: Veuillez entrer un nombre (usage: @skpoint <nombre de points>).
+
+// @zeny
+1012: Veuillez entrer une valeur (usage: @zeny <+/- valeur>).
+
+// @param
+1013: Veuillez entrer une valeur valide (usage: @str/@agi/@vit/@int/@dex/@luk <+/-ajustement>).
+
+// @guildlevelup
+1014: Veuillez entrer un niveau valide (usage: @guildlvup/@guildlvlup <# de niveaux>).
+
+// @makeeg
+1015: Veuillez entrer un monstre/egg nom/ID (usage: @makeegg <pet>).
+
+// @petfriendly
+1016: Veuillez entrer une valeur d'affinité (usage: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Veuillez entrer un nombre valide (usage: @pethungry <0-100>).
+
+// @recall
+1018: Veuillez entrer un nom de Joueur (usage: @recall <nom du personnage/ID>).
+1019: Vous n'êtes pas autorisé à téléporter quelqu'un sur cette carte.
+
+// @recall
+1020: Vous n'êtes pas autorisé à téléporter ce Joueur depuis sa carte.
+
+// @charblock
+1021: Veuillez entrer un nom de Joueur (usage: @charblock/@block <nom du personnage>).
+
+// @charban
+1022: Veuillez entrer un temps de bannissement et un nom de Joueur (usage: @charban/@ban/@banish/@charbanish <durée> <nom du personnage>).
+1023: Vous n'êtes pas autorisé à reduire la durée d'un bannissement.
+
+// @charunblock
+1024: Veuillez entrer un nom de Joueur (usage: @charunblock <nom du personnage>).
+
+// @charunban
+1025: Veuillez entrer un nom de Joueur (usage: @charunban <nom du personnage>).
+
+// @kick
+1026: Veuillez entrer un nom de Joueur (usage: @kick <nom du personnage/ID>).
+
+// @questskill / @lostskill
+1027: Veuillez entrer un numéro de skill de quête.
+
+// @spiritball
+1028: Veuillez entrer une quantité (usage: @spiritball <nombre: 0-%d>).
+
+// @party
+1029: Veuillez entrer un nom d'Equipe (usage: @party <Nom_Equipe>).
+
+// @guild
+1030: Veuillez entrer un nom de guilde (usage: @guild <nom_guilde>).
+
+// @idsearch
+1031: Veuillez entrer une partie du nom de l'objet cherché (usage: @idsearch <partie_nom_de_objet>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: Vous n'êtes pas autorisé(e) à téléporter quelqu'un sur votre carte actuelle.
+1033: Parce que vous n'êtes pas autorisé(e) à téléporter certains Joueurs depuis leur carte actuelle, %d Joueur(s) n'ont pas été téléportés.
+
+// @guildrecall
+1034: Veuillez entrer un nom/ID de guilde (usage: @guildrecall <nom/ID_guilde>).
+
+// @partyrecall
+1035: Veuillez entrer un nom/ID d'Equipe (usage: @partyrecall <nom/ID_party>).
+
+// @reloadatcommand
+1036: Erreur à la lecture de groups.conf, reload échoué.
+1037: Erreur à la lecture de atcommand_athena.conf, reload échoué.
+
+// @mapinfo
+1038: Veuillez entrer au moins un numéro de liste valide (usage: @mapinfo <0-3> <map>).
+1039: ------ Map Info ------
+1040: Nom de la Map: %s | Joueurs sur la Map: %d | NPCs sur la Map: %d | Chats sur la Map: %d
+1041: ------ Map Flags ------
+1042: Town Map
+1043: Autotrade Activé
+1044: Autotrade Désactivé
+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 Donjon | 
+1055: GvG Château | 
+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 (Retour au dernier point de sauvegarde)
+1069: No Save, Point de Sauvegarde: %s,Aléatoire
+1070: No Save, Point de Sauvegarde: %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: ----- Joueurs sur la Map -----
+1099: Joueur '%s' (session #%d) | Localisation: %d,%d
+1100: ----- NPCs sur la Map -----
+1101: Nord
+1102: Nord Ouest
+1103: Ouest
+1104: South Ouest
+1105: South
+1106: South Est
+1107: Est
+1108: Nord Est
+1109: Nord
+1110: Inconnue
+1111: NPC %d: %s | Direction: %s | Sprite: %d | Localisation: %d %d
+1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Localisation: %d %d 
+1113: ----- Chats sur la Map -----
+1114: Chat: %s | Joueur: %s | Localisation: %d %d
+1115:    Utilisateur: %d/%d | Mot de Passe: %s | Publique: %s
+1116: Oui
+1117: Non
+1118: Veuillez entrer au moins un numéro de liste valide (usage: @mapinfo <0-3> <map>).
+
+// @mount
+1119: Vous êtes monté sur votre Dragon.
+1120: Vous avez relâché votre Dragon.
+1121: Vous êtes monté sur votre Warg.
+1122: Vous avez relâché votre Warg.
+1123: Vous êtes monté dans votre Mado Gear.
+1124: Vous êtes sorti(e) de votre Mado Gear.
+
+// @guildspy
+1125: Mapserver a les commandes d'espionnage désactivées.
+1126: Veuillez entrer un nom/ID de guilde (usage: @guildspy <nom/ID_guilde>).
+
+// @partyspy
+1127: Veuillez entrer un nom/ID d'Equipe (usage: @partyspy <nom/ID_party>).
+
+// @nuke
+1128: Veuillez entrer un nom de Joueur (usage: @nuke <nom du personnage>).
+
+// @tonpc
+1129: Veuillez entrer un nom de NPC (usage: @tonpc <nom_NPC>).
+
+// @enablenpc
+1130: Veuillez entrer un nom de NPC (usage: @enablenpc <nom_NPC>).
+
+// @hidenpc
+1131: Veuillez entrer un nom de NPC (usage: @hidenpc <nom_NPC>).
+
+// @loadnpc
+1132: Veuillez entrer un nom de fichier script (usage: @loadnpc <nom_fichier>).
+
+// @npcoff
+1133: Veuillez entrer un nom de NPC (usage: @npcoff <nom_NPC>).
+
+// @jail
+1134: Veuillez entrer un nom de Joueur (usage: @jail <nom_personnage>).
+
+// @unjail
+1135: Veuillez entrer un nom de Joueur (usage: @unjail/@discharge <nom_personnage>).
+
+// @jailfor
+1136: Durée Invalide pour la commande jail.
+1137: Vous êtes maintenant
+1138: Ce Joueur est maintenant
+
+// @jailtime
+1139: Vous n'êtes pas emprisonné(e).
+1140: Vous avez été emprisonné(e) indéfiniment.
+1141: Vous avez été emprisonné(e) pendant une durée inconnue.
+1142: Vous resterez
+
+// @disguise
+1143: Veuillez entrer un nom/ID de Monstre/NPC (usage: @disguise <nom/ID>).
+1144: Le Personnage ne peut pas se déguiser lorsqu'il possède une monture.
+
+// @disguiseall
+1145: Veuillez entrer un nom/ID de Monstre/NPC (usage: @disguiseall <nom/ID>).
+
+// @disguiseguild
+1146: Veuillez entrer un nom/ID de Monstre et un nom/ID de guilde (usage: @disguiseguild <nom/ID_mob>, <nom/ID_guilde>).
+
+// @undisguiseguild
+1147: Veuillez entrer un nom/ID de guilde (usage: @undisguiseguild <nom/ID_guilde>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: Veuillez entrer un message (usage: @broadcast <message>).
+
+// @localbroadcast
+1150: Veuillez entrer un message (usage: @localbroadcast <message>).
+
+// @email
+1151: Veuillez entrer 2 emails (usage: @email <actuel@email> <nouvel@email>).
+
+// @effect
+1152: Veuillez entrer un numéro se référant à un effet (usage: @effect <numéro_effet>).
+
+// @npcmove
+1153: Usage: @npcmove <X> <Y> <nom_npc>
+1154: NPC n'est pas sur cette carte.
+1155: NPC déplacé.
+
+// @addwarp
+1156: Usage: @addwarp <nom_map> <X> <Y> <nom_npc>
+1157: Carte Inconnue '%s'.
+1158: Nouveau warp NPC '%s' créé.
+
+// @follow
+1159: Follow mode OFF.
+1160: Follow mode ON.
+
+// @storeall
+1161: Vous ne pouvez actuellement pas ouvrir votre storage.
+1162: Tous les Objets ont été stockés.
+
+// @skillid
+1163: Veuillez entrer un nom de compétence à chercher (usage: @skillid <nom du skill>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Usage: @useskill <skill ID> <niveau du skill> <cible>
+
+// @displayskill
+1166: Usage: @displayskill <skill ID> {<niveau du skill>}
+
+// @skilltree
+1167: Usage: @skilltree <skill ID> <cible>
+1168: Joueur est en train d'utiiliser %s skill tree (%d basic points).
+1169: Le Joueur ne peut pas utiliser ce skill.
+1170: Joueur a besoin du niveau %d du skill %s.
+1171: Le Joueur possède tout ce qu'il lui faut pour ce skill.
+
+// @marry
+1172: Usage: @marry <nom du personnage>
+1173: Ils sont marriés... souhaitons-leur bonne chance.
+1174: Ces deux ne peuvent pas se marrier : l'un des deux fait parti de la classe baby ou est déjà marrié.
+
+// @divorce
+1175: '%s' n'est pas marrié.
+1176: '%s' et sa/son partenaire sont maintenant divorcés.
+
+// @changelook
+1177: Usage: @changelook {<position>} <view id>
+1178: Position: 1-Haut 2-Milieu 3-Bas 4-Arme 5-Bouclier 6-Chaussures 7-Robe
+
+// @autotrade
+1179: Autotrade n'est pas autorisé sur cette carte.
+1180: Vous ne pouvez pas utiliser autotrade lorsque vous êtes mort.
+
+// @changegm
+1181: Vous devez être le Maître de votre guilde pour pouvoir utiliser cette commande.
+1182: Vous ne pouvez pas changer de chef de guilde sur cette carte.
+1183: Usage: @changegm <nom_membre_guilde>
+1184: Le personnage en question doit être en ligne et être un membre de votre guilde.
+
+// @changeleader
+1185: Usage: @changeleader <nom_membre_party>
+
+// @partyoption
+1186: Usage: @partyoption <partage des objets ramassés: oui/non> <distribution des objets: oui/non>
+
+// @autoloot
+1187: Autolooting des objets avec un taux de drop de %0.02f%% et au-dessous.
+1188: Autoloot est maintenant off.
+
+// @autolootitem
+1189: Objet non-trouvé.
+1190: Vous ramasser déjà automatiquement cet Objet.
+1191: Votre liste d'Objet à ramasser est pleine. Supprimez des Objets avec @autolootid -<nom_ou_ID_Objet>.
+1192: Ramassage automatique de: '%s'/'%s' {%d}
+1193: Actuellement vous ne ramasser pas automatiquement cet Objet.
+1194: Onjet supprimé: '%s'/'%s' {%d} de votre liste de 'autolootitem'.
+1195: Vous pouvez avoir %d Objets dans votre liste d'Objets ramassés automatiquement avec 'autolootitem'.
+1196: Pour ajouter un Objet à votre liste, utilisez "@alootid +<nom_ou_ID_Objet>". Pour supprimer un Objet de la liste, utiliser "@alootid -<nom_ou_ID_Objet>".
+1197: "@alootid reset" videra votre liste d'Objets ramassés automatiquement avec 'autolootitem'.
+1198: Votre liste d'Objets ramassés automatiquement avec 'autolootitem' est vide.
+1199: Objets listés de 'autolootitem':
+1200: Votre liste d'Objets ramassés automatiquement avec 'autolootitem' a été supprimée.
+
+// @rain
+//1201: La pluie a cessé.
+//1202: Il a commencé à pleuvoir.
+
+// @snow
+1203: La neige a cessé de tomber.
+1204: Il a commencé à neiger.
+
+// @sakura
+1205: Les feuilles de Cerisier ne tombent plus.
+1206: Les feuilles de Cerisier ont commencé à tomber.
+
+// @clouds
+1207: Les nuages ont disparu.
+1208: Des nuages apparaissent.
+
+// @clouds2
+1209: Les nuages alternatifs ont disparu.
+1210: Des nuages alternatifs apparaissent.
+
+// @fog
+1211: Le brouillard a disparu.
+1212: Le brouillard s'est levé.
+
+// @leaves
+1213: Les feuilles ne tombent plus.
+1214: Des feuilles tombent.
+
+// @fireworks
+1215: Les Feux d'artifice se sont arrêtés.
+1216: Feux d'artifice lancés.
+
+// @sound
+1217: Veuillez entrer un nom de fichier de son (usage: @sound <nom du fichier>).
+
+// @mobsearch
+1218: Veuillez entrer un nom de monstre (usage: @mobsearch <nom du monstre>).
+1219: Mob ID Invalide %s!
+1220: Recherche du Mob... %s %s
+
+// @cleanmap
+1221: Tous les Objets à terre ont été supprimés.
+
+// @npctalk
+1222: Veuillez entrer des paramètres corrects (usage: @npctalk <nom du npc>, <message>).
+1223: Veuillez entrer des paramètres corrects (usage: @npctalkc <couleur> <nom du npc>, <message>).
+
+// @pettalk
+1224: Veuillez entrer un message (usage: @pettalk <message>).
+
+// @summon
+1225: Veuillez entrer un nom de monstre (usage: @summon <name du monstre> {durée}).
+
+// @adjgroup
+1226: Usage: @adjgroup <group_id>
+1227: Le groupe spécifié n'existe pas.
+1228: Groupe changé.
+1229: Votre groupe a été changé.
+
+// @trade
+1230: Veuillez entrer un nom de Joueur (usage: @trade <nom du personnage>).
+
+// @setbattleflag
+1231: Usage: @setbattleflag <flag> <valeur>
+1232: Battle_config flag inconnu.
+1233: Changement de battle_config comme demandé.
+
+// @unmute
+1234: Veuillez entrer un nom de Joueur (usage: @unmute <nom du personnage>).
+1235: Le joueur n'est pas mute.
+1236: Joueur unmute.
+
+// @mute
+1237: Usage: @mute <durée> <nom du personnage>
+
+// @identify
+1238: Il n'y a aucun item à identifier.
+
+// @mobinfo
+1239: Veuillez entrer un nom de monstre/ID (usage: @mobinfo <nom_du_monstre_ou_ID_monstre>).
+1240: Monstre MVP: '%s'/'%s'/'%s' (%d)
+1241: Monstre: '%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  Elément: %s (Lv:%d)
+1245:  Drops:
+1246: Ce monstre n'a pas de drops.
+1247:  MVP Bonus EXP:%u
+1248:  MVP Items:
+1249: Ce monstre n'a pas de Prix spécial MVP.
+
+// @showmobs
+1250: Mob ID Invalide %s!
+1251: Impossible de montrer les monstres de type boss!
+1252: Recherche de Monstres... %s %s
+
+// @homlevel
+1253: Veuillez entrer une valeur d'ajustement de niveau (usage: @homlevel <+/- nombre de niveau>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: Vous n'avez pas d'homunculus.
+
+// @homevolve
+1255: Votre homunculus ne peux pas evoluer.
+
+// @makehomun
+1256: Veuillez entrer une ID d'homunculus (usage: @makehomun <homunculus id>).
+1257: Homunculus ID Invalide.
+
+// @homfriendly
+1258: Veuillez entrer une valeur d'affinité (usage: @homfriendly <valeur [0-1000]>).
+
+// @homhungry
+1259: Veuillez entrer une valeur se référant à l'appétit (usage: @homhungry <valeur [0-100]>).
+
+// @homtalk
+1260: Veuillez entrer un message (usage: @homtalk <message>).
+
+// @hominfo
+1261: Stats de l'Homunculus:
+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: Evolution des stats de L'Homunculus (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: Stats de l'Homunculus altérées.
+
+// @iteminfo
+1276: Veuillez entrer un nom/ID d'objet (usage: @ii/@iteminfo <nom/ID>).
+1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
+1278: Aucun
+1279: Avec script
+1280: NPC Acheté:%dz, Vendu:%dz | Poids: %.1f 
+1281:  - Disponible seulement en magasin (shop).
+1282:  - Chance de drop Maximale des monstres: %02.02f%%
+1283:  - monstres ne drop pas cet objet.
+
+// @whodrops
+1284: Veuillez entrer un nom/ID d'Objet (usage: @whodrops <nom/ID_objet>).
+1285: Objet: '%s'[%d]
+1286:  - Cet Objet n'est lâché par aucun monstre.
+1287:  - Monstres communs avec la plus grande chance de drop (seuls %d max sont listés):
+
+// @whereis
+1288: Veuillez entrer un nom/ID de monstre (usage: @whereis <nom/ID_monstre>).
+1289: %s ré-apparait dans:
+1290: Ce monstre n'apparait pas normalement.
+
+// @adopt
+1291: Usage: @adopt <père>,<mère>,<enfant>
+1292: Adoption: --%s--%s--%s--\n
+1293: Impossible de trouver le Joueur %s en ligne.
+1294: Ils sont une famille... souhaitons leur bonne chance.
+
+// @version
+1295: rAthena Version SVN r%s
+1296: Version SVN indéterminée.
+
+// @mutearea
+1297: Veuillez entrer une durée en minute (usage: @mutearea/@stfu <durée en minute>).
+
+// @rates
+1298: Taux (rate) d'Experience: Base %.2fx / Job %.2fx
+1299: Taux (Rate) de Drop Normal: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipement %.2fx / Card %.2fx
+1300: Taux (Rate) de Drop Boss: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipement %.2fx / Card %.2fx
+1301: Autres taux (Rates) de Drops: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Veuillez entrer un message (usage: @me <message>).
+
+// @size / @sizeall / @sizeguild
+1303: Changement de Taille appliqué.
+
+// @sizeguild
+1304: Veuillez entrer un nom/ID de guilde (usage: @sizeguild <taille> <nom/ID_guilde>).
+
+// @monsterignore
+1305: Vous êtes maintenant immunisé aux attaques.
+1306: Retourné à l'état normal.
+
+// @fakename
+1307: Vrai nom affiché.
+1308: Vous devez entrer un nom.
+1309: Le Faux nom doit faire au moins 2 caractères de long.
+1310: Faux nom affiché.
+
+// @mapflag
+1311: Mapflags activé sur cette carte:
+1312: Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Type "@mapflag available" pour afficher la liste des mapflags disponibles.
+1314: Flag ou nom du flag Invalide.
+1315: Flags disponibles:
+
+// @showexp
+1316: L'exp gagnée ne sera plus affichée.  
+1317: L'exp gagnée est maintenant affichée.
+
+// @showzeny
+1318: Les Zeny gagnés ne seront plus affichés. 
+1319: Les Zeny gagnés seront maintenant affichés.
+
+// @showdelay
+1320: Les Compétences avec délai qui échouent ne seront plus affichées.
+1321: Les Compétences avec délai qui échouent seront maintenant affichées.
+
+// @cash
+1322: Veuillez entrer une quantité.
+
+// @clone
+1323: Vous devez entrer un nom de Joueur ou un ID (ID du personnage).
+
+// @feelreset
+1324: Réinitialisation des cartes désignés par 'Feeling'.
+
+// @noks
+1325: [ K.S Protection Inactive ]
+1326: [ K.S Protection Active - Option: Equipe ]
+1327: [ K.S Protection Active - Option: Soi-même ]
+1328: [ K.S Protection Active - Option: Guilde ]
+1329: Usage: @noks <self|party|guild>
+
+// @allowks
+1330: [ Map K.S Protection Active ]
+1331: [ Map K.S Protection Inactive ]
+
+// @itemlist
+1332: ------ %s List des objets de '%s' ------
+1333:  | équipés: 
+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, nommé)
+1349:  -> (pet egg, pet id: %u, sans nom)
+1350:  -> (crafted item, creator id: %u, star crumbs %d, élément %d)
+1351:  -> (produced item, creator id: %u)
+1352:  -> (card(s): 
+1353: Aucun objet n'a été trouvé sur le Joueur %s.
+1354: %d objet(s) trouvé(s) dans %d %s slots.
+
+// @delitem
+1355: Veuillez entrer un nom/ID d'objet, une quantité, et un nom de Joueur (usage: #delitem <Joueur> <nom_ou_ID_item> <quantité>).
+
+// @font
+1356: L'arrière-plan revient à la normal.
+1357: Tapez @font <1-9> pour changer votre message d'arrière-plan.
+1358: Tapez 0 ou aucun paramètre pour remettre l'arrière-plan normal.
+1359: Invalide valeur d'arrière-plan ('font'). Utilisez une valeur comprise entre 0 et 9.
+1360: Arrière-plan changé.
+1361: Vous utilisez déjà cet arrière-plan.
+
+// @new_mount
+1362: NOTE: Si votre lanceur se crash avec la monture alors votre LUA est trop vieux.
+1363: Vous êtes monté(e) sur une monture.
+1364: Vous avez relâché(e) votre monture.
+
+// @accinfo
+1365: Usage: @accinfo/@accountinfo <account_id/nom du personnage>
+1366: Vous pouvez faire une recherche partielle du nom en utilisant '%' dans votre recherche, ex. "@accinfo %Mario%" liste tous les personnages dont le nom contient "Mario".
+
+// @set
+1367: Usage: @set <nom_de_variable> <valeur>
+1368: Usage: ex. "@set PoringCharVar 50"
+1369: Usage: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: Usage: ex. "@set PoringCharVarSTR$" affiche sa valeur actuelle, Super Duper String.
+1371: Les variables des NPC ne peuvent pas être utilisées/changées avec @set.
+1372: Les variables d'Instance ne peuvent pas être utilisées avec @set.
+1373: %s valeur est maintenant :%d
+1374: %s valeur est maintenant :%s
+1375: %s est vide
+1376: Le type de donnée %s n'est pas supportée :%u
+
+// @reloadquestdb
+1377: Base de données des Quêtes rechargée.
+
+// @addperm
+1378: Usage: %s <nom_permission>
+1379: -- Liste des Permissions
+1380: '%s' est une permission inconnue.
+1381: L'utilisateur '%s' possède déjà la permission '%s'.
+1382: L'utilisateur '%s' ne possède pas la permission '%s'.
+1383: -- Permissions de l'utilisateur '%s'
+1384: Les permissions de l'utilisateur '%s' ont été mises à jour avec succès. Notez que ces changements sont temporaires.
+
+// @unloadnpcfile
+1385: Usage: @unloadnpcfile <nom du fichier>
+1386: Fichier unload. Notez que les mapflags et les monstres déjà invoqués se sont pas supprimés.
+1387: Fichier non-trouvé.
+
+// General command messages
+1388: Charcommand échoué (usage: %c<command> <nom du personnage> <parametres>).
+1389: %s échoué. Joueur non-trouvé.
+
+// @cart
+1390: Chariot inconnu (usage: %s <0-%d>).
+1391: Vous ne possédez pas de chariot.
+1392: Chariot ajouté.
+
+// atcommand.c::is_atcommand
+1393: Les morts ne pouvent pas utiliser de commande.
+
+// @clearstorage
+1394: Votre storage est maintenant vide.
+1395: Votre storage de guilde est maintenant vide.
+
+// @clearcart
+1396: Vous ne possédez pas de chariot.
+1397: Votre chariot est maintenant vide.
+
+// @skillid (extension)
+1398: -- Affichage des premiers %d des recherches partielles:
+
+// @join
+1399: Canal ('Channel') inconnu (usage: %s <#nom_canal>)
+1400: Canal ('Channel') inconnu '%s' (usage: %s <#nom_canal>)
+1401: Le Canal '%s' est protégé par un mot de passe (usage: %s <#nom_canal> <mot_de_passe>)
+1402: Vous n'êtes pas sur ce canal, taper '@join <#nom_canal>'
+1403: Vous vous êtes connecté(e) sur le Canal '%s'.
+
+// @channel
+1404: %s échoué.
+1405: Le nom du Canal doit commencer par '#'.
+1406: La longueur du nom du Canal doit être comprise entre 3 et %d.
+1407: Le Canal '%s' n'est pas disponible.
+1408: Le mot de passe d'un Canal ne doit pas contenir d'espaces.
+1409: - #%s (%d utilisateurs)
+1410: ---- Canals Publiques ----
+1411: '%s': Couleur Inconnue.
+1412: Vous n'êtes pas le propriétaire du Canal '%s'.
+1413: Couleur du Canal '%s' changée en '%s'.
+1414: ---- Options disponibles:
+1415: * %s create <#nom_canal> <channel_password>
+1416: -- Création d'un nouveau Canal.
+1417: * %s list
+1418: -- Listes de tous les Canaux publiques.
+1419: * %s list colors
+1420: -- Listes de toutes les couleurs disponibles pour les canaux customisés.
+1421: * %s setcolor <#nom_canal> <nom_couleur>
+1422: -- Change la couleur du texte du canal en celle spécifiée (seul le propriétaire du canal peut l'utiliser).
+1423: * %s leave <#nom_canal>
+1424: -- Sortir du canal spécifié.
+1425: Vous n'êtes pas sur le canal '%s'.
+1426: Vous avez quitté le canal '%s'.
+1427: * %s bindto <#nom_canal>
+1428: -- Lier votre chat global au canal spécifié, envoyant tous vos messages globaux messages sur ce canal.
+1429: * %s unbind
+1430: -- Délier votre chat global des canaux auquels vous êtes attachés, s'il y en a.
+1431: Votre chat global est maintenant lié au canal '%s'.
+1432: Votre chat global n'est relié à aucun canal.
+1433: Votre chat global est maintenant délié du Canal '#%s'.
+1434: Vous êtes déjà sur le canal '%s'.
+1435: Vous êtes entré(e) sur le Canal '#%s' de '%s'.
+
+//Custom translations
+//import: conf/msg_conf/import/map_msg_frn_conf.txt

+ 1453 - 0
conf/msg_conf/map_msg_ind.conf

@@ -0,0 +1,1453 @@
+// rAthena msg_athena.conf
+// Pengaturan pesan
+// Diterjemahkan oleh [Cydh] dan [nanakiwurtz]
+// Untuk terjemahan, cukup ubah pesan di sini (pada baris ke-2), tidak perlu mengubah source code,
+// atau dapat dilakukan dengan cara lain, menggunakan conf/import/msg_conf.txt
+// Format penulisan:
+// nomor_pesan: pesan yang diterjemahkan
+
+//   0-410: untuk perintah GM
+// 500-900 untuk lainnya
+// 900-1300: @atcommand
+
+// Untuk meniadakan sebuah string (%s), maka jadikan maks. panjang string tersebut menjadi 0.
+// contoh:
+// 270: *%s %s* (@me format)
+// 270: *%.0s%s* (menghilangkan nama karakter dari pesan tersebut)
+
+// Pesan dari perintah GM
+// -----------------------
+
+0: Telah berpindah tempat.
+1: Map tidak ditemukan
+2: Koordinat salah, menggunakan target cell random.
+3: Karakter tidak ditemukan.
+4: Lompat ke %s
+5: Lompat ke %d %d
+6: Save point telah diubah.
+7: Dipindahkan ke save point.
+8: Speed telah diubah.
+9: Option telah diubah.
+10: Invisible: Mati
+11: Invisible: Aktif
+12: Job telah diubah.
+13: Kamu mati.
+14: Karakter telah dibunuh.
+15: Player telah warp (pesan telah dikirim ke pemain juga).
+16: Kamu telah dihidupkan!
+17: HP dan SP telah dipulihkan.
+18: Item telah dibuat.
+19: ID item atau nama salah.
+20: Semua itemmu telah dihilangkan.
+21: Base Level dinaikkan.
+22: Base Level diturunkan.
+23: Job Level tidak dapat lebih tinggi.
+24: Job Level dinaikkan.
+25: Job Level diturunkan.
+26: Bantuan command:
+27: Bantuan command tidak tersedia.
+28: Pemain tidak ditemukan.
+29: 1 pemain ditemukan.
+30: %d pemain ditemukan.
+31: PvP: Mati.
+32: PvP: Aktif.
+33: GvG: Mati.
+34: GvG: Aktif.
+35: Kamu tidak bisa menggunakan perintah ini dengan class ini.
+36: Penampilan telah diubah.
+37: Angka yang ditentukan salah.
+38: Angka atau nama lokasi salah.
+39: Semua monster telah dipanggil!
+40: Nama atau ID monster salah.
+41: Tidak dapat mengurangi angka/nilai.
+42: Status diubah.
+43: Kamu tidak berada dalam guild.
+44: Kamu bukan pemimpin dari guild.
+45: Gagal mengubah guild level.
+46: %s telah dipanggil!
+47: Level Base tidak dapat lebih tinggi.
+48: Job karakter telah diubah.
+49: ID job salah.
+50: Kamu sudah memiliki beberapa kekuatan GM.
+51: Karakter dihidupkan.
+52: Opsi ini tidak dapat digunakan dalam mode PK.
+53: '%s' status:
+54: Tidak ada pemain yang ditemukan di map '%s'.
+55: 1 player ditemukan di map '%s'.
+56: %d player ditemukan di map '%s'.
+57: Save point karakter telah diubah.
+58: Opsi pada karakter telah diubah.
+59: Mode malam telah aktif.
+60: Mode siang Mode telah aktif.
+61: Pembawa pesan suci telah memberikan hukuman.
+62: Hukuman telah dilewati.
+63: Kemurahan hati telah ditunjukkan.
+64: Kemurahan hati telah diterima.
+65: Base Level karakter ditingkatkan.
+66: Base Level karakter diturunkan.
+67: Job Level karakter tidak dapat lebih tinggi.
+68: Job Level karakter ditingkatkan.
+69: Job Level karakter diturunkan.
+70: Kamu telah mempelajari skill ini.
+71: Kamu telah melupakan skill ini.
+72: War of Emperium telah dimulai.
+73: War of Emperium saat ini sedang berjalan.
+74: War of Emperium telah selesai.
+75: War of Emperium saat ini tidak sedang berjalan.
+76: Semua skill telah ditambahkan ke skill tree.
+77: Hasil referensi dari '%s' (nama: id):
+78: %s: %d
+79: Terdapat %d hal di atas.
+80: Harap berikan nama tampilan atau nama/id monster.
+81: Level GM kamu tidak diizinkan untuk untuk melakukan aksi ini pada player tertentu.
+82: Harap berikan nama atau nomor dari daftar yang disediakan:
+83: Monster 'Emperium' tidak dapat dipanggil.
+84: Semua status telah diubah!
+85: Waktu salah untuk perintah ban.
+86: Maaf, nama pemain harus setidaknya terdiri dari 4 karakter.
+87: Maaf, nama pemain tidak dapat lebih banyak dari 23 karakter.
+88: Mengirim permintaan ke login server.
+89: Mode malam telah diaktifkan.
+90: Mode siang telah diaktifkan.
+91: Base Level karakter tidak dapat lebih tinggi.
+92: Semua karakter dipanggil!
+93: Semua karakter yang online di guild %s telah dipanggil ke posisimu.
+94: Nama/ID salah, atau tidak ada seorang pun dari guild yang ditentukan sedang online.
+95: Semua karakter yang online di party %s telah dipanggil ke posisimu.
+96: Nama/ID salah, atau tidak seorang pun dari guild yang ditentukan sedang online.
+97: Database item telah dimuat ulang.
+98: Database monster telah dimuat ulang.
+99: Database skill telah dimuat ulang.
+100: Script telah dimuat ulang.
+101: Login-server telah meminta untuk memuat ulang akun GM dan level mereka.
+102: Kamu tidak memiliki Peco Peco.
+103: Tidak lagi memata-matai guild %s.
+104: Memata-matai guild %s.
+105: Tidak lagi memata-matai party %s.
+106: Memata-matai party %s.
+107: Semua item telah diperbaiki.
+108: Tidak ada item yang diperbaiki.
+109: Equip pemain telah dilepas semuanya!
+110: NPC Diaktifkan.
+111: NPC ini tidak tersedia.
+112: NPC Dinonaktifkan.
+113: %d item dibersihkan oleh GM.
+114: %d item dibersihkan dari pemain.
+115: %d item dibersihkan. Pemain hanya mempunyai %d item dari %d.
+116: Karakter tidak memiliki item yang ditentukan.
+117: Kamu dipenjara oleh GM.
+118: Pemain dipindahkan ke penjara.
+119: Pemain ini tidak berada di penjara.
+120: GM telah membebaskanmu dari penjara.
+121: Pemain dibebaskan.
+122: Disguise telah diterapkan.
+123: Nama/ID Monster/NPC yang ditentukan salah.
+124: Undisguise telah diterapkan.
+125: Kamu tidak sedang disguise.
+//Pesan-pesan yang berkaitan dengan Klon
+126: Tidak dapat mengklon pemain dengan Level GM yang lebih tinggi darimu.
+127: Jumlah klon yang kamu miliki telah mencapai batas.
+128: Klon jahat telah diciptakan.
+129: Tidak dapat menciptakan klon jahat.
+130: Klon diciptakan.
+131: TIdak dapat menciptakan klon.
+132: Klon pembantu diciptakan.
+133: Tidak dapat menciptakan klon pembantu.
+//Pesan 134-139 tidak sedang digunakan, tersedia untuk penggunaan berikutnya (lebih baik digunakan untuk variasi dari perintah @clone).
+140: Disguise karakter diterapkan.
+141: Undisguise karakter diterapkan.
+142: Karakter tidak sedang disguise.
+143: Semua perintah tidak dapat digunakan di map ini.
+144: E-mail salah. Jika kamu memiliki e-mail default, ketikkan a@a.com.
+145: E-mail baru salah. Harap masukkan e-mail yang sebenarnya.
+146: E-mail baru haruslah e-mail yang asli.
+147: E-mail baru haruslah berbeda dengan e-mail saat ini.
+148: Informasi telah dikirimkan ke login-server melalui char-server.
+149: Tidak mungkin untuk meningkatkan nilai.
+150: Tidak ada GM yang online.
+151: 1 GM sedang online.
+152: Ada %d GM sedang online.
+153: %s adalah perintah yang tidak diketahui.
+154: %s gagal.
+155: Kamu tidak bisa berganti job.
+156: HP dan/atau SP sudah diubah.
+157: HP dan SP sudah dipulihkan.
+158: Base Level sudah paling rendah.
+159: Job Level sudah paling rendah.
+160: PvP sudah Off.
+161: PvP sudah On.
+162: GvG sudah Off.
+163: GvG sudah On.
+164: Lokasi memo  #%d tidak ditemukan.
+165: Semua monster sudah dibunuh!
+166: Tidak ada item yang ditempa.
+167: 1 item berhasil ditempa.
+168: %d item berhasil ditempa.
+169: Item (%d: '%s') tidak bisa dipakai.
+170: Item ini tidak bisa dipakai.
+171: %d - sudah habis
+172: Kamu sudah mengganti posisi memo %d - %s (%d,%d).
+173: Level skill 'Warp' belum cukup.
+174: Jumlah Status Point sudah diubah.
+175: Jumlah Skill Point sudah diubah.
+176: Jumlah zeny sudah diubah.
+177: Kamu tidak bisa mengurangi stat ini lagi.
+178: Kamu tidak bisa menambah stat ini lagi.
+179: Level Guild sudah diubah.
+180: Monster/Nama telur/ID tidak ditemukan.
+181: Kamu sudah memiliki peliharaan.
+182: Tingkat kedekatan peliharaan sudah diubah.
+183: Tingkat kedekatan peliharaan sudah maksimal.
+184: Maaf, kamu belum mempunyai peliharaan.
+185: Tingkat kelaparan peliharaan sudah diubah.
+186: Tingkat kelaparan peliharaan sudah maksimal.
+187: Kamu bisa mengubah nama peliharaanmu.
+188: Kamu sudah mengubah nama peliharaanmu.
+189: Sekarang player ini bisa mengubah nama peliharaannya.
+190: Pemain ini sudah pernah mengubah nama peliharaannya.
+191: Maaf, pemain ini tidak mempunyai peliharaan.
+192: Job karakter tersebut tidak bisa diubah.
+193: Base Level karakter sudah paling rendah.
+194: Job Level karakter sudah paling rendah.
+195: Semua pemain sudah dikeluarkan!
+196: Kamu sudah memiliki Quest skill ini.
+197: Skill tersebut tidak ditemukan atau bukan Quest skill.
+198: Skill tersebut tidak ditemukan.
+199: Pemain ini sudah memiliki skill tersebut.
+200: Pemain ini sudah memiliki skill quest tersebut.
+201: Kamu belum memiliki skill quest ini.
+202: Player ini sudah menghapus skill.
+203: Player ini tidak mempunyai skill quest.
+204: Kamu tidak membuka toko di sini.
+205: Mungkin maksudnya: 
+206: '%s' skill poin sudah direset.
+207: '%s' status poin sudah direset.
+208: '%s' skill dan status poin sudah direset.
+209: Skill poin karakter sudah diubah.
+210: Status poin karakter sudah diubah.
+211: Jumlah zeny karakter sudah diubah.
+212: Tidak bisa menggunakan tunggangan saat berubah wujud.
+213: Job ini tidak bisa menggunakan Peco Peco.
+214: Kamu sudah melepaskan Peco Peco.
+215: Player ini tidak bisa menggunakan Peco Peco karena sedang berubah wujud.
+216: Player ini sudah menggunakan Peco Peco.
+217: Player ini tidak bisa menggunakan Peco Peco karena jobnya tidak mendukung.
+218: Peco Peco dari pemain ini sudah dilepaskan.
+219: %d hari
+220: %d hari
+221: %s %d jam
+222: %s %d jam
+223: %s %d menit
+224: %s %d menit
+225: %s dan %d detik
+226: %s dan %d detik
+227: Kamu tidak bisa mengubah Party di map ini.
+228: Kamu tidak bisa mengubah Guild di map ini.
+229: Efek sudah diubah.
+230: Waktu Server: %A, %B %d %Y %X.
+231: Info: Server selalu siang.
+232: Info: Server selalu malam.
+233: Info: Server sudah berada pada mode malam selama %s.
+234: Info: Setelah itu, server akan selalu siang.
+235: Info: Server sudah berada pada mode siang selama %s.
+236: Info: Setelah itu, server akan selalu malam.
+237: Info: Setelah itu, server akan berganti ke malam selama %s.
+238: Info: Durasi 1 hari di dalam game adalah %s.
+239: Info: Setelah itu, server akan berganti ke siang selama %s.
+240: %d monster telah dipanggil!
+241: Sekarang kamu bisa menyerang dan membunuh pemain lain.
+242: Sekarang kamu bisa diserang dan dibunuh oleh pemain lain.
+243: Semua skill sudah dinonaktifkan di map ini.
+244: Semua skill sudah diaktifkan di map ini.
+245: Server Online Selama: %ld hari, %ld jam, %ld menit, %ld detik.
+246: Level GM kamu tidak cukup untuk melakukan perintah tersebut.
+247: Kamu tidak diperbolehkan untuk berpindah ke map tersebut.
+248: Kamu tidak diperbolehkan untuk berpindah dari map ini.
+249: Kamu tidak diperbolehkan untuk berpindah ke tempat save.
+250: Kamu sudah membuka penyimpanan.
+251: Kamu sudah membuka penyimpanan guild.
+252: Kamu belum bergabung di dalam guild.
+253: Kamu tidak diperbolehkan untuk menggunakan memo di map ini.
+254: Konfigurasi perintah GM sudah dimuat ulang.
+255: Konfigurasi pertempuran sudah dimuat ulang.
+256: Database status sudah dimuat ulang.
+257: Database pemain sudah dimuat ulang.
+258: Paket 0x%x (%d) sudah terkirim.
+259: Paket salah.
+260: Item ini tidak bisa ditransaksikan.
+261: Script tidak dapat dimuat.
+262: Script sudah dimuat.
+263: Item ini tidak bisa dibuang.
+264: Item ini tidak bisa disimpan.
+265: %s sudah membeli item darimu.
+266: Beberapa item tidak dapat ditransaksikan dan telah dikeluarkan dari toko.
+267: '%s' map yang dipilih sudah diatur ulang.
+268: 'Pesan Hari Ini' sudah dimuat ulang.
+269: Menampilkan hasil %d dari %d
+//@me format keluaran
+270: * :%s %s: *
+271: Kamu tidak bisa membuang item di map ini.
+272: Kamu tidak bisa bertransaksi di map ini.
+273: Perintah yang tersedia:
+274: %d perintah ditemukan.
+275: Tidak ada perintah yang ditemukan.
+276: Kamu tidak bisa membuka toko di map ini.
+277: Penggunaan: @request <Pesan untuk GM yang sedang online>.
+278: (@request): %s
+279: @request sudah terkirim.
+280: Nama salah.
+281: Kamu tidak bisa membuka ruangan chat di map ini.
+// Berhubungan dengan Party
+282: Kamu harus menjadi ketua party untuk menggunakan perintah ini.
+283: Karakter tersebut harus online dan ada di dalam party ini.
+284: Ketua party sudah diganti.
+285: Kamu sudah menjadi ketua party.
+286: Pengaturan tidak jadi diubah.
+287: Kamu tidak bisa mengganti ketua party di map ini.
+288: Sekarang kamu tidak bisa dibunuh.
+289: Sekarang player ini bisa dibunuh.
+290: Player ini tidak bisa dibunuh.
+291: Efek cuaca akan hilang saat warp/refresh.
+292: 'Kondisi pembunuh' diatur ulang.
+// Guild Castles Number
+// --------------------
+//299: ?? Kastil
+300: Tidak satupun
+301: Satu Kastil
+302: Dua Kastil
+303: Tiga Kastil
+304: Empat Kastil
+305: Lima Kastil
+306: Enam Kastil
+307: Tujuh Kastil
+308: Delapan Kastil
+309: Sembilan Kastil
+310: Sepuluh Kastil
+311: Sebelas Kastil
+312: Duabelas Kastil
+313: Tigabelas Kastil
+314: Empatbelas Kastil
+315: Limabelas Kastil
+316: Enambelas Kastil
+317: Tujuhbelas Kastil
+318: Delapanbelas Kastil
+319: Sembilanbelas Kastil
+320: Duapuluh Kastil
+321: Duapuluh Satu Kastil
+322: Duapuluh Dua Kastil
+323: Duapuluh Tiga Kastil
+324: Duapuluh Empat Kastil
+325: Duapuluh Lima Kastil
+326: Duapuluh Enam Kastil
+327: Duapuluh Tujuh Kastil
+328: Duapuluh Delapan Kastil
+329: Duapuluh Sembilan Kastil
+330: Tigapuluh Kastil
+331: Tigapuluh Satu Kastil
+332: Tigapuluh Dua Kastil
+333: Tigapuluh Tiga Kastil
+// 334: Tigapuluh Empat Kastil
+334: Mendominasi Total!
+
+// Contoh untuk keluaran @who
+343: Nama: %s 
+344: (%s) 
+345: | Party: '%s' 
+346: | Guild: '%s'
+//Kamu mungkin menghilangkan %s terakhir, kemudian kamu tidak akan melihat nama job pemain.
+347: | Lv:%d/%d | Job: %s
+//Kamu mungkin menghilangkan %d terakhir, kemudian kamu tidak akan koordinat pemain, hanya nama map.
+348: | Lokasi: %s %d %d
+
+// @duel (bagian 1)
+350: Duel: Kamu tidak dapat menggunakan @invite. Kamu bukan duelist.
+351: Duel: Batas pemain sudah terlampaui.
+352: Duel: Nama pemain tidak ditemukan.
+353: Duel: Pemain sudah dalam duel.
+354: Duel: Undangan duel sudah dikirim.
+355: Duel: Kamu tidak dapat menggunakan @duel tanpa @reject.
+356: Duel: Kamu dapat mengambil bagian dalam duel hanya sekali dalam %d menit.
+357: Duel: Nilai salah.
+358: Duel: Kamu tidak dapat menggunakan @leave. Kamu bukan duelist.
+359: Duel: Kamu meninggalkan duel.
+360: Duel: Kamu tidak dapat menggunakan @accept tanpa undangan duel.
+361: Duel: Undangan duel telah diterima.
+362: Duel: Kamu tidak dapat menggunakan @reject tanpa undangan duel.
+363: Duel: Undangan duel telah ditolak.
+364: Duel: Kamu tidak dapat mengundang %s karena dia tidak berada di map yang sama.
+365: Duel: Tidak dapat menggunakan %s saat duel.
+// @duel (bagian 2)
+370:  -- Duel: %d/%d, Anggota: %d/%d, Pemain maks.: %d --
+371:  -- Duel: %d/%d, Anggota: %d/%d --
+372:  -- Duel sudah dibuat (Gunakan @invite/@leave) --
+373:  -- Pemain %s mengundang %s untuk duel --
+374: Biru -- Pemain %s mengundangmu untuk duel PVP (Gunakan @accept/@reject) --
+375:  <- Pemain %s meninggalkan duel --
+376:  -> Pemain %s telah menerima permintaan duel --
+377:  -- Pemain %s telah menolak permintaan duel --
+// Main chat
+380: Main chat telah diaktifkan.
+381: Main chat sudah aktif..
+382: Main chat telah dimatikan..
+383: Main chat sudah dimatikan.
+384: Main chat saat ini tersedia. Penggunaan: @main <on|off>, @main <pesan>.
+385: Main chat saat ini dimatikan. Penggunaan: @main <on|off>, @main <pesan>.
+386: %s :Main: %s
+387: Kamu tidak dapat menggunakan obrolan 'Main' ketika bisu.
+388: Kamu sebaiknya mengaktifkan obrolan utama dengan perintah "@main on".
+//NoAsk
+390: Penolakan otomatis diaktifkan.
+391: Penolakan otomatis ditidakaktifkan.
+392: Permintaanmu telah ditolak oleh opsi penolakan otomatis.
+393: Telah ditolak otomatis permintaan transaksi dari %s.
+394: Telah ditolak otomatis undangan party dari %s.
+395: Telah ditolak otomatis undangan guild dari %s.
+396: Telah ditolak otomatis permintaan aliansi dari %s.
+397: Telah ditolak otomatis permintaan musuh dari %s.
+398: Telah ditolak otomatis permintaan pertemanan dari %s.
+400: Penggunaan: @jailfor <waktu> <nama karakter>
+401: Kamu telah dipenjarakan selama %d tahun, %d bulan, %d hari, %d jam, %d ,menit.
+402: %s di dalam penjara selama %d tahun, %d bulan, %d hari, %d tahun, %d menit.
+// WoE SE (@agitstart2)
+403: War of Emperium SE telah dimulai.
+404: War of Emperium SE saat ini sedang berjalan.
+405: War of Emperium SE telah dimulai.
+406: War of Emperium SE saat ini sedang tidak berjalan.
+//407 kosong
+//berkaitan dengan chrif
+408: Dibutuhkan pemutusan koneksi untuk melakukan permintaan ubah jenis kelamin ...
+409: Jenis kelaminmu telah diganti (membutuhkan pemutusan koneksi oleh server) ...
+//410-411 digunakan untuk cash shop
+412: Akunmu 'Tidak terdaftar'
+413: Akunmu memiliki 'Password yang salah'...
+414: Akunmu sudah kadaluarsa.
+415: Akunmu telah ditolak oleh server.
+416: Akunmu telah diblokir oleh Tim GM.
+417: File game EXE-mu bukanlah versi terakhir.
+418: Akunmu dilarang untuk masuk 
+419: Server sedang macet karena populasi yang berlebihan.
+420: Akunmu sudah tidak diizinkan 
+421: Akunmu sudah dihapus keseluruhan.
+423: Akunmu telah dibuang hingga 
+424: Login-server meminta untuk %s pemain '%.*s'.
+425: Pemain '%.*s' tidak ada.
+426: Level GM-mu tidak diizinkan untuk %s pemain '%.*s'.
+427: Login-server sedang offline. Tidak mungkin untuk %s pemain '%.*s'.
+428: block
+429: ban
+430: unblock
+431: unban
+432: mengubah jenis kelamin dari 
+
+// Pesan-pesan untuk Homunculus
+450: Kamu sudah memiliki homunculus
+
+// Pesan-pesan untuk keperluan lain (Bukan untuk perintah GM)
+// ----------------------------------------
+
+//500: KOSONG
+501: Batas akun kamu adalah: %d-%m-%Y %H:%M:%S.
+502: Mode siang diaktifkan.
+503: Mode malam diaktifkan.
+
+// Pesan yang berhubungan dengan Cash poin
+504: %d kafra poin dan %d cash poin sudah digunakan. Sisa: %d kafra dan %d cash poin.
+505: %d cash poin sudah bertambah. Total %d poin.
+506: %d kafra poin sudah bertambah. Total %d poin.
+410: %d cash poin sudah dipakai. Total %d poin.
+411: %d kafra poin sudah dipakai. Total %d poin.
+
+507: Player ini sudah dihukum selama %d menit.
+508: Player ini tidak dapat dihukum (Hukuman dinonaktifkan).
+//509 Tersedia....
+
+// Sistem surat (e-mail)
+510: Kamu memiliki %d pesan baru (ada %d pesan yang belum dibaca)
+
+// Pesan yang berhubungan dengan deteksi Bot (Saat ini belum diimplementasikan)
+535: Kemungkinan BOT (99%%) atau client yang digunakan sudah dimodifikasi '%s' (akun: %d, char_id: %d). Player ini bisa melihat nama kamu saat kamu sedang tidak terlihat.
+536: Karakter '%s' (akun: %d) sedang mencoba menggunakan bot (Player ini sedang mencoba mendeteksi player umpan).
+537: Karakter '%s' (akun: %d) sedang mencoba menggunakan bot (Player ini sedang mencoba mendeteksi monster umpan).
+
+// Pesan tentang pelanggaran transaksi.
+538: Hack pada transaksi: Karakter '%s' (akun: %d) sedang mencoba mentransaksikan item lebih dari yang dia punya.
+539: Player ini memiliki %d jenis item (id: %d), dan sedang mencoba untuk mentransaksikan %d item.
+540: Player ini sudah diblok.
+
+// Pesan tentang item langka yang berhasil muncul/dicuri menggunakan Steal.
+541: '%s' mendapatkan %s's %s (Kemungkinan: %0.02f%%)
+//541: %.0s%.0sSeseorang mendapatkan %s
+542: '%s' mencuri %s's %s (Kemungkinan: %0.02f%%)
+//542: %.0s%.0sSeseorang mencuri %s
+// 543~548 tidak dipakai (sebelumnya merupakan pesan @away)
+// @Autotrade
+549: Kamu harus membuka sebuah toko dulu sebelum menggunakan @autotrade.
+
+//550 -> 650: Nama Job
+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 // Nama di IRO
+586: Sniper
+587: Assassin Cross
+588: Paladin
+589: Champion
+590: Professor
+//590: Scholar // Nama di IRO
+591: Stalker
+592: Creator
+//592: Biochemist // Nama di IRO
+593: Clown
+//593: Minstrel // Nama di IRO
+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: KOSONG
+//620: KOSONG
+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 // Nama di IRO
+634: Wanderer
+635: Sura
+636: Genetic
+//636: Geneticist // Nama di IRO
+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: Job Tidak Diketahui
+
+// Batu nisan MvP
+// Tambahkan di sini sehingga dapat dengan mudah diterjemahkan
+656: Batu nisan
+657: [ ^EE0000%s^000000 ]
+658: Telah menemui kehancurannya
+659: Waktu kematian : ^EE0000%s^000000
+660: Dikalahkan oleh
+661: [^EE0000%s^000000]
+
+// Pesan-pesan lainnya dari source
+662: Kamu harus setidaknya %d kotak jauhnya dari NPC.
+663: Duel: Tidak dapat menggunakan item ini saat duel.
+664: Kamu tidak dapat menggunakan perintah ini ketika mati.
+665: TIdak daapt membuat ruang chat di area ini.
+666: Pet tidak diperbolehkan di Guild Wars.
+667: Kamu tidak mati.
+668: Posisi memomu saat ini adalah:
+669: Kamu menghancurkan senajta lawan.
+670: Kamu tidak dapat meninggalkan guild battleground.
+671: Teman sudah ada.
+672: Nama tidak ditemukan di daftar.
+673: Aksi ini tidak dapat dilakukan pada saat ini. Cobalah beberapa saat lagi.
+674: Teman dihilangkan.
+675: Tidak dapat mengirimkan beberapa e-mail terlalu cepat!
+676: Aliansi tidak dapat dibuat ketika Guild Wars!
+677: Aliansi tidak dapat dibatalkan saat Guild Wars!
+678: Kamu bukan lagi Ketua Guild.
+679: Kamu telah menjadi Ketua Guild!
+680: Kamu telah dipulihkan!
+//681-899 kosong
+
+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
+694: Hanbok
+
+
+//------------------------------------
+// Pesan dalam perintah atcommand
+//------------------------------------
+
+// @send
+900: Penggunaan:
+901:    @send len <nomor hex dari paket yang akan dikirim>
+902:     @send <nomor hex dari paket yang akan dikirim> {<data>}*
+903:     Data: <tipe=B(default),W,L><nomor> atau S<panjang>"<string>"
+904: Paket 0x%x panjang: %d
+905: Paket tidak diketahui: 0x%x
+906: Bukan sebuah kata:
+907: Bukan nomor hexadecimal:
+908: Tipe yang tidak diketahui dari data di:
+
+// @rura
+909: Harap masukkan nama map (Penggunaan: @warp/@rura/@mapmove <nama map> <x> <y>).
+
+// @where
+910: Harap masukkan nama player (Penggunaan: @where <nama karakter>).
+
+// @jumpto
+911: Harap masukkan nama player (Penggunaan: @jumpto/@warpto/@goto <nama karakter/ID>).
+
+// @who
+912: (CID:%d/AID:%d) 
+
+// @whogm
+913: Nama: %s (GM)
+914: Nama: %s (GM:%d) | Lokasi: %s %d %d
+915:       BLvl: %d | Job: %s (Lvl: %d)
+916:       Party: '%s' | Guild: '%s'
+917: Tidak ada
+
+// @speed
+918: Harap masukkan angka (Penggunaan: @speed <%d-%d>).
+
+// @storage
+919: Penyimpanan sudah dibuka.
+
+// @guildstorage
+920: Penyimpanan Guild sudah dibuka.
+
+// @option
+921: Harap masukkan minimal 1 opsi.
+
+// @jobchange
+922: Harap masukkan ID Job.
+923: Kamu tidak bisa berganti job menggunakan perintah ini.
+//924-979 KOSONG (Masih kosong, dipakai untuk job-job berikutnya)
+
+// @kami
+980: Harap masukkan pesan (Penggunaan: @kami <pesan>).
+981: Harap masukkan pesan dan warnanya (Penggunaan: @kamic <warna> <pesan>).
+982: Warna salah.
+
+// @item
+983: Harap masukkan nama item atau ID (Penggunaan: @item <nama item/ID> <jumlah>).
+
+// @item2
+984: Harap masukkan semua parameter (Penggunaan: @item2 <nama item/ID> <jumlah>
+985:   <identifikasi> <level tempa> <atribut> <kartu1> <kartu2> <kartu3> <kartu4>).
+
+// @baselevelup
+986: Harap masukkan base level (Penggunaan: @lvup/@blevel/@baselvlup <jumlah level>).
+
+// @joblevelup
+987: Harap masukkan job level (Penggunaan: @joblvup/@jlevel/@joblvlup <jumlah level>).
+
+// @help
+988: Tidak ada informasi yang tersedia untuk %c%s.
+989: Informasi untuk perintah %c%s:
+990: Alias yang tersedia:
+
+// @model
+991: Harap masukkan setidaknya 1 angka (Penggunaan: @model <ID model rambut: %d-%d> <warna rambut: %d-%d> <warna pakaian: %d-%d>).
+
+// @dye
+992: Harap masukkan warna pakaian (Penggunaan: @dye/@ccolor <warna pakaian: %d-%d>).
+
+// @hairstyle
+993: Harap masukkan model rambut (Penggunaan: @hairstyle/@hstyle <ID model rambut: %d-%d>).
+
+// @haircolor
+994: Harap masukkan warna rambut (Penggunaan: @haircolor/@hcolor <warna rambut: %d-%d>).
+
+// @go
+995: Kamu tidak bisa menggunakan @go di map ini.
+
+// @refine
+996: Harap masukkan posisi dan jumlah level tempanya (Penggunaan: @refine <posisi item equip> <+/-jumlah>).
+997: %d: Kepala bagian bawah
+998: %d: Tangan kanan
+999: %d: Jubah
+1000: %d: Aksesoris kiri
+1001: %d: Pakaian
+1002: %d: Tangan kiri
+1003: %d: Sepatu
+1004: %d: Aksesoris kanan
+1005: %d: Kepala bagian atas
+1006: %d: Kepala bagian tengah
+
+// @produce
+1007: Harap masukkan minimal 1 ID/nama item. (Penggunaan: @produce <nama item equip/ID> <elemen> <# star crumb>).
+
+// @memo
+1008: Harap masukkan posisi yang benar. (Penggunaan: @memo <posisi memo:%d-%d>).
+
+// @displaystatus
+1009: Harap masukkan tipe status. (Penggunaan: @displaystatus <tipe status> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Harap masukkan angka. (Penggunaan: @stpoint <jumlah point>).
+
+// @skpoint
+1011: Harap masukkan angka. (penggunaan: @skpoint <jumlah point>).
+
+// @zeny
+1012: Harap masukkan jumlah. (Penggunaan: @zeny <jumlah>).
+
+// @param
+1013: Harap masukkan angka yang benar. (Penggunaan: @str/@agi/@vit/@int/@dex/@luk <+/-angka>).
+
+// @guildlevelup
+1014: Harap masukkan level yang benar. (Penggunaan: @guildlvup/@guildlvlup <# level>).
+
+// @makeeg
+1015: Harap masukkan nama monster/nama telur/ID (Penggunaan: @makeegg <peliharaan>).
+
+// @petfriendly
+1016: Harap masukkan angka yang benar. (Penggunaan: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Harap masukkan angka yang benar. (Penggunaan: @pethungry <0-100>).
+
+// @recall
+1018: Harap masukkan nama pemain. (Penggunaan: @recall <nama karakter/ID>).
+1019: Kamu tidak diperbolehkan untuk menggunakan warp pada orang lain di map ini.
+
+// @recall
+1020: Kamu tidak diperbolehkan untuk memindahkan pemain tersebut.
+
+// @charblock
+1021: Harap masukkan nama pemain. (Penggunaan: @charblock/@block <nama karakter>).
+
+// @charban
+1022: Harap masukkan waktu hukuman dan nama pemain. (Penggunaan: @charban/@ban/@banish/@charbanish <waktu> <nama karakter>).
+1023: Kamu tidak diperbolehkan untuk mengurangi waktu hukuman.
+
+// @charunblock
+1024: Harap masukkan nama pemain. (Penggunaan: @charunblock <nama karakter>).
+
+// @charunban
+1025: Harap masukkan nama pemain. (Penggunaan: @charunban <nama karakter>).
+
+// @kick
+1026: Harap masukkan nama pemain. (Penggunaan: @kick <nama karakter/ID>).
+
+// @questskill / @lostskill
+1027: Harap masukkan angka skill quest.
+
+// @spiritball
+1028: Harap masukkan angka. (Penggunaan: @spiritball <jumlah: 0-%d>).
+
+// @party
+1029: Harap masukkan nama party. (Penggunaan: @party <nama party>).
+
+// @guild
+1030: Harap masukkan nama guild. (Penggunaan: @guild <nama guild>).
+
+// @idsearch
+1031: Harap masukkan sebagian dari nama item yang akan dicari. (Penggunaan: @idsearch <semua/sebagian dari nama item>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: Kamu tidak diperbolehkan untuk memindahkan orang lain dari map ini.
+1033: Karena kamu tidak diperbolehkan untuk memindahkan orang dari beberapa map tertentu, %d player tidak bisa dipindahkan.
+
+// @guildrecall
+1034: Harap masukkan nama guild/ID. (Penggunaan: @guildrecall <nama guild/ID>).
+
+// @partyrecall
+1035: Harap masukkan nama party/ID. (Penggunaan: @partyrecall <nama party/ID>).
+
+// @reloadatcommand
+1036: Terjadi kesalahan saat membaca groups.conf, tidak berhasil dimuat ulang.
+1037: Terjadi kesalahan saat membaca atcommand_athena.conf, tidak berhasil dimuat ulang.
+
+// @mapinfo
+1038: Harap masukkan setidaknya 1 pilihan. (Penggunaan: @mapinfo <0-3> <map>).
+1039: ------ Map Info ------
+1040: Map: %s | Pemain: %d | NPC: %d | Ruang Chat: %d | Toko: %d
+1041: ------ Map Flags ------
+1042: Kota
+1043: Autotrade diaktifkan
+1044: Autotrade dinonaktifkan
+1045: Battleground 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: Tidak ada pengurangan exp: %s | Tidak ada pengurangan zeny: %s
+1066: Hidup
+1067: Mati
+1068: Tidak bisa menggunakan Save (Kembali ke Save Point terakhir)
+1069: Tidak bisa menggunakan Save, Save Point: %s,Acak
+1070: Tidak bisa menggunakan Save, Save Point: %s,%d,%d
+1071: Cuaca: 
+1072: Salju | 
+1073: Kabut | 
+1074: Sakura | 
+1075: Awan | 
+1076: Awan2 | 
+1077: Kembang Api | 
+1078: Daun | 
+//1079: Hujan | 
+1080: Mode Malam | 
+1081: Flag Lainnya: 
+1082: NoBranch | 
+1083: NoTrade | 
+1084: NoVending | 
+1085: NoDrop | 
+1086: NoSkill | 
+1087: NoIcewall | 
+1088: AllowKS | 
+1089: Reset | 
+1090: Flag Lainnya: 
+1091: NoCommand | 
+1092: NoBaseEXP | 
+1093: NoJobEXP | 
+1094: NoMobLoot | 
+1095: NoMVPLoot | 
+1096: PartyLock | 
+1097: GuildLock | 
+1098: ----- Player yang ada di Map -----
+1099: Player '%s' (sesi #%d) | Lokasi: %d,%d
+1100: ----- NPC yang ada di Map -----
+1101: Utara
+1102: Barat Laut
+1103: Barat
+1104: Barat Daya
+1105: Selatan
+1106: Tenggara
+1107: Timur
+1108: Timur Laut
+1109: Utara
+1110: Tidak diketahui
+1111: NPC %d: %s | Arah: %s | Sprite: %d | Lokasi: %d %d
+1112: NPC %d: %s::%s | Arah: %s | Sprite: %d | Lokasi: %d %d 
+1113: ----- Ruang Chat yang ada di Map -----
+1114: Chat: %s | Player: %s | Lokasi: %d %d
+1115:    User: %d/%d | Password: %s | Publik: %s
+1116: Ya
+1117: Tidak
+1118: Harap masukkan setidaknya 1 opsi (Penggunaan: @mapinfo <0-3> <map>).
+
+// @mount
+1119: Kamu sudah menaiki seekor naga.
+1120: Kamu sudah melepaskan nagamu.
+1121: Kamu sudah menaiki seekor Warg.
+1122: Kamu sudah melepaskan Warg-mu.
+1123: Kamu sudah menaiki sebuah Mado Gear.
+1124: Kamu sudah melepaskan Mado Gear-mu.
+
+// @guildspy
+1125: Perintah 'spy' (memata-matai) dinonaktifkan di mapserver.
+1126: Harap masukkan nama/ID guild. (Penggunaan: @guildspy <nama/ID guild>).
+
+// @partyspy
+1127: Harap masukkan nama/ID party. (Penggunaan: @partyspy <nama/ID party>).
+
+// @nuke
+1128: Harap masukkan nama pemain. (Penggunaan: @nuke <nama karakter>).
+
+// @tonpc
+1129: Harap masukkan nama NPC. (Penggunaan: @tonpc <nama npc>).
+
+// @enablenpc
+1130: Harap masukkan nama NPC. (Penggunaan: @enablenpc <nama npc>).
+
+// @hidenpc
+1131: Harap masukkan nama NPC. (Penggunaan: @hidenpc <nama npc>).
+
+// @loadnpc
+1132: Harap masukkan nama file (full path). (Penggunaan: @loadnpc <nama file>).
+
+// @npcoff
+1133: Harap masukkan nama NPC. (Penggunaan: @npcoff <nama npc>).
+
+// @jail
+1134: Harap masukkan nama pemain. (Penggunaan: @jail <nama karakter>).
+
+// @unjail
+1135: Harap masukkan nama pemain. (Penggunaan: @unjail/@discharge <nama karakter>).
+
+// @jailfor
+1136: Waktu yang digunakan salah.
+1137: Kamu sekarang 
+1138: Player ini sekarang 
+
+// @jailtime
+1139: Kamu tidak sedang dipenjara.
+1140: Kamu sudah dipenjara untuk waktu yang lama.
+1141: Kamu dipenjara untuk waktu yang tidak ditentukan.
+1142: Kamu akan tetap 
+
+// @disguise
+1143: Harap masukkan nama/ID Monster/NPC. (Penggunaan: @disguise <nama/ID>).
+1144: Karakter ini tidak bisa berubah wujud karena sedang menunggangi sesuatu.
+
+// @disguiseall
+1145: Harap masukkan nama/ID Monster/NPC. (Penggunaan: @disguiseall <nama/ID>).
+
+// @disguiseguild
+1146: Harap masukkan nama/ID monster dan nama/iD guild. (Penggunaan: @disguiseguild <nama/ID monster>, <nama/ID guild>).
+
+// @undisguiseguild
+1147: Harap masukkan nama/ID guild. (Penggunaan: @undisguiseguild <nama/ID guild>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: Harap masukkan pesan. (Penggunaan: @broadcast <pesan>).
+
+// @localbroadcast
+1150: Harap masukkan pesan. (Penggunaan: @localbroadcast <pesan>).
+
+// @email
+1151: Harap masukkan 2 alamat email. (Penggunaan: @email <lama@email> <baru@email>).
+
+// @effect
+1152: Harap masukkan nomor efek. (Penggunaan: @effect <nomor efek>).
+
+// @npcmove
+1153: Penggunaan: @npcmove <X> <Y> <nama_npc>
+1154: NPC tidak berada di map ini.
+1155: NPC dipindahkan.
+
+// @addwarp
+1156: Penggunaan: @addwarp <nama map> <X> <Y> <nama npc>
+1157: Map tidak diketahui '%s'.
+1158: NPC warp baru  '%s' dibuat.
+
+// @follow
+1159: Mode Follow OFF.
+1160: Mode Follow ON.
+
+// @storeall
+1161: Saat ini kamu tidak bisa membuka penyimpanan.
+1162: Semua item disimpan.
+
+// @skillid
+1163: Harap masukkan nama skill untuk dilihat. (Penggunaan: @skillid <nama skill>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Penggunaan: @useskill <ID skill> <level skill> <sasaran>
+
+// @displayskill
+1166: Penggunaan: @displayskill <ID skill> {<level skill>}
+
+// @skilltree
+1167: Penggunaan: @skilltree <ID skill> <sasaran>
+1168: Pemain menggunakan pohon skill %s (%d point dasar).
+1169: Pemain tidak dapat menggunakan skill tersebut.
+1170: Pemain membutuhkan level %d dari skill %s.
+1171: Pemain memenuhi semua persyaratan untuk skill tersebut.
+
+// @marry
+1172: Penggunaan: @marry <nama karakter>
+1173: Mereka berdua telah dinikahkan... Selamat menempuh hidup baru!
+1174: Mereka tidak dapat menikah karena satu diantaranya adalah baby atau sudah menikah.
+
+// @divorce
+1175: '%s' tidak menikah.
+1176: '%s' dan pasangannya sekarang bercerai.
+
+// @changelook
+1177: Penggunaan: @changelook {<posisi>} <view id>
+1178: Posisi: 1-Kepala bagian atas 2-Kepala bagian tengah 3-Kepala bagian bawah 4-Senjata 5-Perisai 6-Sepatu 7-Jubah
+
+// @autotrade
+1179: Autotrade tidak diizinkan di map ini.
+1180: Kamu tidak dapat menggunakan autotrade ketika mati.
+
+// @changegm
+1181: Kamu harus menjadi Pemimpin Guild untuk menggunakan perintah ini.
+1182: Kamu tidak dapat mengubah kepemimpinan guild di map ini.
+1183: Penggunaan: @changegm <nama naggota guild>
+1184: Karakter yang dituju harus online dan menjadi anggota guild.
+
+// @changeleader
+1185: Penggunaan: @changeleader <nama anggota party>
+
+// @partyoption
+1186: Penggunaan: @partyoption <berbagi item yang didapat: yes/no> <distribusi item: yes/no>
+
+// @autoloot
+1187: Mengambil item secara otomatis dengan drop rate %0.02f%% ke bawah.
+1188: Pengambilan otomatis dimatikan.
+
+// @autolootitem
+1189: Item tidak ditemukan.
+1190: Kamu sudah mengambil secara otomatis item ini.
+1191: Daftar autolooitem penuh. Hilangkan sebagian terlebih dahulu dengan @autolootid -<nama/ID item>.
+1192: Mengambil item secara otomatis: '%s'/'%s' {%d}
+1193: Kamu saat ini sedang tidak mengambil item ini secara otomatis.
+1194: Item dihilangkan: '%s'/'%s' {%d} dari daftar pengambilan otomatismu.
+1195: Kamu hanya memiliki item %d di daftarmu.
+1196: Untuk menambahkan item ke daftar, gunakan "@alootid +<ID atau nama item>". Untuk menghilangkannya, gunakan "@alootid -<ID atau nama item>".
+1197: "@alootid reset" akan membersihkan daftar autolootitem.
+1198: Daftar autolootitemmu kosong.
+1199: Item yang berada di daftar autolootitem:
+1200: Daftar autolootitem telah direset.
+
+// @rain
+//1201: Hujan berhenti.
+//1202: Mulai turun hujan.
+
+// @snow
+1203: Salju berhenti turun.
+1204: Mulai turun salju.
+
+// @sakura
+1205: Sakura tidak lagi berjatuhan.
+1206: Sakura mulai berjatuhan.
+
+// @clouds
+1207: Awan menghilang.
+1208: Awan muncul.
+
+// @clouds2
+1209: Awan alternatif sudah menghilang.
+1210: Awan alternatif muncul.
+
+// @fog
+1211: Kabut telah hilang.
+1212: Saat ini berkabut.
+
+// @leaves
+1213: Daun tidak lagi berjatuh.
+1214: Daun musim gugur berjatuhan.
+
+// @fireworks
+1215: Kembang api diakhiri.
+1216: Kembang api diluncurkan.
+
+// @sound
+1217: Harap masukkan nama file suara. (Penggunaan: @sound <nama file>).
+
+// @mobsearch
+1218: Harap masukkan nama monster. (Penggunaan: @mobsearch <nama monster>).
+1219: ID monster salah: %s!
+1220: Mencari monster... %s %s
+
+// @cleanmap
+1221: Semua barang yang terjatuh sudah dibersihkan.
+
+// @npctalk
+1222: Harap masukkan parameter yang benar. (Penggunaan: @npctalk <nama npc>, <pesan>).
+1223: Harap masukkan parameter yang benar. (Penggunaan: @npctalkc <warna> <nama npc>, <pesan>).
+
+// @pettalk
+1224: Harap masukkan pesan. (Penggunaan: @pettalk <pesan>).
+
+// @summon
+1225: Harap masukkan nama monster. (Penggunaan: @summon <nama monster> {durasi}).
+
+// @adjgroup
+1226: Penggunaan: @adjgroup <id_group>
+1227: Grup yang ditentukan tidak ada.
+1228: Sukses mengubah grup.
+1229: Grupmu sudah diubah.
+
+// @trade
+1230: Harap masukkan nama pemain. (Penggunaan: @trade <nama pemain>).
+
+// @setbattleflag
+1231: Penggunaan: @setbattleflag <flag> <nilai>
+1232: Flag battle_config tidak diketahui.
+1233: Mengatur battle_config seperti yang diminta.
+
+// @unmute
+1234: Harap masukkan nama pemain. (Penggunaan: @unmute <nama karakter>).
+1235: Pemain dapat berbicara.
+1236: Pemain dibisukan.
+
+// @mute
+1237: Penggunaan: @mute <waktu> <nama karakter>
+
+// @identify
+1238: Tidak ada barang untuk diidentifikasi.
+
+// @mobinfo
+1239: Harap masukkan nama/ID monster. (Penggunaan: @mobinfo <ID/nama monster>).
+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  Jarak:%d~%d~%d  Ukuran:%s  Race: %s  Elemen: %s (Lv:%d)
+1245: Barang yang dijatuhkan:
+1246: Monster ini tidak menjatuhkan barang.
+1247: Bonus EXP MVP:%u
+1248: Item MVP:
+1249: Monster ini tidak memiliki bonus MVP.
+
+// @showmobs
+1250: ID monster salah %s!
+1251: Tidak dapat menampilkan bos monster!
+1252: Mencari monster... %s %s
+
+// @homlevel
+1253: Harap masukkan level yang diinginkan. (Penggunaan: @homlevel <level>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: Kamu tidak memiliki homunculus.
+
+// @homevolve
+1255: Homunculusmu tidak berkembang.
+
+// @makehomun
+1256: Harap masukkan ID homunculus (usage: @makehomun <id homunculus>).
+1257: ID Homunculus salah.
+
+// @homfriendly
+1258: Harap masukkan nilai persahabatan (usage: @homfriendly <nilai persahabatan [0-1000]>).
+
+// @homhungry
+1259: Harap masukkan nilai tingkat kelaparan. (Penggunaan: @homhungry <nilai tingkat kelaparan [0-100]>).
+
+// @homtalk
+1260: Harap masukkan sebuah pesan. (Penggunaan: @homtalk <pesan>).
+
+// @hominfo
+1261: Status Homunculus:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: Tingkat Kelaparan: %d - Keakraban: %u
+1265: Status: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Pertumbuhan status Homunculus (Lv %d %s):
+1267: Maks.HP: %d (%d~%d)
+1268: Maks. 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: Status Homunculus diubah.
+
+// @iteminfo
+1276: Harap masukkan nama/ID item. (Penggunaan: @ii/@iteminfo <nama/ID item>).
+1277: Item: '%s'/'%s'[%d] (%d) Jenis: %s | Efek tambahan: %s
+1278: Tidak ada
+1279: Dengan script.
+1280: NPC Harga Beli:%dz, Harga jual:%dz | Berat: %.1f 
+1281:  - Hanya tersedia di toko.
+1282:  - Kemungkiman monster menjatuhkan item: %02.02f%%
+1283:  - Monster tidak menjatuhkan item ini.
+
+// @whodrops
+1284: Harap masukkan nama/ID item. (Penggunaan: @whodrops <nama/ID item>).
+1285: Item: '%s'[%d]
+1286:  - Item ini tidak dijatuhkan dari monster.
+1287:  - Monster biasa dengan kemungkinan menjatuhkan barang tertinggi. (Maks. hanya %d yang ditampilkan):
+
+// @whereis
+1288: Harap masukkan sebuah nama/ID monster. (Penggunaan: @whereis <nama_atau_ID_monster>).
+1289: %s berada di:
+1290: Monster ini tidak keluar secara normal.
+
+// @adopt
+1291: Penggunaan: @adopt <ayah>,<ibu>,<anak>
+1292: Mengadopsi: --%s--%s--%s--\n
+1293: Tidak dapat menemukan pemain %s sedang online..
+1294: Sekarang mereka adalah satu keluarga... Selamat!!
+
+// @version
+1295: Versi SVN rAthena r%s
+1296: Tidak dapat mendapatkan revisi SVN.
+
+// @mutearea
+1297: Harap masukkan waktu dalam menit. (Penggunaan: @mutearea/@stfu <waktu dalam menit>).
+
+// @rates
+1298: Rate Experience: Base %.2fx / Job %.2fx
+1299: Rate Drop Normal: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1300: Rate Drop Boss: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1301: Rate Drop Lainnya: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Masukkan sebuah pesan. (Penggunaan: @me <pesan>).
+
+// @size / @sizeall / @sizeguild
+1303: Perubahan ukuran diterapkan.
+
+// @sizeguild
+1304: Harap masukkan nama/ID guild. (Penggunaan: @sizeguild <ukuran> <nama/ID guild>).
+
+// @monsterignore
+1305: Kamu sekarang kebal dari serangan.
+1306: Kembali ke kondisi normal.
+
+// @fakename
+1307: Kembali ke nama asli.
+1308: Kamu harus memasukkan sebuah nama.
+1309: Nama palsu haruslah setidaknya terdiri dari 2 karakter.
+1310: Nama palsu diaktifkan.
+
+// @mapflag
+1311: Mapflag yang ada di map ini:
+1312: Penggunaan: "@mapflag monster_noteleport 1" (0=Mati | 1=Hidup)
+1313: Ketikkan "@mapflag available" untuk melihat daftar mapflag yang tersedia.
+1314: Flag atau nama flag salah.
+1315: Flag yang tersedia:
+
+// @showexp
+1316: Perolehan exp tidak akan ditampilkan.
+1317: Perolehan exp ditampilkan.
+
+// @showzeny
+1318: Perolehan zeny tidak akan ditampilkan.
+1319: Perolehan zeny ditampilkan.
+
+// @showdelay
+1320: Delay skill yang gagal tidak akan ditampilkan.
+1321: Delay skill yang gagal ditampilkan sekarang.
+
+// @cash
+1322: Harap masukkan jumlah.
+
+// @clone
+1323: Kamu harus memasukkan nama atau ID pemain.
+
+// @feelreset
+1324: Mengatur ulang map 'Feeling'.
+
+// @noks
+1325: [ K.S Protection Tidak Aktif ]
+1326: [ K.S Protection Active - Option: Party ]
+1327: [ K.S Protection Active - Option: Self ]
+1328: [ K.S Protection Active - Option: Guild ]
+1329: Penggunaan: @noks <self|party|guild>
+
+// @allowks
+1330: [ Map K.S Protection Aktif ]
+1331: [ Map K.S Protection Tidak Aktif ]
+
+// @itemlist
+1332: ------ %s daftar item dari '%s' ------
+1333:  | dipakai: 
+1334: jubah, 
+1335: aksesori kiri, 
+1336: badan/armor, 
+1337: tangan kanan, 
+1338: tangan kiri, 
+1339: kedua tangan, 
+1340: kaki, 
+1341: aksesori kanan, 
+1342: kepala bagian bawah, 
+1343: kepala bagian atas, 
+1344: kepala bagian bawah/atas, 
+1345: kepala bagian tengah, 
+1346: kepala bagian bawah/tengah, 
+1347: kepala bagian bawah/tengah/atas, 
+1348:  -> (telur pet, id pet: %u, sudah diberi nama)
+1349:  -> (telur pet, id pet: %u, belum diberi nama)
+1350:  -> (item dibuat, id pembuat: %u, %d star crumb, elemen %d)
+1351:  -> (memproduksi item, id pembuat: %u)
+1352:  -> (kartu: 
+1353: Tidak ada item yang ditemukan di %s pemain.
+1354: %d item ditemukan di slot %d %s.
+
+// @delitem
+1355: Harap masukkan sebuah ID/Nama item, jumlah, dan nama pemain. (Penggunaan: #delitem <pemain> <ID/Nama_item> <jumlah>).
+
+// @font
+1356: Mengembalikan ke font normal.
+1357: Gunakan @font <1-9> untuk mengganti font pesanmu.
+1358: Gunakan 0 atau tanpa parameter untuk mengembalikan ke font normal.
+1359: Font salah. Gunakan nilai dari 0 sampai 9.
+1360: Font diubah.
+1361: Sudah menggunakan font ini.
+
+// @new_mount
+1362: CATATAN: Jika kamu mengalami 'crash' saat menggunakan mount tersebut berarti file LUA-mu harus diperbarui.
+1363: Kamu memiliki mount.
+1364: Kamu telah melepaskan mount.
+
+// @accinfo
+1365: Penggunaan: @accinfo/@accountinfo <id_akun/nama karakter>
+1366: Kamu diperbolehkan mencari bagian nama dengan menggunakan '%' dalam pencarian, misal. "@accinfo %Mario%" akan menampilkan daftar semua karakter dengan nama "Mario".
+
+// @set
+1367: Penggunaan: @set <nama variable> <nilai>
+1368: Penggunaan: ex. "@set PoringCharVar 50"
+1369: Penggunaan: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: Penggunaan: ex. "@set PoringCharVarSTR$" menghasilkan nilainya, Super Duper String.
+1371: Variabel pada NPC tidak mungkin digunakan dengan @set.
+1372: Variabel instanis tidak mungkin digunakan dengan @set.
+1373: Nilai %s saat ini :%d
+1374: Nilai %s saat ini :%s
+1375: %s kosong
+1376: Jenis data %s tidak didukung :%u
+
+// @reloadquestdb
+1377: Database Quest sudah dimuat ulang.
+
+// @addperm
+1378: Penggunaan: %s <nama_izin>
+1379: -- Daftar izin
+1380: Izin '%s' tidak diketahui.
+1381: Pemain '%s' sudah memiliki izin '%s'.
+1382: Pemain '%s' tidak memiliki izin '%s'.
+1383: -- Izin pemain '%s'
+1384: izin pemain '%s' diperbaruhi dengan sukses. Perubahan tersebut hanya sementara.
+
+// @unloadnpcfile
+1385: Penggunaan: @unloadnpcfile <nama file>
+1386: File tidak dimuatkan. Hati-hati, mapflag dan monster yang dikeluarkan secara langsung tidak akan dihilangkan.
+1387: File tidak ditemukan.
+
+// Pesan-pesan perintah umum
+1388: Charcommand gagal (penggunaan: %c<perintah> <nama karakter> <parameter>).
+1389: %s gagal. Player tidak ditemukan.
+
+// @cart
+1390: Gerobak tidak diketahui (penggunaan: %s <0-%d>).
+1391: Kamu tidak memiliki keranjang yang akan dihapus.
+1392: Gerobak ditambahkan.
+
+// atcommand.c::is_atcommand
+1393: Kamu tidak bisa menggunakan perintah ini ketika mati.
+
+// @clearstorage
+1394: Storagemu sudah dibersihkan.
+1395: Storage Guildmu sudah dibersihkan.
+
+// @clearcart
+1396: Kamu tidak mempunyai gerobak untuk dibersihkan.
+1397: Gerobakmu sudah dibersihkan.
+
+// @skillid (tambahan)
+1398: -- Menampilkan %d bagian pertama yang cocok:
+
+// @join
+1399: Channel tidak diketahui. (Penggunaan: %s <#nama_channel>)
+1400: Channel '%s' tidak diketahui. (Penggunaan: %s <#nama_channel>)
+1401: Channel '%s' menggunakan password. (Penggunaan: %s <#nama_channel> <password>)
+1402: kamu tidak berada di channel tersebut, ketikkan '@join <#nama_channel>'
+1403: Kamu sekarang berada di channel '%s'.
+
+// @channel
+1404: %s gagal.
+1405: Nama Channel harus dimulai dengan '#'.
+1406: Panjang nama channel harus di antara 3 dan %d.
+1407: Channel '%s' tidak tersedia.
+1408: Password Channel tidak boleh menggunakan spasi.
+1409: - #%s (%d pengguna)
+1410: ---- Channel Umum ----
+1411: Warna '%s' tidak diketahui.
+1412: Kamu bukanlah pemilik channel '%s'.
+1413: Warna channel '%s' diubah menjadi '%s'.
+1414: ---- Opsi yang tersedia:
+1415: * %s create <#nama_channel> <password_channel>
+1416: -- Membuat sebuah channel.
+1417: * %s list
+1418: -- Mendaftar semua channel umum.
+1419: * %s list colors
+1420: -- Mendaftar semua warna yang tersedia untuk channel.
+1421: * %s setcolor <#nama_channel> <name_color>
+1422: -- Mengubah teks channel ke warna yang ditentukan (hanya untuk pemilik channel).
+1423: * %s leave <#nama_channel>
+1424: -- Meninggalkan channel yang ditentukan.
+1425: Kamu bukan bagian dari channel '%s'.
+1426: Kamu meninggalkan channel '%s'.
+1427: * %s bindto <#name_channel>
+1428: -- Mengikat chat globalmu ke channel yang ditentukan, mengirim semua pesan global ke channel tersebut.
+1429: * %s unbind
+1430: -- Melepaskan chat globalmu dari channel yang diikuti, jika ada.
+1431: Chat globalmu sudah diikatkan ke channel '%s'.
+1432: Chat globalmu tidak diikatkan ke channel manapun.
+1433: Chat globalmu sudah dilepaskan dari channel '#%s'.
+1434: Kamu telah berada di channel '%s'.
+1435: Kamu sekarang berada di channel '#%s' untuk '%s'.
+
+//Bila ada terjemahan lain, cukup tulis di file conf/import/msg_conf.txt
+//import: conf/msg_conf/import/map_msg_idn_conf.txt

+ 1468 - 0
conf/msg_conf/map_msg_spn.conf

@@ -0,0 +1,1468 @@
+// 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
+
+// Spanish Translation by [jaBote] & [Tragedy]
+// Some messages may not be an exact translation but a more understandable message
+// Comments which start with NdT mean "Nota del Traductor" (translator notes), they're mostly in Spanish and contain difficulties we've stumbled upon.
+
+//    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: Warpeado.
+1: Mapa no encontrado.
+2: Coordenadas no válidas, se usa una celda aleatoria.
+3: Personaje no encontrado.
+4: Moviendo a %s
+5: Moviendo a %d %d
+6: Se ha cambiado tu save point.
+7: Warpeando al save point.
+8: Se ha cambiado tu velocidad.
+9: Se han cambiado tus opciones.
+10: Invisible: Off
+11: Invisible: On
+12: Se ha cambiado tu job.
+13: Has muerto.
+14: Se ha matado al personaje objetivo.
+15: Se ha warpeado al jugador. También se le ha comunicado al jugador.
+16: ¡Has revivido!
+17: HP y SP recuperados.
+18: Item creado.
+19: Item ID o nombre no válidos.
+20: Se han eliminado todos tus items.
+21: Se ha subido tu nivel base.
+22: Se ha bajado tu nivel base.
+23: Tu nivel job no puede subir más.
+24: Se ha subido tu nivel job.
+25: Se ha bajado tu nivel job.
+26: Ayuda sobre comandos:
+27: La ayuda sobre comandos no está disponible.
+28: No hay ningún jugador.
+29: Hay 1 jugador.
+30: Hay %d jugadores.
+31: PvP: Off.
+32: PvP: On.
+33: GvG: Off.
+34: GvG: On.
+35: No puedes usar este comando desde tu clase actual.
+36: Se ha cambiado tu apariencia.
+37: No se ha especificado un número válido.
+38: Nombre o número de localización no válido.
+39: ¡Monstruos invocados!
+40: ID o nombre de monstruo no válido.
+41: No se puede disminuir el número o valor.
+42: Stat cambiado.
+43: No estás en una guild.
+44: No eres el master de tu guild.
+45: No se pudo cambiar el Guild level.
+46: ¡%s recalleado!
+47: Tu nivel base no puede subir más.
+48: Se ha cambiado el job del personaje.
+49: Job ID no válido.
+50: Ya tienes algunos poderes de GM.
+51: Personaje revivido.
+52: No puedes usar esta opción en Modo PK.
+53: Stats de '%s':
+54: Ningún jugador en el mapa '%s'.
+55: Un jugador en el mapa '%s'.
+56: %d jugadores en el mapa '%s'.
+57: Se ha cambiado el save point del personaje.
+58: Se han cambiado las opciones del personaje.
+59: Modo Noche Activado.
+60: Modo Día Activado.
+61: El mensajero sagrado ha dado sentencia.
+62: Se acaba de producir el Juicio Final.
+63: Se ha mostrado piedad.
+64: Se ha concedido piedad.
+65: Se ha subido el nivel base del personaje.
+66: Se ha bajado el nivel base del personaje.
+67: El nivel job del personaje no puede subir más.
+68: Se ha subido el nivel job del personaje.
+69: Se ha bajado el nivel job del personaje.
+70: Has aprendido la skill.
+71: Has olvidado la skill.
+72: Se ha iniciado la War of Emperium.
+73: La War of Emperium está en progreso en estos instantes.
+74: Se ha acabado la War of Emperium.
+75: La War of Emperium no está en progreso en estos instantes.
+76: Se han añadido todas las skills a tu árbol de skills.
+77: Resultados de la búsqueda de '%s' (nombre: id):
+78: %s: %d
+79: Hay %d resultados arriba.
+80: Por favor, especifica el nombre de sprite o el nombre/id del monstruo.
+81: Tu nivel de GM no te permite hacer esta acción en el jugador especificado.
+82: Por favor, especifica un nombre o número de la lista proporcionada:
+83: No se puede spawnear el monstruo 'Emperium'.
+84: ¡Se han cambiado todos los stats!
+85: No se ha especificado tiempo válido para el comando ban.
+86: Los nombres de jugador deben tener al menos 4 caracteres.
+87: Los nombres de jugador no pueden tener más de 23 caracteres.
+88: Enviando petición al login server...
+89: El modo noche ya está activo.
+90: El modo día ya está activo.
+91: El nivel base del personaje no puede subir más.
+92: ¡Se ha recalleado a todos los personajes!
+93: Todos los personajes online de la guild %s han sido recalleados a tu posición.
+94: Nombre/ID incorrecto o no hay nadie online en la guild especificada.
+95: Todos los personajes online de la party %s han sido recalleados a tu posición.
+96: Nombre/ID incorrecto o no hay nadie online en la party especificada.
+97: Se ha vuelto a cargar la Item database.
+98: Se ha vuelto a cargar la Monster database.
+99: Se ha vuelto a cargar la Skill database.
+100: Se han vuelto a cargar los Scripts.
+101: Se ha pedido al Login-server que vuelva a cargar las cuentas de GM y su nivel.
+102: Has montado en Peco Peco.
+103: Ya no estás espiando a la guild %s.
+104: Espiando a la guild %s.
+105: Ya no estás espiando a la party %s.
+106: Espiando a la party %s.
+107: Se han reparado todos los items.
+108: Ningún item necesita reparación.
+109: ¡Se ha nukeado al jugador!
+110: Se ha activado el NPC.
+111: El NPC especificado no existe.
+112: Se ha desactivado el NPC.
+113: Un GM te ha eliminado %d item(s).
+114: Se han eliminado %d item(s) del jugador.
+115: Se han eliminado %d item(s). El jugador solo tenía items %d de %d.
+116: El personaje no tiene el item especificado.
+117: Un GM te ha metido en jail.
+118: Se ha warpeado al jugador a jail.
+119: El jugador especificado no está en jail.
+120: Un GM te ha sacado de jail.
+121: Se ha sacado de jail al jugador.
+122: Se ha aplicado el disguise.
+123: El Monstruo/nombre de NPC/ID especificado no es válido.
+124: Se ha desaplicado el disguise.
+125: No tienes ningún disguise.
+//Clone Messages
+126: No puedes clonar a un jugador con mayor nivel de GM que el tuyo.
+127: Has alcanzado tu límite de clones esclavos.
+128: Se ha spawneado un clon malvado.
+129: No se pudo spawnear el clon malvado.
+130: Clon spawneado.
+131: No se pudo spawnear el clon.
+132: Se ha spawneado un clon esclavo.
+133: No se pudo spawnear el clon esclavo.
+//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations of @clone)
+140: Disguise aplicado en el personaje.
+141: Disguise desaplicado del personaje.
+142: El personaje no tiene ningún disguise.
+143: El uso de comandos está desactivado en este mapa.
+144: E-mail no válido. Si tienes el e-mail por defecto, escribe a@a.com.
+145: Nuevo e-mail no válido. Por favor, escribe un e-mail real.
+146: El nuevo e-mail debe ser real.
+147: El nuevo e-mail debe ser diferente al actual.
+148: Se ha enviado la información al login-server a través del char-server.
+149: Es imposible aumentar el número/valor.
+150: No hay ningún GM.
+151: Hay 1 GM.
+152: Hay %d GMs.
+153: %s es un comando desconocido.
+154: %s fallido.
+155: No puedes cambiar tu job.
+156: Se ha modificado tu HP y/o SP.
+157: Tu HP y SP ya han sido recuperados.
+158: Tu nivel base no puede bajar más.
+159: Tu nivel job no puede bajar más.
+160: PvP ya está Off.
+161: PvP ya está On.
+162: GvG ya está Off.
+163: GvG ya está On.
+164: Tu punto guardado #%d no existe.
+165: ¡Se han matado todos los monstruos!
+166: No se ha refinado ningún item.
+167: Se ha refinado 1 item.
+168: Se han refinado %d items.
+169: El item (%d: '%s') no es equipable.
+170: El item no es equipable.
+171: %d - vacío
+//172: You replace previous memo position %d - %s (%d,%d).
+//173: Note: you don't have the 'Warp' skill level to use it.
+174: Se ha cambiado el número de status points.
+175: Se ha cambiado el número de skill points.
+176: Se ha cambiado la cantidad actual de Zeny.
+177: Ya no puedes disminuir ese stat.
+178: Ya no puedes aumentar ese stat.
+179: Se ha cambiado el Guild level.
+180: El monstruo/nombre de huevo/ID no existe.
+181: Ya tienes un pet.
+182: Se ha cambiado la intimacy del pet.
+183: La intimacy del pet ya está al máximo.
+184: Perdona, pero no tienes un pet.
+185: Se ha cambiado el hambre del pet.
+186: El hambre del pet ya está al máximo.
+187: Ahora puedes renombrar tu pet.
+188: Ya puedes renombrar tu pet.
+189: Ahora el jugador especificado puede renombrar su pet.
+190: El jugador especificado ya puede renombrar su pet.
+191: Perdona, pero el jugador especificado no tiene ningún pet.
+192: No se puede cambiar el job del personaje especificado.
+193: El nivel base del personaje no puede bajar más.
+194: El nivel job del personaje no puede bajar más.
+195: ¡Se ha kickeado a todos los jugadores!
+196: Ya tienes la skill de quest especificada.
+197: El número de la skill especificada no existe o no es una quest skill.
+198: El número de la skill especificada no existe.
+199: El jugador especificado ha aprendido la skill.
+200: El jugador especificado ya tiene la skill indicada.
+201: Ya no tienes la quest skill indicada.
+202: El jugador especificado ha olvidado la skill.
+203: El jugador especificado ya no tiene la quest skill indicada.
+204: No puedes abrir una tienda en esta celda.
+205: Tal vez te referías a: 
+206: Se han reseteado '%s' skill points.
+207: Se han reseteado '%s' stats points.
+208: Se han reseteado '%s' skill y stat points.
+209: Se han cambiado los skill points del personaje.
+210: Se han cambiado los status points del personaje.
+211: Se ha cambiado el zeny actual del personaje.
+212: No puedes montar mientras estás en disguise.
+213: No puedes montar en Peco Peco con tu job actual.
+214: Has soltado tu Peco Peco.
+215: El jugador especificado no puede montar en Peco Peco mientras está en disguise.
+216: El jugador especificado ha montado en Peco Peco.
+217: El jugador especificado no puede montar en Peco Peco con su job actual.
+218: El jugador especificado ha soltado su Peco Peco.
+219: %d día
+220: %d días
+221: %s %d hora
+222: %s %d horas
+223: %s %d minuto
+224: %s %d minutos
+225: %s y %d segundo
+226: %s y %d segundos
+227: No se permite modificar la party en este mapa.
+228: No se permite modificar la guild en este mapa.
+229: Se ha mostrado el efecto.
+230: Hora del servidor (hora normal): %A, %B %d %Y %X.
+231: Hora del juego: El juego está permanentemente en el día.
+232: Hora del juego: El juego está permanentemente en la noche.
+233: Hora del juego: El juego está en la noche durante %s.
+234: Hora del juego: Después, el juego estará permanentemente en el día.
+235: Hora del juego: El juego está en el día durante %s.
+236: Hora del juego: Después, el juego estará permanentemente en la noche.
+237: Hora del juego: Después, el juego estará en la noche durante %s.
+238: Hora del juego: El ciclo de un día tiene una duración normal de %s.
+239: Hora del juego: Después, el juego estará en el día durante %s.
+240: ¡Se han invocado %d monstruo(s)!
+241: Ahora puedes atacar y matar jugadores libremente.
+242: Ahora puedes ser atacado y matado por otros jugadores.
+243: Se ha desactivado el uso de skills en este mapa.
+244: Se ha activado el uso de skills en este mapa.
+245: Uptime del server: %ld días, %ld horas, %ld minutos, %ld segundos.
+246: Tu nivel de GM no te permite realizar esta acción.
+247: No estás autorizado a warpearte a este mapa.
+248: No estás autorizado a warpearte desde tu mapa actual.
+249: No estás autorizado a warpearte a tu save map.
+250: Ya tienes abierto tu storage. Ciérralo antes.
+251: Ya tienes abierto tu guild storage. Ciérralo antes.
+252: No estás en una guild.
+//253: You are not authorized to memo this map.
+254: Se ha vuelto a cargar la configuración de los comandos de GM.
+255: Se ha vuelto a cargar la configuración Battle.
+256: Se ha vuelto a cargar la database de Status.
+257: Se ha vuelto a cargar la database de jugadores.
+258: Se ha enviado el paquete 0x%x (%d)
+259: Paquete no válido.
+260: No se puede tradear este item.
+261: No se pudo cargar el script.
+262: Se ha cargado el script.
+263: Este item no se puede dropear.
+264: Este item no se puede meter en storage.
+265: %s ha comprado tu(s) item(s).
+266: Alguno(s) de tus items no se puede(n) vender y fue(ron) eliminado(s) de la tienda.
+//NdT 267: ¿No aparece en ningún lado en el source? No estoy seguro de esta traducción...
+267: Se han reseteado los mapas designados por '%s'.
+268: Se ha vuelto a cargar el Message of the Day.
+269: Se muestran los primeros %d resultados de %d.
+//@me output format
+270: * :%s %s: *
+271: No puedes dropear items en este mapa.
+272: No puedes tradear items en este mapa.
+273: Comandos disponibles:
+274: Se encontraron %d comandos.
+275: No se encontró ningún comando.
+276: No puedes abrir una tienda en este mapa.
+277: Uso: @request <petición/mensaje a los GMs que estén GMs>.
+278: (@request): %s
+279: @request enviado.
+280: Nombre no válido.
+281: No puedes crear chat rooms en este mapa.
+//Party-related
+282: Necesitas ser el líder de party para usar este comando.
+283: El personaje destino debe estar online y en tu party actual.
+284: Se ha transferido el líder de party.
+285: Ahora eres el líder de la party.
+286: No ha habido cambios en la configuración.
+287: No puedes cambiar el líder de party en este mapa.
+//Missing stuff for @killer related commands.
+288: Ya no eres killable.
+289: El jugador es ahora killable.
+290: El jugador ya no es killable.
+291: Los efectos atmosféricos desaparecerán cuando te warpees o hagas refresh.
+292: Se ha quitado el estado de killer.
+// Guild Castles Number
+// --------------------
+//299: ?? Castles
+300: Ninguno Tomado
+301: Uno Castillo
+302: Dos Castillos
+303: Tres Castillos
+304: Cuatro Castillos
+305: Cinco Castillos
+306: Seis Castillos
+307: Siete Castillos
+308: Ocho Castillos
+309: Nueve Castillos
+310: Diez Castillos
+311: Once Castillos
+312: Doce Castillos
+313: Trece Castillos
+314: Catorce Castillos
+315: Quince Castillos
+316: Dieciséis Castillos
+317: Diecisiete Castillos
+318: Dieciocho Castillos
+319: Diecinueve Castillos
+320: Veinte Castillos
+321: Veintiún Castillos
+322: Veintidós Castillos
+323: Veintitrés Castillos
+324: Veinticuatro Castillos
+325: Veinticinco Castillos
+326: Veintiséis Castillos
+327: Veintisiete Castillos
+328: Veintiocho Castillos
+329: Veintinueve Castillos
+330: Treinta Castillos
+331: Treinta y un Castillos
+332: Treinta y dos Castillos
+333: Treinta y tres Castillos
+// 334: Thirty-Four Castles
+334: Dominación Total
+
+// Templates for @who output
+343: Nombre: %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: | Localización: %s %d %d
+
+// @duel (part 1)
+350: Duel: No puedes usar @invite. No estás en duelo.
+351: Duel: Se ha alcanzado el límite de jugadores.
+352: Duel: No se encuentra el nombre del jugador.
+353: Duel: El jugador ya está en el duelo.
+354: Duel: Se ha enviado la invitación.
+355: Duel: No puedes usar @duel sin antes @reject la anterior invitación.
+356: Duel: Puedes participar en un duelo una vez cada %d minutos.
+357: Duel: Valor no válido.
+358: Duel: No puedes usar @leave. No estás en duelo.
+359: Duel: Has abandonado el duelo.
+360: Duel: No puedes usar @accept sin invitación de duelo.
+361: Duel: La invitación de duelo ha sido aceptada.
+362: Duel: No puedes usar @reject sin invitación a duelo.
+363: Duel: La invitación a duelo ha sido rechazada.
+364: Duel: No puedes invitar a %s porque no está en el mismo mapa.
+365: Duel: No puedes usar %s en un duelo. 
+// @duel (part 2)
+370:  -- Duelos: %d/%d, Miembros: %d/%d, Jugadores Máx: %d --
+371:  -- Duelos: %d/%d, Miembros: %d/%d --
+372:  -- Se ha creado el duelo (Usa @invite/@leave) --
+373:  -- El jugador %s invita a %s al duelo --
+//NdT 374: he eliminado el Blue del inicio. ¿Qué utilidad tiene?
+374:  -- El jugador %s te invita a un duelo PVP (Usa @accept/@reject) --
+375:  <- El jugador %s ha abandonado el duelo --
+376:  -> El jugador %s ha aceptado el duelo --
+377:  -- El jugador %s ha rechazado el duelo --
+// Main chat
+380: Se ha activado el Main chat.
+381: El Main chat ya está activo.
+382: Se ha desactivado el Main chat.
+383: El Main chat ya está desactivado.
+384: El Main chat está activado en estos instantes. Uso: @main <on|off>, @main <mensaje>.
+385: El Main chat está desactivado en estos instantes. Uso: @main <on|off>, @main <mensaje>.
+386: %s :Main: %s
+387: No puedes usar el Main chat mientras estás muteado.
+388: Deberías activar el Main chat usando el comando "@main on".
+//NoAsk
+390: Se ha activado el autoreject.
+391: Se ha desactivado el autoreject.
+392: Tu petición ha sido rechazada por la opción de autoreject.
+393: Se ha autorechazado la petición de trade de %s.
+394: Se ha autorechazado la invitación a party de %s.
+395: Se ha autorechazado la invitación a guild de %s.
+396: Se ha autorechazado la petición de alianza de %s.
+397: Se ha autorechazado la petición de oposición de %s.
+398: Se ha autorechazado la petición de amistad de %s.
+400: Uso: @jailfor <tiempo> <nombre de personaje>
+401: Se te ha jaileado durante %d años, %d meses, %d días, %d horas y %d minutos.
+402: %s en jail durante %d años, %d meses, %d días, %d horas y %d minutos.
+// WoE SE (@agitstart2)
+403: Se ha iniciado la War of Emperium SE.
+404: La War of Emperium SE está en progreso en estos instantes.
+405: Se ha acabado la War of Emperium SE.
+406: La War of Emperium SE no está en progreso en estos instantes.
+//407 free
+//chrif related
+408: Tienes que desconectarte del juego para realizar el cambio de sexo...
+409: Se ha cambiado tu sexo (se necesita desconexión desde el servidor)...
+//410-411 used by cash shop. [Translator's note: How can I translate them?]
+//NdT 412-419: 420 es el primero que se utiliza a partir de aquí, y no sé como hacer quedar bien algunos
+412: Tu cuenta tiene un 'No Registrado'.
+413: Tu cuenta tiene una 'Contraseña Incorrecta'...
+414: Tu cuenta ha expirado.
+415: El servidor ha rechazado la entrada con esta cuenta.
+416: El equipo de GMs ha bloqueado tu cuenta.
+417: Tu archivo EXE del juego no es el de la última versión.
+418: Se ha prohibido el log in de tu cuenta.
+419: El servidor está sobrecargado por sobrepoblación.
+//para 420: No sé si esta traducción refleja lo que se quería decir. Vaya inglés...
+420: Tu cuenta no tiene más autorización.
+421: Tu cuenta ha sido totalmente borrada.
+423: Tu cuenta ha sido baneada hasta el 
+424: Se ha pedido al login-server %s al jugador '%.*s'.
+425: El jugador '%.*s' no existe.
+426: Tu nivel de GM no te autoriza a %s al jugador '%.*s'.
+427: El login-server está offline. Imposible %s al jugador '%.*s'.
+428: bloquear
+429: banear
+430: desbloquear
+431: desbanear
+432: cambiar de sexo
+
+// Homunculus messages
+450: Ya tienes un homúnculo.
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+//500: FREE
+501: El límite de tiempo de tu cuenta es: %d-%m-%Y %H:%M:%S.
+502: El Modo Día está activo
+503: El Modo Noche está activo
+
+// Cash point change messages
+504: Has usado %d kafra points y %d cash points. Te quedan %d kafra y %d cash points.
+505: Has ganado %d cash points. Tienes un total de %d points.
+506: Has ganado %d kafra points. Tienes un total de %d points.
+410: Has usado %d cash points. Tienes un total de %d points.
+411: Has usado %d kafra points. Tienes un total de %d points.
+
+// Trade Spoof Messages
+507: El jugador en cuestión ha sido baneado %d minuto(s).
+508: El jugador en cuestión no ha sido baneado (se ha desactivado la opción de ban).
+//509 Available....
+
+// mail system
+//----------------------
+510: Tienes %d emails nuevos (%d sin leer)
+
+// Bot detect messages (currently unused)
+535: Posible uso de BOT (99%% de probabilidad) o cliente modificado por parte de '%s' (account: %d, char_id: %d). El jugador te llama mientras estás oculto.
+
+536: El personaje '%s' (account: %d) intenta usar un bot (trata de detectar un jugador falso).
+537: El personaje '%s' (account: %d) intenta usar un bot (trata de detectar un mob falso).
+// Trade Spoof Messages
+538: Hack en un trade: el personaje '%s' (account: %d) intenta tradear más items de los que tiene.
+539: El jugador en cuestión tiene %d items del mismo tipo (id: %d) y ha intentado tradear %d de ellos.
+540: El jugador en cuestión ha sido definitivamente bloqueado.
+// Rare Items Drop/Steal announce
+// NdT 541-542: queda raro, pero hay que mantener el orden de los placeholders...
+541: '%s' ha matado a %s y ha conseguido un %s (posibilidad: %0.02f%%)
+//541: %.0s%.0sSomeone got %s
+542: '%s' ha robado a %s y ha conseguido un %s (posibilidad: %0.02f%%)
+//542: %.0s%.0sSomeone stole %s
+// 543~548 are not used (previously @away messages)
+// @Autotrade
+549: Debes tener abierta una tienda para usar @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: Job Desconocido
+
+// MvP Tomb
+// Added here so it can be easily translated
+656: Tumba
+657: [ ^EE0000%s^000000 ]
+658: Ha fallecido
+659: Hora de la muerte : ^EE0000%s^000000
+660: Derrotado por
+661: [^EE0000%s^000000]
+
+// Etc messages from source
+662: Debes estar al menos a %d celdas de distancia de cualquier NPC.
+663: Duel: No puedes usar este item en un duelo.
+664: No puedes usar este comando estando muerto.
+665: No puedes crear salas de chat en este área.
+666: No se admiten pets en las Guild Wars.
+667: No estás muerto.
+668: Tus puntos guardados actuales son:
+669: Has roto el arma de tu objetivo.
+670: No puedes dejar las guilds de battleground.
+671: Ya tienes a ese amigo.
+672: No se encontró el nombre en la lista.
+673: No puedes hacer esta acción en este momento. Por favor, inténtalo más tarde.
+674: Se ha eliminado el amigo.
+675: ¡¡No puedes enviar mails tan rápido!!
+676: ¡No se pueden hacer alianzas durante las Guild Wars!
+677: ¡No se pueden romper alianzas durante las Guild Wars!
+678: Ya no eres el Guild Master.
+679: ¡Ahora eres el Guild Master!
+680: ¡Te has recuperado!
+//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
+694: Hanbok
+
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+// NdT 900-908: Preferiría dejarlos en inglés, son de uso muy avanzado y para usarlos deberías saber con qué te manejas...
+900: Uso:
+901:	@send len <número hex del paquete>
+902: 	@send <número hex del paquete> {<valor>}*
+903: 	Valor: <tipo=B(por defecto),W,L><número> or S<longitud>"<string>"
+904: Longitud del paquete 0x%x: %d
+905: Paquete desconocido: 0x%x
+906: No es un string:
+907: No es un dígito hexadecimal:
+908: Tipo de valor desconocido en:
+
+// @rura
+909: Por favor, especifica un mapa (uso: @warp/@rura/@mapmove <nombre_de_mapa> <x> <y>).
+
+// @where
+910: Por favor, especifica un nombre de jugador (uso: @where <nombre personaje>).
+
+// @jumpto
+911: Por favor, especifica un nombre de jugador (uso: @jumpto/@warpto/@goto <nombre/ID personaje>).
+
+// @who
+912: (CID:%d/AID:%d) 
+
+// @whogm
+913: Nombre: %s (GM)
+914: Nombre: %s (GM:%d) | Localización: %s %d %d
+915:       BLvl: %d | Job: %s (Lvl: %d)
+916:       Party: '%s' | Guild: '%s'
+917: Ninguno
+
+// @speed
+918: Por favor, especifica un valor de velocidad (uso: @speed <%d-%d>).
+
+// @storage
+919: Se ha abierto el storage.
+
+// @guildstorage
+920: Se ha abierto el guild storage.
+
+// @option
+921: Por favor, especifica al menos una opción.
+
+// @jobchange
+922: Por favor, especifica un job ID.
+923: No puedes cambiar a este job usando comandos.
+//924-979 free (future jobs?)
+
+// @kami
+980: Por favor, especifica un mensaje (uso: @kami <mensaje>).
+981: Por favor, especifica color y mensaje (uso: @kamic <color> <mensaje>).
+982: Color no válido.
+
+// @item
+983: Por favor, especifica el nombre o ID de un item (uso: @item <nombre/ID item> <cantidad>).
+
+// @item2
+984: Por favor, especifica todos los parámetros (uso: @item2 <nombre/ID item> <quantity>
+985:   <identify_flag> <refine> <atributo> <card1> <card2> <card3> <card4>).
+
+// @baselevelup
+986: Por favor, especifica el cambio de nivel (uso: @lvup/@blevel/@baselvlup <número de niveles>).
+
+// @joblevelup
+987: Por favor, especifica el cambio de nivel (uso: @joblvup/@jlevel/@joblvlup <número de niveles>).
+
+// @help
+988: No hay ayuda para %c%s.
+989: Ayuda para el comando %c%s:
+990: Otros nombres disponibles:
+
+// @model
+991: Por favor, especifica al menos un valor (uso: @model <ID pelo: %d-%d> <color pelo: %d-%d> <color ropa: %d-%d>).
+
+// @dye
+992: Por favor, especifica el color de ropa (uso: @dye/@ccolor <color ropa: %d-%d>).
+
+// @hairstyle
+993: Por favor, especifica el estilo de pelo (uso: @hairstyle/@hstyle <ID pelo: %d-%d>).
+
+// @haircolor
+994: Por favor, especifica el color de pelo (uso: @haircolor/@hcolor <color pelo: %d-%d>).
+
+// @go
+995: No puedes usar @go en este mapa.
+
+// @refine
+996: Por favor, especifica posición y cantidad (uso: @refine <posición equipo> <+/- cantidad>).
+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: Por favor, especifica al menos un nombre/ID de item (uso: @produce <nombre/ID equipo> <elemento> <# de very's>).
+
+// @memo
+1008: Por favor, especifica una posición válida (uso: @memo <memo_position:%d-%d>).
+
+// @displaystatus
+1009: Por favor, especifica un tipo/flag de status (uso: @displaystatus <tipo status> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Por favor, especifica un número (uso: @stpoint <número de puntos>).
+
+// @skpoint
+1011: Por favor, especifica un número (uso: @skpoint <número de puntos>).
+
+// @zeny
+1012: Por favor, especifica una cantidad (uso: @zeny <cantidad>).
+
+// @param
+1013: Por favor, especifica un valor válido (uso: @str/@agi/@vit/@int/@dex/@luk <+/-valor>).
+
+// @guildlevelup
+1014: Por favor, especifica un nivel válido (uso: @guildlvup/@guildlvlup <# de niveles>).
+
+// @makeeg
+1015: Por favor, especifica monstruo/nombre de huevo/ID (uso: @makeegg <pet>).
+
+// @petfriendly
+1016: Por favor, especifica un valor válido (uso: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Por favor, especifica un número válido (uso: @pethungry <0-100>).
+
+// @recall
+1018: Por favor, especifica un nombre de jugador (uso: @recall <nombre/ID personaje>).
+1019: No estás autorizado a warpear a alguien a este mapa.
+
+// @recall
+1020: No estás autorizado a warpear a este jugador desde su mapa.
+
+// @charblock
+1021: Por favor, especifica un nombre de jugador (uso: @charblock/@block <nombre personaje>).
+
+// @charban
+1022: Por favor, especifica el tiempo de ban y el nombre de un jugador (uso: @charban/@ban/@banish/@charbanish <tiempo> <nombre personaje>).
+1023: No estás autorizado a reducir el tiempo de un ban.
+
+// @charunblock
+1024: Por favor, especifica un nombre de jugador (uso: @charunblock <nombre personaje>).
+
+// @charunban
+1025: Por favor, especifica un nombre de jugador (uso: @charunban <nombre personaje>).
+
+// @kick
+1026: Por favor, especifica un nombre de jugador (uso: @kick <nombre/ID personaje>).
+
+// @questskill / @lostskill
+1027: Por favor, especifica el número de la quest skill.
+
+// @spiritball
+1028: Por favor, especifica una cantidad (uso: @spiritball <número: 0-%d>).
+
+// @party
+1029: Por favor, especifica un nombre de party (uso: @party <nombre_party>).
+
+// @guild
+1030: Por favor, especifica un nombre de guild (uso: @guild <nombre_guild>).
+
+// @idsearch
+1031: Por favor, especifica parte del nombre de un item (uso: @idsearch <pate_del_nombre_de_item>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: No estás autorizado a warpear a nadie a tu mapa actual.
+1033: Debido a que no estás autorizado a warpear desde algunos mapas, hay %d jugador(es) que no ha(n) sido recalleado(s).
+
+// @guildrecall
+1034: Por favor, especifica un nombre/ID de guild (uso: @guildrecall <nombre/ID guild>).
+
+// @partyrecall
+1035: Por favor, especifica un nombre/ID de party (uso: @partyrecall <nombre/ID party>).
+
+// @reloadatcommand
+1036: Error al leer groups.conf, recarga fallida.
+1037: Error al leer atcommand_athena.conf, recarga fallida.
+
+// @mapinfo
+1038: Por favor, especifica al menos un número válido de lista (uso: @mapinfo <0-3> <mapa>).
+1039: ------ Map Info ------
+1040: Mapa: %s | Jugadores: %d | NPCs: %d | Chats: %d | Vendings: %d
+1041: ------ Map Flags ------
+1042: Town Map
+1043: Autotrade Activado
+1044: Autotrade Desactivado
+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: ----- Jugadores en el Mapa -----
+1099: Jugador '%s' (sesión #%d) | Localización: %d,%d
+1100: ----- NPCs en el Mapa -----
+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 | Dirección: %s | Sprite: %d | Localización: %d %d
+1112: NPC %d: %s::%s | Dirección: %s | Sprite: %d | Localización: %d %d 
+1113: ----- Chats en el Mapa -----
+1114: Chat: %s | Jugador: %s | Localización: %d %d
+1115:    Usuarios: %d/%d | Password: %s | Público: %s
+1116: Sí
+1117: No
+1118: Por favor, especifica al menos un número válido de lista (uso: @mapinfo <0-3> <mapa>).
+
+// @mount
+1119: Te has montado en tu Dragon.
+1120: Has soltado tu Dragon.
+1121: Te has montado en tu Warg.
+1122: Has soltado tu Warg.
+1123: Te has montado en tu Mado Gear.
+1124: Has soltado tu Mado Gear.
+
+// @guildspy
+1125: El mapserver no tiene activo el soporte a comandos de spy.
+1126: Por favor, especifica un nombre/ID de guild (uso: @guildspy <nombre/ID guild>).
+
+// @partyspy
+1127: Por favor, especifica un nombre/ID de party (uso: @partyspy <nombre/ID party>).
+
+// @nuke
+1128: Por favor, especifica un nombre de jugador (uso: @nuke <nombre personaje>).
+
+// @tonpc
+1129: Por favor, especifica un nombre de NPC (uso: @tonpc <nombre_NPC>).
+
+// @enablenpc
+1130: Por favor, especifica un nombre de NPC (uso: @enablenpc <nombre_NPC>).
+
+// @hidenpc
+1131: Por favor, especifica un nombre de NPC (uso: @hidenpc <nombre_NPC>).
+
+// @loadnpc
+1132: Por favor, especifica el nombre de un archivo de script (uso: @loadnpc <nombre archivo>).
+
+// @npcoff
+1133: Por favor, especifica un nombre de NPC (uso: @npcoff <nombre_NPC>).
+
+// @jail
+1134: Por favor, especifica un nombre de jugador (uso: @jail <char_name>).
+
+// @unjail
+1135: Por favor, especifica un nombre de jugador (uso: @unjail/@discharge <char_name>).
+
+// @jailfor
+1136: Tiempo no válido para el comando jail.
+1137: Estás ahora
+1138: El jugador especificado está ahora
+
+// @jailtime
+1139: No estás en jail.
+1140: Te han jaileado indefinidamente.
+1141: Has sido jaileado una cantidad desconocida de tiempo.
+1142: Permanecerás 
+
+// @disguise
+1143: Por favor, especifica un nombre de Monstruo/NPC o ID (uso: @disguise <nombre/ID>).
+1144: El personaje no se puede disguisear mientras está montado.
+
+// @disguiseall
+1145: Por favor, especifica un nombre de Monstruo/NPC o ID (uso: @disguiseall <nombre/ID>).
+
+// @disguiseguild
+1146: Por favor, especifica el nombre/ID de mob y el nombre/ID de guild (uso: @disguiseguild <nombre/ID mob>, <nombre/ID guild>).
+
+// @undisguiseguild
+1147: Por favor, especifica un nombre/ID de guild (uso: @undisguiseguild <nombre/ID guild>).
+
+// @exp
+1148: Nivel Base: %d (%.3f%%) | Nivel Job: %d (%.3f%%)
+
+// @broadcast
+1149: Por favor, especifica un mensaje (uso: @broadcast <mensaje>).
+
+// @localbroadcast
+1150: Por favor, especifica un mensaje (uso: @localbroadcast <mensaje>).
+
+// @email
+1151: Por favor, especifica 2 emails (uso: @email <email@actual> <email@nuevo>).
+
+// @effect
+1152: Por favor, especifica un número de efecto (uso: @effect <número efecto>).
+
+// @npcmove
+1153: Uso: @npcmove <X> <Y> <nombre_npc>
+1154: El NPC no está en este mapa.
+1155: Se ha movido el NPC.
+
+// @addwarp
+1156: Uso: @addwarp <nombre_mapa> <X> <Y> <nombre_npc>
+1157: No se conoce el mapa '%s'.
+1158: Se ha creado el nuevo NPC warp '%s'.
+
+// @follow
+1159: Modo follow OFF.
+1160: Modo follow ON.
+
+// @storeall
+1161: No puedes abrir tu storage en este momento.
+1162: Se han guardado todos los items en storage.
+
+// @skillid
+1163: Por favor, especifica el nombre de skill a buscar (uso: @skillid <nombre skill>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Uso: @useskill <ID skill> <nivel skill> <objetivo>
+
+// @displayskill
+1166: Uso: @displayskill <ID skill> {<nivel skill>}
+
+// @skilltree
+1167: Uso: @skilltree <ID skill> <objetivo>
+//NdT 1168: No estoy seguro de que sea correcta
+1168: El jugador está usando el skill tree de %s (%d puntos de basic skill).
+1169: El jugador no puede usar la skill indicada.
+1170: El jugador necesita el nivel %d de la skill %s.
+1171: El jugador tiene todos los requisitos para la skill indicada.
+
+// @marry
+1172: Uso: @marry <nombre personaje>
+1173: Se han casado... ¡deseadles lo mejor!
+1174: Los dos personajes no se pueden casar porque uno es baby o ya se ha casado.
+
+// @divorce
+1175: '%s' no está casado.
+1176: '%s' y su compañero están ahora divorciados.
+
+// @changelook
+1177: Uso: @changelook {<posición>} <view id>
+1178: Posición: 1-Top 2-Middle 3-Bottom 4-Weapon 5-Shield 6-Shoes 7-Robe
+
+// @autotrade
+1179: No se permite hacer autotrade en este mapa.
+1180: No puedes hacer autotrade si estás muerto.
+
+// @changegm
+1181: Necesitas ser Guild Master para usar este comando.
+1182: No puedes cambiar el Guild Leader en este mapa.
+1183: Uso: @changegm <nombre_de_miembro_guild>
+1184: El personaje objetivo debe estar online y ser miembro de la guild.
+
+// @changeleader
+1185: Uso: @changeleader <nombre_de_miembro_party>
+
+// @partyoption
+1186: Uso: @partyoption <pickup share: yes/no> <item distribution: yes/no>
+
+// @autoloot
+1187: Autolooteando items de drop rates de %0.02f%% e inferior.
+1188: Se ha desactivado el autoloot.
+
+// @autolootitem
+1189: No se pudo encontrar el item.
+1190: Ya estás autolooteando este item.
+1191: Tu lista de autolootitem está llena. Elimina antes algunos items con @autolootid -<nombre o ID item>.
+1192: Autolooteando item: '%s'/'%s' {%d}
+1193: Ahora mismo no estás autolooteando este item.
+1194: Item eliminado de tu lista de autolootitem: '%s'/'%s' {%d}
+1195: Puedes tener %d items en tu lista de autolootitem.
+1196: Para añadir un item a la lista, usa "@alootid +<nombre o ID item>". Para eliminar un item, usa "@alootid -<nombre o ID item>".
+1197: "@alootid reset" vaciará tu lista de autolootitem.
+1198: Tu lista de autolootitem está vacía.
+1199: Items en tu lista de autolootitem:
+1200: Se ha reseteado tu lista de autolootitem.
+
+// @rain
+//1201: The rain has stopped.
+//1202: It has started to rain.
+
+// @snow
+1203: Ha dejado de caer nieve.
+1204: Ha empezado a nevar.
+
+// @sakura
+1205: Ya no caen hojas de cerezo.
+1206: Han empezado a caer hojas de cerezo.
+
+// @clouds
+1207: Han desaparecido las nubes.
+1208: Han aparecido nubes.
+
+// @clouds2
+1209: Han desaparecido las otras nubes.
+1210: Otras nubes han aparecido.
+
+// @fog
+1211: Se ha ido la niebla.
+1212: La niebla se cierne.
+
+// @leaves
+1213: Ya no caen hojas.
+1214: Empiezan a caer hojas.
+
+// @fireworks
+1215: Se han acabado los fuegos artificiales.
+1216: Se están lanzando fuegos artificiales.
+
+// @sound
+1217: Por favor, especifica un nombre de archivo de sonido (uso: @sound <nombre_archivo>).
+
+// @mobsearch
+1218: Por favor, especifica un nombre de monstruo (uso: @mobsearch <nombre monstruo>).
+1219: ¡Mob ID %s no válida!
+1220: Buscando mob... %s %s
+
+// @cleanmap
+1221: Se han eliminado todos los items dropeados.
+
+// @npctalk
+1222: Por favor, especifica los parámetros correctos (uso: @npctalk <nombre npc>, <mensaje>).
+1223: Por favor, especifica los parámetros correctos (uso: @npctalkc <color> <nombre npc>, <messaje>).
+
+// @pettalk
+1224: Por favor, especifica un mensaje (uso: @pettalk <mensaje>).
+
+// @summon
+1225: Por favor, especifica un nombre de monstruo (uso: @summon <nombre monstruo> {duración}).
+
+// @adjgroup
+1226: Uso: @adjgroup <group_id>
+1227: El grupo especificado no existe.
+1228: Se ha cambiado satisfactoriamente el grupo.
+1229: Tu grupo ha cambiado.
+
+// @trade
+1230: Por favor, especifica un nombre de jugador (uso: @trade <nombre personaje>).
+
+// @setbattleflag
+1231: Uso: @setbattleflag <flag> <valor>
+1232: Has especificado un battle_config flag desconocido.
+1233: Se ha ajustado el battle_config como se ha pedido.
+
+// @unmute
+1234: Por favor, especifica un nombre de jugador (uso: @unmute <nombre personaje>).
+1235: El jugador no está muteado.
+1236: Se ha desmuteado el jugador.
+
+// @mute
+1237: Uso: @mute <tiempo> <nombre personaje>
+
+// @identify
+1238: No hay items que identificar.
+
+// @mobinfo
+1239: Por favor, especifica un nombre/ID de monstruo (uso: @mobinfo <nombre_o_ID_de_monstruo>).
+1240: Monstruo MVP: '%s'/'%s'/'%s' (%d)
+1241: Monstruo: '%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  Rango:%d~%d~%d  Tamaño:%s  Raza: %s  Elemento: %s (Lv:%d)
+1245:  Drops:
+1246: Este monstruo no dropea nada.
+1247:  MVP Bonus EXP:%u
+1248:  MVP Items:
+1249: Este monstruo no da premios de MVP.
+
+// @showmobs
+1250: ¡Mob ID %s no válida!
+1251: ¡No se pueden mostrar boss mobs!
+1252: Buscando mob... %s %s
+
+// @homlevel
+1253: Por favor, especifica el cambio de nivel (uso: @homlevel <número de niveles>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: No tienes homúnculo.
+
+// @homevolve
+1255: Tu homúnculo no evoluciona.
+
+// @makehomun
+1256: Por favor, especifica una ID de homúnculo (uso: @makehomun <id homúnculo>).
+1257: ID de homúnculo no válida.
+
+// @homfriendly
+1258: Por favor, especifica valor de intimacy (uso: @homfriendly <valor intimacy [0-1000]>).
+
+// @homhungry
+1259: Por favor, especifica un valor de hambre (uso: @homhungry <valor hambre [0-100]>).
+
+// @homtalk
+1260: Por favor, especifica un mensaje (uso: @homtalk <mensaje>).
+
+// @hominfo
+1261: Stats del homúnculo:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: Hambre: %d - Intimacy: %u
+1265: Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Growth stats del homúnculo (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: Se han alterado los stats del homúnculo.
+
+// @iteminfo
+1276: Por favor, especifica un nombre/ID de item (uso: @ii/@iteminfo <nombre/ID item>).
+1277: Item: '%s'/'%s'[%d] (%d) Tipo: %s | Extra Effect: %s
+1278: Ninguno
+1279: Tiene script
+1280: NPC Compra:%dz, Venta:%dz | Peso: %.1f 
+1281:  - Solo disponible en tiendas.
+1282:  - Posibilidad máxima de drop por monstruo: %02.02f%%
+1283:  - Los monstruos no dropean este item.
+
+// @whodrops
+1284: Por favor, especifica un nombre/ID de item (uso: @whodrops <nombre/ID item>).
+1285: Item: '%s'[%d]
+1286:  - Los monstruos no dropean este item.
+1287:  - Mobs comunes con mayor probabilidad de drop (solo se muestran los %d máximos):
+
+// @whereis
+1288: Por favor, especifica un nombre/ID de monstruo (uso: @whereis <nombre_o_ID_de_monstruo>).
+1289: %s spawnea en:
+1290: Este monstruo no spawnea de forma normal.
+
+// @adopt
+1291: Uso: @adopt <padre>,<madre>,<hijo>
+1292: Adoptando: --%s--%s--%s--\n
+1293: No se puede encontrar online al jugador %s.
+1294: Ya son familia... deséales suerte.
+
+// @version
+1295: rAthena Version SVN r%s
+1296: No se puede determinar la revisión SVN.
+
+// @mutearea
+1297: Por favor, especifica un tiempo en minutos (uso: @mutearea/@stfu <tiempo en minutos>).
+
+// @rates
+1298: Rates de Experiencia: Base %.2fx / Job %.2fx
+1299: Rates de Drop Normal: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1300: Rates de Drop Boss: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1301: Otros Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Por favor, especifica un mensaje (uso: @me <mensaje>).
+
+// @size / @sizeall / @sizeguild
+1303: Cambio de tamaño aplicado.
+
+// @sizeguild
+1304: Por favor, especifica un nombre/ID de guild (uso: @sizeguild <tamaño> <nombre/ID guild>).
+
+// @monsterignore
+1305: Ahora eres inmune a ataques.
+1306: Has vuelto a tu estado normal.
+
+// @fakename
+1307: Has recuperado tu nombre real.
+1308: Debes especificar un nombre.
+1309: El nombre falso debe tener al menos dos caracteres.
+1310: Nombre falso activado.
+
+// @mapflag
+1311: Mapflags activos en este mapa:
+1312: Uso: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Escribe "@mapflag available" para obtener una lista de mapflags disponibles.
+1314: Nombre de mapflag o flag inválido.
+1315: Mapflags disponibles:
+
+// @showexp
+1316: No se mostrará la experiencia obtenida.  
+1317: Ahora se muestra la experiencia obtenida.
+
+// @showzeny
+1318: No se mostrará el zeny obtenido.
+1319: Ahora se muestra el zeny obtenido.
+
+// @showdelay
+// NdT 1320-1321: No sé cómo traducirlos correctamente, así que están medio traducidos.
+1320: No se mostrarán los skill delay failures.
+1321: Ahora se muestran los skill delay failures.
+
+// @cash
+1322: Por favor, especifica una cantidad.
+
+// @clone
+1323: Debes especifica un nombre o ID de jugador.
+
+// @feelreset
+1324: Se han reseteado los mapas de 'Feeling'.
+
+// @noks
+1325: [ Protección K.S Inactiva ]
+1326: [ Protección K.S Activa - Opción: Party ]
+1327: [ Protección K.S Activa - Opción: Self ]
+1328: [ Protección K.S Activa - Opción: Guild ]
+1329: Uso: @noks <self|party|guild>
+
+// @allowks
+1330: [ Protección K.S en el Mapa Activa ]
+1331: [ Protección K.S en el Mapa Inactiva ]
+
+// @itemlist
+// NdT 1332 y 1353: no podemos traducir ni inventory, ni cart. Storage daría igual.
+1332: ------ %s lista de items de '%s' ------
+1333:  | equipado: 
+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, con nombre)
+1349:  -> (pet egg, pet id: %u, sin nombre)
+1350:  -> (item creado, id creador: %u, star crumbs %d, elemento %d)
+1351:  -> (item producido, id creador: %u)
+1352:  -> (card(s): 
+1353: No se encontró ningún item en el %s del jugador.
+1354: Se han encontrado %d item(s) en %d espacios de %s.
+
+// @delitem
+1355: Por favor, especifica un nombre/ID de item, una cantidad y un nombre de jugador (uso: #delitem <jugador> <nombre_o_ID_de_item> <cantidad>).
+
+// @font
+1356: Volviendo a usar la fuente normal.
+1357: Usa @font <1-9> para cambiar la fuente de tus mensajes.
+1358: Usa 0 o ningún parámetro para volver a usar la fuente normal.
+1359: Fuente no válida. Usa un valor entre 0 y 9.
+1360: Se ha cambiado la fuente.
+1361: Ya estás usando esta fuente.
+
+// @new_mount
+1362: NOTA: Si tu cliente se crashea con la montura, tu LUA está desactualizada.
+1363: Has montado.
+1364: Has soltado tu montura.
+
+// @accinfo
+1365: Uso: @accinfo/@accountinfo <account_id/nombre personaje>
+1366: Puedes buscar partes de nombres si haces uso de '%' en la búsqueda, p.ej. "@accinfo %Mario%" lista todos los personajes cuyo nombre contenga "Mario".
+
+// @set
+1367: Uso: @set <nombre variable> <valor>
+1368: Uso: ej. "@set PoringCharVar 50"
+1369: Uso: ej. "@set PoringCharVarSTR$ String Super Chachi"
+1370: Uso: ej. "@set PoringCharVarSTR$" devuelve su valor, String Super Chachi.
+1371: No se pueden usar variables de NPC con @set.
+1372: No se pueden usar variables de instances con @set.
+1373: El valor de %s es ahora :%d
+1374: El valor de %s es ahora :%s
+1375: %s está vacío
+1376: El tipo de dato de %s no está soportado :%u
+
+// @reloadquestdb
+1377: Se ha vuelto a cargar la quest database.
+
+// @addperm
+1378: Uso: %s <nombre_permiso>
+1379: -- Lista de Permisos
+1380: '%s' no se trata de un permiso conocido.
+1381: El usuario '%s' ya tiene el permiso '%s'.
+1382: El usuario '%s' no tiene el permiso '%s'.
+1383: -- Permisos del usuario '%s'
+1384: Se han actualizado satisfactoriamente los permisos del usuario '%s'. Los cambios son temporales.
+
+// @unloadnpcfile
+1385: Uso: @unloadnpcfile <nombre de archivo>
+1386: Archivo se ha descargado del servidor. Ten en cuenta que los mapflag y los monstruos spawneados directamente no son eliminados.
+1387: File not found.
+
+// General command messages
+1388: Ha fallado el charcommand (uso: %c<comando> <nombre personaje> <parámetros>).
+1389: Ha fallado el %s. No se encontró el jugador.
+
+// @cart
+1390: Carro desconocido (uso: %s <0-%d>).
+1391: No tienes un carro que se pueda quitar.
+1392: Se ha puesto el carro.
+
+// atcommand.c::is_atcommand
+1393: No puedes usar comandos mientras estás muerto.
+
+// @clearstorage
+1394: Se ha vaciado tu storage.
+1395: Se ha vaciado tu guild storage.
+
+// @clearcart
+1396: No tienes un carro que se pueda vaciar.
+1397: Se ha vaciado tu carro.
+
+// @skillid (extension)
+1398: -- Se muestran las primeras %d coincidencias parciales:
+
+// @join
+1399: Canal Desconocido (uso: %s <#nombre_canal>)
+1400: Se desconoce el canal '%s' (uso: %s <#nombre_canal>)
+1401: El canal '%s' está protegido por contraseña (uso: %s <#nombre_canal> <contraseña>)
+1402: No estás en ese canal. Para entrar, escribe '@join <#nombre_canal>'
+1403: Estás ahora en el canal '%s'.
+
+// @channel
+1404: %s fallido.
+1405: El nombre del canal debe empezar por '#'.
+1406: El nombre del canal debe tener entre 3 y %d caracteres.
+1407: El canal '%s' no está disponible.
+1408: La contraseña del canal no debe contener espacios.
+1409: - #%s (%d usuarios)
+1410: ---- Canales Públicos ----
+1411: Se desconoce el color '%s'.
+1412: No eres el dueño del canal '%s'.
+1413: Se ha cambiado el color del canal '%s' a '%s'.
+1414: ---- Opciones disponibles:
+1415: * %s create <#nombre_canal> <contraseña_canal>
+1416: -- Crea un nuevo canal.
+1417: * %s list
+1418: -- Muestra una lista con todos los canales públicos.
+1419: * %s list colors
+1420: -- Muestra una lista con todos los colores disponibles para canales propios.
+1421: * %s setcolor <#nombre_canal> <color_name>
+1422: -- (Solo para dueños del canal) Cambia el texto al color especificado.
+1423: * %s leave <#nombre_canal>
+1424: -- Permite salir del canal especificado.
+1425: No eres parte del canal '%s'.
+1426: Has salido del canal '%s'.
+1427: * %s bindto <#nombre_canal>
+1428: -- Une tu chat global al canal especificado, de forma que todos los mensajes que envíes por chat global se envían a ese canal.
+1429: * %s unbind
+1430: -- Elimina la unión de tu chat global con el canal al que lo tengas unido, si lo tuvieras.
+1431: Tu chat global está ahora unido al canal '%s'.
+1432: Tu chat global no está unido con ningún canal.
+1433: Tu chat global ya no está unido al canal '%s'.
+1434: Ya estás en el canal '%s'.
+1435: Estás ahora en el canal '#%s' gracias a '%s'.
+
+//Custom translations
+//import: conf/msg_conf/import/map_msg_spn_conf.txt

+ 5 - 5
src/char/char.c

@@ -5124,14 +5124,14 @@ int do_init(int argc, char **argv)
 	mapindex_init();
 	start_point.map = mapindex_name2id("new_zone01");
 
-	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";
+	CHAR_CONF_NAME =   "conf/char_athena.conf";
+	LAN_CONF_NAME =    "conf/subnet_athena.conf";
+	SQL_CONF_NAME =    "conf/inter_athena.conf";
+	MSG_CONF_NAME_EN = "conf/msg_conf/char_msg.conf";
 
 	cli_get_options(argc,argv);
 
-	msg_config_read(MSG_CONF_NAME);
+	msg_config_read(MSG_CONF_NAME_EN);
 	char_config_read(CHAR_CONF_NAME);
 	char_lan_config_read(LAN_CONF_NAME);
 	sql_config_read(SQL_CONF_NAME);

+ 2 - 2
src/common/cli.c

@@ -21,7 +21,7 @@ char* SQL_CONF_NAME;
 char* LOGIN_CONF_NAME;
 //common
 char* LAN_CONF_NAME; //char-login
-char* MSG_CONF_NAME; //all
+char* MSG_CONF_NAME_EN; //all
 
 bool opt_has_next_value(const char* option, int i, int argc)
 {
@@ -64,7 +64,7 @@ int cli_get_options(int argc, char ** argv)
 		display_versionscreen(true);
 	    } else if (strcmp(arg, "msg-config") == 0) {
 		    if (opt_has_next_value(arg, i, argc))
-			MSG_CONF_NAME = argv[++i];
+			MSG_CONF_NAME_EN = 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;

+ 1 - 1
src/common/cli.h

@@ -27,7 +27,7 @@ extern "C" {
  extern char* LOGIN_CONF_NAME;
 //common
  extern char* LAN_CONF_NAME; //char-login
- extern char* MSG_CONF_NAME; //all
+ extern char* MSG_CONF_NAME_EN; //all
 
 extern void display_helpscreen(bool exit);
 int cli_get_options(int argc, char ** argv);

+ 65 - 29
src/common/msg_conf.c

@@ -24,42 +24,42 @@ const char* _msg_txt(int msg_number,int size, char ** msg_table)
  *------------------------------------------*/
 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;
+	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 ((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);
+	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;
+	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);
-	    }
+		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);
+	fclose(fp);
+	ShowInfo("Finished reading %s.\n",cfgName);
 
-    return 0;
+	return 0;
 }
 
 /*==========================================
@@ -70,3 +70,39 @@ void _do_final_msg(int size, char ** msg_table){
     for (i = 0; i < size; i++)
 	aFree(msg_table[i]);
 }
+
+/*
+ * lookup a langtype string into his associate langtype number
+ * return -1 if not found
+ */
+int msg_langstr2langtype(char * langtype){
+	int lang=-1;
+	if(!strncmp(langtype, "eng",2)) lang=0;
+	else if (!strncmp(langtype, "rus",2)) lang = 1;
+	else if (!strncmp(langtype, "spn",2)) lang = 2;
+	else if (!strncmp(langtype, "grm",2)) lang = 3;
+	else if (!strncmp(langtype, "chn",2)) lang = 4;
+	else if (!strncmp(langtype, "mal",2)) lang = 5;
+	else if (!strncmp(langtype, "idn",2)) lang = 6;
+	else if (!strncmp(langtype, "frn",2)) lang = 7;
+
+	return lang;
+}
+
+/*
+ * verify that the choosen langtype is enable
+ * return
+ *  1 : langage enable
+ * -1 : false range
+ * -2 : disable
+ */
+int msg_checklangtype(int lang, bool display){
+	uint16 test=1;
+	if(!lang) return 1; //default english
+	else if(lang < 0 && (test<<(lang-1)) > LANG_MAX ) return -1; //false range
+	else if (LANG_ENABLE&(test<<(lang-1)) ) return 1;
+	else if(display) {
+		ShowDebug("Unsuported langtype=%d\n",lang);
+	}
+	return -2;
+}

+ 17 - 0
src/common/msg_conf.h

@@ -8,9 +8,26 @@
 extern "C" {
 #endif
 
+enum lang_types {
+	LANG_RUS = 0x01,
+	LANG_SPN = 0x02,
+	LANG_GRM = 0x04,
+	LANG_CHN = 0x08,
+	LANG_MAL = 0x10,
+	LANG_IND = 0x20,
+	LANG_FRN = 0x40,
+	LANG_MAX
+};
+// What languages are enabled? bitmask FF mean all
+//#define LANG_ENABLE 0xFF
+#define LANG_ENABLE 0x00
+
 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);
+int msg_langstr2langtype(char * langtype);
+//verify that the choosen langtype is enable
+int msg_checklangtype(int lang, bool display);
 
 #ifdef	__cplusplus
 }

+ 4 - 4
src/login/login.c

@@ -553,9 +553,9 @@ int parse_fromchar(int fd){
 				char birthdate[10+1] = "";
 				char pincode[PINCODE_LENGTH+1];
 				int account_id = RFIFOL(fd,2);
-				
+
 				memset(pincode,0,PINCODE_LENGTH+1);
-				
+
 				RFIFOSKIP(fd,6);
 
 				if( !accounts->load_num(accounts, &acc, account_id) )
@@ -1863,11 +1863,11 @@ int do_init(int argc, char** argv)
 
 	LOGIN_CONF_NAME = "conf/login_athena.conf";
 	LAN_CONF_NAME = "conf/subnet_athena.conf";
-	MSG_CONF_NAME = "conf/msg_conf/login_msg.conf";
+	MSG_CONF_NAME_EN = "conf/msg_conf/login_msg.conf";
 
 	cli_get_options(argc,argv);
 
-	msg_config_read(MSG_CONF_NAME);
+	msg_config_read(MSG_CONF_NAME_EN);
 	login_config_read(LOGIN_CONF_NAME);
 	login_lan_config_read(LAN_CONF_NAME);
 

Datei-Diff unterdrückt, da er zu groß ist
+ 146 - 147
src/map/atcommand.c


+ 7 - 7
src/map/buyingstore.c

@@ -58,13 +58,13 @@ bool buyingstore_setup(struct map_session_data* sd, unsigned char slots)
 
 	if( map[sd->bl.m].flag.novending )
 	{// custom: no vending maps
-		clif_displaymessage(sd->fd, msg_txt(276)); // "You can't open a shop on this map"
+		clif_displaymessage(sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map"
 		return false;
 	}
 
 	if( map_getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) )
 	{// custom: no vending cells
-		clif_displaymessage(sd->fd, msg_txt(204)); // "You can't open a shop on this cell."
+		clif_displaymessage(sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell."
 		return false;
 	}
 
@@ -101,7 +101,7 @@ void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned cha
 	if( !pc_can_give_items(sd) )
 	{// custom: GM is not allowed to buy (give zeny)
 		sd->buyingstore.slots = 0;
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		clif_buyingstore_open_failed(sd, BUYINGSTORE_CREATE, 0);
 		return;
 	}
@@ -113,13 +113,13 @@ void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned cha
 
 	if( map[sd->bl.m].flag.novending )
 	{// custom: no vending maps
-		clif_displaymessage(sd->fd, msg_txt(276)); // "You can't open a shop on this map"
+		clif_displaymessage(sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map"
 		return;
 	}
 
 	if( map_getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) )
 	{// custom: no vending cells
-		clif_displaymessage(sd->fd, msg_txt(204)); // "You can't open a shop on this cell."
+		clif_displaymessage(sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell."
 		return;
 	}
 
@@ -221,7 +221,7 @@ void buyingstore_open(struct map_session_data* sd, int account_id)
 
 	if( !pc_can_give_items(sd) )
 	{// custom: GM is not allowed to sell
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		return;
 	}
 
@@ -259,7 +259,7 @@ void buyingstore_trade(struct map_session_data* sd, int account_id, unsigned int
 
 	if( !pc_can_give_items(sd) )
 	{// custom: GM is not allowed to sell
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, 0);
 		return;
 	}

+ 12 - 12
src/map/chat.c

@@ -61,7 +61,7 @@ static struct chat_data* chat_createchat(struct block_list* bl, const char* titl
 
 	if( bl->type != BL_NPC )
 		cd->kick_list = idb_alloc(DB_OPT_BASE);
-	
+
 	return cd;
 }
 
@@ -83,13 +83,13 @@ int chat_createpcchat(struct map_session_data* sd, const char* title, const char
 
 	if( map[sd->bl.m].flag.nochat )
 	{
-		clif_displaymessage(sd->fd, msg_txt(281));
+		clif_displaymessage(sd->fd, msg_txt(sd,281));
 		return 0; //Can't create chatrooms on this map.
 	}
 
 	if( map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOCHAT) )
 	{
-		clif_displaymessage (sd->fd, msg_txt(665));
+		clif_displaymessage (sd->fd, msg_txt(sd,665));
 		return 0;
 	}
 
@@ -158,10 +158,10 @@ int chat_joinchat(struct map_session_data* sd, int chatid, const char* pass)
 	pc_setchatid(sd,cd->bl.id);
 
     clif_joinchatok(sd, cd); //To the person who newly joined the list of all
-    clif_addchat(cd, sd); //Reports To the person who already in the chat 
-    clif_dispchat(cd, 0); //Reported number of changes to the people around 
+    clif_addchat(cd, sd); //Reports To the person who already in the chat
+    clif_dispchat(cd, 0); //Reported number of changes to the people around
 
-    chat_triggerevent(cd); //Event 
+    chat_triggerevent(cd); //Event
 
     return 0;
 }
@@ -204,14 +204,14 @@ int chat_leavechat(struct map_session_data* sd, bool kicked)
 
 	if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
 		struct skill_unit* unit;
-		struct skill_unit_group* group;	
+		struct skill_unit_group* group;
 
 		clif_clearchat(cd, 0);
 		db_destroy(cd->kick_list);
 		map_deliddb(&cd->bl);
 		map_delblock(&cd->bl);
 		map_freeblock(&cd->bl);
-		
+
 		unit = map_find_skill_unit_oncell(&sd->bl, sd->bl.x, sd->bl.y, AL_WARP, NULL, 0);
 		group = (unit != NULL) ? unit->group : NULL;
 		if (group != NULL)
@@ -318,7 +318,7 @@ int chat_kickchat(struct map_session_data* sd, const char* kickusername)
 	nullpo_retr(1, sd);
 
 	cd = (struct chat_data *)map_id2bl(sd->chatID);
-	
+
 	if( cd==NULL || (struct block_list *)sd != cd->owner )
 		return -1;
 
@@ -328,7 +328,7 @@ int chat_kickchat(struct map_session_data* sd, const char* kickusername)
 
 	if (pc_has_permission(cd->usersd[i], PC_PERM_NO_CHAT_KICK))
 		return 0; //gm kick protection [Valaris]
-	
+
 	idb_put(cd->kick_list,cd->usersd[i]->status.char_id,(void*)1);
 
 	chat_leavechat(cd->usersd[i],1);
@@ -370,14 +370,14 @@ int chat_deletenpcchat(struct npc_data* nd)
 	cd = (struct chat_data*)map_id2bl(nd->chat_id);
 	if( cd == NULL )
 		return 0;
-	
+
 	chat_npckickall(cd);
 	clif_clearchat(cd, 0);
 	map_deliddb(&cd->bl);
 	map_delblock(&cd->bl);
 	map_freeblock(&cd->bl);
 	nd->chat_id = 0;
-	
+
 	return 0;
 }
 

+ 15 - 15
src/map/chrif.c

@@ -810,7 +810,7 @@ int chrif_changesex(struct map_session_data *sd) {
 	WFIFOW(char_fd,30) = 5;
 	WFIFOSET(char_fd,44);
 
-	clif_displaymessage(sd->fd, msg_txt(408)); //"Need disconnection to perform change-sex request..."
+	clif_displaymessage(sd->fd, msg_txt(sd,408)); //"Need disconnection to perform change-sex request..."
 
 	if (sd->fd)
 		clif_authfail_fd(sd->fd, 15);
@@ -843,15 +843,15 @@ static void chrif_char_ask_name_answer(int acc, const char* player_name, uint16
 	}
 
 	if( type > 0 && type <= 5 )
-		snprintf(action,25,"%s",msg_txt(427+type)); //block|ban|unblock|unban|change the sex of
+		snprintf(action,25,"%s",msg_txt(sd,427+type)); //block|ban|unblock|unban|change the sex of
 	else
 		snprintf(action,25,"???");
 
 	switch( answer ) {
-		case 0 : sprintf(output, msg_txt(424), action, NAME_LENGTH, player_name); break;
-		case 1 : sprintf(output, msg_txt(425), NAME_LENGTH, player_name); break;
-		case 2 : sprintf(output, msg_txt(426), action, NAME_LENGTH, player_name); break;
-		case 3 : sprintf(output, msg_txt(427), action, NAME_LENGTH, player_name); break;
+		case 0 : sprintf(output, msg_txt(sd,424), action, NAME_LENGTH, player_name); break;
+		case 1 : sprintf(output, msg_txt(sd,425), NAME_LENGTH, player_name); break;
+		case 2 : sprintf(output, msg_txt(sd,426), action, NAME_LENGTH, player_name); break;
+		case 3 : sprintf(output, msg_txt(sd,427), action, NAME_LENGTH, player_name); break;
 		default: output[0] = '\0'; break;
 	}
 
@@ -907,7 +907,7 @@ int chrif_changedsex(int fd) {
 		// save character
 		sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
 							  // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it)
-		clif_displaymessage(sd->fd, msg_txt(409)); //"Your sex has been changed (need disconnection by the server)..."
+		clif_displaymessage(sd->fd, msg_txt(sd,409)); //"Your sex has been changed (need disconnection by the server)..."
 		set_eof(sd->fd); // forced to disconnect for the change
 		map_quit(sd); // Remove leftovers (e.g. autotrading) [Paradox924X]
 	}
@@ -1001,18 +1001,18 @@ int chrif_accountban(int fd) {
 
 	sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
 	if (RFIFOB(fd,6) == 0) { // 0: change of statut, 1: ban
-                int ret_status = RFIFOL(fd,7); // status or final date of a banishment
-                if(0<ret_status && ret_status<=9)
-                    clif_displaymessage(sd->fd, msg_txt(411+ret_status));
-                else if(ret_status==100)
-                    clif_displaymessage(sd->fd, msg_txt(421));
-                else
-                    clif_displaymessage(sd->fd, msg_txt(420)); //"Your account has not more authorised."
+		int ret_status = RFIFOL(fd,7); // status or final date of a banishment
+		if(0<ret_status && ret_status<=9)
+			clif_displaymessage(sd->fd, msg_txt(sd,411+ret_status));
+		else if(ret_status==100)
+			clif_displaymessage(sd->fd, msg_txt(sd,421));
+		 else
+			clif_displaymessage(sd->fd, msg_txt(sd,420)); //"Your account has not more authorised."
 	} else if (RFIFOB(fd,6) == 1) { // 0: change of statut, 1: ban
 		time_t timestamp;
 		char tmpstr[2048];
 		timestamp = (time_t)RFIFOL(fd,7); // status or final date of a banishment
-		strcpy(tmpstr, msg_txt(423)); //"Your account has been banished until "
+		strcpy(tmpstr, msg_txt(sd,423)); //"Your account has been banished until "
 		strftime(tmpstr + strlen(tmpstr), 24, "%d-%m-%Y %H:%M:%S", localtime(&timestamp));
 		clif_displaymessage(sd->fd, tmpstr);
 	}

+ 35 - 35
src/map/clif.c

@@ -5572,7 +5572,7 @@ void clif_chsys_mjoin(struct map_session_data *sd) {
 
 	if( !( map[sd->bl.m].channel->opt & raChSys_OPT_ANNOUNCE_JOIN ) ) {
 		char mout[60];
-		sprintf(mout, msg_txt(1435),raChSys.local_name,map[sd->bl.m].name); // You're now in the '#%s' channel for '%s'.
+		sprintf(mout, msg_txt(sd,1435),raChSys.local_name,map[sd->bl.m].name); // You're now in the '#%s' channel for '%s'.
 		clif_disp_onlyself(sd, mout, strlen(mout));
 	}
 }
@@ -6655,7 +6655,7 @@ void clif_party_inviteack(struct map_session_data* sd, const char* nick, int res
 
 #if PACKETVER < 20070904
 	if( result == 7 ) {
-		clif_displaymessage(fd, msg_txt(3));
+		clif_displaymessage(fd, msg_txt(sd,3));
 		return;
 	}
 #endif
@@ -6962,7 +6962,7 @@ void clif_sendegg(struct map_session_data *sd)
 
 	fd=sd->fd;
 	if (battle_config.pet_no_gvg && map_flag_gvg(sd->bl.m)) { //Disable pet hatching in GvG grounds during Guild Wars [Skotlex]
-		clif_displaymessage(fd, msg_txt(666));
+		clif_displaymessage(fd, msg_txt(sd,666));
 		return;
 	}
 	WFIFOHEAD(fd, MAX_INVENTORY * 2 + 4);
@@ -7465,7 +7465,7 @@ void clif_guild_basicinfo(struct map_session_data *sd) {
 	memcpy(WFIFOP(fd,46),g->name, NAME_LENGTH);
 	memcpy(WFIFOP(fd,70),g->master, NAME_LENGTH);
 
-	safestrncpy((char*)WFIFOP(fd,94),msg_txt(300+guild_checkcastles(g)),16); // "'N' castles"
+	safestrncpy((char*)WFIFOP(fd,94),msg_txt(sd,300+guild_checkcastles(g)),16); // "'N' castles"
 	WFIFOL(fd,110) = 0;  // zeny
 
 	WFIFOSET(fd,packet_len(0x1b6));
@@ -9415,7 +9415,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 	// pet
 	if( sd->pd ) {
 		if( battle_config.pet_no_gvg && map_flag_gvg(sd->bl.m) ) { //Return the pet to egg. [Skotlex]
-			clif_displaymessage(sd->fd, msg_txt(666));
+			clif_displaymessage(sd->fd, msg_txt(sd,666));
 			pet_menu(sd, 3); //Option 3 is return to egg.
 		} else {
 			map_addblock(&sd->pd->bl);
@@ -10280,7 +10280,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd)
 				clif_chsys_join(channel,sd);
 				clif_chsys_send(channel,sd,message);
 			} else {
-				clif_displaymessage(fd, msg_txt(1402)); //You're not in that channel, type '@join <#channel_name>'
+				clif_displaymessage(fd, msg_txt(sd,1402)); //You're not in that channel, type '@join <#channel_name>'
 			}
 			return;
 		}
@@ -10739,16 +10739,16 @@ void clif_parse_ChatLeave(int fd, struct map_session_data* sd)
 //Handles notifying asker and rejecter of what has just ocurred.
 //Type is used to determine the correct msg_txt to use:
 //0:
-static void clif_noask_sub(struct map_session_data *src, struct map_session_data *target, int type)
+static void clif_noask_sub(struct map_session_data *sd, struct map_session_data *tsd, int type)
 {
 	const char* msg;
 	char output[256];
 	// Your request has been rejected by autoreject option.
-	msg = msg_txt(392);
-	clif_disp_onlyself(src, msg, strlen(msg));
+	msg = msg_txt(sd,392);
+	clif_disp_onlyself(sd, msg, strlen(msg));
 	//Notice that a request was rejected.
-	snprintf(output, 256, msg_txt(393+type), src->status.name, 256);
-	clif_disp_onlyself(target, output, strlen(output));
+	snprintf(output, 256, msg_txt(tsd,393+type), sd->status.name, 256);
+	clif_disp_onlyself(tsd, output, strlen(output));
 }
 
 
@@ -11715,7 +11715,7 @@ void clif_parse_CreateParty(int fd, struct map_session_data *sd)
 	name[NAME_LENGTH-1] = '\0';
 
 	if( map[sd->bl.m].flag.partylock ) {// Party locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 	if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 7 ) {
@@ -11734,7 +11734,7 @@ void clif_parse_CreateParty2(int fd, struct map_session_data *sd)
 	name[NAME_LENGTH-1] = '\0';
 
 	if( map[sd->bl.m].flag.partylock ) {// Party locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 	if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 7 ) {
@@ -11754,7 +11754,7 @@ void clif_parse_PartyInvite(int fd, struct map_session_data *sd)
 	struct map_session_data *t_sd;
 
 	if(map[sd->bl.m].flag.partylock) {// Party locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 
@@ -11775,7 +11775,7 @@ void clif_parse_PartyInvite2(int fd, struct map_session_data *sd)
 	name[NAME_LENGTH-1] = '\0';
 
 	if(map[sd->bl.m].flag.partylock) {// Party locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 
@@ -11812,7 +11812,7 @@ void clif_parse_ReplyPartyInvite2(int fd,struct map_session_data *sd)
 void clif_parse_LeaveParty(int fd, struct map_session_data *sd)
 {
 	if(map[sd->bl.m].flag.partylock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 	party_leave(sd);
@@ -11824,7 +11824,7 @@ void clif_parse_LeaveParty(int fd, struct map_session_data *sd)
 void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd)
 {
 	if(map[sd->bl.m].flag.partylock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(227));
+		clif_displaymessage(fd, msg_txt(sd,227));
 		return;
 	}
 	party_removemember(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6));
@@ -12145,11 +12145,11 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd)
 	if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM )
 		return;
 	if( map[sd->bl.m].flag.novending ) {
-		clif_displaymessage (sd->fd, msg_txt(276)); // "You can't open a shop on this map"
+		clif_displaymessage (sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map"
 		return;
 	}
 	if( map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) {
-		clif_displaymessage (sd->fd, msg_txt(204)); // "You can't open a shop on this cell."
+		clif_displaymessage (sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell."
 		return;
 	}
 
@@ -12168,7 +12168,7 @@ void clif_parse_CreateGuild(int fd,struct map_session_data *sd)
 	name[NAME_LENGTH-1] = '\0';
 
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 
@@ -12333,7 +12333,7 @@ void clif_parse_GuildInvite(int fd,struct map_session_data *sd)
 	struct map_session_data *t_sd;
 
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 
@@ -12365,11 +12365,11 @@ void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd)
 void clif_parse_GuildLeave(int fd,struct map_session_data *sd)
 {
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 	if( sd->bg_id ) {
-		clif_displaymessage(fd, msg_txt(670)); //"You can't leave battleground guilds."
+		clif_displaymessage(fd, msg_txt(sd,670)); //"You can't leave battleground guilds."
 		return;
 	}
 
@@ -12383,7 +12383,7 @@ void clif_parse_GuildExpulsion(int fd,struct map_session_data *sd)
 {
 	if( map[sd->bl.m].flag.guildlock || sd->bg_id )
 	{ // Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 	guild_expulsion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14));
@@ -12437,7 +12437,7 @@ void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd)
 		return;
 
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 
@@ -12475,7 +12475,7 @@ void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd)
 		return;
 
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 	guild_delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
@@ -12492,7 +12492,7 @@ void clif_parse_GuildOpposition(int fd, struct map_session_data *sd)
 		return;
 
 	if(map[sd->bl.m].flag.guildlock) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 
@@ -12516,7 +12516,7 @@ void clif_parse_GuildOpposition(int fd, struct map_session_data *sd)
 void clif_parse_GuildBreak(int fd, struct map_session_data *sd)
 {
 	if( map[sd->bl.m].flag.guildlock ) { //Guild locked.
-		clif_displaymessage(fd, msg_txt(228));
+		clif_displaymessage(fd, msg_txt(sd,228));
 		return;
 	}
 	guild_break(sd,(char*)RFIFOP(fd,2));
@@ -13162,7 +13162,7 @@ void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd)
 
 	// Friend doesn't exist (no player with this name)
 	if (f_sd == NULL) {
-		clif_displaymessage(fd, msg_txt(3));
+		clif_displaymessage(fd, msg_txt(sd,3));
 		return;
 	}
 
@@ -13179,7 +13179,7 @@ void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd)
 	// Friend already exists
 	for (i = 0; i < MAX_FRIENDS && sd->status.friends[i].char_id != 0; i++) {
 		if (sd->status.friends[i].char_id == f_sd->status.char_id) {
-			clif_displaymessage(fd, msg_txt(671)); //"Friend already exists."
+			clif_displaymessage(fd, msg_txt(sd,671)); //"Friend already exists."
 			return;
 		}
 	}
@@ -13275,7 +13275,7 @@ void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd)
 		(sd->status.friends[i].char_id != char_id || sd->status.friends[i].account_id != account_id); i++);
 
 	if (i == MAX_FRIENDS) {
-		clif_displaymessage(fd, msg_txt(672)); //"Name not found in list."
+		clif_displaymessage(fd, msg_txt(sd,672)); //"Name not found in list."
 		return;
 	}
 
@@ -13300,7 +13300,7 @@ void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd)
 
 	} else { //friend not online -- ask char server to delete from his friendlist
 		if(chrif_removefriend(char_id,sd->status.char_id)) { // char-server offline, abort
-			clif_displaymessage(fd, msg_txt(673)); //"This action can't be performed at the moment. Please try again later."
+			clif_displaymessage(fd, msg_txt(sd,673)); //"This action can't be performed at the moment. Please try again later."
 			return;
 		}
 	}
@@ -13313,7 +13313,7 @@ void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd)
 		memcpy(&sd->status.friends[j-1], &sd->status.friends[j], sizeof(sd->status.friends[0]));
 
 	memset(&sd->status.friends[MAX_FRIENDS-1], 0, sizeof(sd->status.friends[MAX_FRIENDS-1]));
-	clif_displaymessage(fd, msg_txt(674)); //"Friend removed"
+	clif_displaymessage(fd, msg_txt(sd,674)); //"Friend removed"
 
 	WFIFOHEAD(fd,packet_len(0x20a));
 	WFIFOW(fd,0) = 0x20a;
@@ -14153,7 +14153,7 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd)
 	}
 
 	if( DIFF_TICK(sd->cansendmail_tick, gettick()) > 0 ) {
-		clif_displaymessage(sd->fd,msg_txt(675)); //"Cannot send mails too fast!!."
+		clif_displaymessage(sd->fd,msg_txt(sd,675)); //"Cannot send mails too fast!!."
 		clif_Mail_send(fd, true); // fail
 		return;
 	}
@@ -14473,7 +14473,7 @@ void clif_parse_Auction_bid(int fd, struct map_session_data *sd)
 	int bid = RFIFOL(fd,6);
 
 	if( !pc_can_give_items(sd) ) { //They aren't supposed to give zeny [Inkfish]
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		return;
 	}
 

+ 28 - 28
src/map/duel.c

@@ -23,10 +23,10 @@ void duel_savetime(struct map_session_data* sd)
 {
 	time_t timer;
 	struct tm *t;
-	
+
 	time(&timer);
 	t = localtime(&timer);
-	
+
 	pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min);
 }
 
@@ -35,12 +35,12 @@ int duel_checktime(struct map_session_data* sd)
 	int diff;
 	time_t timer;
 	struct tm *t;
-	
+
 	time(&timer);
     t = localtime(&timer);
-	
+
 	diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME");
-	
+
 	return !(diff >= 0 && diff < battle_config.duel_time_interval);
 }
 static int duel_showinfo_sub(struct map_session_data* sd, va_list va)
@@ -50,7 +50,7 @@ static int duel_showinfo_sub(struct map_session_data* sd, va_list va)
 	char output[256];
 
 	if (sd->duel_group != ssd->duel_group) return 0;
-	
+
 	sprintf(output, "      %d. %s", ++(*p), sd->status.name);
 	clif_disp_onlyself(ssd, output, strlen(output));
 	return 1;
@@ -62,13 +62,13 @@ void duel_showinfo(const unsigned int did, struct map_session_data* sd)
 	char output[256];
 
 	if(duel_list[did].max_players_limit > 0)
-		sprintf(output, msg_txt(370), //" -- Duels: %d/%d, Members: %d/%d, Max players: %d --"
+		sprintf(output, msg_txt(sd,370), //" -- Duels: %d/%d, Members: %d/%d, Max players: %d --"
 			did, duel_count,
 			duel_list[did].members_count,
 			duel_list[did].members_count + duel_list[did].invites_count,
 			duel_list[did].max_players_limit);
 	else
-		sprintf(output, msg_txt(371), //" -- Duels: %d/%d, Members: %d/%d --"
+		sprintf(output, msg_txt(sd,371), //" -- Duels: %d/%d, Members: %d/%d --"
 			did, duel_count,
 			duel_list[did].members_count,
 			duel_list[did].members_count + duel_list[did].invites_count);
@@ -81,19 +81,19 @@ int duel_create(struct map_session_data* sd, const unsigned int maxpl)
 {
 	int i=1;
 	char output[256];
-	
+
 	while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++;
 	if(i == MAX_DUEL) return 0;
-	
+
 	duel_count++;
 	sd->duel_group = i;
 	duel_list[i].members_count++;
 	duel_list[i].invites_count = 0;
 	duel_list[i].max_players_limit = maxpl;
-	
-	strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --"
+
+	strcpy(output, msg_txt(sd,372)); // " -- Duel has been created (@invite/@leave) --"
 	clif_disp_onlyself(sd, output, strlen(output));
-	
+
 	clif_map_property(sd, MAPPROPERTY_FREEPVPZONE);
 	//clif_misceffect2(&sd->bl, 159);
 	return i;
@@ -104,14 +104,14 @@ void duel_invite(const unsigned int did, struct map_session_data* sd, struct map
 	char output[256];
 
 	// " -- Player %s invites %s to duel --"
-	sprintf(output, msg_txt(373), sd->status.name, target_sd->status.name);
+	sprintf(output, msg_txt(sd,373), sd->status.name, target_sd->status.name);
 	clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS);
 
 	target_sd->duel_invite = did;
 	duel_list[did].invites_count++;
-	
+
 	// "Blue -- Player %s invites you to PVP duel (@accept/@reject) --"
-	sprintf(output, msg_txt(374), sd->status.name);
+	sprintf(output, msg_txt(sd,374), sd->status.name);
 	clif_broadcast((struct block_list *)target_sd, output, strlen(output)+1, 0x10, SELF);
 }
 
@@ -126,18 +126,18 @@ static int duel_leave_sub(struct map_session_data* sd, va_list va)
 void duel_leave(const unsigned int did, struct map_session_data* sd)
 {
 	char output[256];
-	
+
 	// " <- Player %s has left duel --"
-	sprintf(output, msg_txt(375), sd->status.name);
+	sprintf(output, msg_txt(sd,375), sd->status.name);
 	clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS);
-	
+
 	duel_list[did].members_count--;
-	
+
 	if(duel_list[did].members_count == 0) {
-		map_foreachpc(duel_leave_sub, did); 
+		map_foreachpc(duel_leave_sub, did);
 		duel_count--;
 	}
-	
+
 	sd->duel_group = 0;
 	duel_savetime(sd);
 	clif_map_property(sd, MAPPROPERTY_NOTHING);
@@ -146,14 +146,14 @@ void duel_leave(const unsigned int did, struct map_session_data* sd)
 void duel_accept(const unsigned int did, struct map_session_data* sd)
 {
 	char output[256];
-	
+
 	duel_list[did].members_count++;
 	sd->duel_group = sd->duel_invite;
 	duel_list[did].invites_count--;
 	sd->duel_invite = 0;
-	
+
 	// " -> Player %s has accepted duel --"
-	sprintf(output, msg_txt(376), sd->status.name);
+	sprintf(output, msg_txt(sd,376), sd->status.name);
 	clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS);
 
 	clif_map_property(sd, MAPPROPERTY_FREEPVPZONE);
@@ -163,11 +163,11 @@ void duel_accept(const unsigned int did, struct map_session_data* sd)
 void duel_reject(const unsigned int did, struct map_session_data* sd)
 {
 	char output[256];
-	
+
 	// " -- Player %s has rejected duel --"
-	sprintf(output, msg_txt(377), sd->status.name);
+	sprintf(output, msg_txt(sd,377), sd->status.name);
 	clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS);
-	
+
 	duel_list[did].invites_count--;
 	sd->duel_invite = 0;
 }

+ 4 - 4
src/map/guild.c

@@ -1427,7 +1427,7 @@ int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd)
 	int i;
 
 	if(agit_flag || agit2_flag)	{	// Disable alliance creation during woe [Valaris]
-		clif_displaymessage(sd->fd,msg_txt(676)); //"Alliances cannot be made during Guild Wars!"
+		clif_displaymessage(sd->fd,msg_txt(sd,676)); //"Alliances cannot be made during Guild Wars!"
 		return 0;
 	}	// end addition [Valaris]
 
@@ -1545,7 +1545,7 @@ int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
 	nullpo_ret(sd);
 
 	if(agit_flag || agit2_flag)	{	// Disable alliance breaking during woe [Valaris]
-		clif_displaymessage(sd->fd,msg_txt(677)); //"Alliances cannot be broken during Guild Wars!"
+		clif_displaymessage(sd->fd,msg_txt(sd,677)); //"Alliances cannot be broken during Guild Wars!"
 		return 0;
 	}	// end addition [Valaris]
 
@@ -1807,12 +1807,12 @@ int guild_gm_changed(int guild_id, int account_id, int char_id)
 	strcpy(g->master, g->member[0].name);
 
 	if (g->member[pos].sd && g->member[pos].sd->fd) {
-		clif_displaymessage(g->member[pos].sd->fd, msg_txt(678)); //"You no longer are the Guild Master."
+		clif_displaymessage(g->member[pos].sd->fd, msg_txt(g->member[pos].sd,678)); //"You no longer are the Guild Master."
 		g->member[pos].sd->state.gmaster_flag = 0;
 	}
 
 	if (g->member[0].sd && g->member[0].sd->fd) {
-		clif_displaymessage(g->member[0].sd->fd, msg_txt(679)); //"You have become the Guild Master!"
+		clif_displaymessage(g->member[0].sd->fd, msg_txt(g->member[pos].sd,679)); //"You have become the Guild Master!"
 		g->member[0].sd->state.gmaster_flag = g;
 		//Block his skills for 5 minutes to prevent abuse.
 		guild_block_skill(g->member[0].sd, 300000);

+ 1 - 1
src/map/homunculus.c

@@ -707,7 +707,7 @@ int merc_hom_change_name_ack(struct map_session_data *sd, char* name, int flag)
 	normalize_name(name," ");//bugreport:3032
 
 	if ( !flag || !strlen(name) ) {
-		clif_displaymessage(sd->fd, msg_txt(280)); // You cannot use this name
+		clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name
 		return 0;
 	}
 	safestrncpy(hd->homunculus.name,name,NAME_LENGTH);

+ 2 - 2
src/map/intif.c

@@ -201,7 +201,7 @@ int intif_main_message(struct map_session_data* sd, const char* message)
 	nullpo_ret(sd);
 
 	// format the message for main broadcasting
-	snprintf( output, sizeof(output), msg_txt(386), sd->status.name, message );
+	snprintf( output, sizeof(output), msg_txt(sd,386), sd->status.name, message );
 
 	// send the message using the inter-server broadcast service
 	intif_broadcast2( output, strlen(output) + 1, 0xFE000000, 0, 0, 0, 0 );
@@ -1524,7 +1524,7 @@ int intif_parse_Mail_inboxreceived(int fd)
 	else if( battle_config.mail_show_status && ( battle_config.mail_show_status == 1 || sd->mail.inbox.unread ) )
 	{
 		char output[128];
-		sprintf(output, msg_txt(510), sd->mail.inbox.unchecked, sd->mail.inbox.unread + sd->mail.inbox.unchecked);
+		sprintf(output, msg_txt(sd,510), sd->mail.inbox.unchecked, sd->mail.inbox.unread + sd->mail.inbox.unchecked);
 		clif_disp_onlyself(sd, output, strlen(output));
 	}
 	return 0;

+ 89 - 14
src/map/map.c

@@ -94,6 +94,7 @@ static DBMap* map_db=NULL; // unsigned int mapindex -> struct map_data*
 static DBMap* nick_db=NULL; // int char_id -> struct charid2nick* (requested names of offline characters)
 static DBMap* charid_db=NULL; // int char_id -> struct map_session_data*
 static DBMap* regen_db=NULL; // int id -> struct block_list* (status_natural_heal processing)
+static DBMap* map_msg_db=NULL;
 
 static int map_users=0;
 
@@ -107,7 +108,6 @@ static struct block_list *bl_list[BL_LIST_MAX];
 static int bl_list_count = 0;
 
 #define MAP_MAX_MSG 1500
-static char* msg_table[MAP_MAX_MSG]; // map Server messages
 
 struct map_data map[MAX_MAP_PER_SERVER];
 int map_num = 0;
@@ -1699,7 +1699,7 @@ int map_quit(struct map_session_data *sd) {
 		elemental_clean_effect(sd->ed);
 		unit_remove_map(&sd->ed->bl,CLR_TELEPORT);
 	}
-	
+
 	unit_remove_map_pc(sd,CLR_TELEPORT);
 
 	if( map[sd->bl.m].instance_id ) { // Avoid map conflicts and warnings on next login
@@ -3697,6 +3697,81 @@ void set_server_type(void)
 	SERVER_TYPE = ATHENA_SERVER_MAP;
 }
 
+//Msg System
+struct msg_data {
+	char* msg[MAP_MAX_MSG];
+};
+struct msg_data *map_lang2msgdb(uint8 lang){
+	return (struct msg_data*)idb_get(map_msg_db, lang);
+}
+
+void map_do_init_msg(void){
+	map_msg_db = idb_alloc(DB_OPT_BASE);
+
+	msg_config_read(MSG_CONF_NAME_EN,0); // English (default)
+	if( LANG_ENABLE&LANG_RUS )
+		msg_config_read(MSG_CONF_NAME_RUS,1);	// Russian
+	if( LANG_ENABLE&LANG_SPN )
+		msg_config_read(MSG_CONF_NAME_SPN,2);	// Spanish
+	if( LANG_ENABLE&LANG_GRM )
+		msg_config_read(MSG_CONF_NAME_GRM,3);	// German
+	if( LANG_ENABLE&LANG_CHN )
+		msg_config_read(MSG_CONF_NAME_CHN,4);	// Chinese
+	if( LANG_ENABLE&LANG_MAL )
+		msg_config_read(MSG_CONF_NAME_MAL,5);	// Malaysian
+	if( LANG_ENABLE&LANG_IND )
+		msg_config_read(MSG_CONF_NAME_IND,6);	// Indonesian
+	if( LANG_ENABLE&LANG_FRN )
+		msg_config_read(MSG_CONF_NAME_FRN,7);	// French
+}
+void map_do_final_msg(void){
+	DBIterator *iter = db_iterator(map_msg_db);
+	struct msg_data *mdb;
+
+	for (mdb = dbi_first(iter); dbi_exists(iter); mdb = dbi_next(iter)) {
+		_do_final_msg(MAP_MAX_MSG,mdb->msg);
+		aFree(mdb);
+	}
+	dbi_destroy(iter);
+	map_msg_db->destroy(map_msg_db, NULL);
+}
+void map_msg_reload(void){
+	map_do_final_msg(); //clear data
+	map_do_init_msg();
+}
+int map_msg_config_read(char *cfgName, int lang){
+	struct msg_data *mdb;
+
+	if( (mdb = map_lang2msgdb(lang)) == NULL )
+		CREATE(mdb, struct msg_data, 1);
+	else
+		idb_remove(map_msg_db, lang);
+	idb_put(map_msg_db, lang, mdb);
+
+	if(_msg_config_read(cfgName,MAP_MAX_MSG,mdb->msg)!=0){ //an error occur
+		idb_remove(map_msg_db, lang); //@TRYME
+		aFree(mdb);
+	}
+	return 0;
+}
+const char* map_msg_txt(struct map_session_data *sd, int msg_number){
+	struct msg_data *mdb;
+	uint8 lang = 0; //default
+	const char *tmp; //to verify result
+	if(sd && sd->langtype) lang = sd->langtype;
+
+	if( (mdb = map_lang2msgdb(lang)) != NULL){
+		tmp = _msg_txt(msg_number,MAP_MAX_MSG,mdb->msg);
+		if(strcmp(tmp,"??"))
+			return tmp;
+		ShowDebug("msgnmber %d not found for langtype=%d, trying fallback2\n",lang);
+	}
+	ShowDebug("langtype=%d choosed not loaded, trying fallback\n",lang);
+	if(lang != 0 && (mdb = map_lang2msgdb(0)) != NULL) //fallback
+		return _msg_txt(msg_number,MAP_MAX_MSG,mdb->msg);
+	return "??";
+}
+
 
 /// Called when a terminate signal is received.
 void do_shutdown(void)
@@ -3729,9 +3804,19 @@ int do_init(int argc, char *argv[])
 	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_conf/map_msg.conf";
 	GRF_PATH_FILENAME = "conf/grf-files.txt";
 
+	/* Multilanguage */
+	MSG_CONF_NAME_EN = "conf/msg_conf/map_msg.conf"; 			// English (default)
+	MSG_CONF_NAME_RUS = "conf/msg_conf/map_msg_rus.conf";	// Russian
+	MSG_CONF_NAME_SPN = "conf/msg_conf/map_msg_spn.conf";	// Spanish
+	MSG_CONF_NAME_GRM = "conf/msg_conf/map_msg_grm.conf";	// German
+	MSG_CONF_NAME_CHN = "conf/msg_conf/map_msg_chn.conf";	// Chinese
+	MSG_CONF_NAME_MAL = "conf/msg_conf/map_msg_mal.conf";	// Malaysian
+	MSG_CONF_NAME_IND = "conf/msg_conf/map_msg_ind.conf";	// Indonesian
+	MSG_CONF_NAME_FRN = "conf/msg_conf/map_msg_frn.conf";	// French
+	/* Multilanguage */
+
 	cli_get_options(argc,argv);
 
 	rnd_init();
@@ -3762,7 +3847,6 @@ int do_init(int argc, char *argv[])
 	}
 
 	battle_config_read(BATTLE_CONF_FILENAME);
-	msg_config_read(MSG_CONF_NAME);
 	script_config_read(SCRIPT_CONF_NAME);
 	inter_config_read(INTER_CONF_NAME);
 	log_config_read(LOG_CONF_NAME);
@@ -3775,7 +3859,6 @@ int do_init(int argc, char *argv[])
 	nick_db = idb_alloc(DB_OPT_BASE);
 	charid_db = idb_alloc(DB_OPT_BASE);
 	regen_db = idb_alloc(DB_OPT_BASE); // efficient status_natural_heal processing
-
 	iwall_db = strdb_alloc(DB_OPT_RELEASE_DATA,2*NAME_LENGTH+2+1); // [Zephyrus] Invisible Walls
 
 	map_sql_init();
@@ -3793,6 +3876,7 @@ int do_init(int argc, char *argv[])
 	add_timer_func_list(map_removemobs_timer, "map_removemobs_timer");
 	add_timer_interval(gettick()+1000, map_freeblock_timer, 0, 0, 60*1000);
 
+	map_do_init_msg();
 	do_init_atcommand();
 	do_init_battle();
 	do_init_instance();
@@ -3843,12 +3927,3 @@ int do_init(int argc, char *argv[])
 	return 0;
 }
 
-int map_msg_config_read(char *cfgName){
-	return _msg_config_read(cfgName,MAP_MAX_MSG,msg_table);
-}
-const char* map_msg_txt(int msg_number){
-	return _msg_txt(msg_number,MAP_MAX_MSG,msg_table);
-}
-void map_do_final_msg(void){
-	_do_final_msg(MAP_MAX_MSG,msg_table);
-}

+ 15 - 5
src/map/map.h

@@ -25,12 +25,13 @@ enum E_MAPSERVER_ST {
 	MAPSERVER_ST_LAST
 };
 
-#define msg_config_read(cfgName) map_msg_config_read(cfgName)
-#define msg_txt(msg_number) map_msg_txt(msg_number)
+#define msg_config_read(cfgName,isnew) map_msg_config_read(cfgName,isnew)
+#define msg_txt(sd,msg_number) map_msg_txt(sd,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);
+int map_msg_config_read(char *cfgName,int lang);
+const char* map_msg_txt(struct map_session_data *sd,int msg_number);
 void map_do_final_msg(void);
+void map_msg_reload(void);
 
 #define MAX_NPC_PER_MAP 512
 #define AREA_SIZE battle_config.area_size
@@ -747,14 +748,23 @@ void do_reconnect_map(void); //Invoked on map-char reconnection [Skotlex]
 void map_addmap2db(struct map_data *m);
 void map_removemapdb(struct map_data *m);
 
+//option readed in cli
 extern char *INTER_CONF_NAME;
 extern char *LOG_CONF_NAME;
 extern char *MAP_CONF_NAME;
 extern char *BATTLE_CONF_FILENAME;
 extern char *ATCOMMAND_CONF_FILENAME;
 extern char *SCRIPT_CONF_NAME;
-extern char *MSG_CONF_NAME;
+extern char *MSG_CONF_NAME_EN;
 extern char *GRF_PATH_FILENAME;
+//other lang supported
+char *MSG_CONF_NAME_RUS;
+char *MSG_CONF_NAME_GRM;
+char *MSG_CONF_NAME_CHN;
+char *MSG_CONF_NAME_MAL;
+char *MSG_CONF_NAME_IND;
+char *MSG_CONF_NAME_FRN;
+char *MSG_CONF_NAME_SPN;
 
 //Useful typedefs from jA [Skotlex]
 typedef struct map_session_data TBL_PC;

+ 4 - 4
src/map/mob.c

@@ -136,13 +136,13 @@ void mvptomb_create(struct mob_data *md, char *killer, time_t time)
 
 	nd->bl.id = md->tomb_nid = npc_get_new_npc_id();
 
-    nd->ud.dir = md->ud.dir;
+	nd->ud.dir = md->ud.dir;
 	nd->bl.m = md->bl.m;
 	nd->bl.x = md->bl.x;
 	nd->bl.y = md->bl.y;
 	nd->bl.type = BL_NPC;
 
-	safestrncpy(nd->name, msg_txt(656), sizeof(nd->name));
+	safestrncpy(nd->name, msg_txt(NULL,656), sizeof(nd->name));
 
 	nd->class_ = 565;
 	nd->speed = 200;
@@ -2390,7 +2390,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 			//A Rare Drop Global Announce by Lupus
 			if( mvp_sd && drop_rate <= battle_config.rare_drop_announce ) {
 				char message[128];
-				sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, it->jname, (float)drop_rate/100);
+				sprintf (message, msg_txt(NULL,541), mvp_sd->status.name, md->name, it->jname, (float)drop_rate/100);
 				//MSG: "'%s' won %s's %s (chance: %0.02f%%)"
 				intif_broadcast(message,strlen(message)+1,0);
 			}
@@ -2529,7 +2529,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 					struct item_data *i_data;
 					char message[128];
 					i_data = itemdb_exists(item.nameid);
-					sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, i_data->jname, temp/100.);
+					sprintf (message, msg_txt(NULL,541), mvp_sd->status.name, md->name, i_data->jname, temp/100.);
 					//MSG: "'%s' won %s's %s (chance: %0.02f%%)"
 					intif_broadcast(message,strlen(message)+1,0);
 				}

+ 11 - 11
src/map/npc.c

@@ -1155,25 +1155,25 @@ int npc_globalmessage(const char* name, const char* mes)
 void run_tomb(struct map_session_data* sd, struct npc_data* nd)
 {
 	char buffer[200];
-    char time[10];
+	char time[10];
 
-    strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time));
+	strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time));
 
 	// TODO: Find exact color?
-	snprintf(buffer, sizeof(buffer), msg_txt(657), nd->u.tomb.md->db->name);
-    clif_scriptmes(sd, nd->bl.id, buffer);
+	snprintf(buffer, sizeof(buffer), msg_txt(sd,657), nd->u.tomb.md->db->name);
+	clif_scriptmes(sd, nd->bl.id, buffer);
 
-    clif_scriptmes(sd, nd->bl.id, msg_txt(658));
+	clif_scriptmes(sd, nd->bl.id, msg_txt(sd,658));
 
-    snprintf(buffer, sizeof(buffer), msg_txt(659), time);
-    clif_scriptmes(sd, nd->bl.id, buffer);
+	snprintf(buffer, sizeof(buffer), msg_txt(sd,659), time);
+	clif_scriptmes(sd, nd->bl.id, buffer);
 
-    clif_scriptmes(sd, nd->bl.id, msg_txt(660));
+	clif_scriptmes(sd, nd->bl.id, msg_txt(sd,660));
 
-	snprintf(buffer, sizeof(buffer), msg_txt(661), nd->u.tomb.killer_name[0] ? nd->u.tomb.killer_name : "Unknown");
-    clif_scriptmes(sd, nd->bl.id, buffer);
+	snprintf(buffer, sizeof(buffer), msg_txt(sd,661), nd->u.tomb.killer_name[0] ? nd->u.tomb.killer_name : "Unknown");
+	clif_scriptmes(sd, nd->bl.id, buffer);
 
-    clif_scriptclose(sd, nd->bl.id);
+	clif_scriptclose(sd, nd->bl.id);
 }
 
 /*==========================================

+ 7 - 7
src/map/party.c

@@ -345,7 +345,7 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
 	ARR_FIND(0, MAX_PARTY, i, p->data[i].sd == sd);
 
 	if( i == MAX_PARTY || !p->party.member[i].leader ) {
-		clif_displaymessage(sd->fd, msg_txt(282));
+		clif_displaymessage(sd->fd, msg_txt(sd,282));
 		return 0;
 	}
 
@@ -359,7 +359,7 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
 
 	// confirm whether the account has the ability to invite before checking the player
 	if( !pc_has_permission(sd, PC_PERM_PARTY) || (tsd && !pc_has_permission(tsd, PC_PERM_PARTY)) ) {
-		clif_displaymessage(sd->fd, msg_txt(81)); // "Your GM level doesn't authorize you to preform this action on the specified player."
+		clif_displaymessage(sd->fd, msg_txt(sd,81)); // "Your GM level doesn't authorize you to preform this action on the specified player."
 		return 0;
 	}
 
@@ -644,13 +644,13 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
 		return false;
 
 	if (!tsd || tsd->status.party_id != sd->status.party_id) {
-		clif_displaymessage(sd->fd, msg_txt(283));
+		clif_displaymessage(sd->fd, msg_txt(sd,283));
 		return false;
 	}
 
 	if( map[sd->bl.m].flag.partylock )
 	{
-		clif_displaymessage(sd->fd, msg_txt(287));
+		clif_displaymessage(sd->fd, msg_txt(sd,287));
 		return false;
 	}
 
@@ -663,7 +663,7 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
 
 	if (!p->party.member[mi].leader)
 	{	//Need to be a party leader.
-		clif_displaymessage(sd->fd, msg_txt(282));
+		clif_displaymessage(sd->fd, msg_txt(sd,282));
 		return false;
 	}
 
@@ -674,11 +674,11 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
 	//Change leadership.
 	p->party.member[mi].leader = 0;
 	if (p->data[mi].sd->fd)
-		clif_displaymessage(p->data[mi].sd->fd, msg_txt(284));
+		clif_displaymessage(p->data[mi].sd->fd, msg_txt(sd,284));
 
 	p->party.member[tmi].leader = 1;
 	if (p->data[tmi].sd->fd)
-		clif_displaymessage(p->data[tmi].sd->fd, msg_txt(285));
+		clif_displaymessage(p->data[tmi].sd->fd, msg_txt(sd,285));
 
 	//Update info.
 	intif_party_leaderchange(p->party.party_id,p->party.member[tmi].account_id,p->party.member[tmi].char_id);

+ 55 - 52
src/map/pc.c

@@ -1075,7 +1075,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
 		// message of the limited time of the account
 		if (expiration_time != 0) { // don't display if it's unlimited or unknow value
 			char tmpstr[1024];
-			strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), localtime(&expiration_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S."
+			strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(sd,501), localtime(&expiration_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S."
 			clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
 		}
 
@@ -1146,6 +1146,9 @@ int pc_reg_received(struct map_session_data *sd)
 	sd->change_level_3rd = pc_readglobalreg(sd,"jobchange_level_3rd");
 	sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
 
+	sd->langtype = pc_readaccountreg(sd,"#langtype");
+	if(msg_checklangtype(sd->langtype,true)<0) sd->langtype=0; //invalid langtype reset to default
+
 	// Cash shop
 	sd->cashPoints = pc_readaccountreg(sd,"#CASHPOINTS");
 	sd->kafraPoints = pc_readaccountreg(sd,"#KAFRAPOINTS");
@@ -3697,7 +3700,7 @@ int pc_paycash(struct map_session_data *sd, int price, int points, e_log_pick_ty
 	if( battle_config.cashshop_show_points )
 	{
 		char output[128];
-		sprintf(output, msg_txt(504), points, cash, sd->kafraPoints, sd->cashPoints);
+		sprintf(output, msg_txt(sd,504), points, cash, sd->kafraPoints, sd->cashPoints);
 		clif_disp_onlyself(sd, output, strlen(output));
 	}
 	return cash+points;
@@ -3724,7 +3727,7 @@ int pc_getcash( struct map_session_data *sd, int cash, int points, e_log_pick_ty
 
 		if( battle_config.cashshop_show_points )
 		{
-			sprintf(output, msg_txt(505), cash, sd->cashPoints);
+			sprintf(output, msg_txt(sd,505), cash, sd->cashPoints);
 			clif_disp_onlyself(sd, output, strlen(output));
 		}
 		return cash;
@@ -3750,7 +3753,7 @@ int pc_getcash( struct map_session_data *sd, int cash, int points, e_log_pick_ty
 
 		if( battle_config.cashshop_show_points )
 		{
-			sprintf(output, msg_txt(506), points, sd->kafraPoints);
+			sprintf(output, msg_txt(sd,506), points, sd->kafraPoints);
 			clif_disp_onlyself(sd, output, strlen(output));
 		}
 		return points;
@@ -3964,13 +3967,13 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount)
 
 	if( map[sd->bl.m].flag.nodrop )
 	{
-		clif_displaymessage (sd->fd, msg_txt(271));
+		clif_displaymessage (sd->fd, msg_txt(sd,271));
 		return 0; //Can't drop items in nodrop mapflag maps.
 	}
 
 	if( !pc_candrop(sd,&sd->status.inventory[n]) )
 	{
-		clif_displaymessage (sd->fd, msg_txt(263));
+		clif_displaymessage (sd->fd, msg_txt(sd,263));
 		return 0;
 	}
 
@@ -4103,7 +4106,7 @@ int pc_isUseitem(struct map_session_data *sd,int n)
 		case 14591: // Siege Teleport Scroll
 			if( sd->duel_group && !battle_config.duel_allow_teleport )
 			{
-				clif_displaymessage(sd->fd, msg_txt(663));
+				clif_displaymessage(sd->fd, msg_txt(sd,663));
 				return 0;
 			}
 			if( nameid != 601 && nameid != 12212 && map[sd->bl.m].flag.noreturn )
@@ -4385,7 +4388,7 @@ int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amoun
 
 	if( !itemdb_cancartstore(item_data, pc_get_group_level(sd)) )
 	{ // Check item trade restrictions	[Skotlex]
-		clif_displaymessage (sd->fd, msg_txt(264));
+		clif_displaymessage (sd->fd, msg_txt(sd,264));
 		return 1;
 	}
 
@@ -4628,7 +4631,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil
 		struct item_data *i_data;
 		char message[128];
 		i_data = itemdb_search(itemid);
-		sprintf (message, msg_txt(542), (sd->status.name != NULL)?sd->status.name :"GM", md->db->jname, i_data->jname, (float)md->db->dropitem[i].p/100);
+		sprintf (message, msg_txt(sd,542), (sd->status.name != NULL)?sd->status.name :"GM", md->db->jname, i_data->jname, (float)md->db->dropitem[i].p/100);
 		//MSG: "'%s' stole %s's %s (chance: %0.02f%%)"
 		intif_broadcast(message,strlen(message)+1,0);
 	}
@@ -4747,7 +4750,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y
 			sd->regen.state.gc = 0;
 		// make sure vending is allowed here
 		if (sd->state.vending && map[m].flag.novending) {
-			clif_displaymessage (sd->fd, msg_txt(276)); // "You can't open a shop on this map"
+			clif_displaymessage (sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map"
 			vending_closevending(sd);
 		}
 
@@ -4797,7 +4800,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y
 	}
 
 	if (sd->state.vending && map_getcell(m,x,y,CELL_CHKNOVENDING)) {
-		clif_displaymessage (sd->fd, msg_txt(204)); // "You can't open a shop on this cell."
+		clif_displaymessage (sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell."
 		vending_closevending(sd);
 	}
 
@@ -5318,7 +5321,7 @@ const char* job_name(int class_)
 	case JOB_ACOLYTE:
 	case JOB_MERCHANT:
 	case JOB_THIEF:
-		return msg_txt(550 - JOB_NOVICE+class_);
+		return msg_txt(NULL,550 - JOB_NOVICE+class_);
 
 	case JOB_KNIGHT:
 	case JOB_PRIEST:
@@ -5326,10 +5329,10 @@ const char* job_name(int class_)
 	case JOB_BLACKSMITH:
 	case JOB_HUNTER:
 	case JOB_ASSASSIN:
-		return msg_txt(557 - JOB_KNIGHT+class_);
+		return msg_txt(NULL,557 - JOB_KNIGHT+class_);
 
 	case JOB_KNIGHT2:
-		return msg_txt(557);
+		return msg_txt(NULL,557);
 
 	case JOB_CRUSADER:
 	case JOB_MONK:
@@ -5338,23 +5341,23 @@ const char* job_name(int class_)
 	case JOB_ALCHEMIST:
 	case JOB_BARD:
 	case JOB_DANCER:
-		return msg_txt(563 - JOB_CRUSADER+class_);
+		return msg_txt(NULL,563 - JOB_CRUSADER+class_);
 
 	case JOB_CRUSADER2:
-		return msg_txt(563);
+		return msg_txt(NULL,563);
 
 	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(NULL,570 - JOB_WEDDING+class_);
 
 	case JOB_SUMMER:
-		return msg_txt(621);
+		return msg_txt(NULL,621);
 
 	case JOB_HANBOK:
-		return msg_txt(694);
+		return msg_txt(NULL,694);
 
 	case JOB_NOVICE_HIGH:
 	case JOB_SWORDMAN_HIGH:
@@ -5363,7 +5366,7 @@ const char* job_name(int class_)
 	case JOB_ACOLYTE_HIGH:
 	case JOB_MERCHANT_HIGH:
 	case JOB_THIEF_HIGH:
-		return msg_txt(575 - JOB_NOVICE_HIGH+class_);
+		return msg_txt(NULL,575 - JOB_NOVICE_HIGH+class_);
 
 	case JOB_LORD_KNIGHT:
 	case JOB_HIGH_PRIEST:
@@ -5371,10 +5374,10 @@ const char* job_name(int class_)
 	case JOB_WHITESMITH:
 	case JOB_SNIPER:
 	case JOB_ASSASSIN_CROSS:
-		return msg_txt(582 - JOB_LORD_KNIGHT+class_);
+		return msg_txt(NULL,582 - JOB_LORD_KNIGHT+class_);
 
 	case JOB_LORD_KNIGHT2:
-		return msg_txt(582);
+		return msg_txt(NULL,582);
 
 	case JOB_PALADIN:
 	case JOB_CHAMPION:
@@ -5383,10 +5386,10 @@ const char* job_name(int class_)
 	case JOB_CREATOR:
 	case JOB_CLOWN:
 	case JOB_GYPSY:
-		return msg_txt(588 - JOB_PALADIN + class_);
+		return msg_txt(NULL,588 - JOB_PALADIN + class_);
 
 	case JOB_PALADIN2:
-		return msg_txt(588);
+		return msg_txt(NULL,588);
 
 	case JOB_BABY:
 	case JOB_BABY_SWORDMAN:
@@ -5395,7 +5398,7 @@ const char* job_name(int class_)
 	case JOB_BABY_ACOLYTE:
 	case JOB_BABY_MERCHANT:
 	case JOB_BABY_THIEF:
-		return msg_txt(595 - JOB_BABY + class_);
+		return msg_txt(NULL,595 - JOB_BABY + class_);
 
 	case JOB_BABY_KNIGHT:
 	case JOB_BABY_PRIEST:
@@ -5403,10 +5406,10 @@ const char* job_name(int class_)
 	case JOB_BABY_BLACKSMITH:
 	case JOB_BABY_HUNTER:
 	case JOB_BABY_ASSASSIN:
-		return msg_txt(602 - JOB_BABY_KNIGHT + class_);
+		return msg_txt(NULL,602 - JOB_BABY_KNIGHT + class_);
 
 	case JOB_BABY_KNIGHT2:
-		return msg_txt(602);
+		return msg_txt(NULL,602);
 
 	case JOB_BABY_CRUSADER:
 	case JOB_BABY_MONK:
@@ -5415,26 +5418,26 @@ const char* job_name(int class_)
 	case JOB_BABY_ALCHEMIST:
 	case JOB_BABY_BARD:
 	case JOB_BABY_DANCER:
-		return msg_txt(608 - JOB_BABY_CRUSADER + class_);
+		return msg_txt(NULL,608 - JOB_BABY_CRUSADER + class_);
 
 	case JOB_BABY_CRUSADER2:
-		return msg_txt(608);
+		return msg_txt(NULL,608);
 
 	case JOB_SUPER_BABY:
-		return msg_txt(615);
+		return msg_txt(NULL,615);
 
 	case JOB_TAEKWON:
-		return msg_txt(616);
+		return msg_txt(NULL,616);
 	case JOB_STAR_GLADIATOR:
 	case JOB_STAR_GLADIATOR2:
-		return msg_txt(617);
+		return msg_txt(NULL,617);
 	case JOB_SOUL_LINKER:
-		return msg_txt(618);
+		return msg_txt(NULL,618);
 
 	case JOB_GANGSI:
 	case JOB_DEATH_KNIGHT:
 	case JOB_DARK_COLLECTOR:
-		return msg_txt(622 - JOB_GANGSI+class_);
+		return msg_txt(NULL,622 - JOB_GANGSI+class_);
 
 	case JOB_RUNE_KNIGHT:
 	case JOB_WARLOCK:
@@ -5442,7 +5445,7 @@ const char* job_name(int class_)
 	case JOB_ARCH_BISHOP:
 	case JOB_MECHANIC:
 	case JOB_GUILLOTINE_CROSS:
-		return msg_txt(625 - JOB_RUNE_KNIGHT+class_);
+		return msg_txt(NULL,625 - JOB_RUNE_KNIGHT+class_);
 
 	case JOB_RUNE_KNIGHT_T:
 	case JOB_WARLOCK_T:
@@ -5450,7 +5453,7 @@ const char* job_name(int class_)
 	case JOB_ARCH_BISHOP_T:
 	case JOB_MECHANIC_T:
 	case JOB_GUILLOTINE_CROSS_T:
-            return msg_txt(681 - JOB_RUNE_KNIGHT_T+class_);
+		return msg_txt(NULL,681 - JOB_RUNE_KNIGHT_T+class_);
 
 	case JOB_ROYAL_GUARD:
 	case JOB_SORCERER:
@@ -5459,7 +5462,7 @@ const char* job_name(int class_)
 	case JOB_SURA:
 	case JOB_GENETIC:
 	case JOB_SHADOW_CHASER:
-		return msg_txt(631 - JOB_ROYAL_GUARD+class_);
+		return msg_txt(NULL,631 - JOB_ROYAL_GUARD+class_);
 
 	case JOB_ROYAL_GUARD_T:
 	case JOB_SORCERER_T:
@@ -5468,23 +5471,23 @@ const char* job_name(int class_)
 	case JOB_SURA_T:
 	case JOB_GENETIC_T:
 	case JOB_SHADOW_CHASER_T:
-            return msg_txt(687 - JOB_ROYAL_GUARD_T+class_);
+		return msg_txt(NULL,687 - JOB_ROYAL_GUARD_T+class_);
 
 	case JOB_RUNE_KNIGHT2:
 	case JOB_RUNE_KNIGHT_T2:
-		return msg_txt(625);
+		return msg_txt(NULL,625);
 
 	case JOB_ROYAL_GUARD2:
 	case JOB_ROYAL_GUARD_T2:
-		return msg_txt(631);
+		return msg_txt(NULL,631);
 
 	case JOB_RANGER2:
 	case JOB_RANGER_T2:
-		return msg_txt(627);
+		return msg_txt(NULL,627);
 
 	case JOB_MECHANIC2:
 	case JOB_MECHANIC_T2:
-		return msg_txt(629);
+		return msg_txt(NULL,629);
 
 	case JOB_BABY_RUNE:
 	case JOB_BABY_WARLOCK:
@@ -5499,30 +5502,30 @@ const char* job_name(int class_)
 	case JOB_BABY_SURA:
 	case JOB_BABY_GENETIC:
 	case JOB_BABY_CHASER:
-		return msg_txt(638 - JOB_BABY_RUNE+class_);
+		return msg_txt(NULL,638 - JOB_BABY_RUNE+class_);
 
 	case JOB_BABY_RUNE2:
-		return msg_txt(638);
+		return msg_txt(NULL,638);
 
 	case JOB_BABY_GUARD2:
-		return msg_txt(644);
+		return msg_txt(NULL,644);
 
 	case JOB_BABY_RANGER2:
-		return msg_txt(640);
+		return msg_txt(NULL,640);
 
 	case JOB_BABY_MECHANIC2:
-		return msg_txt(642);
+		return msg_txt(NULL,642);
 
 	case JOB_SUPER_NOVICE_E:
 	case JOB_SUPER_BABY_E:
-		return msg_txt(651 - JOB_SUPER_NOVICE_E+class_);
+		return msg_txt(NULL,651 - JOB_SUPER_NOVICE_E+class_);
 
 	case JOB_KAGEROU:
 	case JOB_OBORO:
-		return msg_txt(653 - JOB_KAGEROU+class_);
+		return msg_txt(NULL,653 - JOB_KAGEROU+class_);
 
 	default:
-		return msg_txt(655);
+		return msg_txt(NULL,655);
 	}
 }
 
@@ -9195,7 +9198,7 @@ int map_day_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 	night_flag = 0; // 0=day, 1=night [Yor]
 	map_foreachpc(pc_daynight_timer_sub);
-	strcpy(tmp_soutput, (data == 0) ? msg_txt(502) : msg_txt(60)); // The day has arrived!
+	strcpy(tmp_soutput, (data == 0) ? msg_txt(NULL,502) : msg_txt(NULL,60)); // The day has arrived!
 	intif_broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0);
 	return 0;
 }
@@ -9216,7 +9219,7 @@ int map_night_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 	night_flag = 1; // 0=day, 1=night [Yor]
 	map_foreachpc(pc_daynight_timer_sub);
-	strcpy(tmp_soutput, (data == 0) ? msg_txt(503) : msg_txt(59)); // The night has fallen...
+	strcpy(tmp_soutput, (data == 0) ? msg_txt(NULL,503) : msg_txt(NULL,59)); // The night has fallen...
 	intif_broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0);
 	return 0;
 }

+ 2 - 1
src/map/pc.h

@@ -183,6 +183,7 @@ struct map_session_data {
 	int group_id, group_pos, group_level;
 	unsigned int permissions;/* group permissions */
 
+	int langtype;
 	int packet_ver;  // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 ... 18
 	struct mmo_charstatus status;
 	struct registry save_reg;
@@ -236,7 +237,7 @@ struct map_session_data {
 	unsigned int canskill_tick; // used to prevent abuse from no-delay ACT files
 	unsigned int cansendmail_tick; // [Mail System Flood Protection]
 	unsigned int ks_floodprotect_tick; // [Kill Steal Protection]
-    unsigned int bloodylust_tick; // bloodylust player timer [out/in re full-heal protection]
+	 unsigned int bloodylust_tick; // bloodylust player timer [out/in re full-heal protection]
 
 	struct {
 		short nameid;

+ 48 - 48
src/map/pet.c

@@ -100,15 +100,15 @@ int pet_unlocktarget(struct pet_data *pd)
  *------------------------------------------*/
 int pet_attackskill(struct pet_data *pd, int target_id)
 {
-	if (!battle_config.pet_status_support || !pd->a_skill || 
+	if (!battle_config.pet_status_support || !pd->a_skill ||
 		(battle_config.pet_equip_required && !pd->pet.equip))
 		return 0;
 
 	if (DIFF_TICK(pd->ud.canact_tick, gettick()) > 0)
 		return 0;
-	
+
 	if (rnd()%100 < (pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000))
-	{	//Skotlex: Use pet's skill 
+	{	//Skotlex: Use pet's skill
 		int inf;
 		struct block_list *bl;
 
@@ -133,7 +133,7 @@ int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
 	int rate;
 
 	pd = sd->pd;
-	
+
 	Assert((pd->msd == 0) || (pd->msd->pd == pd));
 
 	if(bl == NULL || bl->type != BL_MOB || bl->prev == NULL ||
@@ -160,7 +160,7 @@ int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
 		if(pd->petDB->defence_attack_rate > 0 && rate <= 0)
 			rate = 1;
 	}
-	if(rnd()%10000 < rate) 
+	if(rnd()%10000 < rate)
 	{
 		if(pd->target_id == 0 || rnd()%10000 < pd->petDB->change_target_rate)
 			pd->target_id = bl->id;
@@ -186,7 +186,7 @@ int pet_sc_check(struct map_session_data *sd, int type)
 		return 1;
 
 	pd->recovery->timer = add_timer(gettick()+pd->recovery->delay*1000,pet_recovery_timer,sd->bl.id,0);
-	
+
 	return 0;
 }
 
@@ -212,7 +212,7 @@ static int pet_hungry(int tid, unsigned int tick, int id, intptr_t data)
 
 	if (pd->pet.intimate <= 0)
 		return 1; //You lost the pet already, the rest is irrelevant.
-	
+
 	pd->pet.hungry--;
 	if( pd->pet.hungry < 0 )
 	{
@@ -322,7 +322,7 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *pet)
 
 	nullpo_retr(1, sd);
 
-	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd); 
+	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
 
 	if(sd->status.account_id != pet->account_id || sd->status.char_id != pet->char_id) {
 		sd->status.pet_id = 0;
@@ -339,7 +339,7 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *pet)
 		//The pet_id value was lost? odd... restore it.
 		sd->status.pet_id = pet->pet_id;
 	}
-	
+
 	i = search_petDB_index(pet->class_,PET_CLASS);
 	if(i < 0) {
 		sd->status.pet_id = 0;
@@ -388,7 +388,7 @@ int pet_birth_process(struct map_session_data *sd, struct s_pet *pet)
 {
 	nullpo_retr(1, sd);
 
-	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd); 
+	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
 
 	if(sd->status.pet_id && pet->incuvate == 1) {
 		sd->status.pet_id = 0;
@@ -416,7 +416,7 @@ int pet_birth_process(struct map_session_data *sd, struct s_pet *pet)
 		clif_pet_equip_area(sd->pd);
 		clif_send_petstatus(sd);
 	}
-	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd); 
+	Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
 
 	return 0;
 }
@@ -547,14 +547,14 @@ int pet_get_egg(int account_id,int pet_id,int flag)
 
 	if(flag)
 		return 0;
-		
+
 	sd = map_id2sd(account_id);
 	if(sd == NULL)
 		return 0;
 
 	i = search_petDB_index(sd->catch_target_class,PET_CLASS);
 	sd->catch_target_class = -1;
-	
+
 	if(i < 0) {
 		intif_delete_petdata(pet_id);
 		return 0;
@@ -584,11 +584,11 @@ int pet_menu(struct map_session_data *sd,int menunum)
 	nullpo_ret(sd);
 	if (sd->pd == NULL)
 		return 1;
-	
+
 	//You lost the pet already.
 	if(!sd->status.pet_id || sd->pd->pet.intimate <= 0 || sd->pd->pet.incuvate)
 		return 1;
-	
+
 	switch(menunum) {
 		case 0:
 			clif_send_petstatus(sd);
@@ -635,7 +635,7 @@ int pet_change_name_ack(struct map_session_data *sd, char* name, int flag)
 	normalize_name(name," ");//bugreport:3032
 
 	if ( !flag || !strlen(name) ) {
-		clif_displaymessage(sd->fd, msg_txt(280)); // You cannot use this name for your pet.
+		clif_displaymessage(sd->fd, msg_txt(sd,280)); // You cannot use this name for your pet.
 		clif_send_petstatus(sd); //Send status so client knows oet name change got rejected.
 		return 0;
 	}
@@ -655,9 +655,9 @@ int pet_equipitem(struct map_session_data *sd,int index)
 	nullpo_retr(1, sd);
 	pd = sd->pd;
 	if (!pd)  return 1;
-	
+
 	nameid = sd->status.inventory[index].nameid;
-	
+
 	if(pd->petDB->AcceID == 0 || nameid != pd->petDB->AcceID || pd->pet.equip != 0) {
 		clif_equipitemack(sd,0,0,0);
 		return 1;
@@ -839,7 +839,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
 		pet_randomwalk(pd,tick);
 		return 0;
 	}
-	
+
 	if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range3)) {
 		//Master too far, chase.
 		if(pd->target_id)
@@ -863,7 +863,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
 		pd->status.speed = pd->petDB->speed;
 		pd->ud.state.change_walk_target = pd->ud.state.speed_changed = 1;
 	}
-	
+
 	if (pd->target_id) {
 		target= map_id2bl(pd->target_id);
 		if (!target || pd->bl.m != target->m || status_isdead(target) ||
@@ -873,13 +873,13 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
 			pet_unlocktarget(pd);
 		}
 	}
-	
+
 	if(!target && pd->loot && pd->loot->count < pd->loot->max && DIFF_TICK(tick,pd->ud.canact_tick)>0) {
 		//Use half the pet's range of sight.
 		map_foreachinrange(pet_ai_sub_hard_lootsearch,&pd->bl,
 			pd->db->range2/2, BL_ITEM,pd,&target);
 	}
-	
+
 	if (!target) {
 	//Just walk around.
 		if (check_distance_bl(&sd->bl, &pd->bl, 3))
@@ -894,12 +894,12 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
 
 		return 0;
 	}
-	
+
 	if(pd->ud.target == target->id &&
 		(pd->ud.attacktimer != INVALID_TIMER || pd->ud.walktimer != INVALID_TIMER))
 		return 0; //Target already locked.
 
-	if (target->type != BL_ITEM) 
+	if (target->type != BL_ITEM)
 	{ //enemy targetted
 		if(!battle_check_range(&pd->bl,target,pd->status.rhw.range))
 		{	//Chase
@@ -921,7 +921,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
 				memcpy(&pd->loot->item[pd->loot->count++],&fitem->item_data,sizeof(pd->loot->item[0]));
 				pd->loot->weight += itemdb_weight(fitem->item_data.nameid)*fitem->item_data.amount;
 				map_clearflooritem(target);
-			} 
+			}
 			//Target is unlocked regardless of whether it was picked or not.
 			pet_unlocktarget(pd);
 		}
@@ -959,7 +959,7 @@ static int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
 
 	if(sd_charid && sd_charid != pd->msd->status.char_id)
 		return 0;
-	
+
 	if(unit_can_reach_bl(&pd->bl,bl, pd->db->range2, 1, NULL, NULL) &&
 		((*target) == NULL || //New target closer than previous one.
 		!check_distance_bl(&pd->bl, *target, distance_bl(&pd->bl, bl))))
@@ -1040,7 +1040,7 @@ int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
 
 /*==========================================
  * pet bonus giving skills [Valaris] / Rewritten by [Skotlex]
- *------------------------------------------*/ 
+ *------------------------------------------*/
 int pet_skill_bonus_timer(int tid, unsigned int tick, int id, intptr_t data)
 {
 	struct map_session_data *sd=map_id2sd(id);
@@ -1050,7 +1050,7 @@ int pet_skill_bonus_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 	if(sd == NULL || sd->pd==NULL || sd->pd->bonus == NULL)
 		return 1;
-	
+
 	pd=sd->pd;
 
 	if(pd->bonus->timer != tid) {
@@ -1058,7 +1058,7 @@ int pet_skill_bonus_timer(int tid, unsigned int tick, int id, intptr_t data)
 		pd->bonus->timer = INVALID_TIMER;
 		return 0;
 	}
-	
+
 	// determine the time for the next timer
 	if (pd->state.skillbonus && pd->bonus->delay > 0) {
 		bonus = 0;
@@ -1082,15 +1082,15 @@ int pet_skill_bonus_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 /*==========================================
  * pet recovery skills [Valaris] / Rewritten by [Skotlex]
- *------------------------------------------*/ 
+ *------------------------------------------*/
 int pet_recovery_timer(int tid, unsigned int tick, int id, intptr_t data)
 {
 	struct map_session_data *sd=map_id2sd(id);
 	struct pet_data *pd;
-	
+
 	if(sd==NULL || sd->pd == NULL || sd->pd->recovery == NULL)
 		return 1;
-	
+
 	pd=sd->pd;
 
 	if(pd->recovery->timer != tid) {
@@ -1099,7 +1099,7 @@ int pet_recovery_timer(int tid, unsigned int tick, int id, intptr_t data)
 	}
 
 	if(sd->sc.data[pd->recovery->type])
-	{	//Display a heal animation? 
+	{	//Display a heal animation?
 		//Detoxify is chosen for now.
 		clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
 		status_change_end(&sd->bl, pd->recovery->type, INVALID_TIMER);
@@ -1107,7 +1107,7 @@ int pet_recovery_timer(int tid, unsigned int tick, int id, intptr_t data)
 	}
 
 	pd->recovery->timer = INVALID_TIMER;
-	
+
 	return 0;
 }
 
@@ -1117,19 +1117,19 @@ int pet_heal_timer(int tid, unsigned int tick, int id, intptr_t data)
 	struct status_data *status;
 	struct pet_data *pd;
 	unsigned int rate = 100;
-	
+
 	if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
 		return 1;
-	
+
 	pd=sd->pd;
-	
+
 	if(pd->s_skill->timer != tid) {
 		ShowError("pet_heal_timer %d != %d\n",pd->s_skill->timer,tid);
 		return 0;
 	}
-	
+
 	status = status_get_status_data(&sd->bl);
-	
+
 	if(pc_isdead(sd) ||
 		(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
 		(rate = get_percentage(status->hp, status->max_hp)) > pd->s_skill->hp ||
@@ -1148,7 +1148,7 @@ int pet_heal_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 /*==========================================
  * pet support skills [Skotlex]
- *------------------------------------------*/ 
+ *------------------------------------------*/
 int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr_t data)
 {
 	struct map_session_data *sd=map_id2sd(id);
@@ -1157,14 +1157,14 @@ int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr_t data)
 	short rate = 100;
 	if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
 		return 1;
-	
+
 	pd=sd->pd;
-	
+
 	if(pd->s_skill->timer != tid) {
 		ShowError("pet_skill_support_timer %d != %d\n",pd->s_skill->timer,tid);
 		return 0;
 	}
-	
+
 	status = status_get_status_data(&sd->bl);
 
 	if (DIFF_TICK(pd->ud.canact_tick, tick) > 0)
@@ -1172,7 +1172,7 @@ int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr_t data)
 		pd->s_skill->timer=add_timer(pd->ud.canact_tick,pet_skill_support_timer,sd->bl.id,0);
 		return 0;
 	}
-	
+
 	if(pc_isdead(sd) ||
 		(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
 		(rate = get_percentage(status->hp, status->max_hp)) > pd->s_skill->hp ||
@@ -1181,7 +1181,7 @@ int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr_t data)
 		pd->s_skill->timer=add_timer(tick+(rate>10?rate:10)*100,pet_skill_support_timer,sd->bl.id,0);
 		return 0;
 	}
-	
+
 	pet_stop_attack(pd);
 	pet_stop_walking(pd,1);
 	pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_skill_support_timer,sd->bl.id,0);
@@ -1196,12 +1196,12 @@ int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr_t data)
  * Pet read db data
  * pet_db.txt
  * pet_db2.txt
- *------------------------------------------*/ 
+ *------------------------------------------*/
 int read_petdb()
 {
 	char* filename[] = {"pet_db.txt","pet_db2.txt"};
 	FILE *fp;
-	int nameid,i,j,k; 
+	int nameid,i,j,k;
 
 	// Remove any previous scripts in case reloaddb was invoked.
 	for( j = 0; j < MAX_PET_DB; j++ )
@@ -1351,7 +1351,7 @@ int do_init_pet(void)
 
 	item_drop_ers = ers_new(sizeof(struct item_drop),"pet.c::item_drop_ers",ERS_OPT_NONE);
 	item_drop_list_ers = ers_new(sizeof(struct item_drop_list),"pet.c::item_drop_list_ers",ERS_OPT_NONE);
-	
+
 	add_timer_func_list(pet_hungry,"pet_hungry");
 	add_timer_func_list(pet_ai_hard,"pet_ai_hard");
 	add_timer_func_list(pet_skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris]

+ 2 - 2
src/map/script.c

@@ -12722,7 +12722,7 @@ BUILDIN_FUNC(recovery)
 			status_revive(&sd->bl, 100, 100);
 		else
 			status_percent_heal(&sd->bl, 100, 100);
-		clif_displaymessage(sd->fd,msg_txt(680));
+		clif_displaymessage(sd->fd,msg_txt(sd,680));
 	}
 	mapit_free(iter);
 	return 0;
@@ -16836,7 +16836,7 @@ BUILDIN_FUNC(buyingstore)
 
 	if( npc_isnear(&sd->bl) ) {
 		char output[150];
-		sprintf(output, msg_txt(662), battle_config.min_npc_vendchat_distance);
+		sprintf(output, msg_txt(sd,662), battle_config.min_npc_vendchat_distance);
 		clif_displaymessage(sd->fd, output);
 		return 0;
 	}

+ 3 - 3
src/map/skill.c

@@ -5272,7 +5272,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			if (sd)
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 			if (skill_break_equip(src,bl, EQP_WEAPON, 10000, BCT_PARTY) && sd && sd != dstsd)
-				clif_displaymessage(sd->fd, msg_txt(669));
+				clif_displaymessage(sd->fd, msg_txt(sd,669));
 		}
 		break;
 
@@ -6175,7 +6175,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				break;
 			}
 			if(!battle_config.duel_allow_teleport && sd->duel_group && skill_lv <= 2) { // duel restriction [LuzZza]
-				char output[128]; sprintf(output, msg_txt(365), skill_get_name(AL_TELEPORT));
+				char output[128]; sprintf(output, msg_txt(sd,365), skill_get_name(AL_TELEPORT));
 				clif_displaymessage(sd->fd, output); //"Duel: Can't use %s in duel."
 				break;
 			}
@@ -12722,7 +12722,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 			break;
 		case AL_WARP:
 			if(!battle_config.duel_allow_teleport && sd->duel_group) { // duel restriction [LuzZza]
-				char output[128]; sprintf(output, msg_txt(365), skill_get_name(AL_WARP));
+				char output[128]; sprintf(output, msg_txt(sd,365), skill_get_name(AL_WARP));
 				clif_displaymessage(sd->fd, output); //"Duel: Can't use %s in duel."
 				return 0;
 			}

+ 32 - 32
src/map/storage.c

@@ -97,13 +97,13 @@ int storage_storageopen(struct map_session_data *sd)
 
 	if(sd->state.storage_flag)
 		return 1; //Already open?
-	
+
 	if( !pc_can_give_items(sd) )
-  	{ //check is this GM level is allowed to put items to storage
-		clif_displaymessage(sd->fd, msg_txt(246));
+	{ //check is this GM level is allowed to put items to storage
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		return 1;
 	}
-	
+
 	sd->state.storage_flag = 1;
 	storage_sortitem(sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
 	clif_storagelist(sd, sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
@@ -140,7 +140,7 @@ static int storage_additem(struct map_session_data* sd, struct item* item_data,
 
 	if( item_data->nameid <= 0 || amount <= 0 )
 		return 1;
-	
+
 	data = itemdb_search(item_data->nameid);
 
 	if( data->stack.storage && amount > data->stack.amount )
@@ -150,10 +150,10 @@ static int storage_additem(struct map_session_data* sd, struct item* item_data,
 
 	if( !itemdb_canstore(item_data, pc_get_group_level(sd)) )
 	{	//Check if item is storable. [Skotlex]
-		clif_displaymessage (sd->fd, msg_txt(264));
+		clif_displaymessage (sd->fd, msg_txt(sd,264));
 		return 1;
 	}
-	
+
 	if( itemdb_isstackable2(data) )
 	{//Stackable
 		for( i = 0; i < MAX_STORAGE; i++ )
@@ -248,7 +248,7 @@ int storage_storageget(struct map_session_data* sd, int index, int amount)
 
 	if( sd->status.storage.items[index].nameid <= 0 )
 		return 0; //Nothing there
-	
+
 	if( amount < 1 || amount > sd->status.storage.items[index].amount )
 		return 0;
 
@@ -279,7 +279,7 @@ int storage_storageaddfromcart(struct map_session_data* sd, int index, int amoun
 
 	if( sd->status.cart[index].nameid <= 0 )
 		return 0; //No item there.
-	
+
 	if( amount < 1 || amount > sd->status.cart[index].amount )
 		return 0;
 
@@ -302,13 +302,13 @@ int storage_storagegettocart(struct map_session_data* sd, int index, int amount)
 
 	if( index < 0 || index >= MAX_STORAGE )
 		return 0;
-	
+
 	if( sd->status.storage.items[index].nameid <= 0 )
 		return 0; //Nothing there.
-	
+
 	if( amount < 1 || amount > sd->status.storage.items[index].amount )
 		return 0;
-	
+
 	if( pc_cart_additem(sd,&sd->status.storage.items[index],amount,LOG_TYPE_STORAGE) == 0 )
 		storage_delitem(sd,index,amount);
 
@@ -337,7 +337,7 @@ void storage_storageclose(struct map_session_data* sd)
 void storage_storage_quit(struct map_session_data* sd, int flag)
 {
 	nullpo_retv(sd);
-	
+
 	if (save_settings&4)
 		chrif_save(sd, flag); //Invokes the storage saving as well.
 
@@ -365,7 +365,7 @@ struct guild_storage *guild2storage(int guild_id)
 
 //For just locating a storage without creating one. [Skotlex]
 struct guild_storage *guild2storage2(int guild_id)
-{	
+{
 	return (struct guild_storage*)idb_get(guild_storage_db,guild_id);
 }
 
@@ -393,9 +393,9 @@ int storage_guild_storageopen(struct map_session_data* sd)
 
 	if(sd->state.storage_flag)
 		return 1; //Can't open both storages at a time.
-	
+
 	if( !pc_can_give_items(sd) ) { //check is this GM level can open guild storage and store items [Lupus]
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		return 1;
 	}
 
@@ -405,10 +405,10 @@ int storage_guild_storageopen(struct map_session_data* sd)
 	}
 	if(gstor->storage_status)
 		return 1;
-		
+
 	if( gstor->lock )
 		return 1;
-	
+
 	gstor->storage_status = 1;
 	sd->state.storage_flag = 2;
 	storage_sortitem(gstor->items, ARRAYLENGTH(gstor->items));
@@ -444,7 +444,7 @@ int guild_storage_additem(struct map_session_data* sd, struct guild_storage* sto
 
 	if( !itemdb_canguildstore(item_data, pc_get_group_level(sd)) || item_data->expire_time )
 	{	//Check if item is storable. [Skotlex]
-		clif_displaymessage (sd->fd, msg_txt(264));
+		clif_displaymessage (sd->fd, msg_txt(sd,264));
 		return 1;
 	}
 
@@ -462,10 +462,10 @@ int guild_storage_additem(struct map_session_data* sd, struct guild_storage* sto
 	}
 	//Add item
 	for(i=0;i<MAX_GUILD_STORAGE && stor->items[i].nameid;i++);
-	
+
 	if(i>=MAX_GUILD_STORAGE)
 		return 1;
-	
+
 	memcpy(&stor->items[i],item_data,sizeof(stor->items[0]));
 	stor->items[i].amount=amount;
 	stor->storage_amount++;
@@ -513,19 +513,19 @@ int storage_guild_storageadd(struct map_session_data* sd, int index, int amount)
 
 	nullpo_ret(sd);
 	nullpo_ret(stor=guild2storage2(sd->status.guild_id));
-		
+
 	if( !stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE )
 		return 0;
-	
+
 	if( index<0 || index>=MAX_INVENTORY )
 		return 0;
 
 	if( sd->status.inventory[index].nameid <= 0 )
 		return 0;
-	
+
 	if( amount < 1 || amount > sd->status.inventory[index].amount )
 		return 0;
-		
+
 	if( stor->lock ) {
 		storage_guild_storageclose(sd);
 		return 0;
@@ -554,16 +554,16 @@ int storage_guild_storageget(struct map_session_data* sd, int index, int amount)
 
 	if(!stor->storage_status)
   		return 0;
-	
+
 	if(index<0 || index>=MAX_GUILD_STORAGE)
 		return 0;
 
 	if(stor->items[index].nameid <= 0)
 		return 0;
-	
+
 	if(amount < 1 || amount > stor->items[index].amount)
 	  	return 0;
-		
+
 	if( stor->lock ) {
 		storage_guild_storageclose(sd);
 		return 0;
@@ -600,7 +600,7 @@ int storage_guild_storageaddfromcart(struct map_session_data* sd, int index, int
 
 	if( sd->status.cart[index].nameid <= 0 )
 		return 0;
-	
+
 	if( amount < 1 || amount > sd->status.cart[index].amount )
 		return 0;
 
@@ -629,10 +629,10 @@ int storage_guild_storagegettocart(struct map_session_data* sd, int index, int a
 
 	if(index<0 || index>=MAX_GUILD_STORAGE)
 	  	return 0;
-	
+
 	if(stor->items[index].nameid<=0)
 		return 0;
-	
+
 	if(amount < 1 || amount > stor->items[index].amount)
 		return 0;
 
@@ -711,7 +711,7 @@ int storage_guild_storage_quit(struct map_session_data* sd, int flag)
 
 	nullpo_ret(sd);
 	nullpo_ret(stor=guild2storage2(sd->status.guild_id));
-	
+
 	if(flag)
 	{	//Only during a guild break flag is 1 (don't save storage)
 		sd->state.storage_flag = 0;

+ 9 - 9
src/map/trade.c

@@ -32,7 +32,7 @@ void trade_traderequest(struct map_session_data *sd, struct map_session_data *ta
 	nullpo_retv(sd);
 
 	if (map[sd->bl.m].flag.notrade) {
-		clif_displaymessage (sd->fd, msg_txt(272));
+		clif_displaymessage (sd->fd, msg_txt(sd,272));
 		return; //Can't trade in notrade mapflag maps.
 	}
 
@@ -71,7 +71,7 @@ void trade_traderequest(struct map_session_data *sd, struct map_session_data *ta
 
 	if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) //check if both GMs are allowed to trade
 	{
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		clif_tradestart(sd, 2); // GM is not allowed to trade
 		return;
 	}
@@ -201,25 +201,25 @@ int impossible_trade_check(struct map_session_data *sd)
 		index = sd->deal.item[i].index;
 		if (inventory[index].amount < sd->deal.item[i].amount)
 		{ // if more than the player have -> hack
-			sprintf(message_to_gm, msg_txt(538), sd->status.name, sd->status.account_id); // Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+			sprintf(message_to_gm, msg_txt(sd,538), sd->status.name, sd->status.account_id); // Hack on trade: character '%s' (account: %d) try to trade more items that he has.
 			intif_wis_message_to_gm(wisp_server_name, PC_PERM_RECEIVE_HACK_INFO, message_to_gm);
-			sprintf(message_to_gm, msg_txt(539), inventory[index].amount, inventory[index].nameid, sd->deal.item[i].amount); // This player has %d of a kind of item (id: %d), and try to trade %d of them.
+			sprintf(message_to_gm, msg_txt(sd,539), inventory[index].amount, inventory[index].nameid, sd->deal.item[i].amount); // This player has %d of a kind of item (id: %d), and try to trade %d of them.
 			intif_wis_message_to_gm(wisp_server_name, PC_PERM_RECEIVE_HACK_INFO, message_to_gm);
 			// if we block people
 			if (battle_config.ban_hack_trade < 0) {
 				chrif_char_ask_name(-1, sd->status.name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
 				set_eof(sd->fd); // forced to disconnect because of the hack
 				// message about the ban
-				strcpy(message_to_gm, msg_txt(540)); //  This player has been definitively blocked.
+				strcpy(message_to_gm, msg_txt(sd,540)); //  This player has been definitively blocked.
 			// if we ban people
 			} else if (battle_config.ban_hack_trade > 0) {
 				chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
 				set_eof(sd->fd); // forced to disconnect because of the hack
 				// message about the ban
-				sprintf(message_to_gm, msg_txt(507), battle_config.ban_hack_trade); //  This player has been banned for %d minute(s).
+				sprintf(message_to_gm, msg_txt(sd,507), battle_config.ban_hack_trade); //  This player has been banned for %d minute(s).
 			} else
 				// message about the ban
-				strcpy(message_to_gm, msg_txt(508)); //  This player hasn't been banned (Ban option is disabled).
+				strcpy(message_to_gm, msg_txt(sd,508)); //  This player hasn't been banned (Ban option is disabled).
 
 			intif_wis_message_to_gm(wisp_server_name, PC_PERM_RECEIVE_HACK_INFO, message_to_gm);
 			return 1;
@@ -356,14 +356,14 @@ void trade_tradeadditem(struct map_session_data *sd, short index, short amount)
 	if( !itemdb_cantrade(item, src_lv, dst_lv) && //Can't trade
 		(pc_get_partner(sd) != target_sd || !itemdb_canpartnertrade(item, src_lv, dst_lv)) ) //Can't partner-trade
 	{
-		clif_displaymessage (sd->fd, msg_txt(260));
+		clif_displaymessage (sd->fd, msg_txt(sd,260));
 		clif_tradeitemok(sd, index+2, 1);
 		return;
 	}
 
 	if( item->expire_time )
 	{ // Rental System
-		clif_displaymessage (sd->fd, msg_txt(260));
+		clif_displaymessage (sd->fd, msg_txt(sd,260));
 		clif_tradeitemok(sd, index+2, 1);
 		return;
 	}

+ 3 - 3
src/map/vending.c

@@ -57,7 +57,7 @@ void vending_vendinglistreq(struct map_session_data* sd, int id)
 
 	if (!pc_can_give_items(sd) || !pc_can_give_items(vsd)) //check if both GMs are allowed to trade
 	{	// GM is not allowed to trade
-		clif_displaymessage(sd->fd, msg_txt(246));
+		clif_displaymessage(sd->fd, msg_txt(sd,246));
 		return;
 	}
 
@@ -189,7 +189,7 @@ void vending_purchasereq(struct map_session_data* sd, int aid, int uid, const ui
 		if( battle_config.buyer_name )
 		{
 			char temp[256];
-			sprintf(temp, msg_txt(265), sd->status.name);
+			sprintf(temp, msg_txt(sd,265), sd->status.name);
 			clif_disp_onlyself(vsd,temp,strlen(temp));
 		}
 	}
@@ -286,7 +286,7 @@ void vending_openvending(struct map_session_data* sd, const char* message, const
 	}
 
 	if( i != j )
-		clif_displaymessage (sd->fd, msg_txt(266)); //"Some of your items cannot be vended and were removed from the shop."
+		clif_displaymessage (sd->fd, msg_txt(sd,266)); //"Some of your items cannot be vended and were removed from the shop."
 
 	if( i == 0 )
 	{	// no valid item found

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.