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=2549)


Отправлено KiQ 13-01-2011 в 21:36:

Post Подскажите с аптечкой

Собственно в своей игре хочу сделать чтобы после поднятия аптечки (item_healthkit) здоровье прибавлялось не сразу а постепенно, допустим в течении 10-15сек. Я думал надо копать в func_healthcharger, но там просто делается проверка на то, держит ли игрок use. В общих чертах представляю что надо делать в цикле, но не будет ли он замораживать все другие процессы? Честно скажу что как то не сталкивался с многопоточностью и реализацией трэдов в С++, поэтому затруднение.

__________________
-Brain is dead-


Отправлено XaeroX 13-01-2011 в 23:44:

KiQ
Это надо делать в коде игрока (player.cpp). При поднятии аптечки просто запоминается некое значение m_flIdealHealth, а потом в PlayerPreThink пишется чтото типа:

C++ Source Code:
if (pev->health < m_flIdealHealth)
  pev->health += min(m_flIdealHealth - pev->health, gpGlobals->frametime * 0.5f);

__________________

xaerox on Vivino


Отправлено KiQ 14-02-2011 в 19:51:

Спасибо за помощь, правда я пошел несколько иным путем, но отталкиваясь от этого. В общем сначала я изменил player.cpp - добавил функции int getCurrentHealth( void ) и void getGradualyHealth( void ). Добавил три переменных - int m_flIdealHealth, int m_idealHealthBuff и BOOL isHealthCharge. В функции PreThink прописал условие if(isHealthCharge) {
getGradualyHealth();
SetThink( getGradualyHealth );
pev->nextthink = gpGlobals->time + 0.5;
}
Вот функция getGradualyHealth():
void CBasePlayer::getGradualyHealth() {
if (pev->health < 100 && pev->health < m_idealHealthBuff + m_flIdealHealth) {
pev->health += 1;
} else {
isHealthCharge = false;
}
}
Теперь я перешел к работе в item_healthkit. В функции поднятия после if(pPlayer->TakeHealth ....
Я вписал следущее:
pPlayer->m_idealHealthBuff = pPlayer->getCurrentHealth();
pPlayer->m_flIdealHealth = gSkillData.healthkitCapacity;
pPlayer->isHealthCharge = true;
Собственно это и запускает механизм постепенного восстановления здоровья. В общем я все скомпилировал, проблем не возникло. Все работает, видно что здоровье прибавляется по единице за каждый проход функции. Но осталась одна проблема - это происходит очень быстро. Хотелось бы все же около 10-15 секунд, а происходит все примерно за секунду. Изменение значения в pev->nextthink = gpGlobals->time + 0.5 не дало результатов, и я подозреваю что использую его неправильно. Собственно подскажите пожалуйста что можно сделать, заранее благодарен

__________________
-Brain is dead-


Отправлено Дядя Миша 14-02-2011 в 20:21:

KiQ самое простое - прибавлять не по еденичке, а по 0.1 процента
Впрочем скорость прибавления будет зависеть от cl_cmdrate.

__________________
My Projects: download page

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

Цитата:

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


Отправлено KiQ 14-02-2011 в 20:28:

Дядя Миша а, то то я думал, причем тут floatы Худ я так понял будет обновлятся каждые десять проходов. А все что связано с SetThink можно убрать? Хм, насчет cl_cmdrate я так думаю надо его понизить, но это плохо скажется на сетевой игре, как я знаю.

__________________
-Brain is dead-


Отправлено Дядя Миша 14-02-2011 в 20:58:

Цитата:
KiQ писал:
Хм, насчет cl_cmdrate я так думаю надо его понизить, но это плохо скажется на сетевой игре, как я знаю.

а я не уверен, что он вообще в сингле дает какой-то эффект.

__________________
My Projects: download page

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

Цитата:

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


Отправлено KiQ 14-02-2011 в 21:02:

Дядя Миша в том то и дело, что там будет также кооператив и дм. Если в первый как правило играют по локалке, то со вторым все сложнее. Ну а потом, а что если игрок захочет помнять его через консоль? нехорошо получится...

__________________
-Brain is dead-


Отправлено Дядя Миша 14-02-2011 в 21:36:

KiQ ну тада вводи еще одну переменную.
и делай вот так по такому принципу

C++ Source Code:
1
if (m_flSuitUpdate <= gpGlobals->time)
2
{
3
  if (m_flSuitUpdate == 0)
4
    // play queue is empty, don't delay too long before playback
5
  m_flSuitUpdate = gpGlobals->time + SUITFIRSTUPDATETIME;
6
  else
7
    m_flSuitUpdate = gpGlobals->time + SUITUPDATETIME;
8
}

Все тчинки по сути устроены именно так.

__________________
My Projects: download page

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

Цитата:

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


Отправлено KiQ 14-02-2011 в 21:44:

Ок спасибо завтра опробую все варианты. Еще у меня одна непонятка возникла, из за которой я и добавил функцию getCurrentHealth. Я сначала написал просто pPlayer->health, после чего компил естественно ругнулся. В функции getCurrentHealth я всего лишь возвращаю значение pev->health. Но ведь насколько я знаю (возможно неправильно), pev это типа аналога this для энтить. Почему тогда он находит health, а прямое обращение к классу не находит? Да, в player.h я health не нашел, тогда откуда ее берет pev для меня непонятка.

__________________
-Brain is dead-


Отправлено Дядя Миша 14-02-2011 в 21:52:

Цитата:
KiQ писал:
pPlayer->health

pPlayer->pev->health, не тупи.

__________________
My Projects: download page

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

Цитата:

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


Отправлено KiQ 14-02-2011 в 21:56:

Дядя Миша я не туплю, я повышаю уровень квалификации в общем завтра потестю аптечку, потом отпишусь, если траффик останется. Спасибо за помощь

__________________
-Brain is dead-


Отправлено KiQ 15-02-2011 в 20:24:

Congratulation!

Допилил таки аптечку Все отлично работает, спасибо за советы! Прикладываю свой рассказ-тутор как же сделать плавное восстановление здоровья

__________________
-Brain is dead-


Отправлено Дядя Миша 15-02-2011 в 20:34:

KiQ не надо нам в аттаче. Запили нормальную тему в ветке туторов.

__________________
My Projects: download page

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

Цитата:

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


Отправлено KiQ 16-02-2011 в 19:08:

Дядя Миша дак там в html вроде все грамотно оформлено. Впрочем сейчас запостю в туторах.

Добавлено сегодня в 22:08:

Запостил

__________________
-Brain is dead-


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

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