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

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

Рейтинг



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

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

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

Старое сообщение 23-03-2017 19:38
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

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

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

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

Рейтинг



Question

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

C++ Source Code:
TYPEDESCRIPTION    CRpg::m_SaveData[] =
{
    DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ),
    DEFINE_FIELD( CRpg, m_cActiveRockets, FIELD_INTEGER ),
};
IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon );

Если да, то добавлять в том же файле(в items.cpp в случае с костюмом)?

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

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

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

Рейтинг



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

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

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

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

Рейтинг



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

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

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

Дата регистрации: Oct 2005
Проживает: (void)
Сообщений: 2913
Нанёс повреждений: 0 ед.

Рейтинг



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


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

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

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

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

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

Рейтинг



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

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

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

Дата регистрации: Oct 2005
Проживает: (void)
Сообщений: 2913
Нанёс повреждений: 0 ед.

Рейтинг



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


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

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

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

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

Дата регистрации: Jan 2016
Проживает: Украина
Сообщений: 68
Возраст: 20

Рейтинг



испробуй по этой теме
http://hlfx.ru/forum/showthread.php...15&pagenumber=1

если ты говорил про приближения то в каких-то сорцах видел такой пример

C++ Source Code:
void CSG552::SecondaryAttack( void )
{
    if( Scope )
        m_pPlayer->pev->fov = 0;
    else
        m_pPlayer->pev->fov = 55;
    m_pPlayer->m_iFOV = m_pPlayer->pev->fov;
    Scope = !Scope;
    m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.3;
}

__________________
Ну еб твой жопег, десу.
Если любой начитавшийся туторов и не знает с++ начинает говно кодить, тогда в чем смысл?
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 12:15
- За что?
 ~ X ~
offline

Дата регистрации: Oct 2005
Проживает: (void)
Сообщений: 2913
Нанёс повреждений: 0 ед.

Рейтинг



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


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

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

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

Старое сообщение 25-03-2017 13:28
-
Ku2zoff
Юзер (типа моддер)

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

Рейтинг



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

Цитата:
~ X ~ писал:
если с регулировкой, как в Unreal

И то и то не круто на самом деле, касаемо снайперки. Первый вариант годится для ironsight. Второй неудобен тем, что степень приближения регулируется только в большую сторону. Надо делать как в кс, скачками (с плавным изменением между ними, как в первом варианте), только регулировать колесом мыши туда и обратно. Чтоли накодить такое себе, пока есть желание?

Добавлено 12-04-2017 в 02:05:

Так. Сам ступенчатый зум сделал. Осталось только отключить перелистывание оружий в худе, и сделать, чтобы зум работал только для арбалета в режиме прицеливания. Ну и добавить плавность при переходах.

Добавлено 12-04-2017 в 02:23:

А вот, впрочем, более-менее рабочий вариант, написанный на коленке:
В crossbow.cpp приводим указанные ниже строки к такому виду:
C++ Source Code:
void CCrossbow::SecondaryAttack()
{
    if (m_fInZoom)
    {
        m_fInZoom = 0;
        m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0;
    }
    else
    {
        m_fInZoom = 1;
        m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 80;
    }
    
    pev->nextthink = UTIL_WeaponTimeBase() + 0.1;
    m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
}

