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

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


Отправлено Lev 05-06-2012 в 05:29:

Кодинг оружия

Не знаю возможно ли - но всё же - можно как нибудь посчитать, сколько пуль подряд выпустила пушка, или же сколько времени зажата атака (для автоматов)?


Отправлено DefilerUnit 05-06-2012 в 07:44:

это подойдёт?
http://hlpp.thewavelength.net/tuts/burst.htm


Отправлено HAWK0044 05-06-2012 в 08:03:

DefilerUnit
не подойдёт.Точнее подойдёт, но что-то метод через weaponidle меня настораживает.

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

float flFirstShot;

if(!flFirstShot)
flFirstShot = gpGlobals->time + 1.0;//1.0 - твоё время

if(flFirstShot > gpGlobals->time)
{
m_iShoots++;
}
else
{
flFirstShot = 0.0;
m_iShoots=0;
}


Отправлено Дядя Миша 05-06-2012 в 10:12:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено Lev 05-06-2012 в 13:05:

Ну можно и так сказать - только мне нужно просто сделать кастомный дым при прохождении временного поргога стрельбы. Вот таким спрайтом


Отправлено ONeiLL 05-06-2012 в 13:11:

Lev , таким спрайтом сложновато будет замутить, ведь спрайт всегда смотрит лицом к игроку

Добавлено 05-06-2012 в 16:11:

Или дым у тебя вверх должен быть направлен?


Отправлено Lev 05-06-2012 в 13:15:

У меня в entity.cpp есть дым - круглый, после каждого выстрела

C++ Source Code:
1
void VectorAngles( const float *forward, float *angles );
2
 
3
float zz_framerate = CVAR_GET_FLOAT( "zz_framerate" );
4
float zz_fadespeed = CVAR_GET_FLOAT( "zz_fadespeed" );
5
float zz_life = CVAR_GET_FLOAT( "zz_life" );
6
float zz_alpha = CVAR_GET_FLOAT( "zz_alpha" );
7
 
8
int iSmoke = CVAR_GET_FLOAT("cl_gunsmoke");
9
 
10
TEMPENTITY *pSmokeTempEntity;
11
int  iGunSmoke = gEngfuncs.pEventAPI->EV_FindModelIndex ("sprites/gunsmoke.spr");
12
 
13
TEMPENTITY *pSmokeTempEntity2;
14
int  iGunSmoke2 = gEngfuncs.pEventAPI->EV_FindModelIndex ("sprites/gunsmoke2.spr");
15
 
16
vec3_t up, right, forward, angles;
17
 
18
cl_entity_t *ent = gEngfuncs.GetEntityByIndex( entity->index );
19
 
20
angles =  ent->curstate.angles;
21
 
22
AngleVectors( entity->angles, forward, up, right );
23
 
24
 
25
 
26
switch( event->event )
27
{
28
case 5001:
29
    pSmokeTempEntity = gEngfuncs.pEfxAPI->R_TempSprite( (float *)&entity->attachment[0], Vector (1,1,1)/*forward * gEngfuncs.pfnRandomLong ( -1 , 1 ) + right * gEngfuncs.pfnRandomLong ( -1 , 1 ) + up * gEngfuncs.pfnRandomLong ( -1 , 1 )*/,
30
  0.3,
31
  iGunSmoke,//iGunSmoke
32
  kRenderTransAdd,
33
  kRenderFxNone,
34
  1.0,//1.0
35
  0.5, //1
36
  FTENT_SPRANIMATE| FTENT_FADEOUT);
37
 
38
  if(pSmokeTempEntity)
39
  {    // sprite created successfully, adjust some things
40
  pSmokeTempEntity->fadeSpeed = gEngfuncs.pfnRandomLong ( 10.0 , 2.0 );
41
  pSmokeTempEntity->entity.curstate.framerate = 20;
42
  pSmokeTempEntity->entity.curstate.renderamt = 255;
43
  pSmokeTempEntity->entity.curstate.rendercolor.r = COLOR_VALUE;
44
  pSmokeTempEntity->entity.curstate.rendercolor.g = COLOR_VALUE;
45
  pSmokeTempEntity->entity.curstate.rendercolor.b = COLOR_VALUE;
46
}
47
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[0], atoi( event->options) );
48
DlightFlash((float *)&entity->attachment[0]);
49
break;
- а новый дым должен возникать только при перегреве - от ствола - вроде горячего воздуха


