HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashXT > Проблема с грантами
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



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

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

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

Вложение: grunt.zip (17.5 кб)
Этот файл был скачан 28 раз.

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

Старое сообщение 11-09-2020 18:36
- За что?
Crystallize
Житель форума

Дата регистрации: Jul 2007
Проживает: Новосибирск
Сообщений: 3154
Возраст: 31

Рейтинг



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

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

Старое сообщение 12-09-2020 08:03
- За что?
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



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

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 прописан…).
Ну и естественно, совместимость с первой халфой сломалась - гранты уже не те!

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

Старое сообщение 12-09-2020 09:18
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



Вы эту проблему сами можете починить.
В 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

Ты сегодня мне принёс гидравлический насос и сказал, что это ландышы
Но меня не проведёшь, насос на ландыш не похож, он большой, а ландыш маленький

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

Старое сообщение 12-09-2020 15:26
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



Вот так вот получается. На карте 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
}

Отредактировано Aynekko 12-09-2020 в 16:30

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

Старое сообщение 12-09-2020 16:26
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



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

Добавлено 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

Ты сегодня мне принёс гидравлический насос и сказал, что это ландышы
Но меня не проведёшь, насос на ландыш не похож, он большой, а ландыш маленький

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

Старое сообщение 12-09-2020 17:38
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



Сначала написал, что 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

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

Старое сообщение 12-09-2020 18:19
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



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

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

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

__________________
My Projects: download page

Ты сегодня мне принёс гидравлический насос и сказал, что это ландышы
Но меня не проведёшь, насос на ландыш не похож, он большой, а ландыш маленький

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

Старое сообщение 12-09-2020 20:18
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



Не, я использую чистенький файл из 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 прямо в гранте. Тем не менее, она все выводит же и как ты сказал даже правильно. Утром выкину ее отсюда и сделаю в баземонстер как надо.

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

Старое сообщение 12-09-2020 21:54
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



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

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

__________________
My Projects: download page

Ты сегодня мне принёс гидравлический насос и сказал, что это ландышы
Но меня не проведёшь, насос на ландыш не похож, он большой, а ландыш маленький

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

Старое сообщение 12-09-2020 22:14
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



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

Добавлено 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
]

Отредактировано Aynekko 26-09-2020 в 15:46

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

Старое сообщение 26-09-2020 15:45
- За что?
Crystallize
Житель форума

Дата регистрации: Jul 2007
Проживает: Новосибирск
Сообщений: 3154
Возраст: 31

Рейтинг



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

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

Старое сообщение 26-09-2020 16:52
- За что?
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 251
Возраст: 28

Рейтинг



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

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

Старое сообщение 26-09-2020 17:12
- За что?
Raid
Офисный шакал

Дата регистрации: Jul 2012
Проживает: Великомогучая
Сообщений: 454
Возраст: 29

Рейтинг



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

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

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

Старое сообщение 15-10-2020 08:23
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 02:48. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashXT > Проблема с грантами
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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