HLFX.Ru Forum
Показать все 29 сообщений этой темы на одной странице

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


Отправлено [)r0n 12-04-2011 в 03:59:

Кастомные декали

Облазил все что мог в поисках ответа как сделать, чтобы декаль зависела от типа материала и ничего не нашел. Может у кого-нибудь есть какие-либо исходники, ссылки, туторы на эту тему? Или может совет какой полезный, кто-нибудь даст, где смотреть и что делать.


Отправлено Ku2zoff 12-04-2011 в 04:18:

[)r0n закомментируй стандартную функцию создания декали на клиенте, ставь декали в EV_HLDM_PlaySound или как его там, где звук попадания пули выбирается в зависимости от материала. Но это только для игрока, для его оружий. У монстров и пулемётов декали ставятся на сервере. Смысл в том, чтобы определить тип материала, лучше это делать на сервере, т.к. для "немировых" энтить можно определить класс и для энтить с CLASS_MACHINE задавать звук металла.

На сервере трейсим энтитю. Если она "мировая", то отправляем на клиент в эвенте или мессагой индекс текстуры. Если "немировая", то в зависимости от класса индекс "мяса" или металла. А на клиенте уже отлавливаем этот индекс и в зависимости от него делаем нужный звук и декаль. Глянь мой тутор "Эффект попадания пуль в стену".


Отправлено [)r0n 12-04-2011 в 21:55:

Есть какие-нибудь исходники, где этот момент уже реализован?
Т.к. моих скромных познаний в С++ явно не хватает.


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

[)r0n Paranoia?

__________________
-Brain is dead-


Отправлено Ku2zoff 13-04-2011 в 04:51:

KiQ в паранойе декали все одинаковые. Не подойдёт.

Решение простое:

Из EV_HLDM_PlaySound вызвать TraceDecal или как там его для каждого типа текстуры. Ну а в EV_HLDM_FireBullets закомментить TraceDecal.


Отправлено HAWK0044 13-04-2011 в 07:09:

хах , а я сделал
смотри...
вобщем создаём переменную:
char *textype;
в EV_HLDM_PlaySound записываем её , к примеру textype = "metall"
далее есть :
EV_HLDM_DamageDecal( physent_t *pe )
там создаём условия типа:
else if (texmat =="metal")
{
idx = gEngfuncs.pfnRandomLong(1,4);
sprintf(decalname,"{shot_metal%d",idx);
}
вот и всё, ничего сложного

в параное тоже можно , почти так же только не в дэмэйдж декал, а там где вы её рисуете (я рисую из EV_HLDM_GunshotDecalTrace )

там у меня:
CreateDecal(*pTrace,"shot");
только вот тут уже можно так:
char *szDecal;
sprintf(szDecal , "shot_%s" , textype);
в итоге создаём новые группы декалей в decallist.txt (или не так) и пишем туда тгашки


Отправлено XaeroX 13-04-2011 в 07:21:

Цитата:
HAWK0044 писал:
else if (texmat =="metal")

В Анапе уже сильно солнышко припекает?

__________________

xaerox on Vivino


Отправлено HAWK0044 13-04-2011 в 07:37:

да есть такое, просто копировал из своего кода, а там это воричное условие, так что прошу прощения, не заметил. Поправь пожалуйста

C++ Source Code:
1
if ( pe->classnumber == 1 )
2
{
3
  idx = gEngfuncs.pfnRandomLong( 0, 2 );
4
  sprintf( decalname, "{break%i", idx + 1 );
5
}
6
else if ( pe->rendermode != kRenderNormal )
7
{
8
  sprintf( decalname, "{bproof1" );
9
}
10
else if (texmat =="wood")
11
{
12
 
13
  idx = gEngfuncs.pfnRandomLong(1,2);
14
  sprintf(decalname,"{shot_wood%i",idx);
15
}
16
else if (texmat =="metal")
17
{
18
  idx = gEngfuncs.pfnRandomLong(1,4);
19
  sprintf(decalname,"{shot_metal%d",idx);
20
}
21
else if (texmat =="tile")
22
{
23
  idx = gEngfuncs.pfnRandomLong(1,5);
24
  sprintf(decalname,"{shot%i",idx);
25
}
26
else if (texmat =="dirt")
27
{
28
  idx = gEngfuncs.pfnRandomLong(1,2);
29
  sprintf(decalname,"{shot_dirt%i",idx);
30
}
31
else
32
{
33
  idx = gEngfuncs.pfnRandomLong( 1, 5 );
34
  sprintf( decalname, "{shot%i", idx );
35
}