Отправлено Дядя Миша 05-06-2012 в 13:16:

Цитата:
ONeiLL писал:
ведь спрайт всегда смотрит лицом к игроку

кто тебя так обманул?

__________________
My Projects: download page

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

Цитата:

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


Отправлено ONeiLL 05-06-2012 в 13:32:

Ну если не скомпилить с параметром oriented или vp_parallel_upright


Отправлено qpAHToMAS 05-06-2012 в 23:36:

Какая разница, какой спрайт. Человек спрашивал как отловить конкретный момент, а создать эффект — совсем другое дело.


Отправлено Lev 06-06-2012 в 07:37:

Мне нужно узнать три вещи: первое - как и где ловить этот момент(я думаю что на сервере в коде самого оружия), второе - как передать этот момент на клиент, чтобы им можно было воспользоваться в эвентах, и третье - в выше преведённом мной коде, дым после выстрела не прикреплён к стволу, а остаётся там, где произошёл выстрел - и в этом случае это нормально, но новый эффект мне нужно бы зафиксировать на стволе - как это можно сделать?


Отправлено ONeiLL 06-06-2012 в 08:12:

Код дал HAWK0044

Его в PrimaryAttack

C++ Source Code:
1
if(!flFirstShot)
2
  flFirstShot = gpGlobals->time + 1.0;//1.0 - твоё время
3
 
4
if(flFirstShot > gpGlobals->time)
5
{
6
  m_iShoots++;
7
}
8
else
9
{
10
  flFirstShot = 0.0;
11
  m_iShoots=0;
12
}
13
 
14
if( m_iShoots >= 10 ) // После 10 выстрелов дым
15
{
16
  // А вот здесь уже и  надо наш дым делать, как думай сам
17
}


Предварительно переменные flFirstShot и flFirstShot надо объявить в классе оружия или в CBaseWeapon, потом в функ. Deploy их поидее надо обнулять.

Добавлено 06-06-2012 в 11:12:

И я не уверен, будет это работать или нет )))


Отправлено Lev 06-06-2012 в 17:45:

Всё работает - отлавливает момент точно после десяти выстрелов. Я думаю для этого дела создать новый евент с дымом - но как эту информацию переслать на клиент, чтобы в нужный момент запустить эвент?


Отправлено marikcool 06-06-2012 в 18:14:

зачем пересылать?, клиентское оружие и так проиграет после 10 выстрела то что требуется.


Отправлено Lev 06-06-2012 в 18:26:

Ты имеешь в виду то, которое в ev_hldm.cpp? А как это сделать?


Отправлено marikcool 06-06-2012 в 18:33:

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


Отправлено Lev 06-06-2012 в 18:52:

То есть я могу в функции void EV_FireAKS( event_args_t *args )
просто создать условие?

if (( m_iShoots >= 10 ))
{
... - нужный мне евент
return;
}


Отправлено antikran 10-06-2012 в 19:53:

Вопрос по рикошетам...

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

например
имя текстуры - градус вероятность,

metall_012 0 0, 15 95, 30 70, 45 50, 60 30, 90 0.


Возможно ли это.?

__________________
Спасибо тем кто помогает...
И тем кто бред этот читает...
Спасибо Дяде Мише за Xash двиг...
Благодаря ему, чуть больше я постиг...
Ну чайник я, и мало очень знаю С++...
Зато леплю я карты и играю блюз...

