/* hpak.c - custom user package to send other clients Copyright (C) 2010 Uncle Mike This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #ifndef HPAK_H #define HPAK_H #include "custom.h" /* ======================================================================== .HPK archive format (Hash PAK - HPK) List of compressed files, that can be identify only by TYPE_* header: dwadinfo_t[dwadinfo_t] file_1: byte[dwadinfo_t[num]->disksize] file_2: byte[dwadinfo_t[num]->disksize] file_3: byte[dwadinfo_t[num]->disksize] ... file_n: byte[dwadinfo_t[num]->disksize] infotable dlumpinfo_t[dwadinfo_t->numlumps] ======================================================================== */ #define IDHPAKHEADER (('K'<<24)+('A'<<16)+('P'<<8)+'H') // little-endian "HPAK" #define IDHPAK_VERSION 1 // a1ba: because Valve for some reason writes resource_t to file // I had to make it crossplatform version #pragma pack( push, 8 ) typedef struct dresource_s { char szFileName[64]; /* 0 64 */ /* --- cacheline 1 boundary (64 bytes) --- */ resourcetype_t type; /* 64 4 */ int nIndex; /* 68 4 */ int nDownloadSize; /* 72 4 */ unsigned char ucFlags; /* 76 1 */ unsigned char rgucMD5_hash[16]; /* 77 16 */ unsigned char playernum; /* 93 1 */ unsigned char rguc_reserved[32]; /* 94 32 */ /* XXX 2 bytes hole, try to pack */ /* --- cacheline 2 boundary (128 bytes) --- */ uint32_t pNext; /* 128 4 */ uint32_t pPrev; /* 132 4 */ /* size: 136, cachelines: 3, members: 10 */ /* sum members: 134, holes: 1, sum holes: 2 */ /* last cacheline: 8 bytes */ } dresource_t; #pragma pack( pop ) STATIC_ASSERT( sizeof( dresource_t ) == 136, "invalid dresource_t size, HPAKs won't be compatible (no custom logo in multiplayer!)" ); typedef struct { int ident; // should be equal HPAK int version; int infotableofs; } hpak_header_t; typedef struct { dresource_t resource; int filepos; int disksize; } hpak_lump_t; typedef struct { int count; hpak_lump_t *entries; // variable sized. } hpak_info_t; #endif // HPAK_H