вот весь код, чтоб не вводить в заблуждение


Отправлено CrazyRussian 13-04-2011 в 07:52:

Видимо очень сильно там солнышко пекет.
Наводящее слово - strcmp
Хотя есть мысль что если у компилятора/линкера(непомню у кого точно) включена настройка "merge duplicated strings" то такое проканает при условии что строки задавать таким способом

C++ Source Code:
char*name="foo";

знающие - поправьте меня если я не прав, мне самому стало интересно.

__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов


Отправлено HAWK0044 13-04-2011 в 07:58:

вы объясните мне ,чем так не правильно?! все говорят.а объяснять - не объясняют, к тому же у меня еще с вб привычка так делать и всё отлично(!!!) работает


Отправлено CrazyRussian 13-04-2011 в 08:06:

HAWK0044 ты сравниваешь указатели на строки а не сами строки.
такой метод зафейлиться тут:

C++ Source Code:
1
char str[64];
2
strcpy(str,"Boom - это круто! 8-)");
3
if (str == "Boom - это круто! 8-)")
4
  MessageBox(0,str,"",MB_ICONERROR);

МессаджБокс никогда не вылезет.

__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов


Отправлено fire64 13-04-2011 в 08:15:

Это же вообще не скомпилится.

Добавлено 13-04-2011 в 12:15:

Можно конечно воспользоваться и strcmp, а можно написать и свою функцию

C++ Source Code:
1
bool isstringmatch( char *pFirst, char *pSecond )
2
{
3
  if(strlen(pFirst) != strlen(pSecond) )
4
  {
5
    return false;
6
  }
7
 
8
  for( int i = 0; i < strlen(pFirst); i++ )
9
  {
10
    if( pFirst[i] != pSecond[i] )
11
    {
12
      return false;
13
    }
14
  }
15
 
16
  return true;
17
}

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


Отправлено XaeroX 13-04-2011 в 08:32:

Цитата:
HAWK0044 писал:
к тому же у меня еще с вб привычка так делать


Цитата:
fire64 писал:
Можно конечно воспользоваться и strcmp, а можно написать и свою функцию

А зачем? Вдобавок код на редкость неоптимальный.

__________________

xaerox on Vivino


Отправлено Дядя Миша 13-04-2011 в 08:44:

Цитата:
CrazyRussian писал:
включена настройка "merge duplicated strings"

не "merge" а "eliminate". К тому же это касается только констант.
Цитата:
fire64 писал:
Это же вообще не скомпилится.

почему это? вполне себе скомпилится.
вот вам пример кастомного strcmp с защитой от инвалидных строк
C++ Source Code:
1
int Q_strncmp( const char *s1, const char *s2, int n )
2
{
3
  int		c1, c2;
4
 
5
  if( s1 == NULL )
6
  {
7
    if( s2 == NULL ) return 0;
8
    else return -1;
9
  }
10
  else if( s2 == NULL )
11
    return 1;
12
 
13
  do {
14
    c1 = *s1++;
15
    c2 = *s2++;
16
 
17
    // strings are equal until end point
18
    if( !n-- ) return 0;
19
    if( c1 != c2 ) return c1 < c2 ? -1 : 1;
20
 
21
  } while( c1 );
22
 
23
  // strings are equal
24
  return 0;
25
}


Добавлено 13-04-2011 в 12:44:

