HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Нубские вопросы от <censored> и других нубов (https://hlfx.ru/forum/showthread.php?threadid=4535)
Отправлено Дядя Миша 24-06-2017 в 16:19:
Цитата:
Ku2zoff писал:
работа со строками в этом языке довольно странная
Она не то чтобы странная. Её как таковой вообще нет. В крестах через контейнеры обычно работают, но они там не всегда были.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Sigurth 24-06-2017 в 19:24:
Цитата:
Ku2zoff писал:
ты сохраняешь в сейвдату игрока только имя трека без расширения, или полный путь с расширением?
Только имя, но с расширением, например "music01.mp3".
Цитата:
Ku2zoff писал:
Как у тебя формируется строка m_strCurrentMp3, и как ты отправляешь мессагу после загрузки карты?
При спавне или ресторе переменная m_iMp3NeedsUpdate = 2;
А потом такой код в функции UpdateClientData
C++ Source Code:
3 | if (FStringNull(m_strCurrentMp3)) |
5 | MESSAGE_BEGIN( MSG_ONE, gmsgMP3, NULL, pev ); |
6 | WRITE_BYTE(0); // turn off |
7 | if (m_iMp3NeedsUpdate == 2) |
8 | WRITE_COORD(0); // level 2 update: stops immediatly |
10 | WRITE_COORD(5.0); // update during game - slowly turn off |
12 | //ALERT(at_aiconsole, "MP3 player: turning off\n"); |
16 | MESSAGE_BEGIN( MSG_ONE, gmsgMP3, NULL, pev ); |
17 | WRITE_BYTE(m_iMp3NeedsUpdate == 3 ? 2 : 1); // play |
18 | WRITE_STRING(STRING(m_strCurrentMp3)); |
20 | //ALERT(at_console, "MP3 player: playing file [%s]\n", STRING(m_strCurrentMp3)); |
22 | if( m_iMp3NeedsUpdate == 3 ) |
23 | m_strCurrentMp3 = iStringNull; |
27 | m_iMp3NeedsUpdate = 0; |
Я думаю, может мне просто посылать номер трека, а на клиенте уже определять, какой трек будет соответствовать этому номеру? Скорее всего и проблема исчезнет. Но в Паранойе то точно такой же код, и он не вызывает багов (ну кроме вылетов). Хотя может дело в том, что Паранойя изначально строилась на спирите?__________________
Никогда не поздно сделать мод под хл1
Отправлено Дядя Миша 24-06-2017 в 19:45:
Sigurth ты эту строчку в сейв-то сохранил?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Sigurth 25-06-2017 в 05:46:
Дядя Миша Сохранил
C++ Source Code:
DEFINE_FIELD( CBasePlayer, m_strCurrentMp3, FIELD_STRING ), |
Говорю же, проблема в несанкционированном вызове мп3 плеера, и походу не с сервера мессагой, а чисто с клиента. Потому что в коде ошибок нет, плеер работает исправно. Но вот почему-то он пытается при старте уровня включить мне музычку с названием сейва, который я загружаю, например quick, autosave или half-life-000. А потом в консоль ругается, что не может загрузить такой файл. Причем ругань выдает только клиент, на сервере походу мессага вообще не отправлялась, потому что я там что в ALERTe написано, в консоль не пишется при developer 5. А если я сам активирую плеер, то все пишется.__________________
Никогда не поздно сделать мод под хл1
Отправлено a1batross 25-06-2017 в 09:33:
Sigurth так поставь брейкпоинт на клиенте и смотри кто же тебе её вызывает.
Если в трейсе будет CL_DispatchUserMessage(или что-то в этом роде), значит её точно выслал сервер, если так, то ищи все вхождения gmsgPlayMP3 на сервере, ставь везде брейкпоинты и смотри что происходит.
Я так понимаю, вся проблема в том, что вместо реального названия трека в сейв записывается нечто другое?
Отправлено Дядя Миша 25-06-2017 в 13:09:
Да мусор у нево на клиенте
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Sigurth 25-06-2017 в 14:37:
a1batross Дядя Миша
Короче, я понял в чем проблема. Альбатросс был прав, что вместо реального названия трека в сейв записывается нечто другое. А именно m_strCurrentMp3 каждый кадр принимает различные значения. Они меняются в зависимости от нажатия клавиш, а после сохранения игры - название сейва. Я решу проблему, как и хотел. Уберу эти проклятые строки и буду сохранять индекс трека, а на клиенте сопоставлять индекс и название. Всем спасибо
__________________
Никогда не поздно сделать мод под хл1
Отправлено Дядя Миша 25-06-2017 в 14:43:
Цитата:
Sigurth писал:
Они меняются в зависимости от нажатия клавиш, а после сохранения игры - название сейва
ну мусор у тебя там, мусор. Вычисти его. Ты строчку не зануляешь видимо.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Sigurth 25-06-2017 в 16:01:
Дядя Миша Да я уже переделал под индексы. Так удобнее даже
__________________
Никогда не поздно сделать мод под хл1
Отправлено Chyvachok 27-06-2017 в 15:24:
Кстати а как зарядить оружие меньше чем p->iMaxClip? Хочу сделать имитацию патронника, то есть сделать допустим МП5 обойму 31 патрон, если оружие полностью разряжено то заряжать 30 патронов, если не полностью то 31. Или вот эта базука, в ней должно заряжаться 12 патронов если полностью разряжена, 15 если нет (типа ракеты остаются в барабане): http://imgur.com/a/tmccL
Если к примеру написать так, то оно не работает, заряжает 31 патрон, а не на 1 меньше, хотя анимация проигрывается нужная:
Отправлено Ku2zoff 27-06-2017 в 18:03:
Chyvachok
C++ Source Code:
1 | void CBasePlayerWeapon::ItemPostFrame( void ) |
3 | if ((m_fInReload) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) ) |
5 | // complete the reload. |
6 | [b]int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]);[/b] |
8 | // Add them to the clip |
10 | m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; |
12 | m_pPlayer->TabulateAmmo(); |
Поэтому и не работает то, что ты указываешь при вызове DefaultReload. Заводи в базовом классе оружия новую переменную, например, m_iReloadingAmmo, задавай ей значение iClipSize в DefaultReload, а потом в ItemPostFrame подсовывай её вместо iMaxClip(). И сразу же по завершении перезарядки зануляй. Не знаю, нужно ли сохранять её в сейв, наверное нет. Можешь ещё воткнуть проверку, чтобы m_iReloadingAmmo не было больше iMaxClip().
Фишка в том, что DefaultReload только проверяет оружие на возможность перезарядиться, считая патроны. Сама перезарядка происходит в ItemPostFrame.
Добавлено 28-06-2017 в 00:51:
И да, наверное вальвовцы хотели что-то такое сделать с количеством патронов, но не дописали код, сделав проверку только в DefaultReload.
Добавлено 28-06-2017 в 01:03:
P.S. Я буду делать у себя нечто подобное, только с выбрасываемыми магазинами, как в Firearms. Если в магазине осталось меньше половины патронов - он выкидывается, если больше - сохраняется. Для отображения магазинов две цифры - одна означает полные магазины, другая неполные.
Отправлено KiQ 27-06-2017 в 18:06:
Цитата:
XaeroX писал:
Ты что-то имеешь против Оксанки?
Ну можно тему отдельную запилить, в принципе__________________
-Brain is dead-
Отправлено Chyvachok 27-06-2017 в 21:30:
Ku2zoff спасибо за подсказку, буду смотреть.
Кстати твой старый тутор по wallpuff-ам ( http://hlfx.ru/forum/showthread.php?s=&threadid=1151 ) мне очень пригодился как самая идея как вызывать эффекты на клиенте, плюс мне еще помог Gunship_Mark_II поделившись кодом своих эффектов что подобным образом вызываются через эвенты на клиенте, попробовал через них реализовать эффекты для плазмогана и кровяхи:
https://www.youtube.com/watch?v=4CcSTSE5K98
https://www.youtube.com/watch?v=HDFgYO2RYqA
Отправлено Ku2zoff 28-06-2017 в 03:03:
Цитата:
Chyvachok писал:
твой старый тутор по wallpuff-ам
Глянь сорцы Invasion (есть на гитхабе), там весьма годные партикли, лучше, чем в моём нубском туторе
Отправлено Chyvachok 28-06-2017 в 08:46:
Ku2zoff а в чем вообще достоинство тех партиклей? Никогда не обращал внимание что они там вообще есть. Я вообще в эффектах не разбираюсь особо, те на видео это вообще первые эффекты что я в игру добавил.
Вообще я помню из инвазиона из новых эффектов разве что эффект попадания пуль в стены, ну или огонь из огнемета "поджарь себя", та же плазма супергана там просто спрайт.