Leaderboard
Popular Content
Showing content with the highest reputation on 04/05/12 in Posts
-
Briefing & Concept Hi. So, here we are again. Bringing this old prontera edition that I did on the 2009 - 2010 year. This was my first map, and this is the third improvement of this map that, I'm sure most of you allready known. Some days ago, I was talking with one guy, that told me that my Prontera edit, is used among a lot of servers around actually. I was checking the downloads, and, I was really glad by seing the amount of downloads of this prontera edit. Also seems like I'm on the top Authors in --> http://rathena.org/board/files/ when I saw that I just say to me "Holy crap Mercurial is so close!" so I said, I must release something. On the other hand, I just noticed that actually there are a lot of free releases around. The most ones are since Syouji is into the Graphic Moderators team (That, I must give him my congratulations, he certainly deserves that job for helping a lot of guys around) So for all those reasons I decided to do 2 releases. This is the first, and the second is on the way. To all my actual customers that might read this topic... Don't take me wrong, I just worked in some small free times with this one. Your requests are on the way. Video of This map Watch it in HD 720p! Edition of my past Dark Garden Prontera. More garden style. Map in daymode, but with night tones. Black Shadows I know, this is intentional It is a Garden Map, but with an occultist essence/i] Added Ivys and leaves in almost all the structures: houses, walls, buildings, statues.. Added gardens, in south area, north area, swordman guild, and church New design on the north plaza Removed tree in south plaza. I though that the map was so overcharged with 3 big trees. Better to keep only one, to have a better cam vision. Center Overview South Area Houses. With the Ivy Textures Passages. With Dark Garden Statues and Ivy Textures Center. Custom Leaves on tree + new floor texture North passage New North Plaza Church < -- DOWNLOAD LINK --> You can consider to post, or say something to this topic. A rating, a like, a comment. Like the good reception of the first map, Please people don't download only and say nothing. You can allways contribute with a comment. Remember that I'm allways busy with paid requests, as also that in another situation, I would sell this map easily. It is hard to me to do free time, to offer something for free ... but ... I understand the priority of doing free releases to keep the community alive. All the mappers should make at least, one free release for me. So please, in exchange, share, comment, rate. I will really really appreciate that!. Bye, and thanks in advance! and happy download.1 point
-
Nothing much to says >.<~ Things to know: All message logs i've got from iRO, and i don't use any custom message in my script. 2nd release, follow with my first release ( dewata island ) All El Dicastes Quest and Features ( with quest log ): Department Quests Document Quests Doha's Secret Orders Frede's Request Sapha's Visit Cheshire's Call Cat Hand Service: Equipment Enchanting And All Basic NPC in El Dicastes are included in this release. That made up of <Warp Point>, <Mob Spawn> <Mapflags> ( From iRO Wiki Database ), other things like <Mob DB>, <Skill DB>, <Item DB> are already in rAthena Revision. // -- Ep13_3_invite , Ep13_3_secret ¿¡ÇǼҵå 13.3 »ÇÆÄÀÇ ÃÊû, ºñ¹ÐÀÓ¹« 7182,0,0,0,0,0,0,0,"Sapha's Visit" 7183,0,0,0,0,0,0,0,"Invitation from Sapha" 7184,0,0,0,0,0,0,0,"To El Dicastes!" 7185,0,0,0,0,0,0,0,"Inspector Doha" 7186,0,0,0,0,0,0,0,"Secret Order from Doha - Investigation" 7187,0,0,0,0,0,0,0,"Secret Order from Doha - Shay" 7188,0,0,0,0,0,0,0,"Information Gathering - in the Plaza" 7189,0,0,0,0,0,0,0,"Information Gathering - in the Factory" 7190,0,0,0,0,0,0,0,"Information Gathering - at the Guards" 7191,0,0,0,0,0,0,0,"Shay's designation - BK" 7192,0,0,0,0,0,0,0,"BK's Information" 7193,0,0,0,0,0,0,0,"Dimensional Crack Investigation" 7194,0,0,0,0,0,0,0,"What's this bloodstain?" 7195,0,0,0,0,0,0,0,"What's this skin piece?" 7196,0,0,0,0,0,0,0,"What's this suspicious magic power?" 7197,0,0,0,0,0,0,0,"Sapha Certifications?" 7198,0,0,0,0,0,0,0,"Audience with Ahat" 7199,0,0,0,0,0,0,0,"Secret Order from Ahat" 7200,82800,0,0,0,0,0,0,"Cheshire's call" 7201,0,0,0,0,0,0,0,"Removing traces" 7202,0,0,0,0,0,0,0,"Secret order from Doha - Collect proof" 7203,0,0,0,0,0,0,0,"Secret order from Doha - Final Report" // -- Ep13.3 ¿¡ÇǼҵå 13.3 11159,0,0,0,0,0,0,0,"Story of Brian" 11160,0,0,0,0,0,0,0,"Story of John" 11161,0,0,0,0,0,0,0,"Story of Tyler" 11162,0,0,0,0,0,0,0,"Story of Rose" 11163,0,0,0,0,0,0,0,"Story of Bain" 11164,0,0,0,0,0,0,0,"Story of Lash" 11165,0,0,0,0,0,0,0,"Delivered to Brian" 11166,0,0,0,0,0,0,0,"Delivered to John" 11167,0,0,0,0,0,0,0,"Delivered to Tyler" 11168,0,0,0,0,0,0,0,"Delivered to Rose" 11169,0,0,0,0,0,0,0,"Delivered to Bain" 11170,0,0,0,0,0,0,0,"Delivered to Lash" 11171,0,0,0,0,0,0,0,"Request from Frede" 11172,0,0,0,0,0,0,0,"Request from Frede" 11173,0,0,0,0,0,0,0,"Request from Frede" 11174,0,0,0,0,0,0,0,"Supply Shortage" 11175,7200,0,0,0,0,0,0,"Supply Shortage" 11176,0,0,0,0,0,0,0,"For my friends" // -- Ep. 13.3 --- ÀÏÀÏÄù½ºÆ® Daily Quest 12099,0,2014,10,0,0,0,0,"Remove Root Cause" 12100,0,1994,12,0,0,0,0,"Violent Winged Insect" 12101,0,2013,5,0,0,0,0,"Work Interference" 12102,0,1993,10,0,0,0,0,"Intelligent Snakes" 12103,0,1992,1,0,0,0,0,"Legendary Creature" 12104,0,1987,15,0,0,0,0,"Insects with an Appetite" 12105,0,2024,10,0,0,0,0,"Moving Rocks" 12106,0,1995,15,0,0,0,0,"A child on a flower" 12107,0,2015,10,0,0,0,0,"Twisted Love" 12108,0,1988,12,0,0,0,0,"Dangerous Plant Removal" 12109,0,1999,14,0,0,0,0,"Larva Extermination" 12110,0,2016,7,0,0,0,0,"Demon of Water" 12111,0,1986,10,0,0,0,0,"Bird with ugly face" 12117,0,0,0,0,0,0,0,"Withered Flower" 12118,0,0,0,0,0,0,0,"Welcomed Mineral" 12119,0,0,0,0,0,0,0,"Valuable Textile" 12120,0,0,0,0,0,0,0,"Curious Meat" 12121,0,0,0,0,0,0,0,"Materials to Clear Snow" 12122,0,0,0,0,0,0,0,"Best Cooler Material" 12123,0,0,0,0,0,0,0,"Best Paint" 12124,0,0,0,0,0,0,0,"Rare Valuable" 12125,0,0,0,0,0,0,0,"Armory Material" 12126,0,0,0,0,0,0,0,"Advanced Armory Material" 12127,0,0,0,0,0,0,0,"Supervisor's Tool" 12128,0,0,0,0,0,0,0,"Preparation for Heating" 12129,0,0,0,0,0,0,0,"Suspicious Food" 12130,0,0,0,0,0,0,0,"Useful Material" 12131,0,0,0,0,0,0,0,"Essential Material for Construction" 12132,0,0,0,0,0,0,0,"Essential Material for Construction 2" 12133,0,0,0,0,0,0,0,"Decoration arrangement" 12134,0,0,0,0,0,0,0,"Instant Receptacle" 12135,0,0,0,0,0,0,0,"Not enough medicine" 12136,0,0,0,0,0,0,0,"Honey robber" 12137,0,0,0,0,0,0,0,"Tools for Experiment" 12138,0,0,0,0,0,0,0,"Fine Gift Samples" 12139,0,0,0,0,0,0,0,"Respect for Taste!" 12140,0,0,0,0,0,0,0,"Courtesy for Regulars" 12141,0,0,0,0,0,0,0,"Special Package" 12142,0,0,0,0,0,0,0,"Dangerous Request" 12143,0,0,0,0,0,0,0,"Strange Trend" 12144,0,0,0,0,0,0,0,"Unknown Usage" 12145,0,0,0,0,0,0,0,"Other World Cuisine" 12146,0,0,0,0,0,0,0,"Filling in Cracks" 12147,0,0,0,0,0,0,0,"Adhesive Material" 12148,0,0,0,0,0,0,0,"Bait for Tatacho Hunting" 12149,0,0,0,0,0,0,0,"Swordmanship Practice" 12150,0,0,0,0,0,0,0,"Pretty reddish vegetable" 12151,0,0,0,0,0,0,0,"Tenacity of the pub owner" 12152,0,0,0,0,0,0,0,"Tastes like home cooking" 12153,0,0,0,0,0,0,0,"Hazardous plant when burnt" 12154,0,0,0,0,0,0,0,"Unexpectedly Normal" 12155,0,0,0,0,0,0,0,"Gift with heart" 12156,0,0,0,0,0,0,0,"Respect personal appetite!" 12157,0,0,0,0,0,0,0,"Resolution of the pub owner" 12158,0,0,0,0,0,0,0,"Rage of the pub owner" 12159,82800,0,0,0,0,0,0,"Quest record from Laponte" 12160,82800,0,0,0,0,0,0,"Quest record from Kalipo" 12161,82800,0,0,0,0,0,0,"Quest record from Pura" 12162,82800,0,0,0,0,0,0,"Quest record from Tragis" 12163,82800,0,0,0,0,0,0,"Quest record from Calyon" 12164,82800,0,0,0,0,0,0,"Quest record from Moltuka" 12165,21600,0,0,0,0,0,0,"Dizziness" 12166,0,0,0,0,0,0,0,"Tree Root Doc." 12167,0,0,0,0,0,0,0,"Reptile Tongue Doc." 12168,0,0,0,0,0,0,0,"Scorpion Tail Doc." 12169,0,0,0,0,0,0,0,"Stem Doc." 12170,0,0,0,0,0,0,0,"Pointed Scale Doc." 12171,0,0,0,0,0,0,0,"Resin Doc." 12172,0,0,0,0,0,0,0,"Spawn Doc." 12173,0,0,0,0,0,0,0,"Jellopy Doc." 12174,0,0,0,0,0,0,0,"Fish Tail Doc." 12175,0,0,0,0,0,0,0,"Worm Peeling Doc." 12176,0,0,0,0,0,0,0,"Gill Doc." 12177,0,0,0,0,0,0,0,"Tooth of Bat Doc." 12178,0,0,0,0,0,0,0,"Fluff Doc." 12179,0,0,0,0,0,0,0,"Chrysalis Doc." 12180,0,0,0,0,0,0,0,"Feather of Birds Doc." 12181,0,0,0,0,0,0,0,"Talon Document Doc." 12182,0,0,0,0,0,0,0,"Sticky Webfoot Doc." 12183,0,0,0,0,0,0,0,"Animal Skin Doc." 12184,0,0,0,0,0,0,0,"Wolf Claw Doc." 12185,0,0,0,0,0,0,0,"Mushroom Spore Doc." 12186,0,0,0,0,0,0,0,"Orc's Fang Doc." 12187,0,0,0,0,0,0,0,"Evil Horn Doc." 12188,0,0,0,0,0,0,0,"Powder of Butterfly Doc." 12189,0,0,0,0,0,0,0,"Bill of Birds Doc." 12190,0,0,0,0,0,0,0,"Snake Scale Doc." 12191,0,0,0,0,0,0,0,"Insect Feeler Doc." 12192,0,0,0,0,0,0,0,"Immortal Heart Doc." 12193,0,0,0,0,0,0,0,"Rotten Bandage Doc." 12194,0,0,0,0,0,0,0,"Decayed Nail Doc." 12195,0,0,0,0,0,0,0,"Horrendous Mouth Doc." 12196,0,0,0,0,0,0,0,"Tentacle Doc." 12197,0,0,0,0,0,0,0,"Shell Doc." 12198,0,0,0,0,0,0,0,"Scale Shell Doc." 12199,0,0,0,0,0,0,0,"Venom Canine Doc." 12200,0,0,0,0,0,0,0,"Sticky Mucus Doc." 12201,0,0,0,0,0,0,0,"Bee Sting Doc." 12202,0,0,0,0,0,0,0,"Grasshopper's Leg Doc." 12203,0,0,0,0,0,0,0,"Royal Jelly Doc." 12204,0,0,0,0,0,0,0,"Yoyo Tail Doc." 12205,0,0,0,0,0,0,0,"Solid Shell Doc." 12206,0,0,0,0,0,0,0,"Yam Doc." 12207,0,0,0,0,0,0,0,"Raccoon Leaf Doc." 12208,0,0,0,0,0,0,0,"Snail's Shell Doc." 12209,0,0,0,0,0,0,0,"Horn Doc." 12210,0,0,0,0,0,0,0,"Bear's Footskin Doc." 12211,0,0,0,0,0,0,0,"Feather Doc." 12212,0,0,0,0,0,0,0,"Red Herb Doc." 12213,0,0,0,0,0,0,0,"Carrot Doc." 12214,0,0,0,0,0,0,0,"Cactus Needle Doc." 12215,0,0,0,0,0,0,0,"Stone Heart Doc." Update 17/2/2012: Fix bug cat_hands_enchant.txt, please re-download.1 point
-
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 -> 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 }; 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 -> 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 int main () { FILE * FD = NULL; struct grf_header Header = {0}; uint32_t RealFilesCount = 0; FD = fopen ("data.grf", "rb"); /// Read the header container fread (& 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 (& 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; } /// 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 <_FileNode> _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 <_FileNode> _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 (& 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 = 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 & 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); } 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.rar1 point
-
1 point
-
10/10 as usual. Now I want a Light Garden Prontera. *hint hint* ;D JKJK!1 point
-
This free release has already been provided on eAthena however since eA is no longer in development, I'm migrating the release to rAthena to make sure everyone has a chance of choosing whether or not they wish to use it. A warp script is provided with this release. To download this map, refer to the attached file to this thread. The Lounge comes with the following areas: - Main Entrance Hall (Here you can choose to walk into 4 different warps) - Lounge (Couches, tables, resting zone for chit-chat) - Weaponry/Vending Area (NPCs can sell exclusive gear here) - Games Room (there's a poker table with some couches) - Courtyard (complete with a pool, wedding area, and some walkways) Overview Screenshot VIP Lounge - Syouji.7z1 point
-
this is a rough translation For %dminutes increases your gained experience by %d%%.# or For %dminutes boost your experience gain by %d%%.#1 point
-
That thread provided the sprite in an alternate download link about 2 pages in xD. I attached the sprite file to this post. GM Sprite.rar1 point
-
I thing I see the holy light now man, lol! Let me ask you this. Did you update you LUA files to let you go to higher than just level 1? Skillinfo and skillinfoz? If not then theres you problem! Glad I could help. Peopleperson491 point
-
Small: 2 Big: 4 AI: 8 Small and AI: 2+8 = 10 Big and AI: 4+8 = 12 You enter the red values as event.1 point
-
i not understand why did use a pink texture? for it serves?1 point
-
I should mention that you will not see the magenta color in game that's currently portrayed on the indoor map in the last two images. The color simply enables proper shadows to form on the sides of the tiles/walls whilst providing as a transparent base at the same time. So all of the magenta areas will be shown in game as a black color with zero lightmap coloration. I highly recommend mappers to use this method to encircle the perimeter of in-door maps.1 point
-
This is very simple and nice syouji! I'm loving this way better than the original grounds!1 point
-
if your having problems with your exp.txt, you obviously have an old revision thats out of fking date, update your svn or grab an exp.txt from the current revision, INSTEAD of being lazy and asking us to look for one for you. the svn has every damn file from like when it started till now, and guess what you can even browse each file from when it started till now, isnt that just flippin amazing, so the next time you post in here having problems with something and people like us that take time out of our day to help you look for something dont get a damn attitude >_>, also typing in configurations from scratch isnt a hard deal, and having a local server and ur barley working on the exp.txt means you can throw away this old revision your using and grab a fresh clean stable one that wont have any errors and no sacrifices will happend because you don't have any players. Hope this helps with your future posts, and or current problem.1 point
-
Awesome, anyone havin trouble with homunculus with his client, cant seem to delete or feed them, get 99 error unknown menu choice:99 that seems like the only problem with this client, other than that its cool things i noticed, 2011-12-20b doesn't work with AI same error 2012-02-07b works no errors with AI1 point
-
you need to fix your LUA. goto stateicon folder -> stateiconinfo.LUA ctrl+f "EFST_ALL_RIDING" change this line StateIconList[EFST_IDs.EFST_ALL_RIDING] = { haveTimeLimit = 1, posTimeLimitStr = 2, descript = { {"Riding", COLOR_TITLE_TOGGLE}, } } into this StateIconList[EFST_IDs.EFST_ALL_RIDING] = { descript = { {"Riding", COLOR_TITLE_TOGGLE} } }1 point
-
[ Update ] : Added a Class Restriction Script : Description : This Script allow certain Maps to Block / Restrict certain Job Class. Configurations can be varies across the Maps settings. If the Class that are Blocked entering the Map, the Characters will be warped out from the Map within few seconds after they enter the Map. This Script will be able to answer / solve those below problems. Configuration : Bitwise Table and Usage : // -------- BitMasks -------- // 1 - Normal jobs, // 2 - Adv jobs. // 4 - Baby jobs, // 8 - Normal 3rd jobs. // 16 - Adv. 3rd jobs. // 32 - Baby 3rd jobs. // 64 - Certain Jobs ( Specific ) // ----- Mode Example : ( Blocked Class ) ------ // 63 - All Class that has been defined // 64 - Only the Specific Job you defined // 7 - Normal + Advanced + Baby Jobs // 56 - Normal 3rd + Advanced 3rd + Baby 3rd Jobs Notes : Just add in the Value for the Bitmask. Aware of the Usage of Certain Jobs. --- If you using Bitmask Above , aware of the Limit Reach. ( ~128 Total Class ) --- If your Bitmask = ( 63 + 64 ) , Your "Certain Jobs" have only about 20 Slots. --- Anyway, i dont think you will do so since Bitmask 63 will block most of the Class already. * Common Sense : Make sure the Array ".@Restrict" didnt exceed limit of 128 element. You may edit these below parts... but by default, i have list down most of the Job Class accordingly... // Normal Jobs if( getarg(0) & 1 ) setarray .@Restrict[getarraysize(.@Restrict)],0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,23,24,25,4046,4047,4049; // Adv Jobs if( getarg(0) & 2 ) setarray .@Restrict[getarraysize(.@Restrict)],4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4015,4016,4017,4018,4019,4020,4021; // Baby Jobs if( getarg(0) & 4 ) setarray .@Restrict[getarraysize(.@Restrict)],4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4037,4038,4039,4040,4041,4042,4043,4045; // Normal 3rd Jobs if( getarg(0) & 8 ) setarray .@Restrict[getarraysize(.@Restrict)],4054,5055,4056,4057,4058,4059,4066,4067,4068,4069,4070,4071,4072; // Adv 3rd Jobs if( getarg(0) & 16 ) setarray .@Restrict[getarraysize(.@Restrict)],4060,4061,4062,4063,4064,4065,4073,4074,4075,4076,4077,4078,4079; // Baby 3rd Jobs if( getarg(0) & 32 ) setarray .@Restrict[getarraysize(.@Restrict)],4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108; However,.....this is a special case ....... // Certain Jobs ( Specific Your Own Class Restriction ) if( getarg(0) & 64 ) setarray .@Restrict[getarraysize(.@Restrict)],4046,4002,4004,4013,4011; It would be better to Not using Bitwise 64 if your script already block all of the job class above ( Bitwise : 63 ) This is because, the limit might be exceed if you add too much Job Class in the Array for Bitwise ( 64 + 63 ) Anyway, i think it is still Okay to use Bitwise ( 64 + some of the other Bitwise ) ...but not All Bitwise combined. Settings : I guess you should be able to understand this part right ? so, i will skip this parts. // Wait X Seconds before warped out. set .Sec,5; // Lowest GM Level to Bypass set .LowGMLvl,80; Here come the Maps Settings Parts. setarray .Map$, // <Mapname>,<Mode>.... ( Mode = Bitwise Value ) Max of ~64 Map Settings. "prtg_cas01","63", "prtg_cas02","64", "prtg_cas03","3", "prtg_cas04","2", "prtg_cas05","1"; You should be able to realize that....the setting are done in this Format.. <MapName>, <Mode>, ......... <MapName>, <Mode>; the Mode refer to the Bitwise Value ( Blocked Class for the Map ) and the Mode are write within Quotation Mark ( " " ) as a string. refer to above Bitwise Table for how to configure the Bitwise Value for Restrict those Job Class. You may add up to ~64 Maps. Example : "prtg_cas01","63", // --------> Restrict "All" the Job Class ( Except "Certain Jobs" ) "prtg_cas02","64", // --------> Restrict "Certain Jobs" ( Specified by Yourself ) "prtg_cas03","3", // --------> Restrict "Normal & Advanced Job" Class "prtg_cas04","2", // --------> Restrict "Advance" Jobs "prtg_cas05","1"; // --------> Restrict "Normal" Jobs Class Restriction [ Version 2 ] Changelog : Scripts : View ♥ Download Please spend your time to read all the things i have write / mentioned in the post before you asking any questions. if got bug / problems please do report to me.1 point