Вот так то.


Отправлено Дядя Миша 10-06-2012 в 20:01:

1. возможно
2. код рикошета (точнее отражения) можно взять из гаусса
3. код парсинга текстовых документов - из кода чтения звучащих текстур

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 10-06-2012 в 20:34:

antikran не обязательно заносить данные для каждой текстуры в текстовый файл. Можно сделать условия для каждого из типов текстур и зашить их прямо в код. Например, для металла - вероятность рикошета очень высокая, для вентиляции - нулевая (пуля просто пробьёт дырку), для бетона - чуть меньше чем для металла и т.п. А типы текстур читаются для их "озвучивания", тут ничего нового писать не придётся.


Отправлено HAWK0044 10-06-2012 в 21:43:

Lev
да перешли ты уже мессагой и не делай мозги


Отправлено antikran 10-06-2012 в 22:22:

Спасибо попробую.

__________________
Спасибо тем кто помогает...
И тем кто бред этот читает...
Спасибо Дяде Мише за Xash двиг...
Благодаря ему, чуть больше я постиг...
Ну чайник я, и мало очень знаю С++...
Зато леплю я карты и играю блюз...

Вот так то.


Отправлено qpAHToMAS 11-06-2012 в 03:06:

antikran, советую в ArmAII поиграть, посмотерть как там работают рикошеты. Весьма круто сделано.
Если в кратце, то стоит очень болшой рэндом (не как у гауса, точный угол отражения) и сила/скорость пули здорово уменьшается.


Отправлено antikran 11-06-2012 в 04:48:

qpAHToMAS
Хорошо поиграю))) Можете поздравить только ОСь новую залил... беда, не приходит одна. Хорошо проекты на съемнике были.
Я вот думал что скорее всего не надо к каждому оружию задавать, проще привязать это все к патронам... тоесть к их типу. Насчет рандомайза я думал... но и 99 может выпасть при прямом углу. Сам себя и застрелишь.

__________________
Спасибо тем кто помогает...
И тем кто бред этот читает...
Спасибо Дяде Мише за Xash двиг...
Благодаря ему, чуть больше я постиг...
Ну чайник я, и мало очень знаю С++...
Зато леплю я карты и играю блюз...

Вот так то.


Отправлено Ku2zoff 11-06-2012 в 09:06:

Цитата:
antikran писал:
но и 99 может выпасть при прямом углу. Сам себя и застрелишь.

Из гаусса кстати так можно сделать
Цитата:
antikran писал:
не надо к каждому оружию задавать, проще привязать это все к патронам...

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


Отправлено Lev 05-07-2012 в 12:25:

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


Отправлено Ku2zoff 05-07-2012 в 12:37:

Lev ты лучше сделай так: перезаряжаем - старый магазин записывается в память, новый заряжается в ствол. И когда у нас заканчиваются нетронутые магазины, начинают использоваться те, что в памяти. Когда магазин пустой - он выкидывается при перезарядке, а когда нет - сохраняется в памяти.


Отправлено ONeiLL 05-07-2012 в 12:41:

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


Отправлено Lev 05-07-2012 в 12:45:

Ku2zoff - мысль конечно хорошая, но во первых у меня акнимации такие что обойма со свистом вылетает в сторону земли, а во вторых я пока не умею работать с памятью - если ты знаешь как можно спавнить - итем подскажи пожалуйста


Отправлено marikcool 05-07-2012 в 12:52:

а если выкинутую обойму поднять патроны сольются воедино?


Отправлено ONeiLL 05-07-2012 в 12:56:

Цитата:
Lev писал:
не умею работать с памятью

Просто это на замудрёном языке так звучит.

Напиши int iiii = 1;

Поздравляю, ты научился работать с памятью


Отправлено Lev 05-07-2012 в 14:17:

Да - но это не страшно

Добавлено 05-07-2012 в 20:17:

