Scrama
95 постов
Карма: 8
#1 08 октября 2008 в 09:09
Может кто знает, как на Quake C прочитать содержимое файла? Хочу сделать подгрузку дополнительных поинт-ентитей.
VorteX
341 постов
Карма: 60
#2 08 октября 2008 в 09:32
Если под оригинальный квак делать - никак (фрикбот не в счет, он читает свои вейпонты извращенским путем через конфиг-файлы)<br /><br />если под порт - в помощь экстеншн FRIK_FILE<br /><br />http://web.archive.org/web/20071029104936/wiki.quakesrc.org/index.php/FRIK_FILE<br /><br />пример использования FRIK_FILE:<br /><br />float filehandle;<br />string s;<br /><br />filehandle = fopen(&quot;myfile.txt&quot;, FILE_READ);<br />if (filehandle &lt; 0)<br />&nbsp; &nbsp; return; // ошибка при открытии<br />s = fgets(filehandle);<br />while(s)<br />{<br />// код обработки строчки<br />// читаем следующую<br />s = fgets(filehandle);<br />}<br />fclose(filehandle);
Scrama
95 постов
Карма: 8
#3 09 октября 2008 в 08:06
VorteX, не совсем понял. Мне нужен какой-то порт, который поддерживает эти функции, так?<br />Я подохреваю, что почти все они это уже умеют. Еще мне нужен, видимо, расширенный qcc, я пользую последний fteqcc. Это все или нужно еще что-то иметь?
VorteX
341 постов
Карма: 60
#4 09 октября 2008 в 08:51
Мне нужен какой-то порт, который поддерживает эти функции, так?
Да<br /><br />
Я подозреваю, что почти все они это уже умеют
Если брать самые известные - то все. FTE, Darkplaces, Vengeance (r1/r2), Betwix, QMB, Tremor, JoeQuake, Fuh и пр. Но есть и те, в которых этого нет, или где свой экстеншн под чтение файла (TOMAZ_FILE у TomazQuake, у ZQuake что то свое, не помню).<br /><br />Чтобы все было правильно, рекомендую пользоваться checkextension(), тогда ты точно будешь знать, поддерживает ли порт данную фишку или нет.<br /><br /><br />
Еще мне нужен, видимо, расширенный qcc, я пользую последний fteqcc
<br />да, желательно юзать FTEQCC/FRIKQCC,&nbsp; в FTEQCC надо включить опцию if(string) fix<br /><br />Дело в том, что в QC как и в C есть принципиальное различие между нулевой и пустой строкой (пустая строка содержит ноль-терминатор, нулевая строка его не имеет). В оригинальном QCC проверки на нулевую строку нет - только на пустую строку. А фишка в том, что fgets() при достижении конца файла начинает возвращать именно нулевую строку, то есть без современного FTEQCC/FRIKQCC конец файла нормальным образом не поймать, в оригинальном QCC if (!s) сработает на первой пустой строке (которые гипотетически могут быть в середине файла)
Scrama
95 постов
Карма: 8
#5 09 октября 2008 в 10:15
VorteX, спасибо большое. Попробую зачитать что-нибудь простенькое для начала, а там и партикли можно будет пускать...
Scrama
95 постов
Карма: 8
#6 09 октября 2008 в 10:20
[quote author=VorteX link=topic=409.msg10039#msg10039 date=1223542313]рекомендую пользоваться checkextension()[/quote]Это в QC пишется что-то вроде checkextinsion(FRIK_FILE) и если возвращает 1, то можно пускать код обработки, а если 0 - то просто не включать эффект?
VorteX
341 постов
Карма: 60
#7 09 октября 2008 в 10:46
Scrama пишет:<br />
Это в QC пишется что-то вроде checkextinsion(FRIK_FILE) и если возвращает 1, то можно пускать код обработки, а если 0 - то просто не включать эффект?<br />
<br />в общем так, я использую такой подход:<br /><br />void() worldspawn =<br />{<br />&nbsp; &nbsp; // проверим что движок поддерживает функцию checkextension<br />&nbsp; &nbsp; if (!cvar(&quot;pr_checkextension&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error(&quot;Engine does not supports QSG extensions&quot;);<br />&nbsp; &nbsp; // проверяем жизненно важный FRIK_FILE<br />&nbsp; &nbsp; if (!checkextension(&quot;FRIK_FILE&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; error(&quot;Vital extension FRIK_FILE is missed&quot;);<br />&nbsp; &nbsp; ...<br />}<br /><br /><br />или так, как в цитате (отрубание вызова функции)<br /><br /><br />float frik_file_supported;<br />void() worldspawn =<br />{<br />&nbsp; &nbsp; frik_file_supported = FALSE;<br />&nbsp; &nbsp; if (cvar(&quot;pr_checkextension&quot;))<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!checkextension(&quot;FRIK_FILE&quot;))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;frik_file_supported = TRUE;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; ...<br />}<br /><br />void() SomeFuncToWriteFile =<br />{<br /> if (!frik_file_supported)<br />&nbsp; &nbsp; &nbsp;return;<br /> filehandle = fopen....<br />}<br /><br /><br />
а там и партикли можно будет пускать...
<br />Партикл-скрипты задумал сделать? :)<br />
KRIGSSVIN
930 постов
Карма: 53
#8 09 октября 2008 в 10:58
А фишка в том, что fgets() при достижении конца файла начинает возвращать именно нулевую строку, то есть без современного FTEQCC/FRIKQCC конец файла нормальным образом не поймать
<br />Даже в кушной файловой системе FS_ReadFile спецом добавляет нолик к буферу, в который загрузили файл.
Scrama
95 постов
Карма: 8
#9 10 октября 2008 в 02:51
Партикл-скрипты задумал сделать?
Да, хочу сделать что-то вроде Spirit of Half-life, но под Кваку. Пока чисто из интереса, на сколько далеко можно продвинуться.<br /><br />Дернул тут вращающиеся объекты из армагона - что-то они не срабатывают, или я чего-то не то делаю.<br />Навписывал там в функции бпринтов - отчитывается о выполнении постоянно, но сам объект куда-то исчез с карты, его просто не видно. А функция в консоль исправно гадит.<br />
<br />{<br />&quot;classname&quot; &quot;func_rotate_entity&quot;<br />&quot;spawnflags&quot; &quot;2&quot;<br />&quot;rotate&quot; &quot;30 0 0&quot;<br />&quot;speed&quot; &quot;1&quot;<br />&quot;target&quot; &quot;rp&quot;<br />&quot;targetname&quot; &quot;rot&quot;<br />&quot;origin&quot; &quot;128 0 0&quot;<br />}<br />{<br />&quot;classname&quot; &quot;info_rotate&quot;<br />&quot;targetname&quot; &quot;rp&quot;<br />&quot;origin&quot; &quot;128 0 96&quot;<br />}<br /><br />
Scrama
95 постов
Карма: 8
#10 10 октября 2008 в 03:27
Майндфак! Там оказывается две поинт-ентити и одна солид должна быть!<br />Осталось хоть как-то сгладить движение и получать зачот...