HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 22 сообщений этой темы на одной странице

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


Отправлено FreeSlave 29-05-2011 в 13:48:

Общие вопросы по кодингу

Дабы не создавать кучу тем с маленькими вопросами, создам одну для всех, если админы не против.

Решил создать зависимость между френдлифаером и возможностью наносить урон дружественным монстрам.

Итак, записал в CHalf-LifeMultiplay функцию

C++ Source Code:
virtual BOOL  FMonsterCanTakeDamage ( CBaseMonster *pMonster, CBaseEntity *pAttacker );


В CGameRules тоже

C++ Source Code:
virtual BOOL  FMonsterCanTakeDamage ( CBaseMonster *pMonster, CBaseEntity *pAttacker ) = 0;


Определил в multiplay_gamerules.cpp

C++ Source Code:
1
BOOL CHalfLifeMultiplay::FMonsterCanTakeDamage ( CBaseMonster *pMonster, CBaseEntity *pAttacker )
2
{
3
  if ( (pMonster) && (pMonster->IRelationship(pAttacker) == R_AL))
4
    if ( (friendlyfire.value == 0) && (pMonster != pAttacker) )
5
      return FALSE;
6
    return TRUE;
7
  }


В функцию TakeDamage у CBaseMonster добавил

C++ Source Code:
CBaseEntity *pAttacker = CBaseEntity::Instance(pevAttacker);
if ( !g_pGameRules->FMonsterCanTakeDamage( this, pAttacker ) )
  return 0;

после
if ( pev->deadflag == DEAD_NO )
{PainSound();// "Ouch!"}

Добавил заголовочные файлы. В combat.cpp - #include "gamerules.h", в multiplay_gamerules.cpp - #include "monsters.h", в skill.h добавил ifndef SKILL_H, чтобы не переопределялся.

Загружаю карту по сети (монстры включены) с отключенным френдлифаером, но всё равно могу убить Барни.

Подскажите, в чём ошибка? И вообще в верном ли я направлении в плане реализации?

__________________
I'm on github
I'm on opendesktop.org


Отправлено Дядя Миша 29-05-2011 в 14:44:

FreeSlave у барни свой тейк-демедж, через который и наносится дамага.
ищи место в Combap.cpp где эта функция вызывается в принципе, и там делай условие.

Добавлено 29-05-2011 в 18:44:

Это по идее в CheckTraceHullAttack, но не только там.

__________________
My Projects: download page

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

Цитата:

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


Отправлено FreeSlave 29-05-2011 в 15:51:

Цитата:
Дядя Миша писал:
FreeSlave у барни свой тейк-демедж, через который и наносится дамага.
ищи место в Combap.cpp где эта функция вызывается в принципе, и там делай условие.

Добавлено 29-05-2011 в 18:44:

Это по идее в CheckTraceHullAttack, но не только там.


Тейк-демедж Барни всё равно вызывает эту же функцию уже у толк-монстра, а там уже вызывается общая.

В комбате TakeDamage вызывается только в CheckTraceHullAttack и в RadiusDamage

Добавил в ChechTraceHullAttack в условие

C++ Source Code:
1
if ( iDamage > 0 )
2
{
3
  CBaseEntity *pAttacker = CBaseEntity::Instance(pev);
4
  if ( !g_pGameRules->FMonsterCanTakeDamage( this, pAttacker ) )
5
    return pEntity;
6
  pEntity->TakeDamage( pev, pev, iDamage, iDmgType );
7
}


Но всё равно не работает.

А для чего вообще trace-функции? Кровь рисуют?

Кстати, сейчас понял, что при таком раскладе дружественные друг другу монстры не смогут наносить урон при френдлифаере (а порой ведь солдаты подрываются на гранатах других солдат ), надо бы ещё проверку IsPlayer подкрутить.

__________________
I'm on github
I'm on opendesktop.org


Отправлено pRoxxx 29-05-2011 в 17:00:

Цитата:
FreeSlave писал:


А для чего вообще trace-функции? Кровь рисуют?

Всмысле для чего ? Вобще что бы узнать что случиться если провести линию из точки А в точку Б, с чем столкнеться , где столкнеться и т.д.


Отправлено Дядя Миша 29-05-2011 в 17:04:

Цитата:
FreeSlave писал:
В комбате TakeDamage вызывается только в CheckTraceHullAttack и в RadiusDamage

корочи. Чтобы монстр не мог получить дамагу совсем-совсем, используется проверка на pev->takedamage. Вот гляди где эта проверка есть и там посмыслу дополняй своим условием.
Цитата:
FreeSlave писал:
А для чего вообще trace-функции? Кровь рисуют?

какие именно?

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 14-07-2011 в 11:54:

Поднимаю эту тему, чтобы не создавать новую.
Первое:

C++ Source Code:
if ( !stricmp( строка1, строка2 ) )
  break;

Это дело находится внутри цикла. Я так понял, что если если строки совпадут, то цикл прервётся и пойдёт выполняться код, находящийся за ним. Это я правильно понял?

Второе:
C++ Source Code:
if ( строка[0] == '\0' )

Что это вообще за условие? Пустая строка?


Отправлено fire64 14-07-2011 в 11:58:

1 - да
2 - если в начале строка стоит 0x00

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Ku2zoff 14-07-2011 в 12:06:

То есть? Можно подробнее про второе?


Отправлено Shapirlic 14-07-2011 в 12:27:

\0 - нулевой символ.Это не цифра ноль а именно символ с кодом 0.Обозначает конец строки.Если строка пустая то в ней только нулевой символ.Если не пустая то он в конце строки.


Отправлено Ku2zoff 14-07-2011 в 12:35:

То есть в случае

C++ Source Code:
строка[0] == '\0'

строка, пустая, т.к. первый символ есть нулевой.


Отправлено Shapirlic 14-07-2011 в 12:39:

Получается да )


Отправлено Дядя Миша 14-07-2011 в 13:12:

Цитата:
Ku2zoff писал:
Это дело находится внутри цикла. Я так понял, что если если строки совпадут, то цикл прервётся и пойдёт выполняться код, находящийся за ним.

да. А если вместо break написать continue, то цикл пропустит весь код, который находится под break и начнет следующую итерацию.
Цитата:
Ku2zoff писал:
Что это вообще за условие? Пустая строка?

чтобы занулить строку, вовсе необязательно обнулять весь массив. Вполне достаточно занулить первый символ. Так что да, это проверка на пустую строку.

Добавлено 14-07-2011 в 17:12:

ЗЫ. если вместо массива нам доступен только указатель на строку, то условие целесообразно сделать вот таким:
C++ Source Code:
if( str && *str )
{
}

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 14-07-2011 в 13:23:

А в чём отличие между

C++ Source Code:
if (str[0] == '\0')

и
C++ Source Code:
if (str[0] == 0)

? Что-то я понять не могу. Во втором случае первый символ равен нулю, или он не существует вообще?


Отправлено Shapirlic 14-07-2011 в 13:24:

Разницы нет так как код символа '\0' = 0


Отправлено Дядя Миша 14-07-2011 в 13:50:

В одиночных кавычках пишется не число, а код символа, который впоследствии преобразуется в число.
Вот допустим, нам требуется сделать проверку на пробел.
Но не каждый знает, что код пробела равен 32. К тому же это не для всех наглядно. Поэтому пишут

C++ Source Code:
if( *str == ' ' )

вместо
C++ Source Code:
if( *str == 32 )

__________________
My Projects: download page

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

Цитата:

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


Временная зона GMT. Текущее время 11:37. Страницы (2): [1] 2 »
Показать все 22 сообщений этой темы на одной странице

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