Решил сделать так чтобы персонажи тоже выбрасывали при перезарядке обойму - есть сама функция спавна void CSpetsnaz::SpawnClip( void ) - но как её правилно запустить я не понимаю - если сделать так

SetThink( SpawnClip );
pev->nextthink = gpGlobals->time + 0.0;

то после перезарядки персонажи перестают стрелять и двигаться вообще, хотя и откликаются на разговор.


Отправлено KiQ 06-07-2012 в 15:19:

Lev
pev->nextthink = gpGlobals->time + 0.1;
или уж вызывай непосредственно из Reload.

__________________
-Brain is dead-


Отправлено Дядя Миша 06-07-2012 в 16:46:

Цитата:
ONeiLL писал:
Поздравляю, ты научился работать с памятью

С памятью вы научитесь работать, когда подобные конструкции вас смущать перестанут.
C++ Source Code:
1
void CStudioModelRenderer :: CreateVertexCache( word handle )
2
{
3
  int vertSize = 0, normSize = 0;
4
  int totalVertSize = 0, totalNormSize = 0;
5
  size_t vertOffsets[MAXSTUDIOMODELS];
6
  size_t normOffsets[MAXSTUDIOMODELS];
7
  int lastNormSize = 0;
8
 
9
  memset( vertOffsets, 0, sizeof( vertOffsets ));
10
  memset( normOffsets, 0, sizeof( normOffsets ));
11
 
12
  // through all bodies to determine max vertices count
13
  for( int j = 0; j < m_pStudioHeader->numbodyparts; j++ )
14
  {
15
    mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)m_pStudioHeader + m_pStudioHeader->bodypartindex) + j;
16
 
17
    int index = m_ModelInstances[handle].m_pEntity->curstate.body / pbodypart->base;
18
    index = index % pbodypart->nummodels;
19
 
20
    mstudiomodel_t *psubmodel = (mstudiomodel_t *)((byte *)m_pStudioHeader + pbodypart->modelindex) + index;
21
    vertSize = (psubmodel->numverts * sizeof(Vector));
22
    normSize = (psubmodel->numnorms * sizeof(Vector));
23
 
24
    // NOTE: vertex and normals array are interleaved into memory representation
25
    if( j == 0 )
26
    {
27
      vertOffsets[j] = 0;	// just in case
28
      normOffsets[j] = vertOffsets[j] + vertSize;
29
    }
30
    else
31
    {
32
      vertOffsets[j] = normOffsets[j-1] + lastNormSize;
33
      normOffsets[j] = vertOffsets[j] + vertSize;
34
    }
35
 
36
    // count total cache vertexes and normals
37
    totalVertSize += vertSize;
38
    totalNormSize += normSize;
39
    lastNormSize = normSize;
40
  }
41
 
42
  // create a vertexcache too
43
  size_t cacheSize = sizeof( VertCache_t ) + totalVertSize + totalNormSize;
44
  m_ModelInstances[handle].vertcache = (VertCache_t *)calloc( 1, cacheSize );
45
  byte *cache_base = (byte *)m_ModelInstances[handle].vertcache + sizeof( VertCache_t );
46
 
47
  // simple huh?
48
  for( int i = 0; i < m_pStudioHeader->numbodyparts; i++ )
49
  {
50
    m_ModelInstances[handle].vertcache->verts[i] = (Vector *)(cache_base + vertOffsets[i]); // vertex array
51
    m_ModelInstances[handle].vertcache->norms[i] = (Vector *)(cache_base + normOffsets[i]); // normal array
52
  }
53
}

Вот тогда вы действительно сможете себе сказать "да, я научился работать с памятью".

__________________
My Projects: download page

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

Цитата:

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


Отправлено ONeiLL 06-07-2012 в 17:45:

конечно я не понял, для чего это, но ничего такого странного тоже не заметил


Отправлено Chyvachok 10-07-2012 в 17:05:

