HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Общие вопросы по кодингу
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1087

Рейтинг



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

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

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

Итак, записал в 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

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

Старое сообщение 29-05-2011 13:48
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



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'

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

Старое сообщение 29-05-2011 14:44
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1087

Рейтинг



Цитата:
Дядя Миша писал:
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

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

Старое сообщение 29-05-2011 15:51
- За что?
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 34

Рейтинг



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


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

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

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

Старое сообщение 29-05-2011 17:00
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Цитата:
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'

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

Старое сообщение 29-05-2011 17:04
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

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

Рейтинг



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

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

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

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

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

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

Старое сообщение 14-07-2011 11:54
- За что?
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 35

Рейтинг



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

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

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

Старое сообщение 14-07-2011 11:58
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

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

Рейтинг



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

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

Старое сообщение 14-07-2011 12:06
- За что?
Shapirlic
Житель форума

Дата регистрации: Feb 2011
Проживает: SPb
Сообщений: 351
Возраст: 31

Рейтинг



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

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

Старое сообщение 14-07-2011 12:27
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

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

Рейтинг



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

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

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

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

Старое сообщение 14-07-2011 12:35
- За что?
Shapirlic
Житель форума

Дата регистрации: Feb 2011
Проживает: SPb
Сообщений: 351
Возраст: 31

Рейтинг



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

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

Старое сообщение 14-07-2011 12:39
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Цитата:
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'

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

Старое сообщение 14-07-2011 13:12
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

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

Рейтинг



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

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

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

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

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

Старое сообщение 14-07-2011 13:23
- За что?
Shapirlic
Житель форума

Дата регистрации: Feb 2011
Проживает: SPb
Сообщений: 351
Возраст: 31

Рейтинг



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

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

Старое сообщение 14-07-2011 13:24
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



В одиночных кавычках пишется не число, а код символа, который впоследствии преобразуется в число.
Вот допустим, нам требуется сделать проверку на пробел.
Но не каждый знает, что код пробела равен 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'

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

Старое сообщение 14-07-2011 13:50
-
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 23:16. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
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