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

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- XashXT (https://hlfx.ru/forum/forumdisplay.php?forumid=30)
-- Проблема с грантами (https://hlfx.ru/forum/showthread.php?threadid=5557)


Отправлено Aynekko 11-09-2020 в 18:36:

Question Проблема с грантами

Привет всем.
Проблема такая: у грантов неправильно работают оружия. XashXT 0.81 rev.2 + Xash3D build 4529.
Независимо от того, какие weapons прописаны в энтити (1, 3, 5, 8, 10 - халфовские значения) - гранты спавнятся всегда с автоматами, при этом некоторые из них стреляют из автомата, но при этом идет звук дробовика. Гранатами они экипируются то ли рандомно, то ли еще как. Но часть из них с подстволом, часть с обычной.

В аттаче прикрепляю исходник карты + bsp, на всякий случай. У кого тоже последний ксаш, проверьте пожалуйста.
На карте просто комната, 5 грантов и у каждого из них прописаны разные оружия. Побегайте вокруг них с notarget, а потом просто с god (чтобы стреляли и посмотрите что будет).


Отправлено Crystallize 12-09-2020 в 08:03:

Ну как-то так оно и есть, да.


Отправлено Aynekko 12-09-2020 в 09:18:

Как фиксить? В ксаше прописано так:

C++ Source Code:
1
#define HGRUNT_9MMAR				1
2
#define HGRUNT_HANDGRENADE		2
3
#define HGRUNT_GRENADELAUNCHER	3
4
#define HGRUNT_SHOTGUN			4

А после в спауне выдается оружие через функции AddWeapon, затем проверка оружия идет через HasWeapon. Но на деле мы получаем вот такую ситуацию - ничего не работает.

На данный момент у меня работает старый вариант:
C++ Source Code:
1
#define HGRUNT_9MMAR				( 1 << 0)
2
#define HGRUNT_HANDGRENADE		( 1 << 1)
3
#define HGRUNT_GRENADELAUNCHER	( 1 << 2)
4
#define HGRUNT_SHOTGUN			( 1 << 3)

А проверка везде идет через pev->weapons. Дядя Миша уверил, что эта функция не используется в ХТ 0.81. Сейчас я вышел из положения вот таким костылем:
C++ Source Code:
1
if (pev->weapons == 0)
2
{
3
  switch( RANDOM_LONG( 0, 3 ))
4
  {
5
  case 0:
6
      pev->weapons = HGRUNT_9MMAR | HGRUNT_HANDGRENADE;
7
    break;
8
  case 1:
9
      pev->weapons = HGRUNT_SHOTGUN;
10
    break;
11
  case 2:
12
      pev->weapons = HGRUNT_9MMAR | HGRUNT_GRENADELAUNCHER;
13
    break;
14
  case 3:
15
      pev->weapons = HGRUNT_SHOTGUN | HGRUNT_HANDGRENADE;
16
    break;
17
  }
18
}

И это работает. Гранты стабильно появляются с рандомной экипировкой. Но пушку задать им уже нельзя - при вписании в поле weapons в энтити любое число там игнорируется и ставится рандомная экипировка (дескать, там 0 прописан…).
Ну и естественно, совместимость с первой халфой сломалась - гранты уже не те!


Отправлено Дядя Миша 12-09-2020 в 15:26:

Вы эту проблему сами можете починить.
В CBaseMonster :: KeyValue есть блок

C++ Source Code:
1
else if (FStrEq(pkvd->szKeyName, "weapons") )
2
{
3
  int	weapons = atoi( pkvd->szValue );
4
 
5
  if( weapons ) m_bHaveWeapons = TRUE;
6
 
7
  // convert bits to weapons
8
  for( int i = 0; i < 32; i++ )
9
  {
10
    if( FBitSet( weapons, BIT( i )))
11
    {
12
      // вот тут добавляем алерт
13
      ALERT( at_console, "has weapon %d, set weapon %d\n", FBitSet( weapons, BIT( i )), i );
14
      AddWeapon( i );
15
    }
16
  }
17
 
18
  pkvd->fHandled = TRUE;
19
}

Что-то там не срабатывает, хотя и должно. Ну через тот же HasWeapon довольно легко проверить после цикла какие оружия были добавлены, а потом сделать вторую проверку в спавне самого гранта. Вывести алерты и посмотреть что там к чему.

Добавлено 12-09-2020 в 18:26:

А в спавне написать немного другой цикл
C++ Source Code:
1
for( int i = 0; i < 32; i++ )
2
{
3
  if( HasWeapon( i )) ALERT( at_console, "has weapon %d\n", i );
4
}

И сравнить чтобы список с set weapon от первого вызова совпадал с has weapon второго. Может случится так, что мессаги has weapon выведены вообще не будут. Значит переменная m_iWeapons где-то зануляется, но это маловероятно.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 12-09-2020 в 16:26:

Вот так вот получается. На карте 1 грант с прописанным значением weapons = 10, что по-халфовски значит Shotgun + HG. По итогу он стреляет из автомата, при этом имея скин дробовика. Консоль вываливает это:

C++ Source Code:
1
>map grunt
2
Spawn Server: grunt
3
 
4
GAME SKILL LEVEL:1
5
 
6
*Physic Initialized!
7
has weapon 2, set weapon 1
8
has weapon 8, set weapon 3
9
has weapon 0
10
has weapon 1
11
has weapon 2
12
has weapon 3
13
has weapon 4
14
has weapon 5
15
has weapon 6
16
has weapon 7
17
has weapon 8
18
has weapon 9
19
has weapon 10
20
has weapon 11
21
has weapon 12
22
has weapon 13
23
has weapon 14
24
has weapon 15
25
has weapon 16
26
has weapon 17
27
has weapon 18
28
has weapon 19
29
has weapon 20
30
has weapon 21
31
has weapon 22
32
has weapon 23
33
has weapon 24
34
has weapon 25
35
has weapon 26
36
has weapon 27
37
has weapon 28
38
has weapon 29
39
has weapon 30
40
has weapon 31
41
 
42
0 entities inhibited
43
Game started



А, кстати, забыл сказать. Когда я спавню их через кнопку (bind p give monsyer_human_grunt), то вроде все нормально.
Просто пишет has weapon 1, has weapon 2 при каждом спауне. Все верно:
C++ Source Code:
1
if (!m_bHaveWeapons)
2
{
3
  AddWeapon(HGRUNT_9MMAR);
4
  AddWeapon(HGRUNT_HANDGRENADE);
5
}


Отправлено Дядя Миша 12-09-2020 в 17:38:

Очень странно

Добавлено 12-09-2020 в 20:38:

Я бы еще поверил, что ошибка в самих функциях HasWeapon, AddWeapon, но тогда бы очевидно, оно и у игрока не работало. А у игрока оно работает точно. Блок установки тоже рабочий, судя по тому, что ты написал.
Но то что выводится в спавне подразумевает, что переменная почему-то вся забита 0xFF.
ALLOC_PRIVATE память очищает. Очень странно.

Сделай еще вот что:

C++ Source Code:
1
else if (FStrEq(pkvd->szKeyName, "weapons") )
2
{
3
  int	weapons = atoi( pkvd->szValue );
4
 
5
  if( weapons ) m_bHaveWeapons = TRUE;
6
 
7
  for( int i = 0; i < 32; i++ )
8
  {
9
    if( HasWeapon( i )) ALERT( at_console, "before has weapon %d\n", i );
10
  }
11
 
12
  // convert bits to weapons
13
  for( i = 0; i < 32; i++ )
14
  {
15
    if( FBitSet( weapons, BIT( i )))
16
    {
17
      // вот тут добавляем алерт
18
      ALERT( at_console, "has weapon %d, set weapon %d\n", FBitSet( weapons, BIT( i )), i );
19
      AddWeapon( i );
20
    }
21
  }
22
  for( i = 0; i < 32; i++ )
23
  {
24
    if( HasWeapon( i )) ALERT( at_console, "after has weapon %d\n", i );
25
  }
26
  pkvd->fHandled = TRUE;
27
}

А из спавна цикл убери. И покажи что напишет.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 12-09-2020 в 18:19:

Сначала написал, что pkvd - undeclared. Не знаю, правильно ли я сделал, но твой код я вставил так:

C++ Source Code:
1
void CHGrunt::KeyValue( KeyValueData *pkvd )
2
{
3
  if (FStrEq(pkvd->szKeyName, "weapons") )
4
  {
5
    int	weapons = atoi( pkvd->szValue );
6
 
7
    if( weapons ) m_bHaveWeapons = TRUE;
8
 
9
    for( int i = 0; i < 32; i++ )
10
    {
11
      if( HasWeapon( i )) ALERT( at_console, "before has weapon %d\n", i );
12
    }
13
 
14
    // convert bits to weapons
15
    for( i = 0; i < 32; i++ )
16
    {
17
      if( FBitSet( weapons, BIT( i )))
18
      {
19
        ALERT( at_console, "has weapon %d, set weapon %d\n", FBitSet( weapons, BIT( i )), i );
20
        AddWeapon( i );
21
      }
22
    }
23
    for( i = 0; i < 32; i++ )
24
    {
25
      if( HasWeapon( i )) ALERT( at_console, "after has weapon %d\n", i );
26
    }
27
    pkvd->fHandled = TRUE;
28
  }
29
}


Поставил трех грантов на карту, значения всегда в консоли выводятся одни и те же у них, но стреляют они все равно чем попало - дробовик с моделью автомата и т.д. Weapons у них 10, 8 и 5. Правда кто из них кто тут, я не знаю.
C++ Source Code:
1
// 1
2
has weapon 2, set weapon 1
3
has weapon 8, set weapon 3
4
after has weapon 1
5
after has weapon 3
6
 
7
// 2
8
has weapon 8, set weapon 3
9
after has weapon 3
10
 
11
// 3
12
has weapon 1, set weapon 0
13
has weapon 4, set weapon 2
14
after has weapon 0
15
after has weapon 2


Отправлено Дядя Миша 12-09-2020 в 20:18:

Ну вот, в кей-валуях всё корректно.
Каким чудом уже в спавне память портится?
Ничего не понимаю.
Для начала поубирай все эти свои вызовы pev->weapons, их там быть точно не должно. Т.е. есть какой-то баг от меня, а ты его еще и усугубил.

Добавлено 12-09-2020 в 23:18:

А! Кинь сюда функцию спавна своего. От гранта.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 12-09-2020 в 21:54:

Не, я использую чистенький файл из XT сорцев. Свой не трогаю вообще пока.
Вот спаун:

C++ Source Code:
1
void CHGrunt :: Spawn()
2
{
3
  Precache( );
4
 
5
  if (pev->model)
6
    SET_MODEL(ENT(pev), STRING(pev->model)); //LRC
7
  else
8
    SET_MODEL(ENT(pev), "models/hgrunt.mdl");
9
  UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX);
10
 
11
  pev->solid			= SOLID_SLIDEBOX;
12
  pev->movetype		= MOVETYPE_STEP;
13
  m_bloodColor		= BLOOD_COLOR_RED;
14
  pev->effects		= 0;
15
  if (!pev->health) pev->health	= gSkillData.hgruntHealth;
16
  m_flFieldOfView		= 0.2;// indicates the width of this monster's forward view cone ( as a dotproduct result )
17
  m_MonsterState		= MONSTERSTATE_NONE;
18
  m_flNextGrenadeCheck = gpGlobals->time + 1;
19
  m_flNextPainTime	= gpGlobals->time;
20
  m_iSentence			= HGRUNT_SENT_NONE;
21
 
22
  m_afCapability		= bits_CAP_SQUAD | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP;
23
 
24
  m_fEnemyEluded		= FALSE;
25
  m_fFirstEncounter	= TRUE;// this is true when the grunt spawns, because he hasn't encountered an enemy yet.
26
 
27
  m_HackedGunPos = Vector ( 0, 0, 55 );
28
 
29
  if (!m_bHaveWeapons)
30
  {
31
    AddWeapon(HGRUNT_9MMAR);
32
    AddWeapon(HGRUNT_HANDGRENADE);
33
  }
34
 
35
  if (HasWeapon( HGRUNT_SHOTGUN ))
36
  {
37
    SetBodygroup( GUN_GROUP, GUN_SHOTGUN );
38
    m_cClipSize		= 8;
39
  }
40
  else
41
  {
42
    m_cClipSize		= GRUNT_CLIP_SIZE;
43
  }
44
  m_cAmmoLoaded		= m_cClipSize;
45
 
46
  if (RANDOM_LONG( 0, 99 ) < 80)
47
    pev->skin = 0;	// light skin
48
  else
49
    pev->skin = 1;	// dark skin
50
 
51
  if ( HasWeapon( HGRUNT_SHOTGUN ))
52
  {
53
    SetBodygroup( HEAD_GROUP, HEAD_SHOTGUN);
54
  }
55
  else if ( HasWeapon( HGRUNT_GRENADELAUNCHER ))
56
  {
57
    SetBodygroup( HEAD_GROUP, HEAD_M203 );
58
    pev->skin = 1; // alway dark skin
59
  }
60
 
61
  CTalkMonster::g_talkWaitTime = 0;
62
 
63
 
64
  MonsterInit();
65
}


Добавлено 13-09-2020 в 00:54:

Блин, я ток сейчас понял, что мне надо было в баземонстер редактировать. А я создал новую функцию keyvalue прямо в гранте. Тем не менее, она все выводит же и как ты сказал даже правильно. Утром выкину ее отсюда и сделаю в баземонстер как надо.


Отправлено Дядя Миша 12-09-2020 в 22:14:

Цитата:
Aynekko писал:
А я создал новую функцию keyvalue прямо в гранте

это не влияет. кроме грантов всё равно никто это не пользует.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 26-09-2020 в 15:45:

Проблема идет дальше, выяснилось что после сохр/загр оружие у грантов меняется на дробовик, стабильно. Скин остается тот же.

Добавлено 26-09-2020 в 14:27:

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

Добавлено 26-09-2020 в 14:46:

Таак, идем дальше. Убрал поле weapons из энтити полностью в джеке. Гранты спавнятся как надо, пушки сохраняются. Игре не нравится поле weapons прописанное в энтити и их значения?

Добавлено 26-09-2020 в 18:45:

Все, кажется я починил этих засранцев. Правда, без сохранения совместимости с халвой. Собственно, как решил проблему (вдруг пригодится кому):
В класс кидаем:

C++ Source Code:
void KeyValue( KeyValueData *pkvd );

Добавляем функцию:
C++ Source Code:
1
void CHGrunt::KeyValue( KeyValueData *pkvd )
2
{
3
  if( FStrEq( pkvd->szKeyName, "wpns" ))
4
  {
5
    wpns = ALLOC_STRING( pkvd->szValue );
6
  }
7
  pkvd->fHandled = TRUE;
8
}


В спауне удаляем условие if pev->weapons == 0 или if (!m_bHaveWeapons) в ксаше и ставим это:
C++ Source Code:
1
if (wpns)
2
{
3
  m_bHaveWeapons = TRUE;
4
}
5
else
6
{
7
  m_bHaveWeapons = FALSE;
8
}
9
 
10
 
11
if (!m_bHaveWeapons)
12
{
13
  switch( RANDOM_LONG( 0, 3 ))
14
  {
15
  case 0:
16
      AddWeapon(HGRUNT_9MMAR);
17
    AddWeapon(HGRUNT_HANDGRENADE);
18
    break;
19
  case 1:
20
      AddWeapon(HGRUNT_SHOTGUN);
21
    break;
22
  case 2:
23
      AddWeapon(HGRUNT_9MMAR);
24
    AddWeapon(HGRUNT_GRENADELAUNCHER);
25
    break;
26
  case 3:
27
      AddWeapon(HGRUNT_SHOTGUN);
28
    AddWeapon(HGRUNT_HANDGRENADE);
29
    break;
30
  }
31
  ALERT( at_console, "random weapon\n");
32
}
33
 
34
if (m_bHaveWeapons)
35
{
36
  if (FStrEq( STRING(wpns), "9mmar" ))
37
  {
38
    AddWeapon(HGRUNT_9MMAR);
39
    ALERT( at_console, "9mmar\n");
40
  }
41
  if (FStrEq( STRING(wpns), "9mmar_hg" ))
42
  {
43
    AddWeapon(HGRUNT_9MMAR);
44
    AddWeapon(HGRUNT_HANDGRENADE);
45
  }
46
  if (FStrEq( STRING(wpns), "9mmar_gl" ))
47
  {
48
    AddWeapon(HGRUNT_9MMAR);
49
    AddWeapon(HGRUNT_GRENADELAUNCHER);
50
  }
51
  if (FStrEq( STRING(wpns), "shotgun" ))
52
  {
53
    AddWeapon(HGRUNT_SHOTGUN);
54
    ALERT( at_console, "shotgun\n");
55
  }
56
  if (FStrEq( STRING(wpns), "shotgun_hg" ))
57
  {
58
    AddWeapon(HGRUNT_SHOTGUN);
59
    AddWeapon(HGRUNT_HANDGRENADE);
60
 
61
    ALERT( at_console, "shotgun_hg\n");
62
  }
63
}

Алерты для теста, можете потом убрать. Пока вроде все норм. Побегал, посохранялся. В общем, день прожит не зря.

И наконец для fgd-файла:
C++ Source Code:
1
wpns(Choices) : "Weapons" : 1 =
2
[
3
9mmar : "9mmAR"
4
9mmar_hg : "9mmAR + HG"
5
9mmar_gl : "9mmAR + GL"
6
shotgun : "Shotgun"
7
shotgun_hg : "Shotgun + HG"
8
]


Отправлено Crystallize 26-09-2020 в 16:52:

А может это сам редактор чудит?


Отправлено Aynekko 26-09-2020 в 17:12:

Тоже думал, но нет - запускал карту халфовскую.


Отправлено Raid 15-10-2020 в 08:23:

Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

__________________
Ты себя ведёшь как маленький ребёнок, который на улице увидел говно и обрадовался - говно-говно, смотрите кто-то насрал, ну и дела! © Дядя Миша

лиса.забирать.сыр.кусочек = ворона.уронить.сыр.кусочек( 1шт ); © FiEctro


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

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