HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Работа с сейвами
Как сохранить переменную в сейв
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



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

Интересует, как можно сохранить значение переменной в сейв и как его загрузить.
Например, хочу, чтобы при надевании костюма(или смене оружия) менялась скорость(увеличивалась или уменьшалась, не важно).
Надеваю, сохраняюсь, вдруг убили, загружаюсь, а скорость опять дефолтная.
Я так понял это все через IMPLEMENT_SAVERESTORE или что-то вроде того, но как это все работает?

Сообщить модератору | | IP: Записан
Сообщение: 165703

Старое сообщение 23-03-2017 20:38
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32133
Нанёс повреждений: 392 ед.

Рейтинг



Добавляешь свою строчку с описанием переменной, по аналогии с остальными. А дальше всё автомагически.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 165704

Старое сообщение 23-03-2017 20:45
-
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



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 в случае с костюмом)?

Сообщить модератору | | IP: Записан
Сообщение: 165705

Старое сообщение 23-03-2017 22:14
- За что?
Sigurth
Частый гость

Дата регистрации: May 2015
Проживает: Красноярск
Сообщений: 95
Возраст: 27

Рейтинг



А ты саму переменную в каком классе объявил? Если в CItemSuit, то в добавляешь её в CItemSuit::m_SaveData[] соответственно.

Сообщить модератору | | IP: Записан
Сообщение: 165708

Старое сообщение 24-03-2017 04:10
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Все понял, спасибо.
И еще вопрос, можно ли сделать приближение у арбалета плавным, как в хл2?

Сообщить модератору | | IP: Записан
Сообщение: 165750

Старое сообщение 25-03-2017 08:10
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


sas если с регулировкой, как в Unreal, то уже сделано: http://www.moddb.com/mods/xdm/
А как конкретно в ХЛ2 я не помню.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 165751

Старое сообщение 25-03-2017 08:27
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



~ X ~ , нет, чуть по-другому.
В хл1 прицеливаешься - фов сразу меняется,
в хл2 - есть эффект приближения.

Сообщить модератору | | IP: Записан
Сообщение: 165756

Старое сообщение 25-03-2017 09:53
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


sas тогда это ещё проще. Чисто клиентский эффект.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 165759

Старое сообщение 25-03-2017 11:18
- За что?
Luciferchik
Whatever...

Дата регистрации: Jan 2016
Проживает: в гостях
Сообщений: 167
Возраст: 26

Рейтинг



испробуй по этой теме
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.

Сообщить модератору | | IP: Записан
Сообщение: 165763

Старое сообщение 25-03-2017 13:15
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Как я понял, ему надо сделать просто:
с сервера послать сигнал "начинаю зум" с финальным значением (эвент)
на сервере поменять pev->fov на желаемый
на клиенте поймать сигнал, начать плавно менять fov от текущего значения до пришедшего в эвенте.
в процессе изменения фова поймать и проигнорировать резкое изменение pev->fov игрока с сервера (т.е. не допустить "попадания его на экран")
когда процесс интерполяции фова закончен, перестать игнорить серверный фов
сравнить получившийся фов и серверный, при несовпадении вылететь в синий экран, повесить операционку, испортить бутсектор и бесконечно пытаться отправить багрепорт на несуществующий адрес

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 165775

Старое сообщение 25-03-2017 14:28
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Цитата:
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 местами.

Сообщить модератору | | IP: Записан
Сообщение: 166233

Старое сообщение 11-04-2017 19:57
- За что?
PLut
Creator

Дата регистрации: Jun 2009
Проживает: Санкт-Петербург
Сообщений: 1220
Возраст: 29

Рейтинг



Велосипеды с костылями изобретаете, в первой паранойе есть этот эффект. Сорцы есть, там всё просто.

__________________
Base Defense on Steam, ModDB

Сообщить модератору | | IP: Записан
Сообщение: 166235

Старое сообщение 11-04-2017 21:46
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



PLut не считая того, что придётся лишний раз ковырять код UpdateClientData и посылать на клиент iGunMode. Всего-то ничего для новичка, связаться с клиентскими оружиями.

Сообщить модератору | | IP: Записан
Сообщение: 166236

Старое сообщение 12-04-2017 04:36
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Немного плавности в тему:
Код в функции 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:

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

Сообщить модератору | | IP: Записан
Сообщение: 166240

Старое сообщение 12-04-2017 12:14
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 09:35. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Работа с сейвами
Как сохранить переменную в сейв
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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