Просмотр исходного кода

-Releasing console support (disable by default)
--Allow admin to send some command in server by cli. (do not use those who require a real player)

-Update msg system
--Add RU translation from Lilith (give me that in UTF8 plz guys)
--Upd FR translation from Capuche
--Upd file read for something more dynamic
--upd @langtype to display available when no arg enter as specified in doc
--Fix few typos

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

glighta 12 лет назад
Родитель
Сommit
755000f570

+ 1 - 1
conf/msg_conf/import-tmpl/map_msg_grm_conf.txt

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

+ 74 - 74
conf/msg_conf/map_msg.conf

@@ -86,7 +86,7 @@
 65: Character's base level raised.
 66: Character's base level lowered.
 67: Character's job level can't go any higher.
-68: character's job level raised.
+68: Character's job level raised.
 69: Character's job level lowered.
 70: You have learned the skill.
 71: You have forgotten the skill.
@@ -99,7 +99,7 @@
 78: %s: %d
 79: It is %d affair above.
 80: Give the display name or monster name/id please.
-81: Your GM level doesn't authorize you to preform this action on the specified player.
+81: Your GM level doesn't authorize you to perform this action on the specified player.
 82: Please provide a name or number from the list provided:
 83: Monster 'Emperium' cannot be spawned.
 84: All stats changed!
@@ -219,7 +219,7 @@
 202: This player has forgotten the skill.
 203: This player doesn't have this quest skill.
 204: You can't open a shop on this cell.
-205: Maybe you meant: 
+205: Maybe you meant:
 206: '%s' skill points reset.
 207: '%s' stats points reset.
 208: '%s' skill and stat points have been reset.
@@ -351,9 +351,9 @@
 334: Total Domination
 
 // Templates for @who output
-343: Name: %s 
-344: (%s) 
-345: | Party: '%s' 
+343: Name: %s
+344: (%s)
+345: | Party: '%s'
 346: | Guild: '%s'
 //You may ommit the last %s, then you won't see players job name
 347: | Lv:%d/%d | Job: %s
@@ -376,7 +376,7 @@
 362: Duel: You can't use @reject without a duel invitation.
 363: Duel: The duel invitation has been rejected.
 364: Duel: You can't invite %s because he/she isn't on the same map.
-365: Duel: Can't use %s in duel. 
+365: Duel: Can't use %s in duel.
 // @duel (part 2)
 370:  -- Duels: %d/%d, Members: %d/%d, Max players: %d --
 371:  -- Duels: %d/%d, Members: %d/%d --
@@ -429,7 +429,7 @@
 419: Server is jammed due to over populated.
 420: Your account has not more authorised.
 421: Your account has been totally erased.
-423: Your account has been banished until 
+423: Your account has been banished until
 424: Login-server has been asked to %s the player '%.*s'.
 425: The player '%.*s' doesn't exist.
 426: Your GM level don't authorise you to %s the player '%.*s'.
@@ -678,7 +678,7 @@
 911: Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>).
 
 // @who
-912: (CID:%d/AID:%d) 
+912: (CID:%d/AID:%d)
 
 // @whogm
 913: Name: %s (GM)
@@ -849,58 +849,58 @@
 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 | 
+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 | 
+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 -----
@@ -915,7 +915,7 @@
 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 
+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
@@ -1227,7 +1227,7 @@
 1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
 1278: None
 1279: With script
-1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f 
+1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
 1281:  - Available in the shops only.
 1282:  - Maximal monsters drop chance: %02.02f%%
 1283:  - Monsters don't drop this item.
@@ -1289,7 +1289,7 @@
 1315: Available Flags:
 
 // @showexp
-1316: Gained exp will not be shown.  
+1316: Gained exp will not be shown.
 1317: Gained exp is now shown.
 
 // @showzeny
@@ -1322,26 +1322,26 @@
 
 // @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, 
