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 ) |
3 | if ( (pMonster) && (pMonster->IRelationship(pAttacker) == R_AL)) |
4 | if ( (friendlyfire.value == 0) && (pMonster != pAttacker) ) |
В функцию TakeDamage у CBaseMonster добавил
C++ Source Code:
CBaseEntity *pAttacker = CBaseEntity::Instance(pevAttacker); |
if ( !g_pGameRules->FMonsterCanTakeDamage( this, pAttacker ) ) |
после
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:
3 | CBaseEntity *pAttacker = CBaseEntity::Instance(pev); |
4 | if ( !g_pGameRules->FMonsterCanTakeDamage( this, pAttacker ) ) |
6 | pEntity->TakeDamage( pev, pev, iDamage, iDmgType ); |
Но всё равно не работает.
А для чего вообще 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 ) ) |
Это дело находится внутри цикла. Я так понял, что если если строки совпадут, то цикл прервётся и пойдёт выполняться код, находящийся за ним. Это я правильно понял?
Второе:
C++ Source Code:
Что это вообще за условие? Пустая строка?
Отправлено 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:
строка, пустая, т.к. первый символ есть нулевой.
Отправлено Shapirlic 14-07-2011 в 12:39:
Получается да )
Отправлено Дядя Миша 14-07-2011 в 13:12:
Цитата:
Ku2zoff писал:
Это дело находится внутри цикла. Я так понял, что если если строки совпадут, то цикл прервётся и пойдёт выполняться код, находящийся за ним.
да. А если вместо break написать continue, то цикл пропустит весь код, который находится под break и начнет следующую итерацию.
Цитата:
Ku2zoff писал:
Что это вообще за условие? Пустая строка?
чтобы занулить строку, вовсе необязательно обнулять весь массив. Вполне достаточно занулить первый символ. Так что да, это проверка на пустую строку.
Добавлено 14-07-2011 в 17:12:
ЗЫ. если вместо массива нам доступен только указатель на строку, то условие целесообразно сделать вот таким:
C++ Source Code:
__________________
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:
и
C++ Source Code:
? Что-то я понять не могу. Во втором случае первый символ равен нулю, или он не существует вообще?
Отправлено Shapirlic 14-07-2011 в 13:24:
Разницы нет так как код символа '\0' = 0
Отправлено Дядя Миша 14-07-2011 в 13:50:
В одиночных кавычках пишется не число, а код символа, который впоследствии преобразуется в число.
Вот допустим, нам требуется сделать проверку на пробел.
Но не каждый знает, что код пробела равен 32. К тому же это не для всех наглядно. Поэтому пишут
C++ Source Code:
вместо
C++ Source Code:
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 14-07-2011 в 15:13:
Я объясню чуть иначе.
По дефолту числовые константы имеют тип int. Поэтому сравнение
C++ Source Code:
это неявное приведение типа.
Конечно, умный компилятор легко оптимизирует сравнение с нулем. Если мы пишем
C++ Source Code:
то сравниваем байт с байтом.
В данном случае тип роли не играет, и оба выражения имеют одинаковый смысл. Но так бывает далеко не всегда!
Пример:
C++ Source Code:
unsigned __int64 test = (1 << 40); |
Как думаете, что будет в переменной test? 64-битное число (1<<40)? А вот не тут-то было! И 1, и 40 имеют тип int, а значит, операция сдвига имеет также тип int. Но это число превышает размер 32-битного числа, поэтому в итоге получается 0. Он-то радостно и присваивается 64-битному test-у.
А правильный код выглядит так:
C++ Source Code:
unsigned __int64 test = ((unsigned __int64)1 << 40); |
__________________
Отправлено Дядя Миша 14-07-2011 в 15:19:
Цитата:
XaeroX писал:
А правильный код выглядит так:
следует понимать, что работа с 64-разрядными переменными, вообще имеет массу тонкостей.
То что обязательно для них, вовсе необязательно для 32-битных.
Также приведение типов играет важную роль при русификации и передаче данных по сети.
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено underworlddemon 14-07-2011 в 18:59:
Цитата:
Дядя Миша писал:
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.
это ещё не худший вариант
в НСке при печати Я вылет в винду или зависон компа... как повезёт...
Отправлено KiQ 06-01-2015 в 13:19:
Сорри за некропостинг, но более подходящей темы не нашел. В общем суть такова:
У нас есть некая структура
C++ Source Code:
6 | static somestruct_t somestruct; |
где thing_t в свою очередь выражен
C++ Source Code:
1 | typedef struct thing_t thing_s; |
а в структура other_s в свою очередь:
C++ Source Code:
Вопрос - как получить доступ к переменной number, начиная с somestruct? Я пробовал разные варианты, все они ссылаются на C2228. Последний вариант, который выдает всего одну ошибку:
C++ Source Code:
somestruct.something->other.number; |
Ошибка error C2228: left of '.number' must have class/struct/union type
Я в общем запарился уже, вроде простая задача__________________
-Brain is dead-
Отправлено XaeroX 06-01-2015 в 13:51:
C++ Source Code:
somestruct.something->other->number; |
__________________
Отправлено ComradeAndrew 06-01-2015 в 13:51:
KiQ
other в структуре thing_s является указателем.
C++ Source Code:
somestruct.something->other->number; |
Цитата:
C++ Source Code:
typedef struct thing_t thing_s; |
Разве не наоборот надо?
C++ Source Code:
typedef struct thing_s thing_t; |
Отправлено KiQ 06-01-2015 в 16:52:
Все, спасибо, там оказывается еще дело было в том, что other не был определен, то есть когда он передавался как параметр, все было нормально, а попытка обратиться к его членам выдавала C2027. Подключил нужный инклюд и все заработало
__________________
-Brain is dead-