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=4976)
Отправлено sas 23-03-2017 в 20:38:
Работа с сейвами
Интересует, как можно сохранить значение переменной в сейв и как его загрузить.
Например, хочу, чтобы при надевании костюма(или смене оружия) менялась скорость(увеличивалась или уменьшалась, не важно).
Надеваю, сохраняюсь, вдруг убили, загружаюсь, а скорость опять дефолтная.
Я так понял это все через IMPLEMENT_SAVERESTORE или что-то вроде того, но как это все работает?
Отправлено Дядя Миша 23-03-2017 в 20:45:
Добавляешь свою строчку с описанием переменной, по аналогии с остальными. А дальше всё автомагически.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено sas 23-03-2017 в 22:14:
Примерно как здесь?
C++ Source Code:
1 | TYPEDESCRIPTION CRpg::m_SaveData[] = |
3 | DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ), |
4 | DEFINE_FIELD( CRpg, m_cActiveRockets, FIELD_INTEGER ), |
6 | IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon ); |
Если да, то добавлять в том же файле(в items.cpp в случае с костюмом)?
Отправлено Sigurth 24-03-2017 в 04:10:
А ты саму переменную в каком классе объявил? Если в CItemSuit, то в добавляешь её в CItemSuit::m_SaveData[] соответственно.
Отправлено sas 25-03-2017 в 08:10:
Все понял, спасибо.
И еще вопрос, можно ли сделать приближение у арбалета плавным, как в хл2?
Отправлено ~ X ~ 25-03-2017 в 08:27:
sas если с регулировкой, как в Unreal, то уже сделано: http://www.moddb.com/mods/xdm/
А как конкретно в ХЛ2 я не помню.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено sas 25-03-2017 в 09:53:
~ X ~ , нет, чуть по-другому.
В хл1 прицеливаешься - фов сразу меняется,
в хл2 - есть эффект приближения.
Отправлено ~ X ~ 25-03-2017 в 11:18:
sas тогда это ещё проще. Чисто клиентский эффект.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Luciferchik 25-03-2017 в 13:15:
испробуй по этой теме
http://hlfx.ru/forum/showthread.php...15&pagenumber=1
если ты говорил про приближения то в каких-то сорцах видел такой пример
C++ Source Code:
1 | void CSG552::SecondaryAttack( void ) |
4 | m_pPlayer->pev->fov = 0; |
6 | m_pPlayer->pev->fov = 55; |
7 | m_pPlayer->m_iFOV = m_pPlayer->pev->fov; |
9 | m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.3; |
__________________
Sometimes you have to get knocked down lower than you've even been to stand up taller than you everwere.
You so sad. No, i just die everyday...
I can't do anything around here without everybody getting up in my shit...
The aim of life is self-development.
Отправлено ~ X ~ 25-03-2017 в 14:28:
Как я понял, ему надо сделать просто:
с сервера послать сигнал "начинаю зум" с финальным значением (эвент)
на сервере поменять pev->fov на желаемый
на клиенте поймать сигнал, начать плавно менять fov от текущего значения до пришедшего в эвенте.
в процессе изменения фова поймать и проигнорировать резкое изменение pev->fov игрока с сервера (т.е. не допустить "попадания его на экран")
когда процесс интерполяции фова закончен, перестать игнорить серверный фов
сравнить получившийся фов и серверный, при несовпадении вылететь в синий экран, повесить операционку, испортить бутсектор и бесконечно пытаться отправить багрепорт на несуществующий адрес
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Ku2zoff 11-04-2017 в 19:57:
Цитата:
sas писал:
И еще вопрос, можно ли сделать приближение у арбалета плавным, как в хл2?
Цитата:
~ X ~ писал:
если с регулировкой, как в Unreal
И то и то не круто на самом деле, касаемо снайперки. Первый вариант годится для ironsight. Второй неудобен тем, что степень приближения регулируется только в большую сторону. Надо делать как в кс, скачками (с плавным изменением между ними, как в первом варианте), только регулировать колесом мыши туда и обратно. Чтоли накодить такое себе, пока есть желание?
Добавлено 12-04-2017 в 02:05:
Так. Сам ступенчатый зум сделал. Осталось только отключить перелистывание оружий в худе, и сделать, чтобы зум работал только для арбалета в режиме прицеливания. Ну и добавить плавность при переходах.
Добавлено 12-04-2017 в 02:23:
А вот, впрочем, более-менее рабочий вариант, написанный на коленке:
В crossbow.cpp приводим указанные ниже строки к такому виду:
C++ Source Code:
1 | void CCrossbow::SecondaryAttack() |
6 | m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; |
11 | m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 80; |
14 | pev->nextthink = UTIL_WeaponTimeBase() + 0.1; |
15 | m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; |
18 | void CCrossbow::Reload( void ) |
20 | if ( m_pPlayer->ammo_bolts <= 0 ) |
26 | if ( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) ) |
28 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF)); |
Дальше прёмся в client.cpp, и добавляем туда две новые команды в функцию ClientCommand:
C++ Source Code:
1 | else if (FStrEq(pcmd, "zoom_out")) |
3 | CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev); |
5 | if (pPlayer->m_pActiveItem) |
7 | if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW) |
10 | CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem; |
12 | if (!pWeapon->m_fInZoom) |
15 | ALERT(at_console, "Zoom out\n"); |
17 | if (pPlayer->m_iFOV <= 80) |
18 | pPlayer->m_iFOV += 10; |
20 | if (pPlayer->m_iFOV > 80) |
23 | if (pPlayer->m_iFOV < 20) |
26 | pPlayer->pev->fov = pPlayer->m_iFOV; |
29 | else if (FStrEq(pcmd, "zoom_in")) |
31 | CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev); |
33 | if (pPlayer->m_pActiveItem) |
35 | if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW) |
38 | CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem; |
40 | if (!pWeapon->m_fInZoom) |
43 | ALERT(at_console, "Zoom in\n"); |
45 | if (pPlayer->m_iFOV >= 20) |
46 | pPlayer->m_iFOV -= 10; |
48 | if (pPlayer->m_iFOV > 80) |
51 | if (pPlayer->m_iFOV < 20) |
54 | pPlayer->pev->fov = pPlayer->m_iFOV; |
На сервере всё. Теперь на клиенте, в ammo.cpp:
C++ Source Code:
1 | // Selects the next item in the weapon menu |
2 | void CHudAmmo::UserCmd_NextWeapon(void) |
4 | if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) ) |
9 | gEngfuncs.pfnClientCmd("zoom_out\n"); |
12 | // остальной код функции |
15 | // Selects the previous item in the menu |
16 | void CHudAmmo::UserCmd_PrevWeapon(void) |
18 | if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) ) |
21 | if (gHUD.m_iFOV != 90) |
23 | gEngfuncs.pfnClientCmd("zoom_in\n"); |
26 | // остальной код функции |
Плавность пока неохота делать.
Добавлено 12-04-2017 в 02:30:
З.Ы. тут как ни крути, идёт привязка к командам invnext и invprev. У меня колесо вверх - invprev, колесо вниз - invnext, как в халфе по-умолчанию. Поэтому приближение/удаление как бы противоположны пред/след оружию. Если у вас наоборот, то наверное будет удобнее поменять коды в UserCmd_NextWeapon и UserCmd_PrevWeapon местами.
Отправлено PLut 11-04-2017 в 21:46:
Велосипеды с костылями изобретаете, в первой паранойе есть этот эффект. Сорцы есть, там всё просто.
__________________
Base Defense on Steam, ModDB
Отправлено Ku2zoff 12-04-2017 в 04:36:
PLut не считая того, что придётся лишний раз ковырять код UpdateClientData и посылать на клиент iGunMode. Всего-то ничего для новичка, связаться с клиентскими оружиями.
Отправлено Ku2zoff 12-04-2017 в 12:14:
Немного плавности в тему:
Код в функции void CHud::Think
C++ Source Code:
3 | m_iFOV = default_fov->value; |
Нужно заменить на такой:
C++ Source Code:
5 | newfov = default_fov->value; |
11 | float mod = newfov - m_iFOV; |
12 | if (mod < 0) mod *= -1; |
13 | if (mod < 30) mod = 30; |
17 | m_iFOV += gHUD.m_flTimeDelta * speed * mod; |
25 | m_iFOV -= gHUD.m_flTimeDelta * speed * mod; |
Тоже на коленке написан, за 10 минут. С оглядкой на сорцы паранойи. Вроде работает нормально. Если к первой половине пояснения были не нужны, то тут я кое-что поясню. speed - скорость зумирования. Зачем вообще разные значения? Чтобы при резком отключении зума вообще (выкл прицела), фов возвращался в нормальный быстрее. Например, при смене на другое оружие. Значение m_iFOV = 80 это минимальный зум для арбалета, указанный в первой половине кода. Ну а остальное всё из паранойи. Можно конечно сделать ещё красивее, и поиграться со значениями.
Добавлено 12-04-2017 в 19:14:
Кстати, плавность не работает при отключенных клиентских пушках. Но это легко исправить.