+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): 
+1352:  -> (card(s):
 1353: No item found in this player's %s.
 1354: %d item(s) found in %d %s slots.
 

Разница между файлами не показана из-за своего большого размера
+ 205 - 205
conf/msg_conf/map_msg_frn.conf


+ 1462 - 0
conf/msg_conf/map_msg_rus.conf

@@ -0,0 +1,1462 @@
+// rAthena msg_athena.conf
+// Перевод сообщений на русский: Lilith
+// Настройки сообщений
+// Формат:
+// № сообщения: само сообщение
+
+//   0-499: зарезервированы для команд Администратора
+// 500-900 зарезервированы для разных сообщений
+// 900-1300: зарезервированы для @команд
+
+// Чтобы запретить строковое поле (%s) в сообщении достаточно урезать его длину до 0
+// Пример:
+// 270: *%s %s* (формат сообщения команды @me)
+// 270: *%.0s%s* (удаляет ник персонажа из сообщения)
+
+// -------------------------------------
+// Сообщения команд Администратора
+// -------------------------------------
+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: Неверный ID или название предмета.
+20: Все предметы удалены.
+21: Базовый уровень повышен.
+22: Базовый уровень снижен.
+23: Уровень профессии достиг максимума.
+24: Уровень профессии повышен.
+25: Уровень профессии снижен.
+26: Подсказки для команд:
+27: Подсказки для команд не доступны.
+28: Игроки не найдены.
+29: Найден 1 игрок.
+30: Найдено %d игрока(ов).
+31: PvP: выключено.
+32: PvP: включено.
+33: GvG: выключено.
+34: GvG: включено.
+35: Команда не может быть использована с данной профессией.
+36: Внешний вид изменён.
+37: Указан неверный номер.
+38: Неверный номер или название локации.
+39: Все монстры призваны!
+40: Неверный ID или название монстра.
+41: Невозможно понизить значение.
+42: Статистика персонажа изменена.
+43: Вы не состоите в гильдии.
+44: Вы не являетесь главой гильдии.
+45: Невозможно изменить уровень гильдии.
+46: %s призван!
+47: Базовый уровень достиг максимума.
+48: Профессия персонажа изменена.
+49: Неверный ID профессии.
+50: Вы уже имеете полномочия Администратора.
+51: Персонаж возрождён.
+52: Эта опция не может быть использована в режиме ПК.
+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' (название: ID):
+78: %s: %d
+79: Всего найдено %d результатов.
+80: Введите отображаемое имя или ID/название монстра.
+81: Ваши права Администратора не позволяют выполнять данное действие на указанного игрока.
+82: Укажите имя или номер из указанного списка:
+83: Империум не может быть призван.
+84: Вся статистика изменена!
+85: Неверный формат времени.
+86: Ники игроков не могут быть короче 4 символов.
+87: Ники игроков не могут быть длиннее 23 символов.
+88: Отправка запроса на Сервер Авторизации...
+89: Ночь уже активна.
+90: День уже активен.
+91: Базовый уровень персонажа достиг максимума.
+92: Все персонажи призваны!
+93: Все находящиеся в игре персонажи из гильдии %s призваны.
+94: Неверный ID или название гильдии, либо никого из гильдии нет в игре.
+95: Все находящиеся в игре персонажи из группы %s призваны.
+96: Неверный ID или название группы, либо никого из группы нет в игре.
+97: База данных предметов перезагружена.
+98: База данных монстров перезагружена.
+99: База данных навыков перезагружена.
+100: Скрипты перезагружены.
+//101: НЕ ИСПОЛЬЗУЕТСЯ
+102: Вы оседлали Пеко Пеко.
+103: Шпионаж за гильдией %s прекращён.
+104: Начат шпионаж за гильдией %s.
+105: Шпионаж за группой %s прекращён.
+106: Начат шпионаж за группой %s.
+107: Все предметы починены.
+108: Нет предметов, нуждающихся в ремонте.
+109: Игрок уничтожен!
+110: НИП разрешён.
+111: НИП'а с таким именем не существует.
+112: НИП запрещён.
+113: %d предмет(ов) удалено администратором.
+114: У персонажа удалено %d предмет(ов).
+115: %d предмет(ов) удалено. У персонажа осталось %d из %d предметов.
+116: У персонажа нет такого пердмета.
+117: Администратор отправил вас в тюрьму.
+118: Персонаж отправлен в тюрьму.
+119: Персонаж не находится в тюрьме.
+120: Администратор выпустил вас из тюрьмы.
+121: Персонаж выпущен из тюрьмы.
+122: Вы замаскировались.
+123: Неверный ID или название монстра/НИП.
+124: Маскировка исчезла.
+125: Вы не замаскированы.
+
+// Сообщения команд @clone/@evilclone/@slaveclone
+126: Нельзя клонировать игрока, у которого уровень администратора выше, чем ваш собственный.
+127: Вы призвали максимальное количество клонов.
+128: Злой клон призван.
+129: Невозможно призвать злого клона.
+130: Клон призван.
+131: Невозможно призвать клона.
+132: Клон-раб призван.
+133: Невозможно призвать клона-раба.
+// Сообщения под номерами 134-139 больше не используются, но остаются доступными для повторного использования в будущем.
+
+140: Персонаж замаскирован.
+141: Маскировка персонажа исчезла.
+142: Персонаж не замаскирован.
+143: На этой локации команды запрещены.
+144: Неверный e-mail. Если у вас e-mail по умолчанию напишите a@a.com.
+145: Неверный e-mail. Введите существующий e-mail.
+146: Новый e-mail должен быть существующим.
+147: Новый e-mail должен отличаться от текущего.
+148: Информация отправлена Серверу Авторизации через Сервер Персонажей.
+149: Невозможно повысить значение.
+150: Администраторы не найдены.
+151: Найден 1 Администратор.
+152: Найдено %d Администраторов.
+153: %s неизвестная команда.
+154: Команда %s не удалась.
+155: Вы не можете изменить свою профессию.
+156: HP и/или SP восстановлено.
+157: HP и SP в норме.
+158: Базовый уровень достиг минимума.
+159: Уровень профессии достиг минимума.
+160: PvP уже выключено.
+161: PvP уже включено.
+162: GvG уже выключено.
+163: GvG уже включено.
+//164: НЕ ИСПОЛЬЗУЕТСЯ
+165: Все монстры уничтожены!
+166: Ни один предмет не был заточен.
+167: 1 предмет заточен.
+168: %d предметов заточено.
+169: Предмет (%d: '%s') невозможно надеть.
+170: Предмет невозможно надеть.
+171: %d - пусто
+//172: НЕ ИСПОЛЬЗУЕТСЯ
+//173: НЕ ИСПОЛЬЗУЕТСЯ
+174: Количество очков статистики изменено.
+175: Количество очков навыка изменено.
+176: Количество Зени изменено.
+177: Вы больше не можете снизить этот параметр.
+178: Вы больше не можете повысить этот параметр.
+179: Уровень гильдии изменён.
+180: Название/ID монстра/яйца питомца не существует.
+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: Количество Зени персонажа изменено.
+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: Ваши права Администратора не позволяют выполнять данное действие.
+247: У вас нет прав для перемещения на эту локацию.
+248: У вас нет прав для перемещения с текущей локации.
+249: У вас нет прав для перемещения в точку сохранения.
+250: Вы уже открыли склад.
+251: Вы уже открыли склад гильдии.
+252: Вы не состоите в гильдии.
+//253: НЕ ИСПОЛЬЗУЕТСЯ
+254: Конфигурация команд перезагружена.
+255: Конфигурация битв перезагружены.
+256: База данных статусов перезагружена.
+257: База данных игроков перезагружена.
+258: Отправка пакета 0x%x (%d).
+259: Неверный пакет.
+260: Предметом нельзя торговать.
+261: Скрипт не может загрузиться.
+262: Скрипт загружен.
+263: Предмет нельзя выбросить.
+264: Предмет нельзя перемещать на склад.
+265: %s купил ваш товар.
+266: Некоторые из ваших товаров не могут быть проданы, поэтому они удалены из магазина.
+//267: НЕ ИСПОЛЬЗУЕТСЯ
+268: Сообщение дня перезагружено.
+269: Показаны первые %d из %d результатов
+
+// Сообщение команды @me
+270: * :%s %s: *
+271: Вы не можете выбрасывать предметы на этой локации.
+272: Вы не можете торговать на этой локации.
+273: Доступные команды:
+274: Найдено %d команд.
+275: Команды не найдены.
+276: Вы не можете открыть магазин на этой локации
+277: Использование: @request <просьба/сообщение для администраторов в игре>.
+278: (@request): %s
+279: @request отправлен.
+280: Неверное имя.
+281: Вы не можете создать чат на этой локации
+
+// Сообщения группы
+282: Вы должны быть лидером группы для использования этой команды.
+283: Персонаж должен находиться в игре и состоять в вашей группе.
+284: Лидерство передано.
+285: Вы стали лидером группы.
+286: Не произведено никаких изменений в настройках.
+287: You cannot change party leaders on this map.
+
+// Сообщения команды @killer и @killable
+288: Режим жертвы выключен.
+289: Режим жертвы персонажа включен.
+290: Режим жертвы персонажа выключен.
+291: Погодные эффекты будут убраны с телепортацией/обновлением персонажа.
+292: Режим убийцы выключен.
+
+293: Вы не можете перемещать данный предмет - он привязан к аккаунту!
+
+// Количество замков гильдии
+300: Территория не захвачена
+301: Один замок
+302: Два замка
+303: Три замка
+304: Четыре замка
+305: Пять замков
+306: Шесть замков
+307: Семь замков
+308: Восемь замков
+309: Девять замков
+310: Десять замков
+311: Одиннадцать замков
+312: Двенадцать замков
+313: Тринадцать замков
+314: Четырнадцать замков
+315: Пятнадцать замков
+316: Шестнадцать замков
+317: Семнадцать замков
+318: Восемнадцать замков
+319: Девятнадцать замков
+320: Двадцать замков
+321: Двадцать-один замок
+322: Двадцать-два замка
+323: Двадцать-три замка
+324: Двадцать-четыре замка
+325: Двадцать-пять замков
+326: Двадцать-шесть замков
+327: Двадцать-семь замков
+328: Двадцать-восемь замков
+329: Двадцать-девять замков
+330: Тридцать замков
+331: Тридцать-один замок
+332: Тридцать-два замка
+333: Тридцать-три замка
+// 334: Тридцать-четрые замка
+334: Полное доминирование
+
+// Сообщения команды @who
+343: Имя: %s 
+344: (%s) 
+345: | Группа: '%s' 
+346: | Гильдия: '%s'
+// Вы можете обнулить последнее строковое поле и тогда не будете видеть профессию персонажей
+347: | Ур:%d/%d | Профессия: %s
+// Вы можете обнулить последние 2 строковых поля и тогда не будете видеть местонахождение персонажа
+348: | Местонахождение: %s %d %d
+
+// Сообщения команды @duel
+350: Дуэль: Вы не можете использовать @invite. Вы не в дуэли.
+351: Дуэль: Достигнут лимит персонажей.
+352: Дуэль: Персонаж не найден.
+353: Дуэль: Персонаж уже в дуэли.
+354: Дуэль: Принлашение отправлено.
+355: Дуэль: Вы не можете создать новую дуэль, пока не выйдете из текущей через команду @reject.
+356: Дуэль: Вы можете учавствовать в дуэли раз в %d минут.
+357: Дуэль: Неверное значение.
+358: Дуэль: Вы не можете использовать @leave. Вы не в дуэли.
+359: Дуэль: Вы покинули дуэль.
+360: Дуэль: Вы не можете использовать @accept без приглашения на дуэль.
+361: Дуэль: Приглашение на дуэль одобрено.
+362: Дуэль: Вы не можете использовать @reject без приглашения на дуэль.
+363: Дуэль: Приглашение на дуэль отвергнуто.
+364: Дуэль: Вы не можете пригласить %s потому что он/она находится на другой локации.
+365: Дуэль: Вы не можете использовать %s в дуэли. 
+370:  -- Дуэль: %d/%d, Участники: %d/%d, Максимум участников: %d --
+371:  -- Дуэль: %d/%d, Участники: %d/%d --
+372:  -- Дуэль создана (Используйте @invite/@leave) --
+373:  -- Игрок %s пригласил %s на дуэль --
+374:  -- Игрок %s пригласил вас на дуэль (Используйте @accept/@reject) --
+375:  <- Игрок %s покинул дуэль --
+376:  -> Игрок %s принял приглашение --
+377:  -- Игрок %s отверг приглашение --
+
+// Сообщения команд Общего чата
+380: Общий чат включен.
+381: Общий чат уже включен.
+382: Общий чат выключен.
+383: Общий чат уже выключен.
+384: Общий чат включен. Использование: @main <on|off>, @main <сообщение>.
+385: Общий чат выключен. Использование: @main <on|off>, @main <сообщение>.
+386: %s :Общий: %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 минут
+
+// Сообщения Войны за Империум: Вторая Версия (@agitstart2)
+403: Война за Империум 2.0 начата.
+404: Война за Империум 2.0 уже идёт.
+405: Война за Империум 2.0 окончена.
+406: Война за Империум 2.0 в текущее время не идёт.
+
+//407 НЕ ИСПОЛЬЗУЕТСЯ
+408: Need disconnection to perform change-sex request...
+409: Your sex has been changed (need disconnection by the server)...
+//410-411 used by cash shop
+412: Your account has 'Unregistered'.
+413: Your account has an 'Incorrect Password'...
+414: Your account has expired.
+415: Your account has been rejected from server.
+416: Your account has been blocked by the GM Team.
+417: Your Game's EXE file is not the latest version.
+418: Your account has been prohibited to log in.
+419: Server is jammed due to over populated.
+420: Your account has not more authorised.
+421: Your account has been totally erased.
+423: Your account has been banished until 
+424: Login-server has been asked to %s the player '%.*s'.
+425: The player '%.*s' doesn't exist.
+426: Your GM level don't authorise you to %s the player '%.*s'.
+427: Login-server is offline. Impossible to %s the player '%.*s'.
+428: block
+429: ban
+430: unblock
+431: unban
+432: change the sex of
+
+// Сообщения команды @makehomun
+450: У вас уже есть гомункулус
+
+// Предметы, привязанные к аккаунту
+497: Вы не можете обменивать предмет, привязанный к аккаунту!
+
+// @itembound / @itembound2
+498: Нельзя создавать привязанные к аккаунту яйца питомцев или броню.
+499: Нельзя создать предмет.
+
+// ----------------------------------------
+// Остальные сообщения
+// ----------------------------------------
+//500: НЕ ИСПОЛЬЗУЕТСЯ
+501: Срок действия вашего аккаунта: %d-%m-%Y %H:%M:%S.
+502: Наступил день
+503: Наступила ночь
+
+// Сообщения, связанные с изменением Кеш очков
+504: Использовано %d очков кафры и %d кеш очков. Осталось %d очков кафры и %d кеш очков.
+505: Получено %d кеш очков. Всего %d кеш очков.
+506: Получено %d очков кафры. Всего %d очков кафры.
+410: Удалено %d кеш очков. Всего %d кеш очков.
+411: Удалено %d очков кафры. Всего %d очков кафры.
+
+// Trade Spoof Messages
+507: This player has been banned for %d minute(s).
+508: This player hasn't been banned (Ban option is disabled).
+//509 НЕ ИСПОЛЬЗУЕТСЯ
+
+// Почтовая система
+510: У вас %d новых писем (%d непрочитано)
+
+// Сообщения анти-бота (в настоящее время не используются)
+535: Possible use of BOT (99%% of chance) or modified client by '%s' (account: %d, char_id: %d). This player ask your name when you are hidden.
+
+536: Character '%s' (account: %d) is trying to use a bot (it tries to detect a fake player).
+537: Character '%s' (account: %d) is trying to use a bot (it tries to detect a fake mob).
+// Сообщения о хаках при торгах
+538: Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+539: This player has %d of a kind of item (id: %d), and tried to trade %d of them.
+540: This player has been definitivly blocked.
+// Объявления о выбивании/краже редких предметов
+541: '%s' выбил %s's %s (шанс: %0.02f%%)
+//541: %.0s%.0sКто-то выбил %s
+542: '%s' украл %s's %s (шанс: %0.02f%%)
+//542: %.0s%.0sКто-то украл %s
+// 543~548 are not used (previously @away messages)
+// Сообщение команды @Autotrade
+549: Чтобы использовать команду @autotrade сперва вы должны открыть магазин.
+
+//550 -> 654: Названия профессий
+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: НЕ ИСПОЛЬЗУЕТСЯ
+//620: НЕ ИСПОЛЬЗУЕТСЯ
+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: Неизвестная профессия
+
+// Надгробие MvP
+656: Надгробие
+657: [ ^EE0000%s^000000 ]
+658: Встретил свою смерть...
+659: Время смерти : ^EE0000%s^000000
+660: Побеждён игроком
+661: [^EE0000%s^000000]
+
+// Остальные разные сообщения
+662: Вы находитесь слишком близко к НИП'у, вы должны быть на %d клеток дальше от любого НИП.
+663: Дуэль: Нельзя использовать данный предмет во время дуэли.
+664: Вы не можете использовать эту команду когда мертвы.
+665: Вы не можете открыть чат в этой зоне.
+666: Питомцы запрещены во время Войны за Империум.
+667: Вы не мертвы.
+668: Ваши текущие точки сохранения:
+669: Вы сломали оружие цели.
+670: Вы не можете покинуть БГ.
+671: Друг уже добавлен.
+672: Имя не найдено в списке.
+673: Это действие не может быть выполнено в данный момент. Повторите попытку позже.
+674: Друг удалён.
+675: Нельзя отправлять письма так быстро!
+676: Невозможно заключать союзы во время Войны за Империум!
+677: Невозможно разрывать союзы во время Войны за Империум!
+678: Вы больше не Глава Гильдии.
+679: Вы стали Главой Гильдии!
+680: Вы полностью восстановлены!
+
+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-899 НЕ ИСПОЛЬЗУЕТСЯ
+
+//------------------------------------
+// Сообщения ралзичных команд
+//------------------------------------
+
+// @send
+900: Использование:
+901:	@send длина <шестнадцатеричный номер пакета>
+902: 	@send <шестнадцатеричный номер пакета> {<значение>}*
+903: 	Значение: <тип=B(по умолчанию),W,L><номер> or S<длина>"<строка>"
+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 (Уровень: %d)
+916:       Группа: '%s' | Гильдия: '%s'
+917: Нет
+
+// @speed
+918: Введите значение (Использование: @speed <%d-%d>).
+
+// @storage
+919: Склад открыт.
+
+// @guildstorage
+920: Склад гильдии открыт.
+
+// @option
+921: Введите хотя бы один вариант.
+
+// @jobchange
+922: Введите ID профессии.
+923: You can not change to this job by command.
+//924-979 НЕ ИСПОЛЬЗУЮТСЯ
+
+// @kami
+980: Введите сообщение (Использование: @kami <сообщение>).
+981: Введите цвет и сообщение (Использование: @kamic <цвет> <сообщение>).
+982: Неверный цвет.
+
+// @item / @itembound
+983: Введите ID или название предмета (Использование: @%s <ID/название предмета> <количество>).
+
+// @item2 / @itembound2
+984: Введите все параметры (Использование: @%s <ID/название предмета> <количество>
+985:   <идентификация> <заточка> <атрибут> <карта1> <карта2> <карта3> <карта4>).
+
+// @baselevelup
+986: Введите уровень (Использование: @lvup/@blevel/@baselvlup <кол-во уровней>).
+
+// @joblevelup
+987: Введите уровень (Использование: @joblvup/@jlevel/@joblvlup <кол-во уровней>).
+
+// @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: Введите стиль причёски (Использование: @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/название предвета> <элемент> <насколько сильный>).
+
+// @memo
+1008: Введите правильные позиции (Использование: @memo <мемо_позиции:%d-%d>).
+
+// @displaystatus
+1009: Введите тип статуса/флаг (Использование: @displaystatus <тип статуса> <флаг> <время действия> {<значение1> {<значение2> {<значение3>}}}).
+
+// @stpoint
+1010: Введите количество (Использование: @stpoint <кол-во очков>).
+
+// @skpoint
+1011: Введите количество (Использование: @skpoint <кол-во очков>).
+
+// @zeny
+1012: Введите количество (Использование: @zeny <кол-во>).
+
+// @param
+1013: Введите значения (Использование: @str/@agi/@vit/@int/@dex/@luk <+/-регулировка>).
+
+// @guildlevelup
+1014: Введите уровень (Использование: @guildlvup/@guildlvlup <кол-во уровней>).
+
+// @makeeg
+1015: Введите ID/название монстра/питомца (Использование: @makeegg <питомец>).
+
+// @petfriendly
+1016: Введите значение (Использование: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Введите значение (Использование: @pethungry <0-100>).
+
+// @recall
+1018: Введите ник персонажа (Использование: @recall <ID/ник персонажа>).
+1019: Ваши права Администратора не позволяют перемещать кого-либо на данную локацию.
+
+// @recall
+1020: Ваши права Администратора не позволяют переместить персонажа на данную локацию с его текущей локации.
+
+// @charblock
+1021: Введите ник персонажа (Использование: @charblock/@block <ник персонажа>).
+
+// @charban
+1022: Введите время бана и ник персонажа (Использование: @charban/@ban/@banish/@charbanish <time> <ник персонажа>).
+1023: Вы не можете уменьшить время бана.
+
+// @charunblock
+1024: Введите ник персонажа (Использование: @charunblock <ник персонажа>).
+
+// @charunban
+1025: Введите ник персонажа (Использование: @charunban <ник персонажа>).
+
+// @kick
+1026: Введите ник персонажа (Использование: @kick <ID/ник персонажа>).
+
+// @questskill / @lostskill
+1027: Введите номер квестового навыка.
+
+// @spiritball
+1028: Введите количество (Использование: @spiritball <кол-во: 0-%d>).
+
+// @party
+1029: Введите название группы (Использование: @party <название_группы>).
+
+// @guild
+1030: Введите название гильдии (Использование: @guild <название_гильдии>).
+
+// @idsearch
+1031: Введите часть от названия предмета (Использование: @idsearch <часть_от_названия>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: Ваши права Администратора не позволяют переместить всех на данную локацию.
+1033: Потому что вы можете призвать персонажей не со всех локаций, %d игрока(ов) не было призвано.
+
+// @guildrecall
+1034: Введите ID/название гильдии (Использование: @guildrecall <ID/название гильдии>).
+
+// @partyrecall
+1035: Введите ID/название группы (Использование: @partyrecall <ID/название группы>).
+
+// @reloadatcommand
+1036: Ошибка чтения файла groups.conf, перезагрузка не удалась.
+1037: Ошибка чтения файла atcommand_athena.conf, перезагрузка не удалась.
+
+// @mapinfo
+1038: Введите хотя бы один номер (Использование: @mapinfo <0-3> <локация>).
+1039: ------ Информация о локации ------
+1040: Название локации: %s | Игроки: %d | НИП: %d | Чаты: %d
+1041: ------ Мапфлаги ------
+1042: Столица
+1043: Autotrade Разрешён
+1044: Autotrade Запрещён
+1045: Battlegrounds ВКЛЮЧЕНО
+1046: PvP флаги: 
+1047: Pvp ВКЛЮЧЕНО | 
+1048: NoGuild | 
+1049: NoParty | 
+1050: NightmareDrop | 
+1051: NoCalcRank | 
+1052: GvG флаги: 
+1053: GvG ВКЛЮЧЕНО | 
+1054: GvG Dungeon | 
+1055: GvG Castle | 
+1056: NoParty | 
+1057: Флаги перемещения: 
+1058: NoTeleport | 
+1059: Monster NoTeleport | 
+1060: NoWarp | 
+1061: NoWarpTo | 
+1062: NoReturn | 
+1063: NoGo | 
+1064: NoMemo | 
+1065: Нет штрафов опыта: %s | Нет штрафов Зени: %s
+1066: Включено
+1067: Выключено
+1068: No Save (Возвращение в точку сохранения)
+1069: No Save, Точка сохранения: %s,Случайные координаты
+1070: No Save, Точка сохранения: %s,%d,%d
+1071: Флаги погоды: 
+1072: Снег | 
+1073: Туман | 
+1074: Сакура | 
+1075: Облака | 
+1076: Облака 2 | 
+1077: Фейерверки | 
+1078: Листопад | 
+//1079: Дождь | 
+1080: Ночь | 
+1081: Другие флаги: 
+1082: NoBranch | 
+1083: NoTrade | 
+1084: NoVending | 
+1085: NoDrop | 
+1086: NoSkill | 
+1087: NoIcewall | 
+1088: AllowKS | 
+1089: Reset | 
+1090: Другие флаги: 
+1091: NoCommand | 
+1092: NoBaseEXP | 
+1093: NoJobEXP | 
+1094: NoMobLoot | 
+1095: NoMVPLoot | 
+1096: PartyLock | 
+1097: GuildLock | 
+1098: ----- Игроки на локации -----
+1099: Игрок '%s' (сессия #%d) | Локация: %d,%d
+1100: ----- НИП на локации---
+1101: Север
+1102: Северо-Запад
+1103: Запад
+1104: Юго-Запад
+1105: Юг
+1106: Юго-Восток
+1107: Восток
+1108: Северо-Восток
+1109: Север
+1110: Неизвестно
+1111: НИП %d: %s | Направление: %s | Спрайт: %d | Локация: %d %d
+1112: НИП %d: %s::%s | Направление: %s | Спрайт: %d | Локация: %d %d 
+1113: ----- Чаты на локации -----
+1114: Чат: %s | Персонажи: %s | Локация: %d %d
+1115:    Игроки: %d/%d | Пароль: %s | Публичный: %s
+1116: Да
+1117: Нет
+1118: Введите хотя бы один номер (Использование: @mapinfo <0-3> <локация>).
+
+// @mount
+1119: Вы оседлали Дракона.
+1120: Вы отпустили Дракона.
+1121: Вы оседлали Варга.
+1122: Вы отпустили Варга.
+1123: Вы оседлали МЕХА.
+1124: Вы отпустили МЕХА.
+
+// @guildspy
+1125: В Сервере Локаций нет разрешения на шпионаж.
+1126: Введите ID/название гильдии (Использование: @guildspy <ID/название гильдии>).
+
+// @partyspy
+1127: Введите ID/название группы (Использование: @partyspy <ID/название группы>).
+
+// @nuke
+1128: Введите ник персонажа (Использование: @nuke <ник персонажа>).
+
+// @tonpc
+1129: Введите название НИП (Использование: @tonpc <название НИП>).
+
+// @enablenpc
+1130: Введите название НИП (Использование: @enablenpc <название НИП>).
+
+// @hidenpc
+1131: Введите название НИП (Использование: @hidenpc <название НИП>).
+
+// @loadnpc
+1132: Введите название файла со скриптом (Использование: @loadnpc <название файла>).
+
+// @npcoff
+1133: Введите название НИП (Использование: @npcoff <название НИП>).
+
+// @jail
+1134: Введите ник персонажа (Использование: @jail <ник персонажа>).
+
+// @unjail
+1135: Введите ник персонажа (Использование: @unjail/@discharge <ник персонажа>).
+
+// @jailfor
+1136: Неверный формат времени для команды отправления в тюрьму.
+1137: Вы сейчас
+1138: Персонаж сейчас
+
+// @jailtime
+1139: Вы не в тюрьме.
+1140: Вы заключены в тюрьму на неопределённый срок.
+1141: Ваш срок неопределён.
+1142: Вы останетесь в тюрьме.
+
+// @disguise
+1143: Введите ID/название монстра/НИП (Использование: @disguise <название/ID>).
+1144: Персонаж не может быть замаскирован, пока он находится на ездовом животном.
+
+// @disguiseall
+1145: Введите ID/название монстра/НИП (Использование: @disguiseall <название/ID>).
+
+// @disguiseguild
+1146: Введите ID/название монстра и ID/название гильдии (Использование: @disguiseguild <ID/название монстра>, <ID/название гильдии>).
+
+// @undisguiseguild
+1147: Введите ID/название гильдии (Использование: @undisguiseguild <ID/название гильдии>).
+
+// @exp
+1148: Базовый уровень: %d (%.3f%%) | Уровень профессии: %d (%.3f%%)
+
+// @broadcast
+1149: Введите сообщение (Использование: @broadcast <сообщение>).
+
+// @localbroadcast
+1150: Введите сообщение (Использование: @localbroadcast <сообщение>).
+
+// @email
+1151: Введите 2 E-mail адреса (Использование: @email <текущий@email> <новый@email>).
+
+// @effect
+1152: Введите номер эффекта (Использование: @effect <номер эффекта>).
+
+// @npcmove
+1153: Использование: @npcmove <X> <Y> <название НИП>
+1154: НИП находится на другой локации.
+1155: НИП перемещён.
+
+// @addwarp
+1156: Использование: @addwarp <локация> <X> <Y> <название НИП>
+1157: Неизвестная локация '%s'.
+1158: Новый портал '%s' создан.
+
+// @follow
+1159: Режим преследования деактивирован.
+1160: Режим преследования активирован.
+
+// @storeall
+1161: Сейчас вы не можете пользоваться сундуком.
+1162: Все предметы перемещены в сундук.
+
+// @skillid
+1163: Введите ID/название навыка для просмотра (Использование: @skillid <ID/название>).
+1164: Навык %d: %s
+
+// @useskill
+1165: Использование: @useskill <ID навыка> <уровень навыка> <target>
+
+// @displayskill
+1166: Использование: @displayskill <ID навыка> {<уровень навыка>}
+
+// @skilltree
+1167: Использование: @skilltree <ID навыка> <target>
+1168: Персонаж использует дерево навыков профессии %s (%d базовых очков).
+1169: Персонаж не может использовать такой навык.
+1170: Необходимый уровень навыка персонажа %d навыка %s.
+1171: Персонаж отвечает всем требованиям для этого навыка.
+
+// @marry
+1172: Использование: @marry <ник персонажа>
+1173: Они поженились... желаем удачи.
+1174: Данная пара не может пожениться, т.к. один из них либо является ребёнком, либо уже состоит в браке.
+
+// @divorce
+1175: '%s' не состоит в браке.
+1176: '%s' и его/её супруг(а) разведены.
+
+// @changelook
+1177: Использование: @changelook {<позиция>} <view id>
+1178: Поизиции: 1-Верх головы 2-Середина головы 3-Низ головы 4-Оружие 5-Щит 6-Обувь 7-Накидка
+
+// @autotrade
+1179: Автоматическая торговля запрещена на этой локации.
+1180: Вы не можете торговать когда мертвы.
+
+// @changegm
+1181: Вы должны быть лидером гильдии, чтобы использовать эту команду.
+1182: Вы не можете изменить лидера гильдии на этой локации.
+1183: Использование: @changegm <ник согильдийца>
+1184: Указанный персонаж должен быть в игре и состоять в вашей гильдии.
+
+// @changeleader
+1185: Использование: @changeleader <ник согруппника>
+
+// @partyoption
+1186: Использование: @partyoption <распределение опыта: yes/no> <распределение предметов: yes/no>
+
+// @autoloot
+1187: Автоматическое поднятие предметов с шансом выпадения %0.02f%% и ниже.
+1188: Автоматическое поднятие выключено.
+
+// @autolootitem
+1189: Предмет не найден.
+1190: Этот предмет вы уже собираете автоматически.
+1191: Список автоматической сборки полон. Удалите некоторые предметы через команду @autolootid -<ID/название предмета>.
+1192: Автоматическое поднятие предмета: '%s'/'%s' {%d}
+1193: Этот предмет вы не собираете автоматически.
+1194: Предмет: '%s'/'%s' {%d} удалён из списка автоматической сборки предметов.
+1195: Вы можете иметь %d предметов в списке автоматической сборки предметов.
+1196: Чтобы добавить предмет в список используйте "@alootid +<ID/название предмета>". Чтобы удалить предмет из списка: "@alootid -<ID/название предмета>".
+1197: Команда "@alootid reset" очистит список.
+1198: Список автоматической сборки пуст.
+1199: Предеты в списке:
+1200: Список автоматической сборки очищен.
+
+// @rain
+//1201: The rain has stopped.
+//1202: It has started to rain.
+
+// @snow
+1203: Снег больше не падает.
+1204: Снег начал падать.
+
+// @sakura
+1205: Листья сакуры больше не падают.
+1206: Листья сакуры начали падать.
+
+// @clouds
+1207: Облака исчезли.
+1208: Облака появились.
+
+// @clouds2
+1209: Альтернативные облака исчезли.
+1210: Альтернативные облака появились.
+
+// @fog
+1211: Туман рассеян.
+1212: Туман повис над местностью.
+
+// @leaves
+1213: Листопад окончен.
+1214: Листопад начался.
+
+// @fireworks
+1215: Фейерверки окончены.
+1216: Фейерверки запущены.
+
+// @sound
+1217: Введите название музыкального файла (Использование: @sound <название файла>).
+
+// @mobsearch
+1218: Введите ID/название монстра (Использование: @mobsearch <ID/название монстра>).
+1219: Неверный ID монстра %s!
+1220: Поиск монстра... %s %s
+
+// @cleanmap
+1221: Все упавшие предметы на локации исчезли.
+
+// @npctalk
+1222: Введите корректные параметры (Использование: @npctalk <имя НИП>, <сообщение>).
+1223: Введите корректные параметры (Использование: @npctalkc <цвет> <имя НИП>, <сообщение>).
+
+// @pettalk
+1224: Введите сообщение (Использование: @pettalk <сообщение>).
+
+// @summon
+1225: Введите ID/название монстра (Использование: @summon <ID/название монстра> {время действия}).
+
+// @adjgroup
+1226: Использование: @adjgroup <ID группы>
+1227: Такой группы не существует.
+1228: Группа изменена.
+1229: Ваша группа изменена.
+
+// @trade
+1230: Введите ник персонажа (Использование: @trade <ник персонажа>).
+
+// @setbattleflag
+1231: Использование: @setbattleflag <флаг> <значение>
+1232: Неизвестный флаг battle_config.
+1233: Флаг battle_config установлен.
+
+// @unmute
+1234: Введите ник персонажа (Использование: @unmute <ник персонажа>).
+1235: Персонаж не безмолвен.
+1236: Безмолвие персонажа выключено.
+
+// @mute
+1237: Использование: @mute <время> <ник персонажа>
+
+// @identify
+1238: Нет предметов для идентефикации.
+
+// @mobinfo
+1239: Введите ID/название монстра (Использование: @mobinfo <ID/название монстра>).
+1240: MVP монстр: '%s'/'%s'/'%s' (%d)
+1241: Монстр: '%s'/'%s'/'%s' (%d)
+1242:  Ур.:%d  HP:%d  Базовый опыт:%u   Проф. опыт:%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  Дальность:%d~%d~%d  Размер:%s  Раса: %s  Элемент: %s (Ур.:%d)
+1245:  Предметы:
+1246: С этого монстра не падают предметы.
+1247:  MVP бонус к опыту:%u
+1248:  MVP предметы:
+1249:  Этот монстр не имеет MVP призов.
+
+// @showmobs
+1250: Неверный ID монстра %s!
+1251: Нельзя показывать боссов!
+1252: Поиск монстра... %s %s
+
+// @homlevel
+1253: Введите уровень (Использование: @homlevel <кол-во уровней>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: У вас нет гомункулуса.
+
+// @homevolve
+1255: Ваш гомункулус не эволюционируется.
+
+// @makehomun
+1256: Введите ID гомункулуса (Использование: @makehomun <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: Статистика: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Статистика роста гомункулуса (Уровень %d %s):
+1267: Макс HP: %d (%d~%d)
+1268: Макс 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: Статистика гомункулуса изменилась.
+
+// @iteminfo
+1276: Введите ID/название предмета (Использование: @ii/@iteminfo <ID/название предмета>).
+1277: Предмет: '%s'/'%s'[%d] (%d) Тип: %s | Доп. эффект: %s
+1278: Пусто
+1279: Скрипт
+1280: НИП покупка:%d зени, продажа:%d зени | Вес: %.1f 
+1281:  - Предмет можно только купить в магазинах.
+1282:  - Максимальный шанс выпадения из монстров: %02.02f%%
+1283:  - Из монстров нельзя выбить этот предмет.
+
+// @whodrops
+1284: Введите ID/название предмета (Использование: @whodrops <ID/название предмета>).
+1285: Предмет: '%s'[%d]
+1286:  - Предмет не падает с монстров.
+1287:  - Обычные монстры с высоким шансом выпадения (перечислено только %d):
+
+// @whereis
+1288: Введите ID/название монстра (Использование: @whereis <ID/название монстра>).
+1289: Возрождение %s в:
+1290: Этот монстр не возраждается просто так.
+
+// @adopt
+1291: Использование: @adopt <отец>,<мать>,<ребёнок>
+1292: Усыновление: --%s--%s--%s--\n
+1293: Персонаж %s не в сети.
+1294: Теперь они семья... желаем им счастья!
+
+// @version
+1295: Версия rAthena r%s
+1296: Невозможно определить версию.
+
+// @mutearea
+1297: Введите время в минутах (Использование: @mutearea/@stfu <time in minutes>).
+
+// @rates
+1298: Получение опыта: Базовый ур. %.2fx / Профессия %.2fx
+1299: Обычные рейты на выпадение: Общие %.2fx / Исцеляющие %.2fx / Используемые %.2fx / Экипировка %.2fx / Карты %.2fx
+1300: Рейты выпадение из боссов: Общие %.2fx / Исцеляющие %.2fx / Используемые %.2fx / Экипировка %.2fx / Карты %.2fx
+1301: Остальные рейты на выпадение: MvP %.2fx / На основе карт %.2fx / Сундуки %.2fx
+
+// @me
+1302: Введите сообщение (Использование: @me <сообщение>).
+
+// @size / @sizeall / @sizeguild
+1303: Размер изменился.
+
+// @sizeguild
+1304: Введите ID/название гильдии (Использование: @sizeguild <размер> <ID/название гильдии>).
+
+// @monsterignore
+1305: Вы защещены от атак.
+1306: Вы вернулись в нормальное состояние.
+
+// @fakename
+1307: Реальный ник вернулся.
+1308: Вы должны ввести ник.
+1309: Фальшивый ник не может быть короче 2 символов.
+1310: Фальшивый ник включен.
+
+// @mapflag
+1311: Мапфлаги этой локации:
+1312: Использование: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Используйте "@mapflag available" для получения списка включенных мапфлагов этой локации.
+1314: Неверное имя или индекс флага.
+1315: Доступные мапфлаги:
+
+// @showexp
+1316: Сообщения о полученном опыте больше не показываются. 
+1317: Сообщения о полученном опыте показываются. 
+
+// @showzeny
+1318: Сообщения о полученных Зени больше не показываются.
+1319: Сообщения о полученных Зени показываются.
+
+// @showdelay
+1320: Сообщения задержки навыка больше не показывается.
+1321: Сообщения задержки навыка показывается.
+
+// @cash
+1322: Введите количество.
+
+// @feelreset
+1324: 'Feeling' локации сброшены.
+
+// @noks
+1325: [ Защита от K.S деактивирована ]
+1326: [ Защита от K.S активирована - Опция: Группа ]
+1327: [ Защита от K.S активирована - Опция: Сам ]
+1328: [ Защита от K.S активирована - Опция: Гильдия ]
+1329: Использование: @noks <self|party|guild>
+
+// @allowks
+1330: [ Защита от K.S на данной локации разрешена ]
+1331: [ Защита от K.S на данной локации запрещена ]
+
+// @itemlist
+1332: ------ список предметов из %s персонажа '%s' ------
+1333:  | Экипировано: 
+1334: одежда, 
+1335: левый аксессуар, 
+1336: тело/броня, 
+1337: правая рука, 
+1338: левая рука, 
+1339: обе руки, 
+1340: обувь, 
+1341: правый аксессуар, 
+1342: нижняя часть головы, 
+1343: верхняя часть головы, 
+1344: верхняя/нижняя часть головы, 
+1345: середина головы, 
+1346: середина/нижняя часть головы, 
+1347: вся голова, 
+1348:  -> (яйцо питомца, id питомца: %u, переименован)
+1349:  -> (яйцо питомца, id питомца: %u, не переименован)
+1350:  -> (созданый предмет, id создателя: %u, звёздные крошки %d, элемент: %d)
+1351:  -> (созданый предмет, id создателя: %u)
+1352:  -> (карта(ы): 
+1353: У персонажа %s не найдены предметы.
+1354: %d предмет(ов) найдено %d %s слота.
+
+// @delitem
+1355: Введите ID/название предмета, количество и ник персонажа (Использование: #delitem <ник персонажа> <ID/название предмета> <кол-во>).
+
+// @font
+1356: Стандартный шрифт вернулся.
+1357: Использование @font <1-9> для изменения шрифта сообщений.
+1358: Используйте 0 или без значения для возврата к стандартному шрифту.
+1359: Неверный шрифт. Используйте шрифт от 0 до 9.
+1360: Шрифт изменён.
+1361: Этот шрифт уже используется.
+
+// @new_mount
+1362: ВНИМАНИЕ: Если появляются ошибки, то ваши LUA устарели.
+1363: Вы оседлали ездовое животное.
+1364: Вы отпустили ездовое животное.
+
+// @accinfo
+1365: Использование: @accinfo/@accountinfo <ID аккаунта/ник персонажа>
+1366: Вы можете искать часть названия, используя '%' в поиске, например. "@accinfo %Mario%" покажет всех персонажей, ники которых содержат "Mario".
+
+// @set
+1367: Использование: @set <название переменной> <значение>
+1368: Использование: прим. "@set PoringCharVar 50"
+1369: Использование: прим. "@set PoringCharVarSTR$ Super Duper String"
+1370: Использование: прим. "@set PoringCharVarSTR$" будет иметь значение "Super Duper String".
+1371: Переменные НИП не могут быть использованы командой @set.
+1372: Переменные групп не могут быть использованы командой @set.
+1373: %s значение :%d
+1374: %s значение :%s
+1375: %s пусто
+1376: %s данные не поддерживаются :%u
+
+// @reloadquestdb
+1377: База данных квестов перезагружены.
+
+// @addperm
+1378: Использование: %s <название_прав>
+1379: -- Список прав
+1380: '%s' неизвестное право.
+1381: Игрок '%s' уже обладает правом: '%s'.
+1382: Игрок '%s' не обладает правом: '%s'.
+1383: -- Права игрока '%s'
+1384: Права игрока '%s' обновлены. Изменения носят временный характер.
+
+// @unloadnpcfile
+1385: Использование: @unloadnpcfile <имя файла>
+1386: Файл выгружен. Обратите внимание, что мапфлаги, установленные в файле, не удалились.
+1387: Файл не найден.
+
+// Общие сообщения команд
+1388: Команда персонажа не удалась (Использование: %c<команда> <ник персонажа> <параметры>).
+1389: Команда %s не удалась. Персонаж не найден.
+ 
+// @cart
+1390: Неизвестная телега (используйте: %s <0-%d>).
+1391: У вас нет телеги.
+1392: Телега добавлена.
+
+// atcommand.c::is_atcommand
+1393: Вы не можете использовать команды когда мертвы.
+ 
+// @clearstorage
+1394: Ваш склад очищен.
+1395: Склад вашей гильдии очищен.
+
+// @clearcart
+1396: У вас нет телеги.
+1397: Ваша телега очищена.
+
+// @skillid (расширение)
+1398: -- Показаны первые %d из частисчного совпадения:
+
+// @join
+1399: Неизвестный канал (Используйте: %s <#название_канала>)
+1400: Неизвестный канал '%s' (Используйте: %s <#название_канала>)
+1401: Канал '%s' защищён паролем (Используйте: %s <#название_канала> <пароль>)
+1402: Вы не подключены к этому каналу, введите '@join <#название_канала>'
+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_password>
+1416: -- Создать новый канал.
+1417: * %s list
+1418: -- Список публичных каналов.
+1419: * %s list colors
+1420: -- Список всех доступных цветов для пользовательских каналов.
+1421: * %s setcolor <#название_канала> <color_name>
+1422: -- Изменить цвет сообщений канала (доступно только для владльцев).
+1423: * %s leave <#название_канала>
+1424: -- Отключиться от указанного канала.
+1425: Вы не подключены к каналау '%s'.
+1426: Вы отключены от канала '%s'.
+1427: * %s bindto <#название_канала>
+1428: -- Привязать общий чат к указанному каналу, что позволит отправленные в общий чат сообщения публиковать в этом канале.
+1429: * %s unbind
+1430: -- Отвязать все каналы от общего чата, если такие имеются.
+1431: Общий чат привязан к каналу '%s'.
+1432: Общий чат ни к какому каналу не привязан.
+1433: Общий чат отвязан от канала '#%s'.
+1434: Вы уже подключены к каналу '%s'.
+1435: Вы подключены к каналу '#%s' на локации '%s'.
+
+// Пользовательский перевод
+//import: conf/msg_conf/import/map_msg_rus_conf.txt

+ 30 - 16
src/char/char.c

@@ -14,6 +14,7 @@
 #include "../common/utils.h"
 #include "../common/cli.h"
 #include "../common/random.h"
+#include "../common/ers.h"
 #include "int_guild.h"
 #include "int_homun.h"
 #include "int_mercenary.h"
@@ -4343,20 +4344,34 @@ int parse_char(int fd)
 }
 
 // Console Command Parser [Wizputer]
-int parse_console(const char* command)
+int parse_console(const char* buf)
 {
-	ShowNotice("Console command: %s\n", command);
+	char type[64];
+	char command[64];
+	int n=0;
 
-	if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 || strcmpi("end", command) == 0 )
-		runflag = 0;
-	else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
+	if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 ){
+		if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
+	}
+	if( n != 2 ){ //end string
+		command[0] = '\0';
+	}
+	ShowNotice("Type of command: '%s' || Command: '%s'\n",type,command);
+
+	if( n == 2 && strcmpi("server", type) == 0 ){
+		if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
+			runflag = 0;
+		}
+		else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
 		ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
-	else if( strcmpi("help", command) == 0 )
-	{
-		ShowInfo("To shutdown the server:\n");
-		ShowInfo("  'shutdown|exit|quit|end'\n");
-		ShowInfo("To know if server is alive:\n");
-		ShowInfo("  'alive|status'\n");
+	}
+	else if( strcmpi("ers_report", type) == 0 ){
+		ers_report();
+	}
+	else if( strcmpi("help", type) == 0 ){
+		ShowInfo("Command available :\n");
+		ShowInfo("\t server:shutdown|alive => stop server\n");
+		ShowInfo("\t ers_report => display the db usage\n");
 	}
 
 	return 0;
@@ -5182,11 +5197,6 @@ int do_init(int argc, char **argv)
 	add_timer_func_list(online_data_cleanup, "online_data_cleanup");
 	add_timer_interval(gettick() + 1000, online_data_cleanup, 0, 0, 600 * 1000);
 
-	if( console )
-	{
-		//##TODO invoke a CONSOLE_START plugin event
-	}
-
 	//Cleaning the tables for NULL entrys @ startup [Sirius]
 	//Chardb clean
 	if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '0'", char_db) )
@@ -5215,6 +5225,10 @@ int do_init(int argc, char **argv)
 		runflag = CHARSERVER_ST_RUNNING;
 	}
 
+	if( console ){ //start listening
+		add_timer_func_list(parse_console_timer, "parse_console_timer");
+		add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
+	}
 	return 0;
 }
 

+ 53 - 7
src/common/cli.c

@@ -1,12 +1,18 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#ifdef WIN32
+	#include <conio.h>
+#else
+	#include <sys/poll.h>
+#endif
 
 #include "cbasetypes.h"
 #include "showmsg.h"
 #include "core.h"
 #include "cli.h"
 
+//map confs
 char* MAP_CONF_NAME;
 char* INTER_CONF_NAME;
 char* LOG_CONF_NAME;
@@ -14,15 +20,21 @@ char* BATTLE_CONF_FILENAME;
 char* ATCOMMAND_CONF_FILENAME;
 char* SCRIPT_CONF_NAME;
 char* GRF_PATH_FILENAME;
-//char
+//char confs
 char* CHAR_CONF_NAME;
 char* SQL_CONF_NAME;
-//login
+//login confs
 char* LOGIN_CONF_NAME;
-//common
+//common conf (used by multiple serv)
 char* LAN_CONF_NAME; //char-login
 char* MSG_CONF_NAME_EN; //all
 
+/*
+ * Function to check if specified option have an argument follow it
+ * return
+ *   false : no other args found, and throw a warning
+ *   true : something following us
+ */
 bool opt_has_next_value(const char* option, int i, int argc)
 {
     if (i >= argc - 1) {
@@ -33,19 +45,27 @@ bool opt_has_next_value(const char* option, int i, int argc)
     return true;
 }
 
-/*======================================================
- * Servers Version Screen [MC Cameri]
- *------------------------------------------------------*/
+/*
+ * Display some info about emulator such as
+ *   svn version
+ *   website/forum adresse
+ *   irc hangout
+ */
 void display_versionscreen(bool do_exit)
 {
     ShowInfo(CL_WHITE"rAthena SVN version: %s" CL_RESET"\n", get_svn_revision());
     ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://rathena.org/\n");
-    ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rathena.net/#rathena\n");
+    ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rizon.net/#rathena\n");
     ShowInfo("Open "CL_WHITE"readme.txt"CL_RESET" for more information.\n");
     if (do_exit)
 	exit(EXIT_SUCCESS);
 }
 
+/*
+ * Read the option specify in command line
+ * and assign the confs used by the different server
+ * exit on failure or return true
+ */
 int cli_get_options(int argc, char ** argv)
 {
     int i = 0;
@@ -135,3 +155,29 @@ int cli_get_options(int argc, char ** argv)
     }
     return 1;
 }
+
+int cli_hasevent(){
+#ifdef WIN32
+	return _kbhit();
+#else
+	struct pollfd fds;
+	fds.fd = 0; /* this is STDIN */
+	fds.events = POLLIN;
+	return poll(&fds, 1, 0);
+#endif
+}
+
+int parse_console_timer(int tid, unsigned int tick, int id, intptr_t data) {
+	char buf[MAX_CONSOLE_IN]; //max cmd atm is 63+63+63+3+3
+
+	memset(buf,0,MAX_CONSOLE_IN); //clear out buf
+
+	if(cli_hasevent()){
+		if(fgets(buf, MAX_CONSOLE_IN, stdin)==NULL)
+			return -1;
+		else if(strlen(buf)>MIN_CONSOLE_IN)
+			parse_console(buf);
+	}
+	return 0;
+}
+

+ 4 - 0
src/common/cli.h

@@ -12,6 +12,8 @@
 extern "C" {
 #endif
 
+#define MAX_CONSOLE_IN 200 //max is map...
+#define MIN_CONSOLE_IN 4 //min is help
 //map
  extern char* MAP_CONF_NAME;
  extern char* INTER_CONF_NAME;
@@ -31,6 +33,8 @@ extern "C" {
 
 extern void display_helpscreen(bool exit);
 int cli_get_options(int argc, char ** argv);
+int parse_console_timer(int tid, unsigned int tick, int id, intptr_t data);
+extern int parse_console(const char* buf); //particular for each serv
 
 #ifdef	__cplusplus
 }

+ 16 - 11
src/common/msg_conf.c

@@ -6,10 +6,10 @@
 #include "msg_conf.h"
 #include "showmsg.h"
 
-//-----------------------------------------------------------
-// Return the message string of the specified number by [Yor]
-//-----------------------------------------------------------
-
+/*
+ * Return the message string of the specified number by [Yor]
+ * (read in table msg_table, with specified lenght table in size)
+ */
 const char* _msg_txt(int msg_number,int size, char ** msg_table)
 {
     if (msg_number >= 0 && msg_number < size &&
@@ -19,9 +19,10 @@ const char* _msg_txt(int msg_number,int size, char ** msg_table)
     return "??";
 }
 
-/*==========================================
- * Read Message Data
- *------------------------------------------*/
+
+/*
+ * Read txt file and store them into msg_table
+ */
 int _msg_config_read(const char* cfgName,int size, char ** msg_table)
 {
 	int msg_number;
@@ -62,9 +63,9 @@ int _msg_config_read(const char* cfgName,int size, char ** msg_table)
 	return 0;
 }
 
-/*==========================================
- * Cleanup Message Data
- *------------------------------------------*/
+/*
+ * Destroy msg_table (freeup mem)
+ */
 void _do_final_msg(int size, char ** msg_table){
     int i;
     for (i = 0; i < size; i++)
@@ -89,6 +90,10 @@ int msg_langstr2langtype(char * langtype){
 	return lang;
 }
 
+/*
+ * lookup a langtype into his associate lang string
+ * return ?? if not found
+ */
 const char* msg_langtype2langstr(int langtype){
 	switch(langtype){
 		case 0: return "English (ENG)";
@@ -119,4 +124,4 @@ int msg_checklangtype(int lang, bool display){
 		ShowDebug("Unsupported langtype '%d'.\n",lang);
 	}
 	return -2;
-}
+}

+ 4 - 0
src/common/msg_conf.h

@@ -23,9 +23,13 @@ enum lang_types {
 // 0xFF will enable all, while 0x00 will enable English only.
 #define LANG_ENABLE 0x00
 
+//read msg in table
 const char* _msg_txt(int msg_number,int size, char ** msg_table);
+//store msg from txtfile into msg_table
 int _msg_config_read(const char* cfgName,int size, char ** msg_table);
+//clear msg_table
 void _do_final_msg(int size, char ** msg_table);
+//Lookups
 int msg_langstr2langtype(char * langtype);
 const char* msg_langtype2langstr(int langtype);
 // Verify that the choosen langtype is enabled.

+ 49 - 35
src/login/login.c

@@ -12,6 +12,7 @@
 #include "../common/timer.h"
 #include "../common/msg_conf.h"
 #include "../common/cli.h"
+#include "../common/ers.h"
 #include "account.h"
 #include "ipban.h"
 #include "login.h"
@@ -366,49 +367,61 @@ int login_lan_config_read(const char *lancfgName)
 //-----------------------
 // Console Command Parser [Wizputer]
 //-----------------------
-int parse_console(const char* command)
-{
-	ShowNotice("Console command: %s\n", command);
+int parse_console(const char* buf){
+	char type[64];
+	char command[64];
+	int n=0;
 
-	if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 || strcmpi("end", command) == 0 )
-		runflag = 0;
-	else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
-		ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
-	else if( strcmpi("help", command) == 0 )
-	{
-		ShowInfo("To shutdown the server:\n");
-		ShowInfo("  'shutdown|exit|quit|end'\n");
-		ShowInfo("To know if server is alive:\n");
-		ShowInfo("  'alive|status'\n");
-		ShowInfo("To create a new account:\n");
-		ShowInfo("  'create'\n");
+	if( ( n = sscanf(buf, "%127[^:]:%255[^\n\r]", type, command) ) < 2 ){
+		if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
 	}
-	else
-	{// commands with parameters
-		char cmd[128], params[256];
+	if( n != 2 ){ //end string
+		command[0] = '\0';
+	}
+	ShowNotice("Type of command: '%s' || Command: '%s'\n",type,command);
 
-		if( sscanf(command, "%127s %255[^\r\n]", cmd, params) < 2 )
-		{
-			return 0;
+	if( n == 2){
+		if(strcmpi("server", type) == 0 ){
+			if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
+				runflag = 0;
+			}
+			else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
+			ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
 		}
-
-		if( strcmpi(cmd, "create") == 0 )
+		if( strcmpi("create",type) == 0 )
 		{
-			char username[NAME_LENGTH], password[NAME_LENGTH], sex;
-
-			if( sscanf(params, "%23s %23s %c", username, password, &sex) < 3 || strnlen(username, sizeof(username)) < 4 || strnlen(password, sizeof(password)) < 1 )
-			{
-				ShowWarning("Console: Invalid parameters for '%s'. Usage: %s <username> <password> <sex:F/M>\n", cmd, cmd);
+			char username[NAME_LENGTH], password[NAME_LENGTH], md5password[32+1], sex; //23+1 plaintext 32+1 md5
+			bool md5 = 0;
+			if( sscanf(command, "%23s %23s %c", username, password, &sex) < 3 || strnlen(username, sizeof(username)) < 4 || strnlen(password, sizeof(password)) < 1 ){
+				ShowWarning("Console: Invalid parameters for '%s'. Usage: %s <username> <password> <sex:F/M>\n", type, type);
 				return 0;
 			}
-
-			if( mmo_auth_new(username, password, TOUPPER(sex), "0.0.0.0") != -1 )
-			{
+			if( login_config.use_md5_passwds ){
+				MD5_String(password,md5password);
+				md5 = 1;
+			}
+			if( mmo_auth_new(username,(md5?md5password:password), TOUPPER(sex), "0.0.0.0") != -1 ){
 				ShowError("Console: Account creation failed.\n");
 				return 0;
 			}
 			ShowStatus("Console: Account '%s' created successfully.\n", username);
 		}
+	}
+	else if( strcmpi("ers_report", type) == 0 ){
+		ers_report();
+	}
+	else if( strcmpi("help", type) == 0 ){
+		ShowInfo("Command available :\n");
+		ShowInfo("\t server:shutdown|alive => stop|chk server\n");
+		ShowInfo("\t ers_report => display the db usage\n");
+		ShowInfo("\t create:<username> <password> <sex:F|M> => create new account\n");
+	}
+
+	else
+	{// commands with parameters
+
+
+
 	}
 
 	return 0;
@@ -1916,10 +1929,6 @@ int do_init(int argc, char** argv)
 		}
 	}
 
-	if( login_config.console ) {
-		//##TODO invoke a CONSOLE_START plugin event
-	}
-
 	// server port open & binding
 	if( (login_fd = make_listen_bind(login_config.login_ip,login_config.login_port)) == -1 ) {
 		ShowFatalError("Failed to bind to port '"CL_WHITE"%d"CL_RESET"'\n",login_config.login_port);
@@ -1934,6 +1943,11 @@ int do_init(int argc, char** argv)
 	ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %u).\n\n", login_config.login_port);
 	login_log(0, "login server", 100, "login server started");
 
+	if( login_config.console ) {
+		add_timer_func_list(parse_console_timer, "parse_console_timer");
+		add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
+	}
+
 	return 0;
 }
 

+ 28 - 28
src/map/atcommand.c

@@ -9076,38 +9076,38 @@ ACMD_FUNC(fontcolor)
 
 ACMD_FUNC(langtype)
 {
-	char langtype[8];
-	int lang=-1;
-	memset(langtype, '\0', sizeof(langtype));
+	char langstr[8];
+	int i=0, test=0; char output[100];
 
-	if(sscanf(message, "%3s", langtype) < 1){
-		clif_displaymessage(fd,msg_txt(sd,460)); // Please enter a valid language (usage: @langtype <language>).
-	}
+	memset(langstr, '\0', sizeof(langstr));
+	memset(output, '\0', sizeof(output));
 
-	lang = msg_langstr2langtype(langtype); //Switch langstr to associated langtype
-	if( msg_checklangtype(lang,false) == 1 ){ //Verify it's enabled and set it
-		char output[100];
-		pc_setaccountreg(sd, "#langtype", lang); //For login/char
-		sd->langtype = lang;
-		sprintf(output,msg_txt(sd,461),msg_langtype2langstr(lang)); // Language is now set to %s.
-		clif_displaymessage(fd,output);
-		return 0;
-	} else if (lang != -1) {
- 		clif_displaymessage(fd,msg_txt(sd,462)); // This langage is currently disabled.
-		return -1;
-	} else {
-		int i=0, test=0; char output[100];
-		clif_displaymessage(fd,msg_txt(sd,464)); // Available languages:
-		while(test!=-1){ //out of range
-			test = msg_checklangtype(i,false);
-			if(test == 1) {
-				sprintf(output,"%s\n",msg_langtype2langstr(i));
-				clif_displaymessage(fd,output);
-			}
-			i++;
+	if(sscanf(message, "%3s", langstr) >= 1){
+		int lang=-1;
+		lang = msg_langstr2langtype(langstr); //Switch langstr to associated langtype
+		if( msg_checklangtype(lang,false) == 1 ){ //Verify it's enabled and set it
+			char output[100];
+			pc_setaccountreg(sd, "#langtype", lang); //For login/char
+			sd->langtype = lang;
+			sprintf(output,msg_txt(sd,461),msg_langtype2langstr(lang)); // Language is now set to %s.
+			clif_displaymessage(fd,output);
+			return 0;
+		} else if (lang != -1) { //defined langage but failed check
+			clif_displaymessage(fd,msg_txt(sd,462)); // This langage is currently disabled.
+			return -1;
 		}
-		return -1;
 	}
+
+	//wrong or no entry
+	clif_displaymessage(fd,msg_txt(sd,460)); // Please enter a valid language (usage: @langtype <language>).
+	clif_displaymessage(fd,msg_txt(sd,464)); // Available languages:
+	while(test!=-1){ //out of range
+		test = msg_checklangtype(i,false);
+		if(test == 1) 
+			clif_displaymessage(fd,msg_langtype2langstr(i));
+		i++;
+	}
+	return -1;
 }
 
 ACMD_FUNC(reloadmsgconf)

+ 3 - 1
src/map/homunculus.c

@@ -310,7 +310,9 @@ int merc_hom_levelup(struct homun_data *hd)
 		return 0;
 	}
 
-	if(((m_class&HOM_REG) && hd->homunculus.level >= battle_config.hom_max_level) || ((m_class&HOM_S) && hd->homunculus.level >= battle_config.hom_S_max_level) || !hd->exp_next || hd->homunculus.exp < hd->exp_next)
+	if(((m_class&HOM_REG) && hd->homunculus.level >= battle_config.hom_max_level)
+		|| ((m_class&HOM_S) && hd->homunculus.level >= battle_config.hom_S_max_level)
+		|| !hd->exp_next || hd->homunculus.exp < hd->exp_next)
 		return 0;
 
 	hom = &hd->homunculus;

+ 52 - 65
src/map/map.c

@@ -3100,8 +3100,7 @@ static int char_ip_set = 0;
 /*==========================================
  * Console Command Parser [Wizputer]
  *------------------------------------------*/
-int parse_console(const char* buf)
-{
+int parse_console(const char* buf){
 	char type[64];
 	char command[64];
 	char map[64];
@@ -3114,65 +3113,51 @@ int parse_console(const char* buf)
 	memset(&sd, 0, sizeof(struct map_session_data));
 	strcpy(sd.status.name, "console");
 
-	if( ( n = sscanf(buf, "%63[^:]:%63[^:]:%63s %hd %hd[^\n]", type, command, map, &x, &y) ) < 5 )
-	{
-		if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 )
-		{
-			n = sscanf(buf, "%63[^\n]", type);
+	if( ( n = sscanf(buf, "%63[^:]:%63[^:]:%63s %hd %hd[^\n]", type, command, map, &x, &y) ) < 5 ){
+		if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 )		{
+			if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
 		}
 	}
 
-	if( n == 5 )
-	{
-		m = map_mapname2mapid(map);
-		if( m < 0 )
-		{
-			ShowWarning("Console: Unknown map.\n");
-			return 0;
-		}
-		sd.bl.m = m;
-		map_search_freecell(&sd.bl, m, &sd.bl.x, &sd.bl.y, -1, -1, 0);
-		if( x > 0 )
-			sd.bl.x = x;
-		if( y > 0 )
-			sd.bl.y = y;
-	}
-	else
-	{
+	if( n != 5 ){ //end string
 		map[0] = '\0';
 		if( n < 2 )
 			command[0] = '\0';
-		if( n < 1 )
-			type[0] = '\0';
 	}
 
 	ShowNotice("Type of command: '%s' || Command: '%s' || Map: '%s' Coords: %d %d\n", type, command, map, x, y);
 
-	if( n == 5 && strcmpi("admin",type) == 0 )
-	{
-		if( !is_atcommand(sd.fd, &sd, command, 0) )
+	if(strcmpi("admin",type) == 0 ) {
+		if(strcmpi("map",command) == 0){
+			 m = map_mapname2mapid(map);
+			if( m < 0 ){
+				ShowWarning("Console: Unknown map.\n");
+				return 0;
+			}
+			sd.bl.m = m;
+			map_search_freecell(&sd.bl, m, &sd.bl.x, &sd.bl.y, -1, -1, 0);
+			if( x > 0 )
+				sd.bl.x = x;
+			if( y > 0 )
+				sd.bl.y = y;
+		}
+		else if( !is_atcommand(sd.fd, &sd, command, 0) )
 			ShowInfo("Console: not atcommand\n");
 	}
-	else if( n == 2 && strcmpi("server", type) == 0 )
-	{
-		if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 )
-		{
+	else if( n == 2 && strcmpi("server", type) == 0 ){
+		if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
 			runflag = 0;
 		}
 	}
 	else if( strcmpi("ers_report", type) == 0 ){
 		ers_report();
 	}
-	else if( strcmpi("help", type) == 0 )
-	{
-		ShowInfo("To use GM commands:\n");
-		ShowInfo("  admin:<gm command>:<map of \"gm\"> <x> <y>\n");
-		ShowInfo("You can use any GM command that doesn't require the GM.\n");
-		ShowInfo("No using @item or @warp however you can use @charwarp\n");
-		ShowInfo("The <map of \"gm\"> <x> <y> is for commands that need coords of the GM\n");
-		ShowInfo("IE: @spawn\n");
-		ShowInfo("To shutdown the server:\n");
-		ShowInfo("  server:shutdown\n");
+	else if( strcmpi("help", type) == 0 ) {
+		ShowInfo("Command available :\n");
+		ShowInfo("\t admin:@acmd => use an atcommand\n");
+		ShowInfo("\t admin:map:<map><x><y> => change our current map\n");
+		ShowInfo("\t server:shutdown => stop server\n");
+		ShowInfo("\t ers_report => display the db usage\n");
 	}
 
 	return 0;
@@ -3708,23 +3693,25 @@ struct msg_data *map_lang2msgdb(uint8 lang){
 }
 
 void map_do_init_msg(void){
-	map_msg_db = idb_alloc(DB_OPT_BASE);
+	int test=0, i=0, size;
+	char * listelang[] = {
+	    MSG_CONF_NAME_EN,	//default
+	    MSG_CONF_NAME_RUS,
+	    MSG_CONF_NAME_SPN,
+	    MSG_CONF_NAME_GRM,
+	    MSG_CONF_NAME_CHN,
+	    MSG_CONF_NAME_MAL,
+	    MSG_CONF_NAME_IDN,
+	    MSG_CONF_NAME_FRN
+	};
 
-	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_IDN )
-		msg_config_read(MSG_CONF_NAME_IDN,6);	// Indonesian
-	if( LANG_ENABLE&LANG_FRN )
-		msg_config_read(MSG_CONF_NAME_FRN,7);	// French
+	map_msg_db = idb_alloc(DB_OPT_BASE);
+	size = ARRAYLENGTH(listelang); //avoid recalc
+	while(test!=-1 &&  size>i){ //for all enable lang +(English default)
+		test = msg_checklangtype(i,false);
+		if(test == 1) msg_config_read(listelang[i],i); //if enable read it and assign i to langtype
+		i++;
+	}
 }
 void map_do_final_msg(void){
 	DBIterator *iter = db_iterator(map_msg_db);
@@ -3809,7 +3796,7 @@ int do_init(int argc, char *argv[])
 	GRF_PATH_FILENAME = "conf/grf-files.txt";
 
 	/* Multilanguage */
-	MSG_CONF_NAME_EN = "conf/msg_conf/map_msg.conf"; 			// English (default)
+	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
@@ -3906,11 +3893,6 @@ int do_init(int argc, char *argv[])
 
 	npc_event_do_oninit();	// Init npcs (OnInit)
 
-	if( console )
-	{
-		//##TODO invoke a CONSOLE_START plugin event
-	}
-
 	if (battle_config.pk_mode)
 		ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
 
@@ -3926,6 +3908,11 @@ int do_init(int argc, char *argv[])
 		exit(EXIT_FAILURE);
 #endif
 
+	if( console ){ //start listening
+		add_timer_func_list(parse_console_timer, "parse_console_timer");
+		add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
+	}
+
 	return 0;
 }
 

Некоторые файлы не были показаны из-за большого количества измененных файлов