А как создать разрывные патроны? Чтобы автомат стрелял пулями которые взрываются как стрела арбалета.


Отправлено fire64 10-07-2012 в 17:22:

Chyvachok, делай трассу и в месте попадания создавай взрыв.

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


Отправлено Chyvachok 10-07-2012 в 17:35:

fire64 а как учитывать разброс?


Отправлено Дядя Миша 10-07-2012 в 18:07:

Цитата:
fire64 писал:
Chyvachok, делай трассу и в месте попадания создавай взрыв.

мастер апчхимизаций? Пуля уже и так трассу делает. Достаточно взывать взрыв там же, где и искры.

__________________
My Projects: download page

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

Цитата:

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


Отправлено pRoxxx 10-07-2012 в 20:07:

Цитата:
Lev писал:
не умею работать с памятью

Оу, видел бы ты как я зафлудил ДМ'у аську из за очистки памяти.


Отправлено Chyvachok 11-07-2012 в 10:36:

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

C++ Source Code:
1
case BULLET_PLAYER_357:
2
  //pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BLAST | DMG_ALWAYSGIB);
3
RadiusDamage(tr.vecEndPos, pevAttacker, pevAttacker, gSkillData.plrDmg357Exp, gSkillData.plrDmg357Radius, CLASS_NONE, DMG_BLAST | DMG_ALWAYSGIB); //копипаста из кода ХЛВЕ
4
 
5
static int iContents = UTIL_PointContents ( tr.vecEndPos ); //копипаста из арбалета
6
static int iScaleExp;
7
 
8
iScaleExp = 10;
9
 
10
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, tr.vecEndPos );
11
WRITE_BYTE( TE_EXPLOSION);
12
WRITE_COORD( tr.vecEndPos.x );
13
WRITE_COORD( tr.vecEndPos.y );
14
WRITE_COORD( tr.vecEndPos.z );
15
if (iContents != CONTENTS_WATER)
16
{
17
  WRITE_SHORT( g_sModelIndexFireball );
18
}
19
else
20
{
21
  WRITE_SHORT( g_sModelIndexWExplosion );
22
}
23
WRITE_BYTE( iScaleExp  ); // scale * 10
24
WRITE_BYTE( 15  ); // framerate
25
WRITE_BYTE( TE_EXPLFLAG_NONE );
26
MESSAGE_END();
27
 
28
break;


Отправлено CrazyRussian 11-07-2012 в 11:26:

Цитата:
Chyvachok писал:
Только как эффект взрыва чуть к игроку приблизить?

Vector origin = tr.vecEndPos + vecDir * -чуть;
где:
"чуть" - насколько отодвигаешь взрыв
vecDir - направление из которого у тебя пускается трасса
origin - результирующее положение эффекта взрыва.

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


Отправлено Chyvachok 11-07-2012 в 11:32:

CrazyRussian спасибо, попробую.


Отправлено Дядя Миша 11-07-2012 в 13:31:

вместо чють напиши 24.

__________________
My Projects: download page

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

Цитата:

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


Отправлено marikcool 11-07-2012 в 14:09:

нормуль)


Отправлено Lev 08-08-2012 в 08:03:

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


Отправлено HAWK0044 08-08-2012 в 08:11:

Lev
Идёшь в player.cpp находишь там

C++ Source Code:
void CBasePlayer::SelectItem(const char *pstr)

и в самом начале после
C++ Source Code:
if (!pstr)
  return;

вставляешь это
C++ Source Code:
1
if(m_pActiveItem)
2
{
3
  CBasePlayerWeapon *wpn = (CBasePlayerWeapon*)m_pActiveItem;
4
 
5
  if(wpn && wpn->m_fInReload)
6
    return;
7
 
8
}


потом ищешь
C++ Source Code:
void CBasePlayer::SelectLastItem(void)

