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:
Кстати, плавность не работает при отключенных клиентских пушках. Но это легко исправить.