SHOW:
|
|
- or go back to the newest paste.
| 1 | <?php | |
| 2 | ||
| 3 | /* | |
| 4 | * define globals | |
| 5 | */ | |
| 6 | ||
| 7 | - | $ql_pk3_dir = "C:/Users/USERNAME/AppData/LocalLow/id Software/quakelive/baseq3/"; //path to quakelive baseq3 folder |
| 7 | + | $ql_pk3_dir = "C:/Users/USERNAME/AppData/LocalLow/id Software/quakelive/baseq3/"; //path to quakelive baseq3 folder |
| 8 | - | $target_dir = "D:/Games/Q3A/baseq3/"; //output folder for converted map pk3's |
| 8 | + | $target_dir = "D:/Games/Q3A/baseq3/"; //output folder for converted map pk3's |
| 9 | - | $data_dir = "unzipped/"; //temporary folder for unzipped pk3 contents |
| 9 | + | $data_dir = "unzipped/"; //temporary folder for unzipped pk3 contents |
| 10 | - | $temp_dir = "temp/"; //temporary folder for altered pk3 and converted soundfiles |
| 10 | + | $temp_dir = "temp/"; //temporary folder for altered pk3 and converted soundfiles |
| 11 | $quakelive_dec = "quakelivedec.exe"; //path to quakelivedec.exe | |
| 12 | $vlc = "C:/Program Files (x86)/VideoLAN/VLC/vlc.exe"; //vlc | |
| 13 | ||
| 14 | /* | |
| 15 | * create folders | |
| 16 | */ | |
| 17 | ||
| 18 | if(!is_dir($target_dir)) mkdir($target_dir); | |
| 19 | if(!is_dir($data_dir)) mkdir($data_dir); | |
| 20 | if(!is_dir($temp_dir)) mkdir($temp_dir); | |
| 21 | ||
| 22 | /* | |
| 23 | * convert pk3's | |
| 24 | */ | |
| 25 | ||
| 26 | foreach(glob($ql_pk3_dir."*.pk3") as $pk3){
| |
| 27 | $pk3_basename = pathinfo($pk3, PATHINFO_BASENAME); | |
| 28 | - | exec("quakelivedec.exe \"".$pk3."\" \"".$temp_dir.$pk3_basename."\"");
|
| 28 | + | |
| 29 | if(!file_exists($temp_dir.$pk3_basename)){
| |
| 30 | exec("\"".$quakelive_dec."\" \"".$pk3."\" \"".$temp_dir.$pk3_basename."\"");
| |
| 31 | } | |
| 32 | echo " ... done\r\n"; | |
| 33 | } | |
| 34 | ||
| 35 | /* | |
| 36 | * unpack pk3's | |
| 37 | */ | |
| 38 | ||
| 39 | foreach(glob($temp_dir."*.pk3") as $pk3){
| |
| 40 | $pk3_basename = pathinfo($pk3, PATHINFO_BASENAME); | |
| 41 | echo "unpacking: ".$pk3_basename; | |
| 42 | $zip = new ZipArchive; | |
| 43 | $res = $zip->open($pk3); | |
| 44 | if($res === TRUE){
| |
| 45 | $zip->extractTo($data_dir); | |
| 46 | $zip->close(); | |
| 47 | echo " ... done\r\n"; | |
| 48 | }else{
| |
| 49 | echo " ... failed\r\n"; | |
| 50 | } | |
| 51 | } | |
| 52 | ||
| 53 | ||
| 54 | /* | |
| 55 | * compile shaderdata | |
| 56 | */ | |
| 57 | ||
| 58 | $shaders = glob("unzipped/scripts/*.shader");
| |
| 59 | $shaderdata = ""; | |
| 60 | foreach($shaders as $shader){
| |
| 61 | $shaderdata .= file_get_contents($shader)."\r\n"; | |
| 62 | } | |
| 63 | $shaderdata = preg_split("/\R/", $shaderdata);
| |
| 64 | ||
| 65 | /* | |
| 66 | * loop through all maps, convert, pack and save to $target_dir | |
| 67 | */ | |
| 68 | ||
| 69 | foreach(glob($data_dir."maps/*.bsp") as $map){
| |
| 70 | compileMap(pathinfo($map, PATHINFO_FILENAME)); | |
| 71 | } | |
| 72 | ||
| 73 | /* | |
| 74 | * cleanup | |
| 75 | */ | |
| 76 | echo "cleaning up"; | |
| 77 | foreach(glob($temp_dir."*") as $file){
| |
| 78 | unlink($file); | |
| 79 | } | |
| 80 | foreach(glob($data_dir."*") as $file){
| |
| 81 | unlink($file); | |
| 82 | } | |
| 83 | rmdir($temp_dir); | |
| 84 | rmdir($data_dir); | |
| 85 | echo " ... done\r\n"; | |
| 86 | ||
| 87 | /* | |
| 88 | * main function to compile a single map from unzipped resources | |
| 89 | * making a best effort to take their dependencies into account | |
| 90 | */ | |
| 91 | ||
| 92 | - | global $data_dir, $target_dir, $temp_dir, $shaderdata; |
| 92 | + | |
| 93 | echo "compiling: ".$mapname; | |
| 94 | global $data_dir, $target_dir, $temp_dir, $shaderdata, $vlc; | |
| 95 | $zip = new ZipArchive(); | |
| 96 | ||
| 97 | if($zip->open($target_dir.$mapname.".pk3", ZipArchive::CREATE|ZipArchive::OVERWRITE) == TRUE){
| |
| 98 | ||
| 99 | //add bsp, overwrite version | |
| 100 | $data = file_get_contents($data_dir."maps/".$mapname.".bsp"); | |
| 101 | $data = "IBSP.".substr($data, 5); | |
| 102 | $zip->addFromString("maps/".$mapname.".bsp", $data);
| |
| 103 | ||
| 104 | //add levelshot | |
| 105 | $zip->addFile($data_dir."levelshots/preview/".$mapname.".jpg", "levelshots/".$mapname.".jpg"); | |
| 106 | ||
| 107 | //add arena script | |
| 108 | $arenas = file_get_contents($data_dir."scripts/arenas.txt"); | |
| 109 | preg_match_all("/{\s*map\s*\"".$mapname."\".*?}/s", $arenas, $arena);
| |
| 110 | if(sizeof($arena[0]) > 0){
| |
| 111 | $zip->addFromString("scripts/".$mapname.".arena", $arena[0][0]);
| |
| 112 | } | |
| 113 | ||
| 114 | //not adding aas since it wont work with q3a anyway | |
| 115 | //$zip->addFile($data_dir."maps/".$mapname.".aas", "maps/".$mapname.".aas"); | |
| 116 | ||
| 117 | //TEXTURES | |
| 118 | preg_match_all("/(textures|models)[a-zA-Z\/_0-9\-]*/", $data, $matches);
| |
| 119 | $shaderBuf = ""; | |
| 120 | $textures = array(); | |
| 121 | foreach($matches[0] as $match){
| |
| 122 | //gather textures pass 1/2 | |
| 123 | $textures = array_merge($textures , glob($data_dir.$match."*")); | |
| 124 | ||
| 125 | //gather shaders pass 1/1 | |
| 126 | $lvl = 0; | |
| 127 | $feeding = false; | |
| 128 | foreach($shaderdata as $line){
| |
| 129 | if(!$feeding && preg_match("/^\s*".preg_quote($match, "/")."\s*$/" , $line)){
| |
| 130 | $shaderBuf.=$line."\r\n"; | |
| 131 | $feeding = true; | |
| 132 | }else if($feeding){
| |
| 133 | if(preg_match("/^\s*{\s*$/" ,$line)){
| |
| 134 | $lvl ++; | |
| 135 | } | |
| 136 | if(preg_match("/^\s*}\s*$/" ,$line)){
| |
| 137 | $lvl --; | |
| 138 | if($lvl == 0){
| |
| 139 | $feeding = false; | |
| 140 | } | |
| 141 | } | |
| 142 | if(!preg_match("/^\s*novlcollapse\s*$/", $line)){
| |
| 143 | $shaderBuf.=$line."\r\n"; | |
| 144 | } | |
| 145 | } | |
| 146 | } | |
| 147 | } | |
| 148 | ||
| 149 | //gather textures pass 2/2 | |
| 150 | preg_match_all("/(textures|models)[a-zA-Z\/_0-9]*/", $shaderBuf, $matches);
| |
| 151 | foreach($matches[0] as $match){
| |
| 152 | //echo $match."\r\n"; | |
| 153 | $temp = glob($data_dir.$match."*"); | |
| 154 | $textures = array_merge($textures , $temp); | |
| 155 | } | |
| 156 | ||
| 157 | //add shaders | |
| 158 | $zip->addFromString("scripts/".$mapname.".shader", $shaderBuf);
| |
| 159 | ||
| 160 | //add textures | |
| 161 | $textures = array_unique($textures); | |
| 162 | foreach($textures as $texture){
| |
| 163 | $zip->addFile($texture, substr($texture, strlen($data_dir))); | |
| 164 | } | |
| 165 | ||
| 166 | //SOUNDS | |
| 167 | preg_match_all("/(sound|music)[a-z,A-Z,\/,_,0-9]*/", $data, $matches);
| |
| 168 | $sounds = array(); | |
| 169 | foreach($matches[0] as $match){
| |
| 170 | //gather sounds pass 1/1 | |
| 171 | $sounds = array_merge($sounds , glob($data_dir.$match.".*")); | |
| 172 | } | |
| 173 | ||
| 174 | //convert and add sounds | |
| 175 | $sounds = array_unique($sounds); | |
| 176 | - | exec("vlc -I dummy \"".$sound."\" --sout=#transcode{acodec=s16l,channels=1,samplerate=44100}:standard{access=file,mux=wav,dst=\"".$temp_dir.pathinfo($sound, PATHINFO_FILENAME).".wav\"} --dummy-quiet vlc://quit");
|
| 176 | + | |
| 177 | if(!file_exists($temp_dir.pathinfo($sound, PATHINFO_FILENAME).".wav")){
| |
| 178 | exec("\"".$vlc."\" -I dummy \"".$sound."\" --sout=#transcode{acodec=s16l,channels=1,samplerate=44100}:standard{access=file,mux=wav,dst=\"".$temp_dir.pathinfo($sound, PATHINFO_FILENAME).".wav\"} --dummy-quiet vlc://quit");
| |
| 179 | } | |
| 180 | $zip->addFile($temp_dir.pathinfo($sound, PATHINFO_FILENAME).".wav", pathinfo(substr($sound, strlen($data_dir)), PATHINFO_DIRNAME)."/".pathinfo(substr($sound, strlen($data_dir)), PATHINFO_FILENAME).".wav"); | |
| 181 | } | |
| 182 | $zip->close(); | |
| 183 | ||
| 184 | echo " ... done\r\n"; | |
| 185 | } | |
| 186 | } | |
| 187 | ?> |