HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Проблема с кешированием модели (https://hlfx.ru/forum/showthread.php?threadid=2252)
Отправлено fire64 01-08-2010 в 13:41:
Проблема с кешированием модели
Я пишу NPC который бы при респавне проигрывал нужные мне анимации и воспроизводил заданные в текстовом файле записи.
Так вот, по не известной мне причине, мне не удается закешировать модель.
Если я в скрипте задам уже кешированную модель, то все ОК, а если нет, то ошибка Host_Error: no precache: %modelname%
Сначала я подумал, что ошибка где-то в коде парсера, но консольный его вариант работает нормально, так что и в халфе он должен тоже работать.
Код NPC, а так же тестовый скрипт прилагаю.
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 01-08-2010 в 15:21:
fire64 вот это что за гамно?
C++ Source Code:
1 | void CActorNpc::Precache( void ) |
3 | char ModelName[MEMALLOC]; |
4 | memset( ModelName, 0, sizeof(ModelName) ); |
6 | if( !GetModel( partbuff, ModelName ) ) |
8 | ALERT( at_warning, "Can not get model name" ); |
14 | ALERT( at_warning, "Preceching model: %s\n", ModelName ); |
19 | PRECACHE_MODEL( ModelName ); |
20 | PRECACHE_SOUND( SSOUNDNAME ); |
22 | CBaseMonster::Precache(); |
У тебя Precache не вызывается ни в одном случае. Внимательнее надо быть.
Добавлено 01-08-2010 в 19:21:
ЗЫ. а вообще у тебя парсер вырвиглазный. Зачем хранить буффер и парсить его по мере обращения? Не проще ли сразу всё распарсить?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 01-08-2010 в 16:38:
Да, действительно 
Только это не помогло.
C++ Source Code:
2 | Setmaster unavailable, start a server first. |
5 | Using WAD File: halflife.wad |
6 | Using WAD File: liquids.wad |
7 | Using WAD File: xeno.wad |
8 | Using WAD File: opfor.wad |
9 | Using WAD File: rdm2.wad |
10 | Using WAD File: crossbounce.wad |
12 | WARNING: failed to locate sequence file test |
14 | Average leaves visible / audible / total: 10 / 11 / 24 |
17 | Executing listen server config file |
18 | WARNING: Preceching model: |
19 | Last 32 messages parsed. |
24 | Wrote erroneous message to buffer.dat |
гм, а может ли быть так, что функция Precache вызывается до Spawn ?
Добавлено 01-08-2010 в 20:38:
Дядя Миша, ну вообще-то буфер файла приходится хранить, так как в скрипте может быть несколько секций, а ParseScript при каждом вызове должен обращаться к новой секции.
Насчет же буфера с содержимым секции согласен.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 01-08-2010 в 18:51:
fire64 ты проверь содержимое ModelName. Есть подозрение, что там пусто.
Добавлено 01-08-2010 в 22:51:
И еще: WARNING: failed to locate sequence file test - это он у тебя не смог загрузить твой скрипт? Не юзай fopen, GET_GAME_DIR далеко не всегда возвращает валидную директорию.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 02-08-2010 в 10:35:
Немного разобрался.
Дело в том, что загрузка скрипта у меня вызывается из Spawn функции.
А саму энтити я создаю из другой энтити, при этом предварительно использую UTIL_PrecacheOther
Соответственно кеширование происходит из другой энтити минуя Spawn, при этом загрузка скрипта не происходит.
Добавлено 02-08-2010 в 14:11:
гм
очень странно.
C++ Source Code:
3 | memset( ModelName, 0, sizeof(ModelName) ); |
5 | if( !GetModel( partbuff, ModelName ) ) |
7 | ALERT( at_warning, "Can not get model name" ); |
13 | ALERT( at_warning, "Get model name: %s\n", ModelName ); |
если написать
C++ Source Code:
PRECACHE_MODEL( ModelName ); |
то игра падает, а если написать
C++ Source Code:
1 | char *mmname = ( char * )malloc( strlen(ModelName) ); |
2 | memset( mmname, 0, sizeof(mmname) ); |
3 | sprintf( mmname, "%s", ModelName ); |
5 | PRECACHE_MODEL( mmname ); |
то работает
Добавлено 02-08-2010 в 14:35:
а переделывать код работы со скриптом в любом случае придется, так как список звуков для кеширования нужно брать сразу со всех секций скрипта, а не только из первой, как сейчас.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 02-08-2010 в 10:44:
fire64 у тебя нолик-то дописан в ModelName ?
sprintf его в любом случае его добавляет.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 02-08-2010 в 10:58:
Дядя Миша, хм вполне возможно.
Выкладываю новую версию кода и скрипта.
п.с.
насчет
C++ Source Code:
char ModelName[MEMALLOC]; |
char SoundName[MEMALLOC]; |
это временно, потом сделаю полный парсинг скрипта специально для кеширования моделей и звуков.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 02-08-2010 в 11:13:
та я не про MEMALLOC, убедись что у тебя строки в адекватном состоянии.
Вообще стандартные strncpy и strncat из CRT удивительно кривые.
ну просто мега-кривые. Я в ксаше заюзал кастомные из FreeBSD, с тех пор вообще не имел ни одной проблемы со строками.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 02-08-2010 в 16:17:
Выкладываю небольшую демку + код.
Как выяснилось, появилась новая бага, причина которой мне не известна.
Дело в том, что после проигрывания второй секции скрипта, игра вылетает в главное меню, при этом в консоли сообщение:
C++ Source Code:
Host_Error: UserMsg: Not Present on Client 23 |
Скачать с народа
update:
хм
Очень странно.
Дядя Миша, как выяснилось падение после конца 2 секции происходит из-за кириллического текста. не подскажешь как быть ?__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 02-08-2010 в 17:03:
fire64 тысячу раз пережовывалось. Халфа не любит букву 'я', она считает её за конец мессаги почему-то.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 02-08-2010 в 17:40:
омг 
Ну да конечно,
ведь я это если я не ошибаюсь, в Hexе 'я' выглядит как FF
А это служебный код используемый для сетевых пакетов.
Добавлено 02-08-2010 в 21:40:
На то, что получилось, можно посмотреть здесь
http://narod.ru/disk/23354526000/te...script.rar.html
п.с
стандартная система вывода сообщений на экран мне сильно не понравилась, придется еще и на клиент лезть 
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 02-08-2010 в 17:58:
Цитата:
fire64 писал:
А это служебный код используемый для сетевых пакетов.
-1 это конец мессаги. Внезапный 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 02-08-2010 в 19:03:
Причем, легко поправляемый редактированием parsemsg.cpp на клиенте (или что-то типа того).
__________________
Отправлено fire64 04-08-2010 в 07:44:
Народ еще вопрос, никто не даст ссылку на код диалогов или комментариев, короче на систему вывода текста.
Так как UTIL_HudMessage мне совершенно не подходит.
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено XaeroX 04-08-2010 в 07:49:
UTIL_HudMessage должна подходить, ты, очевидно, что-то делаешь неправильно.
__________________