там после
C++ Source Code:
1
if (!m_pLastItem)
2
{
3
  return;
4
}
5
 
6
if ( m_pActiveItem && !m_pActiveItem->CanHolster() )
7
{
8
  return;
9
}

вставляешь
C++ Source Code:
1
if(m_pActiveItem)
2
{
3
  CBasePlayerWeapon *wpn = (CBasePlayerWeapon*)m_pActiveItem;
4
 
5
  if(wpn && wpn->m_fInReload)
6
    return;
7
 
8
}


Отправлено Lev 08-08-2012 в 08:48:

Спасибо


Отправлено Lev 23-08-2012 в 08:10:

В атаке у любого ствола есть параметр отвечающий за частоту вызова этой функции - например

C++ Source Code:
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;


Как сделать, чтобы при одном нажатии на мышь производился один выстрел - и новый можно было сделать только при повторном нажатии?


Отправлено PLut 23-08-2012 в 08:32:

Lev По форуму бы поискал...

В начало функции стрельбы.

C++ Source Code:
if(!(m_pPlayer->m_afButtonPressed & IN_ATTACK))
  return;


А промежуток между выстрелами сделай меньше, например было 0.1, сделай 0.01.

__________________
Base Defense on Steam, ModDB


Отправлено Lev 23-08-2012 в 08:36:

Если 0.01 - то можно как из автомата стрелять)


Отправлено qpAHToMAS 23-08-2012 в 08:40:

Он хочет пистолет как в CS, а не как Glock в HL, который при +attack стреляет пока не кончатся патроны (а в CS будет лишь 1 выстрел).


Отправлено Lev 23-08-2012 в 08:45:

Да не только - мне ещё нужно третью атаку сделать (в Параное уже две есть) - хочу переключать режим стрельбы. Кстати - где кнопку можно забиндить для этого?


Отправлено qpAHToMAS 23-08-2012 в 08:49:

Цитата:
Lev писал:
где кнопку можно забиндить для этого?

code:
bind "mouse3" "+attack3"

Иначе говоря, нажатие на колесико мыши.


Отправлено Lev 23-08-2012 в 09:13:

Да я проще хотел сделать - чтобы не писать полноценную третью атаку - создать переменную, забиндить на неё кнопку - если нажатать один раз то один режим огня, если ещё раз - то следующий


Отправлено KiQ 23-08-2012 в 09:30:

Lev на импульс сделай

__________________
-Brain is dead-


Отправлено Lev 23-08-2012 в 09:39:

Это как?

Добавлено 23-08-2012 в 15:39:

Вот к примеру переменная

int firemode


Отправлено KiQ 23-08-2012 в 09:47:

емнип, в player.cpp в свитче импульсных команд ставишь свое число (например, 555) и пишешь, допустим:

C++ Source Code:
firemode = (firemode == 0) ? 1 : 0;


потом биндишь на любую клавишу impulse 555

Добавлено 23-08-2012 в 13:47:

P.S. только не в Cheat Commands, иначе будет работать только с sv_cheats 1

__________________
-Brain is dead-


Отправлено Lev 23-08-2012 в 10:55:

Фигня какая-то - всё сделал, но клавиша не работает. Написал в конвиге

bind "b" "impulse 45" - бестолку, хотя если через консоль - то всё работает(sv_cheats 1 не ввожу - просто impulse 45)

Добавлено 23-08-2012 в 16:55:

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


Отправлено Lev 23-08-2012 в 15:04:

Так - с клавишей разобрался. Теперь хочу вывести сообщение на экран - из CBasePlayer::ImpulseCommands всё выводится нормально

C++ Source Code:
1
case 45:
2
  if ( firemode == 1 )
3
  {
4
    firemode = 0;
5
    UTIL_ShowMessage("#FIRE_MODE_SINGLE", this );
6
  }
