HLFX.Ru Forum
Показать все 14 сообщений этой темы на одной странице

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:

Half-Life Работа с сейвами

Интересует, как можно сохранить значение переменной в сейв и как его загрузить.
Например, хочу, чтобы при надевании костюма(или смене оружия) менялась скорость(увеличивалась или уменьшалась, не важно).
Надеваю, сохраняюсь, вдруг убили, загружаюсь, а скорость опять дефолтная.
Я так понял это все через 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:

Question

Примерно как здесь?

C++ Source Code:
1
TYPEDESCRIPTION	CRpg::m_SaveData[] =
2
{
3
  DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ),
4
  DEFINE_FIELD( CRpg, m_cActiveRockets, FIELD_INTEGER ),
5
};
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 )
2
{
3
  if( Scope )
4
    m_pPlayer->pev->fov = 0;
5
  else
6
    m_pPlayer->pev->fov = 55;
7
  m_pPlayer->m_iFOV = m_pPlayer->pev->fov;
8
  Scope = !Scope;
9
  m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.3;
10
}

__________________
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()
2
{
3
  if (m_fInZoom)
4
  {
5
    m_fInZoom = 0;
6
    m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0;
7
  }
8
  else
9
  {
10
    m_fInZoom = 1;
11
    m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 80;
12
  }
13
 
14
  pev->nextthink = UTIL_WeaponTimeBase() + 0.1;
15
  m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
16
}
17
 
18
void CCrossbow::Reload( void )
19
{
20
  if ( m_pPlayer->ammo_bolts <= 0 )
21
    return;
22
 
23
  if (m_fInZoom)
24
    SecondaryAttack();
25
 
26
  if ( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) )
27
  {
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));
29
  }
30
}

Дальше прёмся в client.cpp, и добавляем туда две новые команды в функцию ClientCommand:
C++ Source Code:
1
else if (FStrEq(pcmd, "zoom_out"))
2
{
3
  CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev);
4
 
5
  if (pPlayer->m_pActiveItem)
6
  {
7
    if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW)
8
      return;
9
 
10
    CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem;
11
 
12
    if (!pWeapon->m_fInZoom)
13
      return;
14
 
15
    ALERT(at_console, "Zoom out\n");
16
 
17
    if (pPlayer->m_iFOV <= 80)
18
      pPlayer->m_iFOV += 10;
19
 
20
    if (pPlayer->m_iFOV > 80)
21
      pPlayer->m_iFOV = 80;
22
 
23
    if (pPlayer->m_iFOV < 20)
24
      pPlayer->m_iFOV = 20;
25
 
26
    pPlayer->pev->fov = pPlayer->m_iFOV;
27
  }
28
}
29
else if (FStrEq(pcmd, "zoom_in"))
30
{
31
  CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev);
32
 
33
  if (pPlayer->m_pActiveItem)
34
  {
35
    if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW)
36
      return;
37
 
38
    CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem;
39
 
40
    if (!pWeapon->m_fInZoom)
41
      return;
42
 
43
    ALERT(at_console, "Zoom in\n");
44
 
45
    if (pPlayer->m_iFOV >= 20)
46
      pPlayer->m_iFOV -= 10;
47
 
48
    if (pPlayer->m_iFOV > 80)
49
      pPlayer->m_iFOV = 80;
50
 
51
    if (pPlayer->m_iFOV < 20)
52
      pPlayer->m_iFOV = 20;
53
 
54
    pPlayer->pev->fov = pPlayer->m_iFOV;
55
  }
56
}

На сервере всё. Теперь на клиенте, в ammo.cpp:
C++ Source Code:
1
// Selects the next item in the weapon menu
2
void CHudAmmo::UserCmd_NextWeapon(void)
3
{
4
  if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) )
5
    return;
6
 
7
  if (gHUD.m_iFOV != 90)
8
  {
9
    gEngfuncs.pfnClientCmd("zoom_out\n");
10
    return;
11
  }
12
  // остальной код функции
13
}
14
 
15
// Selects the previous item in the menu
16
void CHudAmmo::UserCmd_PrevWeapon(void)
17
{
18
  if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) )
19
    return;
20
 
21
  if (gHUD.m_iFOV != 90)
22
  {
23
    gEngfuncs.pfnClientCmd("zoom_in\n");
24
    return;
25
  };
26
  // остальной код функции
27
}

Плавность пока неохота делать.

Добавлено 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:
1
if ( newfov == 0 )
2
{
3
  m_iFOV = default_fov->value;
4
}
5
else
6
{
7
  m_iFOV = newfov;
8
}

Нужно заменить на такой:
C++ Source Code:
1
float speed = 5.0;
2
 
3
if (newfov == 0)
4
{
5
  newfov = default_fov->value;
6
 
7
  if (m_iFOV < 80)
8
    speed = 15.0;
9
}
10
 
11
float mod = newfov - m_iFOV;
12
if (mod < 0) mod *= -1;
13
if (mod < 30) mod = 30;
14
 
15
if (m_iFOV < newfov)
16
{
17
  m_iFOV += gHUD.m_flTimeDelta * speed * mod;
18
 
19
  if (m_iFOV > newfov)
20
    m_iFOV = newfov;
21
}
22
 
23
if (m_iFOV > newfov)
24
{
25
  m_iFOV -= gHUD.m_flTimeDelta * speed * mod;
26
 
27
  if (m_iFOV < newfov)
28
    m_iFOV = newfov;
29
}

Тоже на коленке написан, за 10 минут. С оглядкой на сорцы паранойи. Вроде работает нормально. Если к первой половине пояснения были не нужны, то тут я кое-что поясню. speed - скорость зумирования. Зачем вообще разные значения? Чтобы при резком отключении зума вообще (выкл прицела), фов возвращался в нормальный быстрее. Например, при смене на другое оружие. Значение m_iFOV = 80 это минимальный зум для арбалета, указанный в первой половине кода. Ну а остальное всё из паранойи. Можно конечно сделать ещё красивее, и поиграться со значениями.

Добавлено 12-04-2017 в 19:14:

Кстати, плавность не работает при отключенных клиентских пушках. Но это легко исправить.


Временная зона GMT. Текущее время 04:36.
Показать все 14 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024