void CCrossbow::Reload( void )
{
    if ( m_pPlayer->ammo_bolts <= 0 )
        return;
    
    if (m_fInZoom)
        SecondaryAttack();
    
    if ( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) )
    {
        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:
else if (FStrEq(pcmd, "zoom_out"))
{
    CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev);
    
    if (pPlayer->m_pActiveItem)
    {
        if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW)
            return;
        
        CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem;
        
        if (!pWeapon->m_fInZoom)
            return;
        
        ALERT(at_console, "Zoom out\n");
        
        if (pPlayer->m_iFOV <= 80)
            pPlayer->m_iFOV += 10;
        
        if (pPlayer->m_iFOV > 80)
            pPlayer->m_iFOV = 80;
        
        if (pPlayer->m_iFOV < 20)
            pPlayer->m_iFOV = 20;
        
        pPlayer->pev->fov = pPlayer->m_iFOV;
    }
}
else if (FStrEq(pcmd, "zoom_in"))
{
    CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev);
    
    if (pPlayer->m_pActiveItem)
    {
        if (pPlayer->m_pActiveItem->m_iId != WEAPON_CROSSBOW)
            return;
        
        CCrossbow *pWeapon = (CCrossbow *)pPlayer->m_pActiveItem;
        
        if (!pWeapon->m_fInZoom)
            return;
        
        ALERT(at_console, "Zoom in\n");
        
        if (pPlayer->m_iFOV >= 20)
            pPlayer->m_iFOV -= 10;
        
        if (pPlayer->m_iFOV > 80)
            pPlayer->m_iFOV = 80;
        
        if (pPlayer->m_iFOV < 20)
            pPlayer->m_iFOV = 20;
        
        pPlayer->pev->fov = pPlayer->m_iFOV;
    }
}

На сервере всё. Теперь на клиенте, в ammo.cpp:
C++ Source Code:
// Selects the next item in the weapon menu
void CHudAmmo::UserCmd_NextWeapon(void)
{
    if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) )
        return;
    
    if (gHUD.m_iFOV != 90)
    {
        gEngfuncs.pfnClientCmd("zoom_out\n");
        return;
    }
    // остальной код функции
}

// Selects the previous item in the menu
void CHudAmmo::UserCmd_PrevWeapon(void)
{
    if ( gHUD.m_fPlayerDead || (gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL)) )
        return;
    
    if (gHUD.m_iFOV != 90)
    {
        gEngfuncs.pfnClientCmd("zoom_in\n");
        return;
    };
    // остальной код функции
}

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

Добавлено 12-04-2017 в 02:30:

З.Ы. тут как ни крути, идёт привязка к командам invnext и invprev. У меня колесо вверх - invprev, колесо вниз - invnext, как в халфе по-умолчанию. Поэтому приближение/удаление как бы противоположны пред/след оружию. Если у вас наоборот, то наверное будет удобнее поменять коды в UserCmd_NextWeapon и UserCmd_PrevWeapon местами.

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

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

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

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

Рейтинг



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

__________________
Base Defense

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

Старое сообщение 11-04-2017 21:46
- За что?
Ku2zoff
Юзер (типа моддер)

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

Рейтинг



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

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

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

Старое сообщение 12-04-2017 04:36
- За что?
Ku2zoff
Юзер (типа моддер)

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

Рейтинг



Немного плавности в тему:
Код в функции void CHud::Think

C++ Source Code:
if ( newfov == 0 )
{
    m_iFOV = default_fov->value;
}
else
{
    m_iFOV = newfov;
}

Нужно заменить на такой:
C++ Source Code:
float speed = 5.0;

if (newfov == 0)
{
    newfov = default_fov->value;
    
    if (m_iFOV < 80)
        speed = 15.0;
}

float mod = newfov - m_iFOV;
if (mod < 0) mod *= -1;
    if (mod < 30) mod = 30;
        
    if (m_iFOV < newfov)
{
    m_iFOV += gHUD.m_flTimeDelta * speed * mod;
    
    if (m_iFOV > newfov)
        m_iFOV = newfov;
}

if (m_iFOV > newfov)
{
    m_iFOV -= gHUD.m_flTimeDelta * speed * mod;
    
    if (m_iFOV < newfov)
        m_iFOV = newfov;
}

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

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

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

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

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

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



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


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

Временная зона GMT. Текущее время 17:14. Новая тема    Ответить
  Предыдущая тема   Следующая тема
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.
Дизайн и программирование: Chain Studios © 2005-2017

Рейтинг@Mail.ru