7
else
8
{
9
  firemode = 1;
10
  UTIL_ShowMessage("#FIRE_MODE_AUTO", this );
11
}
12
break;
- но мне нужно делать это из каждого ствола отдельно. Написал функцию - но не работает
C++ Source Code:
1
extern int firemode;
2
 
3
void CAPS::Shotmode()
4
{
5
  if (firemode == 0)
6
    UTIL_ShowMessage("#FIRE_MODE_SINGLE", m_pPlayer );
7
 
8
  if (firemode == 1)
9
    UTIL_ShowMessage("#FIRE_MODE_AUTO", m_pPlayer );
10
}
- хотя если вызвать UTIL_ShowMessage из любой другой функции в классе оружия - то всё работает


Отправлено marikcool 23-08-2012 в 15:09:

сделай функцию смены огня в CBaseWeapon::Shotmode()
в импульсе вызывай CBasePlayerWeapon::Shotmode(), по типу
pPlayer->m_pActiveItem->Shotmode();


Отправлено Дядя Миша 23-08-2012 в 15:13:

А у тебе Shootmode откуда зовётся?

__________________
My Projects: download page

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

Цитата:

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


Отправлено Lev 23-08-2012 в 15:20:

Ты имеешь в виду void CAPS::Shotmode()? Неоткуда - я думал над этим - но я не знаю откуда её вызывать. Откуда нужно?


Отправлено Дядя Миша 23-08-2012 в 15:25:

Цитата:
Lev писал:
Неоткуда - я думал над этим - но я не знаю откуда её вызывать

Ну а как жы у тебя будет появляться миссага, если ты её ниоткуда не зовешь?

__________________
My Projects: download page

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

Цитата:

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


Отправлено PLut 23-08-2012 в 18:06:

qpAHToMAS Lev Я дал код, что бы было одно нажатие - один выстрел, что и попросили. В начало в функции выстрела его подсунуть и всё работает. И не будет никакого автомата-пулемета, пробовать надо сначала, а потом говорить.

__________________
Base Defense on Steam, ModDB


Отправлено Lev 23-08-2012 в 18:18:

Цитата:
PLut писал:
qpAHToMAS Lev Я дал код, что бы было одно нажатие - один выстрел, что и попросили. В начало в функции выстрела его подсунуть и всё работает. И не будет никакого автомата-пулемета, пробовать надо сначала, а потом говорить.


Ты меня не понял - я имел в виду что можно быстро жать на кнопку мыши и стрелять как из автомата))


Отправлено Lev 24-08-2012 в 16:53:

В общем патался я сделать, чтобы при смене режима высвечивалось сообщение - но только у того оружия которое имеет альтернативный режим. Значение переменной m_iEnableChangeFifeMode посылается из функции deploy каждого ствола - а ниже указанное сделано в импульных командах в player.cpp - но пока ничего не выходит. Если кто разбирается - подскажите как сделать?

C++ Source Code:
1
case 45:
2
 
3
if ( m_iEnableChangeFifeMode == 1 )
4
{
5
  if ( firemode == 1 )
6
  {
7
    firemode = 0;
8
    UTIL_ShowMessage("#FIRE_MODE_SINGLE", this );
9
  }
10
  else
11
  {
12
    firemode = 1;
13
    UTIL_ShowMessage("#FIRE_MODE_AUTO", this );
14
  }
15
}
16
 
17
if ( m_iEnableChangeFifeMode == 0 )
18
  UTIL_ShowMessage("#FIRE_MODE_NONE", this );
19
break;


Добавлено 24-08-2012 в 22:53:

Так - функцию я написал, всё работает. Теперь только нужно с m_iEnableChangeFifeMode разобраться - не знаю откуда лучше передавать переменную. Пробовал и из прекэша, и из итеминфо - но если в два разных ствола дописать extern int m_iEnableChangeFifeMode и потом прировнять переменную в одном оружии к 0, а во втором к 1 - то работает только одна из них, а вторая игнорируется


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

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