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 | ?> |