fire64 вот это твоё true\false - это ламерство. Ты свою функцию не сможешь заюзать для сортировки строк.

__________________
My Projects: download page

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

Цитата:

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


Отправлено [)r0n 13-04-2011 в 10:27:

KiQ, ага, paranoia


Отправлено HAWK0044 13-04-2011 в 13:50:

если паранойа , я же написал как сделатЬ, у меня всё пашет (я как раз под параною делаю ), если заинтересован как же оно у меня работает , можешь написать в icq : 7-двестипятнадцать-215


Отправлено [)r0n 13-04-2011 в 21:54:

HAWK0044, пока что попробовал сделать по твоему методу на абсолютно чистом HLSDK 2.3 (без рендера паранойи), в принципе все работает, но есть неприятный баг. Ели, допустим, из глока последнее во что ты выстрелил было дерево, то дробаш на всех поверхностях, вне зависимости от материала будет рисовать декали дерева.


Отправлено HAWK0044 14-04-2011 в 08:41:

ты просто сделай так чтоб дробаш тоже юзал ПлэйСаунд , он этого не делает - отсюда баг


Отправлено [)r0n 14-04-2011 в 08:51:

HAWK0044, ммм а как?


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

Я стесняюсь спросить, вы декали из плейсаунд ставите

__________________
My Projects: download page

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

Цитата:

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


Отправлено HAWK0044 14-04-2011 в 18:23:

нет. мы там материал назначем - ИМХО от-туда легче в разы , чем запарка с кодом , делая это из других функций , DRON , говорил же,пиши в ICQ : 7-215-двестипятнадцать


Отправлено [)r0n 15-04-2011 в 02:54:

HAWK0044, нет у меня аськи, не пользуюсь ибо не вижу смысла.
Да и что мешает написать на форуме?

Добавлено 15-04-2011 в 02:31:

Усе, кое как сам допер. Надо-то было всего одну строчку дописать.
Еще бы с декалями для монстров разобраться и вообще бы шикарно было бы.

HAWK0044, можешь поделиться tga-шками декалей?
И вопрос, у тебя декали на func_breakable или func_door рисуются?

Добавлено 15-04-2011 в 06:54:

Есть такой вот тутор:

http://www.hlfx.ru/forum/showthread...5&pagenumber=1&

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


Отправлено HAWK0044 15-04-2011 в 05:43:

да всё же предельно просто! просто мне не удобно на форуме писать , в ясеку приятней.
Про "партикли"

void EV_HLDM_GunshotDecalTrace( pmtrace_t *pTrace, char *decalName )
здесь, удаляем вот это:
gEngfuncs.pEfxAPI->R_BulletImpactParticles( pTrace->endpos );
ТГА Декали результат 5-той попытки их портирования, пришлось вместе с рендером тащить. Про двери - нет , они не рисуются вообще на энтитиях


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

>>они не рисуются вообще на энтитиях
Потому что не умеют двигаться вместе с подвижными энтитями, типа дверей, поездов, пушаблей и т.п. Если отключить ограничение, то когда энтитя начинает движение - декаль исчезает. Энтитя возвращается на старое место - декаль появляется.


Отправлено [)r0n 15-04-2011 в 07:44:

Ku2zoff, а конкретно для func_breakable ограничение можно отключить? Ониже все равно не подвижны.
И можно ли рисовать декали в коде твоего тутора про эффекты при попадании пуль в стену?

HAWK0044, спасибо, а как для турелей/монстров эти "точки" отключить?


Отправлено HAWK0044 15-04-2011 в 12:56:

так же , находим - и трём, чего сложного?


Отправлено [)r0n 15-04-2011 в 13:15:

HAWK0044, где тереть то?


Отправлено [)r0n 17-04-2011 в 11:32:

Ku2zoff, как ограничение снять?


Отправлено HAWK0044 17-04-2011 в 13:14:

Я пробовал - у меня не получилось. попробуй ты


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

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