Jump to content

Tiera

Members
  • Posts

    103
  • Joined

  • Last visited

Everything posted by Tiera

  1. Mercurial, my husband is currently working on a library for GRF Sharper. Plainof, it will be the best tool to work with GRF files.
  2. Логично предположить что обсуждение чит программ более открыто нежели защитных механизмов. Это обусловлено тем, что чем меньше читеры знают о методах реализации защиты, тем дольше защита работает. Пакетных решений несколько: RCP (сейчас в стадии заморозки), Harmony (про защищенность ничего сказать не могу), PxAnticheat (но что то я не видел данную защиту вообще нигде), UCP (бесплатное решение под различные сервера). Самый оптимальный вариант писать самому, но для этого необходимы определенные знания, а если судить по тому что ты спрашиваешь о готовых решениях, у тебя их недостаточно. Второй вариант это заплатить кому то, что бы написали защиту только под твой сервер и отдали тебе исходники, но это стоит не дешево, в зависимости от сложности цена может колебаться от 1000$ и выше. Ну и последний вариант, купить готовый вариант, стоимость обычно от 100$. Защита от ботов это не самое сложное, а вот кликеры это действительно проблема, очень сложно отследить и проверить множество этих программ и определить методы которыми они работают. Твои запросы в готовом решении будут стоит порядка 150$+/-10$.
  3. Что именно тебя интересует по поводу античитов? Правила комьюнити не запрещают обсуждение материалов связных как с эмулятором так и с клиентом.
  4. Please read the description of the diffusion patches, it says that when activating an appropriate differential, you must either replace Setup.exe or leave such as it is.
  5. Mercurial, I can help you with the implementation of functions for working with GRF files. I'm too lazy to write that his program to work with GRF))
  6. 7z support will be added in version 2.5
  7. Everade, resume interrupted downloads added only for FTP, also added backward compatibility with the old format of the patch list. ncmonx, more info, please. Choko, fixed, now working fine. Link updated.
  8. On the Internet it is impossible to find a description of the format of this file type, namely Gravity Patch File. In developing KPatcher I gathered enough information that you could share it with the community. To simplify the writing and understanding of the text, we introduce a small definition for all GRF/GPF files and we will call them shortly - container. Version of the containers differ only by the methods encrypt the content. In his description, I will talk only about 0x200 version container. The description also is present code in C/C++ examples. So let's begin. To start analyze a simplified structure of the container: 1) Cap the container in which to store the number of files in a container, a compressed file table address container, the container version and a bit of official information; 2) The table container file contains the file name, file size, the compressed file size, compressed file size is aligned, the file position in the container and the attributes of a file in a container; 3) Compressed files. All this can be described as structures of the C/C++ To cap structure is as follows: struct grf_header { char Magic [16]; /// "Master of Magic" +\0 char Key [14]; /​​// 0x01 -&gt; 0x0E, or 0x00 -&gt; 0x00 (no encryption) uint32_t FileTableOffset; /// The location of the file table uint32_t Seed; /// What is the value of randomly uint32_t FilesCount; /// The actual number of files = FilesCount - Seed - 7 uint32_t Version; /// GRF file version: 0x102, 0x103, 0x200 }; We analyze this structure in more detail: 1) Magic [16] - an identifier that indicates the program running with a container that is in front of her GRF/GPF container, the keyword "Master of Magic"; 2) Key [14] - a key that tells what the data inside the container encryption, obsolete value is not used; 3) FileTableOffset - well, everything is clear, there is stored the offset location of the file table, I want to see that all the specified offset is not the beginning of the file, and the end cap of the container which is equal to 'sizeof (grf_header)' or 46; 4) Seed - a value that randomly invented by Koreans do not know why, probably used in conjunction with Key [14] in earlier versions of the container to protect the information inside the container, which is obsolete value is always 0; 5) FilesCount - the number of files in the container, this value is not absolute, but a bit distorted. The actual value can be obtained by doing a simple mathematical operation RealFilesCount = FilesCount - Seed - 7; 6) Version - this is how it was not hard to guess, the version container. Now, using this knowledge, try to read this information from any arbitrary container. To do this, I will use the programming language C/C++ #include <...> #include <...> #include <...> # Pragma pack (push, 1) /// Align in-memory structure of 1 byte struct grf_header { char Magic [16]; /// "Master of Magic" +\0 char Key [14]; /// 0x01 -&gt; 0x0E, or 0x00 -&gt; 0x00 (no encryption) uint32_t FileTableOffset; /// The location of the file table uint32_t Seed; /// What is the value of randomly uint32_t FilesCount; /// The actual number of files = FilesCount - Seed - 7 uint32_t Version; /// GRF file version: 0x102, 0x103, 0x200 }; # Pragma pack (pop) # Define GRF_HEADER "Master of Magic" # Define GRF_HEADER_SIZE 46 int main () { FILE * FD = NULL; struct grf_header Header = {0}; uint32_t RealFilesCount = 0; FD = fopen ("data.grf", "rb"); /// Read the header container fread (&amp; Header, GRF_HEADER_SIZE, 1, FD); /// Check if this is a GRF/GPF container or not if (strncmp (Header.Magic, GRF_HEADER, 16) { return 0; } /// Now the structure is stored Header informations about current container /// And can easily access them /// The variable is now RealFilesCount the actual number of files in a container /// On this can start reading the information about files RealFilesCount = Header.FilesCount - Header.Seed - 7; return 0; } In this example, I make out the structure of GRF/GPF files and shows how to use the C/C++, you can determine that this is the GRF/GPF file, which version of the file and how many files are contained in this container. And so, to deal with the basic description of the container and having considered the example of obtaining information about the container down to work with the data container. The first thing to get a table with data in the file container. Fully describe the entire structure of the table files can be very simple: table: [<zsize>. l <size>. l [<fname>. s <fentry> .17 b] *] fentry: [<zsize>. l <zsizeal>. l <size>. l <flags>. b <offset>. l] .17 b From this simple circuit structure is visible to full data is located on the very structure of the file table and file table With this information, can easily get information about all files stored in the container. Table with a container files can also be described as a structure: struct grf_fentry { uint32_t zSize; /// Size of packed data uint32_t zSizeAl; /// The same thing only with alignment uint32_t Size; /// Size of uncompressed data uint8_t Flags; /// Flag file (GRF_FLAG_FILE, GRF_FLAG_MIXCRYPT, GRF_FLAG_DES) uint32_t Offset; /// offset into the GRF file (starts immediately after grf_header) }; Describe in detail the structure, I will not, in the comments should explain everything quite clear. #include <...> #include <...> #include <...> .................................................. ................. int main () { .................................................. ......... uint8_t * pBuffer = NULL, * pZBuffer = NULL; uint32_t TableSize = 0, zTableSize = 0; /// Move the file pointer at the beginning of the file table fseek (FD, FileTableOffset + GRF_HEADER_SIZE, SEEK_SET); /// Read compressed and the actual size of the MFT if (! fread (&amp; zTableSize, 4, 1, FD) | |! fread (&amp; TableSize, 4, 1, FD)) { return 0; } /// Allocate the necessary memory volume and read the file table pBuffer = new uint8_t [TableSize]; pZBuffer = new uint8_t [zTableSize]; if (! fread (pZBuffer, zTableSize, 1, FD)) { delete [] pBuffer, delete [] pZBuffer; return 0; } /// Extract the file table /// If you want to use the code presented here will have to connect the library zlib /// This function is part of GrfLib for KPatcher /// The variable pBuffer now stored unpacked and ready to read the file table if (zio:: zlib_uncompress (pBuffer, TableSize, pZBuffer, zTableSize)! = TableSize) { delete [] pBuffer, delete [] pZBuffer; return 0; } delete [] pZBuffer; return 0; } We now have a fully ready to read the file table. Now it remains the case for small, properly read and write to it, we will write to the memory of which optionally can be written to a file. For that would work with the data it was convenient to define another structure that will remind you what struct grf_fentry, but will carry more useful information: struct _FileNode { std:: string FileName; /// File Name uint32_t NameHash; /// Hash the file name uint32_t FileOffset; /// file offset in a container uint32_t FileSize; /// Size uint32_t zFileSize; /// compressed file size uint32_t zFileSizeAl; /// compressed file size aligned uint8_t FileFlags; /// Flags file int32_t Cycle; /// Cycle (used for encrypted files) }; This structure can sozherzhat information about only one file, and must keep information about all files, but it requires some realties store, which will be convenient to work: typedef std:: list &lt;_FileNode&gt; _FilesList; Now that is all that is necessary, we can begin reading the information about files #include <...> #include <...> #include <...> .................................................. ................. .................................................. ................. struct grf_fentry { uint32_t zSize; /// Size of packed data uint32_t zSizeAl; /// The same thing only with alignment uint32_t Size; /// Size of uncompressed data uint8_t Flags; /// Flag file (GRF_FLAG_FILE, GRF_FLAG_MIXCRYPT, GRF_FLAG_DES) uint32_t Offset; /// offset into the GRF file (starts immediately after grf_header) }; # Define GRF_TABLE_SIZE 17 # Define GRF_FLAG_FILE a # Define GRF_FLAG_MIXCRYPT 2 # Define GRF_FLAG_DES 4 struct _FileNode { std:: string FileName; /// File Name uint32_t NameHash; /// Hash the file name uint32_t FileOffset; /// file offset in a container uint32_t FileSize; /// Size uint32_t zFileSize; /// compressed file size uint32_t zFileSizeAl; /// compressed file size aligned uint8_t FileFlags; /// Flags file int32_t Cycle; /// Cycle (used for encrypted files) }; typedef std:: list &lt;_FileNode&gt; _FilesList; int main () { .................................................. ......... .................................................. ......... _FilesList FilesList; for (uint32_t Offset = 0; Offset <tablesize;) {="" get="" the="" file="" name="" length="" size_t="" fn_size="strlen" ((char="" *)="" (pbuffer="" +="" offset));="" if="" (fn_size=""> = 0x100) { delete [] pBuffer; return 0; } grf_file_table FileEntry = {0}; /// Get a pointer to the file name char * FileName = (char *) (pBuffer + Offset); Offset + = FN_Size + 1; /// Get the file information memcpy (&amp; FileEntry, (pBuffer + Offset), GRF_TABLE_SIZE); Offset + = GRF_TABLE_SIZE; /// Skip the directories and files whose size is equal to 0 if (! (FileEntry.Flags &amp; GRF_FLAG_FILE) | | FileEntry.Size == 0) continue; /// Fill the structure with the file information _FileNode Node; Node.FileName.append (FileName, FN_Size); Node.FileFlags = FileEntry.Flags; Node.NameHash = zio:: zlib_crc32 (FileName, FN_Size); Node.FileOffset = FileEntry.Offset; Node.FileSize = FileEntry.Size; Node.zFileSize = FileEntry.zSize; Node.zFileSizeAl = FileEntry.zSizeAl; Node.Cycle = -1; /// Get the information needed to decrypt the file if (Node.FileFlags &amp; GRF_FLAG_MIXCRYPT) { Node.Cycle = 1; for (uint32_t i = 10; Node.zFileSize&gt; = i; i = i * 10) Node.Cycle + +; } if (Node.FileFlags &amp; GRF_FLAG_DES) Node.Cycle = 0; /// Add all the information on file in the repository. FilesList.push_back (Node); } return 0; } Now, the variable contains FilesList informations about each file in the container and can easily burn any data to a file. Now we can unite all that is written above together and we get: #include <stdio.h> #include <string.h> #include <string> #include <list> #include <stdint.h> #include <zlib.h> using namespace std; #pragma pack(push, 1) /// Align in-memory structure of 1 byte struct grf_header { char Magic[16]; /// "Master of Magic" +\0 char Key[14]; /// 0x01 -> 0x0E, or 0x00 -> 0x00 (no encryption) uint32_t FileTableOffset; /// The location of the file table uint32_t Seed; /// What is the value of randomly uint32_t FilesCount; /// The actual number of files = FilesCount - Seed - 7 uint32_t Version; /// GRF file version: 0x102, 0x103, 0x200 }; #pragma pack(pop) #define GRF_HEADER "Master of Magic" #define GRF_HEADER_SIZE 46 #pragma pack(push, 1) /// Align in-memory structure of 1 byte struct grf_fentry { uint32_t zSize; /// Size of packed data uint32_t zSizeAl; /// The same thing only with alignment uint32_t Size; /// Size of uncompressed data uint8_t Flags; /// Flag file (GRF_FLAG_FILE, GRF_FLAG_MIXCRYPT, GRF_FLAG_DES) uint32_t Offset; /// offset into the GRF file (starts immediately after grf_header) }; #pragma pack(pop) #define GRF_TABLE_SIZE 17 #define GRF_FLAG_FILE 1 #define GRF_FLAG_MIXCRYPT 2 #define GRF_FLAG_DES 4 struct _FileNode { std::string FileName; /// File Name uint32_t NameHash; /// Hash the file name uint32_t FileOffset; /// file offset in a container uint32_t FileSize; /// Size uint32_t zFileSize; /// compressed file size uint32_t zFileSizeAl; /// compressed file size aligned uint8_t FileFlags; /// Flags file int32_t Cycle; /// Cycle (used for encrypted files) }; typedef std::list <_FileNode> _FilesList; int main() { /// Some declarations FILE *FD = NULL; struct grf_header Header; uint32_t RealFilesCount = 0; uint8_t * pBuffer = NULL, * pZBuffer = NULL; uint32_t TableSize = 0, zTableSize = 0; _FilesList FilesList; FD = fopen("naoro.grf", "rb"); fread(&Header, GRF_HEADER_SIZE, 1, FD); if ( strncmp(Header.Magic, GRF_HEADER, 16) ) return 0; /// Now the structure is stored Header informations about current container /// And can easily access them /// The variable is now RealFilesCount the actual number of files in a container /// On this can start reading the information about files RealFilesCount = Header.FilesCount - Header.Seed - 7; /// Move the file pointer at the beginning of the file table fseek(FD, Header.FileTableOffset + GRF_HEADER_SIZE, SEEK_SET); /// Read compressed and the actual size of the MFT if ( !fread (&zTableSize, 4, 1, FD) || !fread (&TableSize, 4, 1, FD) ) { return 0; } /// Allocate the necessary memory volume and read the file table pBuffer = new uint8_t [TableSize]; pZBuffer = new uint8_t [zTableSize]; if( !fread (pZBuffer, zTableSize, 1, FD) ) { delete [] pBuffer, delete [] pZBuffer; return 0; } fclose(FD); /// Extract the file table /// If you want to use the code presented here will have to connect the library zlib /// This function is part of GrfLib for KPatcher /// The variable pBuffer now stored unpacked and ready to read the file table if ( uncompress((Bytef*)pBuffer, (uLongf*)&TableSize, (Bytef*)pZBuffer, zTableSize) != Z_OK ) { delete [] pBuffer, delete [] pZBuffer; return 0; } delete [] pZBuffer; for ( uint32_t Offset = 0; Offset < TableSize; ) { size_t FN_Size = strlen((char*)(pBuffer+Offset)); if ( FN_Size >= 0x100 ) { delete[] pBuffer; return 0; } grf_fentry FileEntry = {0}; /// Get a pointer to the file name char *FileName = (char*)(pBuffer+Offset); Offset += FN_Size + 1; /// Get the file information memcpy(&FileEntry, (pBuffer+Offset), GRF_TABLE_SIZE); Offset += GRF_TABLE_SIZE; /// Skip the directories and files whose size is equal to 0 if ( !(FileEntry.Flags&GRF_FLAG_FILE) || FileEntry.Size == 0 ) continue; /// Fill the structure with the file information _FileNode Node; Node.FileName.append(FileName, FN_Size); Node.FileFlags = FileEntry.Flags; Node.NameHash = crc32(0, (Bytef*)FileName, FN_Size); Node.FileOffset = FileEntry.Offset; Node.FileSize = FileEntry.Size; Node.zFileSize = FileEntry.zSize; Node.zFileSizeAl = FileEntry.zSizeAl; Node.Cycle = -1; /// Get the information needed to decrypt the file if ( Node.FileFlags&GRF_FLAG_MIXCRYPT ) { Node.Cycle = 1; for( uint32_t i = 10; Node.zFileSize >= i; i = i*10 ) Node.Cycle++; } if ( Node.FileFlags&GRF_FLAG_DES ) { Node.Cycle = 0; } /// Add all the information on file in the repository. FilesList.push_back(Node); } delete[] pBuffer; /// Creating empty file FD = fopen("files_list.txt", "w+"); _FilesList::iterator itr = FilesList.begin(); _FilesList::iterator itr_end = FilesList.end(); /// Fill the newly created file data. fprintf(FD, "FileName - FileSize - FilePos\n"); for ( ; itr != itr_end; itr++) fprintf(FD, "%s - %d - %d\n", itr->FileName.c_str(), itr->FileSize, itr->FileOffset+GRF_HEADER_SIZE); fclose(FD); return 0; } Fully working source code that reads the GRF/GPF file and prints the contents a file. main.rar
  9. Tiera

    eAthena

    Mercurial, thanks of course, but could you fix my name in post #13. Well of course in general is really nice. I will continue to develop their projects on this forum.
  10. Вообще о том что реализовано в этом эмуляторе написано в соответствующем разделе английской ветки форума. Ну если судить по тому как они сейчас пишут код, то в скором времени увидим и 3-2 профессии. На днях спрошу разработчиков по поводу реализации 3-2 профессий.
  11. Что бы WinXP корректно отображала иероглифы, достаточно установить поддержку иероглифов, для этого необходим оригинальный дистрибутив WindowsXP и сделать небольшую настройку системы. Пуск->Панель Управления->Языки и региональные стандарты->Языки->Установить поддержку языков с письмом иероглифами. После этого система будет отображать иероглифы а не квадраты.
  12. Everade, I will consider your suggestion about the format of the patch list and do support the old format. As for the resume download after an interruption, I will support only a few possible problems, namely that the file in a resume can be damaged making it difficult to patching. All the same most of the code was rewritten, and requires little cleaning. The archive file will be included kpatcher.inf. Thank you for your detailed bug reports and suggestions, I consider each report and proposal. Thank you for that helps to make better patcher)
  13. Patcher has been updated, the information here.
  14. Вопрос не совсем понятен, название папок что в data.grf что в rdata.grf одинаковые.
  15. Tiera

    KPatcher

    File Name: KPatcher File Submitter: Tiera File Submitted: 20 Dec 2011 File Category: Patchers Content Author: Tiera Title: KPatcher Version: 3.1 Language: Multilingual Supported GRF files: All versions Support for other packers: RGZ and RAR Supports data transfer protocols: HTTP, FTP, support for username and password KPatcher Features: 1) Fast merge GRF/GPF files; 2) Defragment GRF file; 3) Delete files from the GRF on the mask; 4) Deleting files from your client on a mask; 5) Unpack the RGZ/RAR archives; 6) The ability to patch any GRF file in the folder with patcher; 7) Unique auto update; 8) Support for the official patch server; 9) Simple skinning; 10) Remote file settings and auto update; 11) Fully embedded skin; 12) Custom Buttons. Config Tool Features: 1) Embedding the configuration file; 2) Embedding language file; 3) Embedding skin; 4) Change the icons patcher; 5) Getting CRC of any file. ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Instructions: 1) Edit the file Localhost.kpsf; 2) If no language file for your language, create translation using an existing language files; 3) Create your own skin; 4) Place the files from the Web on your Web server 5) Edit the file settings.ini; 6) Make the necessary changes to the file update.ini; 7) Build settings in the patcher using ConfigTool. Each configuration file has comments and explanations for most settings and options! Click here to download this file
  16. -You do not know what an IP is -You do not know the difference between LAN and WAN -You do not know what Ports are in regard to 'IP' -You do not even know if you have a router, let alone know how to use it -You do not know how to use google or the search button -You know how to use 'google' or 'search' but REFUSE to use them -You are not willing to try things on your own to see if they work (read: go out on a limb) -You expect someone to 'teach you how to make a server' -You expect to charge players, or make a lot of money -You are lazy -You just "wan make cool server" -You just "wan be GM" -You plan to host and play from the same computer -You are not dedicated If any of these apply to you DO NOT even think about starting a server. If you still really have your heart set on it go LEARN. read, search, google, just don't expect or ask someone to teach it to you. А также, ЕСЛИ ВЫ НЕ МОЖЕТЕ ПРОЧЕСТЬ И ПОНЯТЬ ТЕКСТ, ЧТО НАПИСАН ВЫШЕ.
  17. I. Общие положения: Запрещено и за этим следует наказание: режим Read Only на 30 дней. 1.1 Использование нецензурной лексики. Мы в культурном обществе и общаться будем подобающе. 1.2 Использование языков, отличных от русского. Это русский раздел и общаться здесь мы будем по-русски. Тем, у кого нет русских букв на клавиатуре, рекомендую использовать http://www.translit.ru. 1.3 Претензии и оскорбления в адрес Администрации и других пользователей. Помните: все кто работают над rAthena, делают это абсолютно бесплатно и никому ничего не должны. 1.4 Оскорбления других пользователей и зачин распрей. Все участники завязавшейся потасовки будут наказаны. 1.5 Реклама серверов. Названия любых серверов (даже общеизвестных) будут расценены как реклама. Такой пост или топ будет удалён, а нарушитель наказан. Для рекламы существует соответствующий раздел. 1.6 Обсуждение программ ботов и всего что с ними связано. Это форум разработчиков серверного ПО, а не чего-либо ещё. 1.7 Обсуждение русификации официальной части эмулятора. Это форум поддержки англоязычного эмулятора, а не какого-либо ещё. 1.8 Обсуждение ПО сторонних разработчиков. Здесь форум поддержки rAthena. Поддержка других проектов производится на других ресурсах. II. Создание тем: Запрещено и за этим следует удаление темы и предупреждение. (За систематические нарушения будет следовать наказание в виде блокировки аккаунта) 2.1 Не информативное название темы. Темы с не информативными названиями будут удалены без предупреждения. 2.2 Создание тем дубликатов, или схожих по смыслу с уже существующими темами. Используйте кнопку Search перед тем, как задать вопрос. 2.3 Невнятное изложение вопроса. Если вы решились всё-таки создать тему, извольте внятно и чётко изложить суть дела. Тема, содержимое которой будет не понятно окружающим, будет расценена как непригодная для жизни и удалена по пп 3.2 данных правил. 2.4 Создание тем, не подпадающих под тематику данного раздела. Будьте внимательны, не создавайте темы с вопросами в разделе, отведённом под руководства. III. Ответ в теме: Запрещено и за этим следует наказание. (На усмотрение модератора) 3.1 Посты, не несущие никакой смысловой нагрузки. 3.2 Оффтоп [Offtop]. Написание сообщений, не попадающих под тематику дискуссии, проводимой под рамками заголовка. Незнание правил не освобождает от ответственности. Администрация имеет право вносить любые изменения в данный материал без предупреждения пользователей. Если вы пишете в этом форуме, то приняли все вышеперечисленные правила и согласны с ними. С уважением. rAthena Russian Support.
  18. Tiera

    KPatcher

    Version 3.1.0.0

    4818 downloads

    Title: KPatcher Version: 3.1 Language: Multilingual Supported GRF files: All versions Support for other packers: RGZ and RAR Supports data transfer protocols: HTTP, FTP, support for username and password KPatcher Features: 1) Fast merge GRF/GPF files; 2) Defragment GRF file; 3) Delete files from the GRF on the mask; 4) Deleting files from your client on a mask; 5) Unpack the RGZ/RAR archives; 6) The ability to patch any GRF file in the folder with patcher; 7) Unique auto update; 8) Support for the official patch server; 9) Simple skinning; 10) Remote file settings and auto update; 11) Fully embedded skin; 12) Custom Buttons. Config Tool Features: 1) Embedding the configuration file; 2) Embedding language file; 3) Embedding skin; 4) Change the icons patcher; 5) Getting CRC of any file. ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Instructions: 1) Edit the file Localhost.kpsf; 2) If no language file for your language, create translation using an existing language files; 3) Create your own skin; 4) Place the files from the Web on your Web server 5) Edit the file settings.ini; 6) Make the necessary changes to the file update.ini; 7) Build settings in the patcher using ConfigTool. Each configuration file has comments and explanations for most settings and options!
    Free
  19. Title: KPatcher Version: 3.1.0.0 Language: Multilingual Supported GRF files: All versions Support for other packers: RGZ and RAR Supports data transfer protocols: HTTP, FTP, support for username and password KPatcher Features: 1) Fast merge GRF/GPF files; 2) Defragment GRF file; 3) Delete files from the GRF on the mask; 4) Deleting files from your client on a mask; 5) Unpack the RGZ/RAR archives; 6) The ability to patch any GRF file in the folder with patcher; 7) Unique auto update; 8) Support for the official patch server; 9) Simple skinning; 10) Remote file settings and auto update; 11) Fully embedded skin; 12) Support the New Login System. Config Tool Features: 1) Embedding the configuration file; 2) Embedding language file; 3) Embedding skin; 4) Change the icons patcher; 5) Getting CRC of any file. ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Instructions: 1) Edit the file Localhost.kpsf; 2) If no language file for your language, create translation using an existing language files; 3) Create your own skin; 4) Place the files from the Web on your Web server 5) Edit the file settings.ini; 6) Make the necessary changes to the file update.ini; 7) Build settings in the patcher using ConfigTool. Each configuration file has comments and explanations for most settings and options! Well, actually everything, wishes, bugs and ask questions only in this topic. KPatcher v3.1.0(rA Downloads)NEW KPatcher v3.0.1(rocrew.net)NEW Thanks to OnPlay for FTP KPatcher v2 Settings Tool Thanks to VgenLife
  20. I am also interested in setting up Russian support section.
×
×
  • Create New...