Jump to content

Search the Community

Showing results for tags 'сервер'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Russian section
    • Новости и объявления
    • Пиратия: Документация
    • Пиратия: Релизы
    • Пиратия: Разработка
    • Пиратия: Web
    • Пиратия: Помощь
    • Программирование
    • Совместные проекты / набор команды
    • Доска объявлений
    • Offtop
  • English Section
    • News & Announcements
    • Guides
    • Releases
    • Development
    • Web
    • Questions & Help
    • Programming
    • Shared Projects / Team search
    • Paid services & Requests
    • Offtopic
  • Porting the game to another engines
    • Tales of Pirates Unity3D
  • Server Advertisements
    • Russian servers
    • English servers

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 18 results

  1. Обеспечение безопасности игрового сервера Автор: @Duduf В данном гайде мы рассмотрим основные проблемы, связанные с обеспечением безопасности нашего игрового сервера. Основными проблемами в работе игровых серверов являются: Несанкционированный доступ к учетной записи администратора ОС сервера SQL-инъекции через клиент игры SQL-инъекции через веб-обвязки игрового сервера Гайд состоит из следующих разделов: Выбор операционной системы для игрового сервера и базовые настройки его безопасности Обеспечение базовой безопасности SQL-сервера Защита баз данных SQL-сервера от SQL-инъекций Установка и базовые настройки веб-сервера Защита веб-обвязок от SQL-инъекций 1. Выбор операционной системы для игрового сервера и базовые настройки его безопасности В первую очередь, следует понимать, что игровой сервер должен являться отдельной машиной, предназначенной только для обеспечения работы этого самого игрового сервера. В качестве операционной системы необходимо использовать только серверные - Windows Server 2003, Windows Server 2008, никаких XP, Вист и семерок - эти системы априори не предназначены для функционирования в качестве серверов. Высшим пилотажем, в плане обеспечения безопасности, было бы разнесение служб игрового сервера по разным серверам - ПО игры, SQL-сервер, Веб-сервер, но в данном случае мы рассмотрим установку и настройку всего этого добра на одной машине. Почему именно серверная ОС В первую очередь, это повышенная отказоустойчивость, отсутствие ресурсоемких и небезопасных приложений, загружаемых "по умолчанию", полноценное логирование действий пользователей, полноценный трейс ошибок при крахе приложений, более полная, по сравнению с домашними ОС, защита системных файлов и директорий, а также более высокая производительность приложений. К базовым настройкам безопасности ОС относятся: Отключение учетной записи Администратор Установка антивируса с автоматическим обновлением Автоматическое обновление ОС Настройка удаленного доступа по протоколу RDP Установка межсетевого экрана (Брандмауэр, Файрволл) Автоматическое обновление ОС Настраивайте автоматическое обновление таким образом, чтобы обновления скачивались, но не устанавливались. Заведите привычку раз в неделю устанавливать эти самые обновления и после их установки перезагружать машину. Remote Desktop Сколь бы не велико было желание подключить монитор и клавиатуру к серверу, делайте это только в случае сбоя в работе RDP, т.е. если вы не можете подключиться к серверу удаленно. Для включения Remote Desktop откройте Панель управления > Система, выберите вкладку Удаленные сеансы и установите флажок Разрешить удаленное подключение к этому компьютеру. По умолчанию удаленное соединение разрешено только локальным администраторам. Учетную запись Администратор мы отключили, т.о. у нас остается только один локальный администратор. Теперь настроим сам сервер RDP Откройте Панель управления > Администрирование > Настройка служб терминалов. В дереве консоли выберите пункт Подключения. В области сведений щелкните правой кнопкой мыши подключение, которое нужно изменить, и выберите команду Свойства. На вкладке Общие, в разделе Уровень безопасности, выберите метод обеспечения безопасности Высокий. Рекомендую также ознакомиться со следующими ссылками по обеспечению безопасности RDP: http://technet.microsoft.com/ru-ru/library/cc781085(WS.10).aspx http://www.winblog.ru/win2003/1147766806-15021001.html Межсетевой экран Самый простой маршрутизатор, установленный между интернетом и вашим сервером во сто крат эффективнее и производительней любых программных файрволлов. Настройте маршрутизацию портов в своем роутере - 80 (для веб-сервера), 1973 (Gate Server), 3389 (RDP) и 1433 (SQL-сервер). Все пакеты от клиента приходят на порт GateServe'ra, поэтому нет необходимости открывать порты других служб игрового сервера. Ограничьте доступ по IP-адресам для порта 3389 (RDP) и 1433 (SQL-сервер). Желательно, чтобы доступ к этим портам был только из локальной сети. Если вы планируете администрировать сервер удаленно из Интернета и имеете статичный IP-адрес, то можете открыть порты 3389 и 1433 и для него. Добавьте перечисленные порты (80, 1973, 3389, 1433) в исключения в Брандмауэре Windows. В исключениях должны быть именно порты, а не приложения. Ничего другого в исключениях быть не должно. Если в вашем роутере есть возможность автоматической защиты от ARP и других атак, включите их. Если у вас нет роутера или аппаратного Файрволла, то ограничения на порты и службы необходимо установить в Брандмауэре Windows. Итогом наших мероприятий стало то, что даже если злоумышленник получит информацию о логине/пароле к SQL-серверу, воспользоваться им он не сможет, поскольку мы закрыли возможность удаленного подключения к игровому серверу с "неизвестных" машин. Работа игровых подсерверов Не запускайте игровые сервера из-под пользователя, обладающего административными правами. Создайте отдельного пользователя в группе Users (Пользователи), прав этой группы достаточно для работы игрового сервера. В противном случае, если злоумышленник получит доступ в игре к команде &lua, то он автоматически получит доступ к пользователю-администратору сервера, со всеми вытекающими. 2. Настройка SQL-сервера Итак, вы установили SQL-сервер, используя соответствующие гайды и присоединили базы данных игры. Запускаем SQL Server Management Studio. При авторизации выбираем проверку подлинности Windows. В обозревателе объектов открываем вкладку Безопасность > Имена входа, заходим в свойства пользователя sa и отключаем эту учетную запись. Для чего мы его отключаем? Пользователь sa по умолчанию имеет права суперпользователя на вашем SQL-сервере. Также права суперпользователя вы можете получить авторизовавшись на Windows-сервере под учетной записью администратора и авторизовавшись в SQL-сервере используя проверку подлинности Windows. Отключением пользователя sa мы оставляем единственную возможность авторизации в качестве суперпользователя - через Windows-аутентификацию. Теперь у вас не будет соблазна настраивать работу приложений из под пользователя sa (особенно с пустым паролем) Для работы игрового сервера и веб-сервера мы создадим отдельных пользователей, которые будут иметь ограниченные права. Вычищаем из БД дефолтные данные Многие сборки серверов поставляются с базами, в которых уже существуют всякие разные нехорошие записи. К таковым относятся пользователи и схемы самой БД, а также список аккаунтов с ГМ-правами. В данной ситуации лучше использовать базы, поставляемые со сборкой Base Server 2.0, там присутствует только один аккаунт с логином admin и паролем admin. Не забываем поменять хотя бы пароль... Добавляем отдельных пользователей для игрового сервера Нам необходимо создать трех пользователей для баз AccountServer и GameDB с ограниченным набором прав - одного для работы GameServer, второго для работы AccountServer, третьего для веб-обвязки. Откройте папку Безопасность > Имена входа и выберите в контекстном меню Создать имя входа. Создайте пользователя для работы игрового сервера (в моем случае это Gamemaster) Перейдите на страницу Роли сервера и выберите только public Перейдите на страницу Сопоставление пользователей и определите базы данных GameDB с правами db_datawriter, public. Схема по умолчанию - dbo. Данные права определяют, что пользователь может осуществлять выборку (SELECT), изменение (UPDATE), вставку (INSERT) и удаление (DELETE) записей в таблицах базы GameDB. Создайте пользователя под которым будет работать AccountServer (в моем случае это Accountmaster) по аналогии с пользователем Gamemaster. Задайте права на базу AccountServer как db_datawriter, public, на базу GameDB прав давать не надо. Создайте пользователя под которым будет работать веб-обвязка (в моем случае это Webmaster) по аналогии с пользователем Gamemaster. Задайте права на базу AccountServer как db_datawriter, public, а на базу GameDB как db_datareader, public. Не ставьте ни в коем случае прав db_owner или db_securityadmin, а также любую другую роль кроме public, эти права дадут доступ пользователю к системным функциям Базы данных, в т.ч. к ее остановке и уничтожению. 3. Защита объектов базы данных от несанкционированных изменений В первую очередь, следует понимать, что SQL-инъекции возможны в том случае если приложения, работающие с SQL-сервером в должной мере не обрабатывают приходящие от пользователей переменные. В случае если в качестве приложения выступает php-скрипт с открытым кодом, мы можем самостоятельно добавить обработку пользовательских переменных. В случае если в качестве приложения выступает скомпилированное приложение (в нашем случае GateServer, GameServer, GroupServer и AccountServer), возможности по модификации кода у нас отсутствуют. При таком раскладе нам остается контролировать данные другими средствами. Первое - это различные фильтры (FilterServer и др.) и модификации GateServer, второе - защита объектов базы средствами SQL-сервера. Ставим необходимые фильтры. Объекты базы защищаем следующим образом: Заходим в свойства пользователя Gamemaster в базе GameDB Переходим на страницу Защищаемые объекты и жмем кнопку Найти. Выбираем Определенные объекты и жмем ОК Нажимаем Типы объектов, выбираем Таблицы, жмем ОК. Затем Обзор и выбираем таблицу account и жмем ОК и еще раз ОК. Загрузится таблица прав. Напротив Изменение и Удаление отмечаем Запретить. Выберите разрешение Обновление, чтобы активировать кнопку Разрешения на доступ к столбцу. Жмем ее. В открывшемся окне отмечаем Запретить напротив столбца gm Ту же самую процедуру проделываем и для пользователя Webmaster Все, теперь гм-права можно выставить только из под учетной записи администратора, пользователи, из под которых работает веб-обвязка и игровой сервер этих прав не имеют. По аналогии вы можете запрещать доступ на изменение к столбцам и в других таблицах. Например, в character было бы неплохо запретить изменение столбца act_id. Теперь со спокойной душой можно защищать менее значимые объекты базы посредством триггеров и мониторинга базы игроков. Сами триггеры я писать не буду, опишу, что можно защищать: Стат-пойнты. Триггер должен при вставке/изменении записи проверять не выходит ли сумма статов за допустимые значения. Количество HP/SP Наличие невведенных/редких предметов в инвентарях игроков Наличие у игроков фей и экипировки со статами, выходящими за допустимыми значениями 4. Веб-сервер На форуме, как я заметил, существует любовь к различного рода NoName-сборкам Apache + PHP + MySQL + еще хрен знает чего (это я про всякие ксампы и денверы). Наличие доверия к ним крайне сомнительно ввиду, хотябы отсутствия документации к ним, особенно, это касается выставленных параметров "по умолчанию". Грамотным решением была бы установка всех компонент отдельно, скачанных и обновляемых с сайтов ПРОИЗВОДИТЕЛЕЙ (apache.org, php.net, mysql.com) либо использование промышленных сборок типа Zend.Server. Если вы устанавливаете MySQL, не забудьте задать пароль для root-пользователя (по умолчанию он пустой) и создать второго администратора. Не следует запускать приложения из-под пользователя root. Прежде чем устанавливать FTP-сервер, сто раз подумайте, нужен ли он вам, возможно, достаточно открыть доступ к нужным папкам в локальной сети. FTP - сам по себе крайне небезопасный протокол. Если установка FTP-сервера необходима, используйте лучше реализацию SFTP под Windows http://www.coreftp.com/server/ (в качестве клиента используйте WinSCP). 5. Веб-обвязки Ну, что тут говорить, большинство представленных на форуме веб-обвязок представляют собой "жалкое зрелище, душераздирающее зрелище": Принудительное подавление вывода ошибок без должной их обработки (error_reporting(0), ini_set('display_errors',0), волшебный символ @ и пр.) Использование "псевдоконструкторов" классов, которые с версии php 5.3.3 уже не поддерживаются Использование библиотеки ereg, которая не модернизировалась с 4-й версии PHP и в 6-й версии будет вырезана Использование морально устаревшей библиотеки mssql Но это еще цветочки по сравнению с отсутствием типизации данных и недолжной обработкой входящих переменных (что может привести к SQL-инъекциям и XSS-атакам). Я не буду вдаваться в экскурс, как писать безопасные приложения, рекомендую использовать только проверенные скрипты, не пихать на рабочий сайт "новинки" пока не появятся отзывы об их использовании и аудите, каким бы шикарным не был их функционал. При появлении новых версий, обязательно обновляйте их. Примеры инъекций в существующих обвязках Рассмотрю один пример уязвимостей в веб-обвязке (регистрации), но, увы, некоторые другие регистрации и обвязки, представленные на этом сайте, имеют уязвимости. Итак, рега Уязвимый код Строка 21 if ((eregi("[^a-z0-9_-]", $login)) || (eregi("[^a-z0-9_-]", $pass)) ) { eregi - устаревшее расширение, имеющее нульбайтовую уязвимость Строки 36-37 $email = $_POST['email']; do_query("INSERT INTO account_login (name,password,originalPassword,email) VALUES ('$login','$encr_pass','$pass', '$email')","AccountServer"); Переменная email не обрабатывается никак вообще
  2. Исходные коды сервера и клиента доступны! Привет всем! Исходные коды сервера и клиента теперь доступны каждому. Я выражаю большую благодарность нашему дружному и сплоченному сообществу! Спасибо за помощь, благодаря Вам мы имеем эти файлы! Успехов нам в освоении и изучении исходных кодов, надеюсь они помогут сделать нашу любимую игру еще лучше. Поздравляю друзья! Отдельное спасибо хочу сказать следующим пользователям и командам: RU: Команда сервера ZEST Online (@e1mer), Команда сервера World of Chaos (@NMS3RR), Команда сервера Мордо Online, @Chad, @insider, @V1tor, @Chudik, @BotPRO, @BETEP/macs509, @lyon, @Am*n9ma (Pastuh). EN: @KONG, @Wrexor, @Yudha, @Jones, @Andy, @Foxseiz, @Andrew, @Lucky, @Sea King, @DevMorgan, @LazyKid, @Sultan, @TheLegend, @Onioni, @7n6, @GustavoHMA, @Xeon, @Ishcurry. Скоро на нашем форуме появятся гайды и статьи по работе с исходными кодами. Получить ссылку на исходные коды Вы можете из файла во вложении (Source Code.txt)
  3. Отключаем сообщения о погоде Привет! В этом гайде я расскажу каким образом можно убрать сообщения о погоде из системы. Работать будем с GameServer.exe, под понятием "сервер" будет подразумеваться GameServer. Есть 2 способа отключения сообщений о погоде. Первый состоит в том, чтобы вообще убрать погоду с сервера. Второй - произвести некоторые изменения в GameServer.exe, при этом погода останется, но сообщения в систему о ней исчезнут. Способ I - Нет погоды нет сообщений В директории resource сервера находятся папки с картами (garner, magicsea, darkblue, guildwar и так далее). В каждой такой папке лежит файл: картаmonster_conf.lua где карта это название папки, в которой находится данный файл - garner, magicsea, darkblue, guildwar и так далее. В этом файле указываются точки возрождения монстров и области карты, в которых происходят погодные явления. Области карты для погоды определяются функцией AddWeatherRegion(). Например, для Аскарона (garner) погода в файле garnermonster_conf.lua определяется следующим образом: AddWeatherRegion(9, 8, 40, 2434, 2800 , 80, 80) AddWeatherRegion(11, 8, 40, 2247, 2960 , 80, 80) AddWeatherRegion(9, 8, 40, 1190, 1140 , 80, 80) AddWeatherRegion(11, 8, 40, 1160, 1400 , 80, 80) Наша задача заключается в том, чтобы удалить или закомментировать (--) вызовы функции AddWeatherRegion() в файле monster_conf.lua для каждой карты. Таким образом, мы отключим погоду на сервере. После проделанных изменений не забудьте перезагрузить GameServer.exe. Способ II - Патчим GameServer.exe Данный способ уже сложнее, но позволяет сохранить погоду на сервере. Вам понадобится отладчик OllyDbg 1.10 и базовые знания языка Ассемблера. Открываем GameServer.exe в OllyDbg (File -> Attach -> В списке процессов выбрать GameServer.exe). Затем переходим в модуль GameServer (View -> Executable modules -> В списке модулей выбрать GameServer), его адрес (Base) 0x00400000. Далее проанализируйте дизассемблированный код. Для этого в контекстном меню окошка с инструкциями (кодом) выберите Analysis -> Analyse code или нажмите сочетание клавиш Ctrl + A. В итоге мы должны получить следующее: Окно с инструкциями - кодом Далее нужно найти строку с сообщением о погоде. Так как я работаю с GameServer.exe версии 1.38, то данная строка находится в .res файле. Декомпилируем .res файл: На выходе получается текстовый файл. Производим поиск по файлу с помощью ключевого слова "weather" и находим строку: GM_WEATHER_CPP_00001 { "Weather: Current sea{0} {1}nearby will occur{2}" } Это шаблонная строка для сообщения о погоде, которое выводится в системный чат. Видно, что идентификатором этой строки является строка "GM_WEATHER_CPP_00001", её мы и будем искать в GameServer.exe. Для этого в контекстном меню окна с инструкциями выполняем команду Search for -> All refernced text strings. В появившемся окне с текстовыми строками ищем строку "GM_WEATHER_CPP_00001" (контекстное меню -> Search for text -> GM_WEATHER_CPP_00001). Затем кликаем по найденной строке правой кнопкой мыши и выбираем команду Follow in Disassembler (или нажимаем Enter). В результате мы видим, что данная строка используется по адресу 0x0004B1D93: 004B1D8B | PUSH EAX ; /Arg3 004B1D8C | LEA ECX,DWORD PTR SS:[EBP-C8] ; | 004B1D92 | PUSH ECX ; |Arg2 004B1D93 | PUSH 0x005C2AA8 ; |Arg1 = 005C2AA8 ASCII "GM_WEATHER_CPP_00001" 004B1D98 | MOV ECX,0x0071E084 ; | 004B1D9D | CALL 0x0054EA70 ; \?Format@CResourceBundleManage@@QAEHPBDAAVCFormatParameter@@QAD@Z 004B1DA2 | LEA EAX,DWORD PTR SS:[EBP-C0] 004B1DA8 | PUSH EAX ; /Arg1 004B1DA9 | MOV ECX,DWORD PTR DS:[71E078] ; | 004B1DAF | CALL 0x0049E0C0 ; \CGameApp::LocalNotice 004B1DB4 | MOV EAX,DWORD PTR SS:[EBP-14] 004B1DB7 | XOR EDX,EDX 004B1DB9 | MOV ECX,3E8 Как нетрудно догадаться, данные инструкции загружают шаблонную строку из .res файла, подставляют в неё координаты и название погодного явления, а затем выводят получившееся сообщение в системный чат. Отключим вывод сообщения о погоде в системный чат. Для этого необходимо затереть соответствующие инструкции: 004B1DA2 | LEA EAX,DWORD PTR SS:[EBP-C0] 004B1DA8 | PUSH EAX ; /Arg1 004B1DA9 | MOV ECX,DWORD PTR DS:[71E078] ; | 004B1DAF | CALL 0x0049E0C0 ; \CGameApp::LocalNotice Чтобы затереть данные инструкции, нужно заменить их байты на 0x90 (инструкция NOP). Выделяем инструкции начиная с адреса 0x04B1DA2 по адрес 0x004B1DAF и вызываем контекстное меню. В контекстном меню выполняем команду Binary -> Fill with NOP's. Получаем следующие инструкции: 004B1D8B | PUSH EAX ; /Arg3 004B1D8C | LEA ECX,DWORD PTR SS:[EBP-C8] ; | 004B1D92 | PUSH ECX ; |Arg2 004B1D93 | 0x005C2AA8 ; |Arg1 = 005C2AA8 ASCII "GM_WEATHER_CPP_00001" 004B1D98 | MOV ECX,0x0071E084 ; | 004B1D9D | 0x0054EA70 ; \?Format@CResourceBundleManage@@QAEHPBDAAVCFormatParameter@@QAD@Z 004B1DA2 | NOP 004B1DA3 | NOP 004B1DA4 | NOP 004B1DA5 | NOP 004B1DA6 | NOP 004B1DA7 | NOP 004B1DA8 | NOP 004B1DA9 | NOP 004B1DAA | NOP 004B1DAB | NOP 004B1DAC | NOP 004B1DAD | NOP 004B1DAE | NOP 004B1DAF | NOP 004B1DB0 | NOP 004B1DB1 | NOP 004B1DB2 | NOP 004B1DB3 | NOP 004B1DB4 | MOV EAX,DWORD PTR SS:[EBP-14] 004B1DB7 | XOR EDX,EDX 004B1DB9 | MOV ECX,3E8 Сохраним проделанные изменения. В контекстном меню выбираем команду Copy to executable -> All modifications. На вопрос "Copy selection to executable file?" отвечаем "Copy all". Появится окошко, просто закрываем его крестиком. Далее программа задаст новый вопрос типа: "Файл GameServer.exe был изменен! Сохранить изменения?", отвечаем "Да" и в диалоге выбора файла, вводим название для измененного GameServer.exe. Запускаем измененный GameServer.exe и убеждаемся, что сообщений о погоде в системе больше нет. Для GameServer.exe версии 1.36 шаг с декомпиляцией .res соответственно нужно пропустить и сразу искать непосредственно строку сообщения о погоде по ключевому слову "weather". Я нашел такую строку: Weather: %s has occurred at location %d %d Затем нужно аналогичным образом затереть инструкции начиная с адреса 0x004AA928 по адрес 0x004AA935.
  4. Защита GM команд Привет! Предположим, Ваш сервер был взломан и злоумышленник получил доступ к GM-аккаунту. В данной статье я расскажу как обезопасить Ваш сервер от его действий, то есть сделать взлом бессмысленным. Внимание! Особое внимание уделите командам &lua и &lua_all. С их помощью злоумышленник может получить контроль над машиной, где запущен GameServer.exe, со всеми вытекающими из этого последствиями: кража Вашей сборки либо её удаление, вайп базы данных, потеря доступа к машине и так далее. Обсуждение этих команд проходит в данной теме: Все прелести команды &lua. Для обеспечения безопасности Вашего сервера, не используйте имена из примеров данной статьи на своем сервере! Способ №1. Нет GM-команд - нет проблем! Если Вы редко или вообще не пользуетесь GM-командами, то имеет смысл их отключить. Редактировать персонажей и выдавать предметы можно с помощью специальных программ или вручную в базе данных, когда персонаж не в игре. Чтобы отключить GM-команды нужно внести изменения в GameServer.exe. Версия | Размер (КБ) | Адрес --------+-------------+------------ 1.36 | 2 040 | 0x000DE1E8 1.38 | 2 088 | 0x000E6852 2.0 | 3 000 | 0x00161349 Откройте GameServer.exe в любом HEX редакторе и перейдите по адресу из таблицы. Я буду работать с 1.38 GameServer.exe в редакторе HxD. Замените 23 байта начиная с этого адреса на 0x90 Сохраните проделанные изменения и убедитесь, что в игре не работают GM-команды. Способ №2. Переименовывание GM-команд. Злоумышленник не сможет воспользоваться GM-командами, если он не будет знать их названия. Итак, Вам придется переименовать каждую команду. Чтобы изменить название GM-команды, откройте GameServer.exe в любом HEX-редакторе. Затем найдите GM-команду и измените ее название. Длина нового названия должна быть такой же, как и длина старого. Для примера, переименуем команду &make в команду &give. Обратите внимание, что длины строк "make" и "give" равны (по 4 символа). Открываем GameServer.exe в HEX-редакторе и ищем строку "make": Вам будут попадаться строки, которые содержат в себе подстроку "make" (например, "MakeItem", "make failed!", "GMmakeLog" и др.). Игнорируйте их и продолжайте поиск. Когда Вы найдете нужную строку, Вы увидите рядом названия других GM-команд: Заменяем на "give": Сохраните проделанные изменения. Повторите данные действия для каждой GM-команды. Список адресов GM-команд GameServer.exe версии 1.36 (2 040 КБ): GameServer.exe версии 1.38 (2 088 КБ): GameServer.exe версии 2.4 (3 000 КБ): Способ N3. GameServer.exe с функциями HandleChat(), GetGmLv() и SetGmLv() Для реализации данного способа Вам потребуется модифицированный GameServer.exe с функциями HandleChat(), GetGmLv() и SetGmLv(). Функция HandleChat(userdata role, string message) срабатывает, когда игрок пишет сообщение в местный чат. Так как GM-команды отправляются также в местный чат, Вы можете написать скрипт, который будет контролировать выполнение команд. Например, Вы можете сделать так, чтобы GM-команды срабатывали только при условии, что их отправляет персонаж с определенным именем или ID. Плюс ко всему, можно сделать чтобы этот персонаж должен еще состоять в определенной гильдии, в которую входят только администраторы и GM Вашего сервера. Все зависит от Вашей фантазии. Чтобы узнать, что персонаж является GM, используйте функцию GetGmLv(userdata role). С помощью функции SetGmLv(userdata role, number level) можно изменять GM-уровень аккаунта, к которому прикреплен персонаж. Например, в той же функции HandleChat() можно сбрасывать GM-уровень аккаунта в 0, если персонаж не прошел проверку. Реализуем простую систему контроля GM-команд: 1) GM-команды могут выполнять только персонажи с именами: "V3ct0r", "pkodev" и "Administrator"; 2) В случае, если персонаж GM и он не прошел проверку, сбросить GM-уровень до 0, кикнуть персонажа с сервера и отправить сообщение администратору в консоль GameServer.exe. Для начала создадим в файле variable.lua массив с именами персонажей, которые могут использовать GM-команды. Назовем его PlayerCanUseCmd: PlayerCanUseCmd = {} PlayerCanUseCmd["V3ct0r"] = 1 PlayerCanUseCmd["pkodev"] = 1 PlayerCanUseCmd["Administrator"] = 1 Затем напишем скрипт для функции HandleChat() в файле functions.lua: -- Обработчик местного чата function HandleChat(role, message) -- Проверяем что персонаж GM if (GetGmLv(role) > 0) then -- Проверяем что персонаж отправил GM-команду if (string.find(message, "&") == 1) then -- Проверяем имя персонажа local cha_name = GetChaDefaultName(role) if (PlayerCanUseCmd[cha_name] ~= nil) then -- Персонаж может использовать GM-команду return 1 end -- Персонаж не может использовать GM-команду -- Сбрасываем GM-уровень до 0 SetGmLv(role, 0) -- Кикаем персонажа с сервера KickCha(role) -- Пишем сообщение администратору в консоль сервера print("Player [" .. cha_name .."] trying to use GM command!") -- Запрещаем выполнение GM-команды return 0 end end return 1 end Для кика персонажей нам понадобится функция KickCha(), добавьте ее также в functions.lua: function KickCha(character) local pkt = GetPacket() WriteCmd(pkt, 1505) SendPacket(character,pkt) end Тема открыта для обсуждения. Пишите свои вопросы и идеи в комментариях!
  5. Изменение порта сервера Порт (англ. port) — натуральное число, записываемое в заголовках протоколов транспортного уровня модели OSI (TCP, UDP, SCTP, DCCP). Используется для определения процесса-получателя пакета в пределах одного хоста — Википедия В данной статье я расскажу как изменить стандартный порт сервера и настроить клиент на новый порт. Какой порт выбрать? Порт кодируется двумя байтами, соответственно, его значение лежит в пределах 0 - 65535. Первые 1024 порта зарезервированы, поэтому Вы можете использовать порты от 1024 до 65535. Клиент Чтобы изменить порт сервера, к которому подключается Ваш клиент, Вам необходимо произвести небольшую модификацию файла Game.exe, который находится в папке system. Адреса значений порта в Game.exe: Версия клиента Адрес --------------------------------- 1.36 ру. оф. клиент 0x000C51F6 2.0 клиент 0x000FD430 Стандартное значение порта: 197310 = b5 0716 1) Откройте Game.exe в любом HEX-редакторе. Я буду использовать Notepad++ с плагином HEX-редактора; 2) Я буду работать с 1.36 ру. оф. клиентом, соответственно ищу значение по адресу 0x000C51F6. Это будет b5 0716 = 197310 (или другое, в зависимости от того, редактировали до этого порт или нет); 3) Замените на свое значение. Например, на 2000 (200010 = d0 0716); 4) Сохраните сделанные изменения. Сервер Чтобы изменить порт сервера, нужно отредактировать конфигурационный файл GateServer.cfg: [ToClient] Port = 1973 // Порт сервера Найдите секцию [ToClient] и присвойте полю Port значение порта, который Вы хотите использовать. Сохраните изменения. На этом процесс смены порта завершен.
  6. Chudik

    Пиратия Лайф

    Добро пожаловать на сервер онлайн-игры "Пиратия Онлайн"! Сервер, полных интересных нововведений с абсолютно новыми возможностями. Сборка, содержащая в себе целую кучу интересных моментов и квестов, в которой можно найти невероятно красивые места и локации. Сервер абсолютно бесплатный. Название: Piratia Life: Возвращение! Версия: 1.39 Время сервера: Московское Онлайн: 24\7 Стадия: Официальное открыт Рейты: Соло - 6х Пати - 6х Дроп - 4х Фея - 15х Корабль - 10х Квесты - 3х Макс уровень персонажа - 100 Макс уровень Феи - 50 Сила - 100 Ловкость - 105 Телосложение - 110 Точность - 115 Дух - 150 Особенности: Новые подземелья Новые цепочки квестов Новые локации Банк Гильдии Совместная покупка рейтов Торговая лавка Уникальная атмосфера Опытная администрация и многое другое.. Локации: Аргент Шайтан Ледынь Хаос Аргента (решаем) Хаос Ледыни Одинокая башня Мир демонов Затерянный город Темная топь Континент сезонов Остров Искателей (решаем) Небеса Остров Зимы Край Авроры и Тьмы Церковь Захват флага Барбароссы Абаддоны 1-18 + Вечный Абаддон Баунти (решаем) Снежные войны Миражи и многое другое.. Баланс классов: Воитель: Без изменений Целительница: Увеличен урон от Призрачного удара "Сила" дает больше прирост маны Увеличена регенерация маны от "Благодать господня" Увеличен прирост здоровья и защиты от телосложения Добавлена дистанционная атака Стрелок: Увеличена прибавка скорости атаки от "Воодушевление" Увеличен прирост здоровья и защиты от телосложения Увеличена прибавка атаки от "Мастер оружия" Возможность ковать +3 самоцветы в оружие Колдунья: Увеличен прирост здоровья и защиты от телосложения Увеличен урон от "Призрачного удара" Добавлена дистанционная атака "Сила" дает прибавку к восстановлению здоровья "Росчерк тени" наносит урон в зависимости от духа "Печать старейшин" останавливает на 2 секунды Покоритель морей: Увеличен прирост здоровья и защиты от телосложения Увеличен прирост маны от духа Увеличен диаметр и длина луча рея Увеличен урон от рея Убраны кораллы Исправлены комплекты экипировки 45-70 уровня Чемпион: Увеличен прирост атаки от "Мастер большого меча" Увеличен прирост атаки от ловкости Теперь возможно одевать 55 перчатки и ботинки Дополнительно: Полная защита от дьюпа. Исправление шифрования пакетов. Новый фильтр от sql-инъекций. Профессиональная защита от Ddos-атак. Исправление поиска пати на воде. Защита от WPE/RPE и прочей нечисти. Трансформация Защита от рисовки скиллов и айтемов Резервное копирование базы данных - 4 раза в сутки. Резервное копирование сборки - 1 раз в сутки. Защита от рисовки 20 уровня скиллов. Сайт: http://www.piratia-life.ru Форум: http://forum.piratia-life.ru
  7. Генератор паролей для .cfg Автор: insider Программа шифрует пароль пользователя базы данных для его использования в .cfg-файлах сервера. Пример: Фрагмент файла конфигурации GameServer.cfg: пароль пользователя базы данных (db_pass) должен быть в зашифрованном виде. [DB] db_ip = 127.0.0.1 db_usr = PkoDevUser db_pass = EZCpyYOZVofugqDFBZrLKw== Как пользоваться: 1. Откройте файл passgen.ini и впишите туда желаемый пароль. Длина пароля должна быть ровно 9 символов. Для примера возьмем стандартный пароль Y87dc#$98: pass=Y87dc#$98 2. Запустите passgen.exe. В консоли Вы увидите зашифрованный пароль (см. изображение выше); 3. Чтобы скопировать зашифрованный пароль в буфер обмена, кликните по окну правой кнопкой мыши, в контекстном меню выберите "Изменить", далее "Выделить все" и нажмите клавишу Enter. EZCpyYOZVofugqDFBZrLKw== Скачать (469 КБ)
  8. Работа с .res файлами (2.x версия) Автор: Monsiure aka Ingry Итак, можно думаю приступить, а начнем мы со скачивания ICU. Скачать Благодарности: Спасибо @lyon и @insider за направление на верный путь. Особая благодарность @kLabMouse за исправление неисправностей в декомпилировании, путем редактирования исходников, версия была взята родная 1.3.8.1. Внутри файлов лежит исходник + скомпилированные .exe .Полное сообщение неисправностей, которые он исправил: Теперь можно приступить к объяснению: Компиляция: Создаем папку icu в корне диска C; В папку ICU выгружаем содержимое из папки bin (В нашем скаченном архиве); Далее создаем в папке icu, файл compile.bat; Нажимаем правой кнопкой > изменить; И добавляем туда это: genrb -e UTF-8 -s | ПУТЬ ДО ПАПКИ С ICU | файл который будем компилировать | Пример: genrb -e UTF-8 -s C:/icu en_US.txt При этом нужно файл, который будем компилировать поместить в папку ICU; Сохраняем, запускаем. Декомпиляция: Создаем в нашей папке ICU еще один .bat файл; Называем его decompile; Добавляем туда такие строчки; derb -e UTF-8 -s | ПУТЬ ДО ПАПКИ С ICU | файл который будем декомпилировать | Пример: derb -e UTF-8 -s C:/icu en_US.res При этом нужно файл, который будем декомпилировать поместить в папку ICU; Сохраняем, запускаем. Вопрос: Найдите тут место, где я посмеялся
  9. Программа для смены рейтов С помощью данной программы Вы можете легко редактировать рейты сервера. Не забудьте перезагрузить все GameServer.exe после изменения рейтов. Скачать
  10. Дистанционная атака у Целительниц и Колдуний Автор: @Am*n9ma Открываем файл SkillInfo.txt и находим строку: 0036 Короткий посох 1 -1,10 1,-1 1,9 1,-1 -1 0 0 0 -1 -1 1 1 3 900 4 1 0 0 0 0 0 0 0 0 0 0 Skill_Melee_End 0 0 0 atk=atk(0)+5 0 0 0 0 0 0 0 0 0 0 0 2 1 7,8,9 0 128 -1 0 0 -1 0,0 0,0 0 6 -1 1015 4000 -1 2 131 0 0 0 0 1 0 0 0 0 0 Заменяем на: 0036 Короткий посох 1 -1,10 1,-1 1,9 1,-1 -1 0 0 0 -1 -1 1 1 3 900 4 1 0 0 0 0 0 0 0 0 0 0 Skill_lackart_End 0 0 0 atk=atk(0)+5 0 0 0 0 0 0 0 0 0 0 0 2 1 7,8,9 0 128 -1 0 0 -1 0,0 0,0 0 6 -1 1015 4000 -1 2 131 0 0 0 0 1 0 0 0 0 0 Далее открываем SkillEffect.lua и просматриваем есть ли у нас функция Skill_lackart_End(). Если нету то добавляем, если есть то заменяем: --Дистанционная атака у Цилительниц и Колдуний function Skill_lackart_End ( ATKER , DEFER , sklv ) if ValidCha(ATKER) == 0 then LG ( "luascript_err" , "function Skill_lackart_End : ATKER as null" ) return end if ValidCha(DEFER) == 0 then LG ( "luascript_err" , "function Skill_lackart_End : DEFER as null" ) return end local ChaName_ATKER = GetChaDefaultName ( ATKER ) local ChaName_DEFER = GetChaDefaultName ( DEFER ) dmg = Atk_Dmg( ATKER, DEFER ) Hp_Endure_Dmg( DEFER , dmg ) Take_Atk_ItemURE ( ATKER ) Take_Def_ItemURE ( DEFER ) Check_Ys_Rem ( ATKER , DEFER) end P.S.: Просьба отписаться как получилось. Спасибо @insider за намёк Спасибо @lyon за реализацию у нас на сервере © Pastuh
  11. Рейты сервера Привет! В данной статье я расскажу как изменить рейты сервера. Рейты - это значения, на которые умножаются опыт, шанс выпадения предмета, рост феи. Откройте файл variable.lua (папка GameServer\resource\script\calculate) и найдите следующие переменные: EXP_RAID = 15 -- Рейт на опыт TeamExp_RAID = 30 -- Рейт на опыт в отряде MF_RAID = 25 -- Рейт на выпадение предметов из монстров Resource_RAID_ADJUST = 10 -- Рейт на выпадение ресурсов ELEEXP_GETRAD = 1000 -- Рейт на рост феи В данном случае: 15х кач соло, 30х кач в пати, 25х дроп, 10х дроп ресурсов, 1000х рост феи. Изменяя значения этих переменных Вы можете настраивать рейты сервера. Не забудьте сохранить файл variable.lua и перезапустить все GameServer.exe после проделанных изменений. Так же Вы можете воспользоваться специальной программой: Вы можете создать рейт для получения опыта корабля, по умолчанию он отсутствует в скриптах. Добавьте в variable.lua переменную для нового рейта, для примера назовем ее SHIP_RAID: SHIP_RAID = 1 Затем откройте файл exp_and_level.lua (папка GameServer\resource\script\calculate) и найдите функцию GetExp_PKM(dead , atk), а в ней строку: local ship_expadd = math.floor(math.min(7, (dead_lv / 10 + 2))) замените эту строку на следующую: local ship_expadd = math.floor(math.min(7, (dead_lv / 10 + 2)) * SHIP_RAID) Теперь получаемый опыт в корабле будет умножаться на значение переменной SHIP_RAID. См. также: [FYI] Разному времени суток - разный дроп
  12. Лут с монстров Всем привет! В этом гайде я расскажу как настраивать лут (дроп) с монстров. Лут (дроп) - это список предметов, которые с определенной вероятностью выпадают с монстра при его убийстве. У каждого монстра в characterinfo.txt есть 2 поля, которые нас интересуют: список предметов (47 колонка) и список шансов их выпадения (48 колонка). Список предметов выглядит следующим образом: ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10 IDn - это ID предмета. Всего у монстра может быть максимум 10 предметов. ID предметов указываются через запятую без пробелов. Если, например, из монстра выпадает всего 5 предметов, то через запятую указывается 5 ID предметов. Список шансов выпадения предметов выглядит аналогично: ШАНС1,ШАНС2,ШАНС3,ШАНС4,ШАНС5,ШАНС6,ШАНС7,ШАНС8,ШАНС9,ШАНС10 ШАНСn представляет собой число, которое определяет вероятность выпадения соответствующего n-го предмета и рассчитывается по формуле: ШАНСn = 100 / %n * MF_RAID, где 100 - константа %n - вероятность выпадения n-го предмета MF_RAID - рейт сервера на выпадение предметов из монстров (определен в variable.lua) из этой формулы можно выразить вероятность выпадения предмета (%): %n = 100 / ШАНСn * MF_RAID Шансы выпадения предметов так же указываются через запятую без каких-либо пробелов и их должно быть столько же, сколько и предметов. ШАНСn указывается для предмета с id IDn, то есть: ID1 = ШАНС1 -- Предмет с id ID1 выпадет с вероятностью (%) 100 / ШАНС1 * MF_RAID ID2 = ШАНС2 -- Предмет с id ID2 выпадет с вероятностью (%) 100 / ШАНС2 * MF_RAID ID3 = ШАНС3 -- Предмет с id ID3 выпадет с вероятностью (%) 100 / ШАНС3 * MF_RAID ID4 = ШАНС4 -- Предмет с id ID4 выпадет с вероятностью (%) 100 / ШАНС4 * MF_RAID ID5 = ШАНС5 -- Предмет с id ID5 выпадет с вероятностью (%) 100 / ШАНС5 * MF_RAID ID6 = ШАНС6 -- Предмет с id ID6 выпадет с вероятностью (%) 100 / ШАНС6 * MF_RAID ID7 = ШАНС7 -- Предмет с id ID7 выпадет с вероятностью (%) 100 / ШАНС7 * MF_RAID ID8 = ШАНС8 -- Предмет с id ID8 выпадет с вероятностью (%) 100 / ШАНС8 * MF_RAID ID9 = ШАНС9 -- Предмет с id ID9 выпадет с вероятностью (%) 100 / ШАНС9 * MF_RAID ID10 = ШАНС10 -- Предмет с id ID10 выпадет с вероятностью (%) 100 / ШАНС10 * MF_RAID Примеры: Для первого примера возьмем монстра Свинокрыл (ID: 237). Рейт сервера на выпадение предметов будет равен x1 (MF_RAID = 1). Открываем characterinfo.txt и ищем Свинокрыла: 237 Свинокрыл Свинокрыл 4 5 180 0 1 1 0 0 0 0 0 0 0 0 0 0 1 130 100 353 354 355 0 0 0 0 1.754 1.772 2.983 60 1,5 2,5 399 398 0 0 0 1 1 0 0 25 100 1680,4416,1777,1779,1618,0648,0472,1000 172,370,769,10000,3333,19607,39215,1000 0 0 0 3968 200 5 1 1000 0 0 1 0 10 180 0 10000 0 28 42 5 20 32 32 10 188 2 0 2000 200 1500 250 2 20 10 10 20 10 10 20 0 0 0 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1,1,1 Далее находим список выпадающих предметов и список шансов выпадения этих предметов. Предметы (8): 1680,4416,1777,1779,1618,0648,0472,1000 Соответствующие шансы выпадения предметов: 172,370,769,10000,3333,19607,39215,1000 По формуле определения вероятности выпадения предметов определим вероятность выпадения каждого предмета: Свиной хвостик (ID 1680), шанс 172: % = 100 / 172 * 1 = 0.58 (58%) Мягкая свиная шерстка (ID 4416), шанс 370: % = 100 / 370 * 1 = 0.27 (27%) Стакан (ID 1777), шанс 769: % = 100 / 769 * 1 = 0.13 (13%) Свиной хвостик (ID 1779), шанс 10000: % = 100 / 10000 * 1 = 0.01 (1%) Флакон (ID 1618), шанс 3333: % = 100 / 3333 * 1 = 0.03 (3%) Сапоги из мягкой кожи (ID 0648), шанс 19607: % = 100 / 19607 * 1 = 0.0051 (0.51%) Перчатки из мягкой кожи (ID 0472), шанс 39215: % = 100 / 39215 * 1 = 0,0025 (0.25%) Чертеж Пачкули (ID 1000), шанс 1000: % = 100 / 1000 * 1 = 0.1 (10%) Полученные значения совпали с теми, что мы видим на скриншоте из базы данных монстров. В качестве второго примера создадим список предметов для нашего нового монстра. Пусть будет 3 предмета и при рейте на выпадение предметов x5 (MF_RAID = 5) нам нужны следующие вероятности выпадения: Нержавеющая сталь (ID1: 3370) - 30% (или 0.3) Коробочка феи (ID2: 262) - 50% (или 0.5) Покровительство богини (ID3: 938) - 33.3% (или 0.333) Сначала составляем список предметов через запятую: 3370,262,938 Затем рассчитываем шансы выпадения: Нержавеющая сталь (ID1: 3370) - 30% ШАНС1 = 100 / 0.3 * 5 = 1666 Коробочка феи (ID2: 262) - 50% ШАНС2 = 100 / 0.5 * 5 = 1000 Покровительство богини (ID3: 938) - 33.3% ШАНС3 = 100 / 0.333 * 5 = 1502 Далее составляем список шансов выпадения: 1666,1000,1502 Спасибо за внимание!
  13. [FYI] Разному времени суток - разный дроп Автор: @insider Итак, добавляем в дроп лист кальмарчика некий предмет. Шанс выпадения предмета ставим 0. Далее, идем в skilleffect.lua, ищем функцию Check_Baoliao и следующий кусок в ней: if arg[i] >= 100 then mf = math.min ( 1, 100 / arg[i] * bsmf ) * MF_RAID * MF_RAID_STATE a = Percentage_Random(mf) if a == 1 then count = count + 1 item[count] = i end end И меняем на что-то вроде: if arg[i] >= 100 then mf = math.min ( 1, 100 / arg[i] * bsmf ) * MF_RAID * MF_RAID_STATE a = Percentage_Random(mf) if a == 1 then count = count + 1 item[count] = i end elseif arg[i] == 0 if время >= 7 часов and время <= 8 часов and id_моба == кальмарчик mf = math.min ( 1, 100 / настоящий_%_дропа * bsmf ) * MF_RAID * MF_RAID_STATE a = Percentage_Random(mf) if a == 1 then count = count + 1 item[count] = i end end end В итоге кальмарчик каждый день с 7 до 8ми будет дропать некий предмет с заданным шансом (шанс рассчитывается как для таблицы), а в остальное время - не будет. Сюда можно добавить проверку не только на время, но и на наличие у игрока определенного предмета или части экипировки, его уровень, принадлежность к определенной гильдии, да и вообще на что только фантазии хватит. Вопросы приветствуются. Enjoy! © insider
  14. Microsoft SQL Server 2014 Express Microsoft SQL Server 2014 Express — это бесплатная многофункциональная и надежная система управления данными, которая предоставляет удобное и надежное хранилище данных для упрощенных веб-сайтов и классических приложений. Скачать с официального сайта Microsoft
  15. Сбор средств на исходные коды сервера и клиента Всем привет! Как Вы могли узнать ранее, появились люди, которые продают исходные файлы клиента и сервера (язык программирования C++). Вокруг этой темы возникли большой интерес и обсуждение. Каждый день люди спрашивают меня про исходники, купил ли их кто и когда они попадут в шару. Пользователь с нашего форума @Treuno86, несмотря на все сомнения, приобрел исходные файлы Мы спросили его, собирается ли он выкладывать их в открытый доступ. Treuno86 ответил, что купил их за 480$ и никто ему в этом не помог. Тогда мы договорились, что соберем для него 300$, а он, свою очередь, поделится этими файлами с сообществом. Все честно, ведь человек потратил кучу денег. Итак, наше сообщество должно собрать 300$, чтобы получить исходные файлы. Если у кого-то есть сомнения, что они ненастоящие, фейк и т.д. Treuno86 предоставит доказательства. Я лично посмотрел эти файлы через Team Viewer и убедился, что они оригинальные. Вот один файл для примера: Character.cpp (GameServer.exe). Для чего нам нужны исходные файлы: 1) Исправление многочисленных багов и ошибок; 2) Добавление нового функционала. В исходные файлы входят клиент и сервер версий 1.10 и 2.4 (т.е. 2 клиента и 2 сервера). В этой теме мы должны решить кто и сколько хочет/готов вложить денег, а так же на чьем кошельке (PayPal) будут эти деньги. ОБНОВЛЕНИЕ 06.06.2016 16:30 @Treuno86 увидел, что много пользователей хотят помочь, и попросил поднять планку до 400$. Я думаю, что никто не будет против. Он по прежнему отдает больше всех (85$). Хочу напомнить, что исходные файлы пойдут в шару и будут доступны всем желающим, независимо от того, вкладывали они деньги или нет. Люди, которые готовы помочь (25): Россия Команда сервера ZEST Online (@e1mer) Команда сервера World of Chaos (@NMS3RR) @Chad @insider @V1tor @Chudik @BotPRO @BETEP/macs509 Команда сервера Мордо Online Англоязычное сообщество @xtc @Wrexor @Yudha @Jones @Andy @Foxseiz @Andrew @Lucky @Sea King @DevMorgan @LazyKid @Sultan @TheLegend @Onioni @7n6 @GustavoHMA
  16. Архив полезных файлов для сервера и клиента В данном архиве содержится много полезных файлов, которые могут Вам пригодится: Сборки серверов; Базы данных; Клиенты; Карты; Скрипты; Утилиты и вспомогательные программы; Веб-обвязки; Аппарели; и т.д. Архив был создан пользователем @Lucky, за что ему большое спасибо. Также спасибо @Foxseiz за обновление архива. Вход в архив
  17. Редактор GM-команд С помощью данной программы Вы можете просмотреть измененные названия GM-команд в GameServer.exe и редактировать их. Поддерживаются GameServer.exe версии 1.36, 1.38 и 2.4. Как пользоваться: 1) Запустите программу; 2) Введите полный путь до GameServer.exe или его название, если программа находится в той же директории. Например: D:\ServerFiles\GameServer.exe 3) Программа выведет список измененных команд, если таковые имеются; 4) При желании Вы можете изменить их названия на стандартные; 5) Чтобы изменить название GM-команды введите в консоль: <старое название> <новое название> 6) Чтобы выйти из программы введите 'E'. Скачать (54 КБ): GM Command 1.2.exe
  18. Может еще есть у кого патч на второй лайт? очень нужно
×