HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Пара вопросов по оружию
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Half-Life Пара вопросов по оружию

Первое, сделал монтировку с замахом на манер ключа из опфора, т.е. зажимаешь лкм, затем отпускаешь, и фомка дает люлей.
Прикол в том, что при промахе игрок продолжает замахиваться, пока кого-нибудь(или что-нибудь) не стукнет. При попадании все вроде нормально, как задумано.
Код:

C++ Source Code:
1
void CCrowbar::PrimaryAttack()
2
{
3
  if ( SwingStart == 0 )
4
  {
5
    SwingStart = 1;
6
    SendWeaponAnim( CROWBAR_ATTACK1 );
7
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
8
  }
9
}


Айдл-функция, когда лкм отпускаешь:
C++ Source Code:
1
void CCrowbar::WeaponIdle( void )
2
{
3
  if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
4
    return;
5
 
6
  if ( (SwingStart != 0) )
7
  {
8
    //SetThink( &CCrowbar::SwingAgain );
9
    //pev->nextthink = gpGlobals->time + 1.0;
10
    Swing( 0 );
11
    SwingStart = 0;
12
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
13
  }
14
  else
15
  {
16
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
17
    SendWeaponAnim( CROWBAR_IDLE );
18
  }
19
}

Функция Swing() валвовская, там я ничего, кроме таймингов не менял.
И объясните, пожалуйста, что делает SetThink. Что с ним, что без него разницы никакой(на первый взгляд).

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

Старое сообщение 15-11-2017 17:18
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6771
Возраст: 33

Рейтинг



sas проверь клиентский эвент монитровки. Вполне возможно, что это из-за него. Анимации в модели не лупленные? Тоже вариант проблемы. А вообще бы хорошо весь код в студию, т.к. эти два отрывка ни о чём не говорят. m_flNextAttack чему равно? Ни в одной, ни в другой функции нет ограничения по времени перед новой атакой.

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

Старое сообщение 15-11-2017 18:33
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Ku2zoff, окей, задержка между атаками внизу

C++ Source Code:
1
int CCrowbar::Swing( int fFirst )
2
{
3
  int fDidHit = FALSE;
4
 
5
  TraceResult tr;
6
 
7
  UTIL_MakeVectors (m_pPlayer->pev->v_angle);
8
  Vector vecSrc	= m_pPlayer->GetGunPosition( );
9
  Vector vecEnd	= vecSrc + gpGlobals->v_forward * 32 * 2;	// TL: crowbar hit distance
10
 
11
  UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
12
 
13
#ifndef CLIENT_DLL
14
  if ( tr.flFraction >= 1.0 )
15
  {
16
    UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr );
17
    if ( tr.flFraction < 1.0 )
18
    {
19
      // Calculate the point of intersection of the line (or hull) and the object we hit
20
      // This is and approximation of the "best" intersection
21
      CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit );
22
      if ( !pHit || pHit->IsBSPModel() )
23
        FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() );
24
      vecEnd = tr.vecEndPos;	// This is the point on the actual surface (the hull could have hit space)
25
    }
26
  }
27
#endif
28
 
29
  PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
30
  0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
31
  0.0, 0, 0.0 );
32
 
33
 
34
  if ( tr.flFraction >= 1.0 )
35
  {
36
    if (fFirst)
37
    {
38
      // miss
39
      m_flNextPrimaryAttack = GetNextAttackDelay(1.0);
40
      //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.2;
41
 
42
      // player "shoot" animation
43
      m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
44
    }
45
  }
46
  else
47
  {
48
    switch( ((m_iSwing++) % 2) + 1 )
49
    {
50
    case 0:
51
        SendWeaponAnim( CROWBAR_ATTACK1HIT ); break;
52
    case 1:
53
        SendWeaponAnim( CROWBAR_ATTACK2HIT ); break;
54
    case 2:
55
        SendWeaponAnim( CROWBAR_ATTACK3HIT ); break;
56
    }
57
 
58
    // player "shoot" animation
59
    m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
60
 
61
#ifndef CLIENT_DLL
62
 
63
    // hit
64
    fDidHit = TRUE;
65
    CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
66
 
67
    ClearMultiDamage( );
68
 
69
    if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
70
    {
71
      // first swing does full damage
72
      pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
73
    }
74
    else
75
    {
76
      // subsequent swings do half
77
      pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
78
    }
79
    ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
80
 
81
    // play thwack, smack, or dong sound
82
    float flVol = 1.0;
83
    int fHitWorld = TRUE;
84
 
85
    if (pEntity)
86
    {
87
      if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
88
      {
89
        // play thwack or smack sound
90
        switch( RANDOM_LONG(0,2) )
91
        {
92
        case 0:
93
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break;
94
        case 1:
95
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break;
96
        case 2:
97
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break;
98
        }
99
        m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME;
100
        if ( !pEntity->IsAlive() )
101
          return TRUE;
102
        else
103
          flVol = 0.1;
104
 
105
        fHitWorld = FALSE;
106
      }
107
    }
108
 
109
    // play texture hit sound
110
    // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line
111
 
112
    if (fHitWorld)
113
    {
114
      float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR);
115
 
116
      if ( g_pGameRules->IsMultiplayer() )
117
      {
118
        // override the volume here, cause we don't play texture sounds in multiplayer,
119
        // and fvolbar is going to be 0 from the above call.
120
 
121
        fvolbar = 1;
122
      }
123
 
124
      // also play crowbar strike
125
      switch( RANDOM_LONG(0,1) )
126
      {
127
      case 0:
128
          EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
129
        break;
130
      case 1:
131
          EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
132
        break;
133
      }
134
 
135
      // delay the decal a bit
136
      m_trHit = tr;
137
    }
138
 
139
    m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
140
#endif
141
    m_flNextPrimaryAttack = GetNextAttackDelay(1.0);
142
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
143
 
144
    SetThink( &CCrowbar::Smack );
145
    pev->nextthink = UTIL_WeaponTimeBase() + 1.0;
146
  }
147
  return fDidHit;
148
}

С анимациями все в поряде, проблема в коде, где-то в айдле(а может и нет, черт знает), но я не догоняю.
Видос с этим
Нажимаю лкм в самом начале и самом конце, а дальше оно само.

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

Старое сообщение 15-11-2017 20:08
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1856

Рейтинг



sas лучше не куски кода, а как сказал Ku2zoff тупо весь код лома выложи, и судя по видео возможно дело таки в модели, у тебя анимация замахивания повторяется опять и опять, возможно у этой анимации стоит параметр loop, который зацикливает анимацию, (он нужен для анимаций вроде idle или зарядки гаусс пушки где анимация отыгрываться зациклено должна, а анимации вроде удара или перезарядки будут повторяться где не надо). Чтобы исправить это тебе надо декомпилировать модель, если у этой анимации есть loop то убрать его и заново скомпилировать.

Ну и код лома с ev_hldm.cpp на клиенте тоже надо проверить.

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

Старое сообщение 15-11-2017 21:20
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Chyvachok, crowbar.cpp

C++ Source Code:
1
void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity )
2
{
3
  int			i, j, k;
4
  float		distance;
5
  float		*minmaxs[2] = {mins, maxs};
6
  TraceResult tmpTrace;
7
  Vector		vecHullEnd = tr.vecEndPos;
8
  Vector		vecEnd;
9
 
10
  distance = 1e6f;
11
 
12
  vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2);
13
  UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace );
14
  if ( tmpTrace.flFraction < 1.0 )
15
  {
16
    tr = tmpTrace;
17
    return;
18
  }
19
 
20
  for ( i = 0; i < 2; i++ )
21
  {
22
    for ( j = 0; j < 2; j++ )
23
    {
24
      for ( k = 0; k < 2; k++ )
25
      {
26
        vecEnd.x = vecHullEnd.x + minmaxs[i][0];
27
        vecEnd.y = vecHullEnd.y + minmaxs[j][1];
28
        vecEnd.z = vecHullEnd.z + minmaxs[k][2];
29
 
30
        UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace );
31
        if ( tmpTrace.flFraction < 1.0 )
32
        {
33
          float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length();
34
          if ( thisDistance < distance )
35
          {
36
            tr = tmpTrace;
37
            distance = thisDistance;
38
          }
39
        }
40
      }
41
    }
42
  }
43
}
44
 
45
 
46
void CCrowbar::PrimaryAttack()
47
{
48
  if ( SwingStart == 0 )
49
  {
50
    SwingStart = 1;
51
    ALERT(at_console, "swing! \n");
52
    SendWeaponAnim( CROWBAR_ATTACK1 );
53
 
54
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7;
55
    /*SetThink( &CCrowbar::SwingAgain );
56
    		pev->nextthink = gpGlobals->time + 0.1;*/
57
  }
58
}
59
 
60
 
61
void CCrowbar::Smack( )
62
{
63
  DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR );
64
}
65
 
66
 
67
void CCrowbar::SwingAgain( void )
68
{
69
  Swing( 0 );
70
}
71
 
72
void CCrowbar::WeaponIdle( void )
73
{
74
  if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
75
    return;
76
 
77
  if ( (SwingStart != 0) )
78
  {
79
    //SetThink( &CCrowbar::SwingAgain );
80
    //pev->nextthink = gpGlobals->time + 1.0;
81
    Swing( 0 );
82
    SwingStart = 0;
83
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7;
84
  }
85
  else
86
  {
87
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
88
    SendWeaponAnim( CROWBAR_IDLE );
89
  }
90
}
91
 
92
int CCrowbar::Swing( int fFirst )
93
{
94
  int fDidHit = FALSE;
95
 
96
  TraceResult tr;
97
 
98
  UTIL_MakeVectors (m_pPlayer->pev->v_angle);
99
  Vector vecSrc	= m_pPlayer->GetGunPosition( );
100
  Vector vecEnd	= vecSrc + gpGlobals->v_forward * 32 * 2;	// TL: crowbar hit distance
101
 
102
  UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
103
 
104
#ifndef CLIENT_DLL
105
  if ( tr.flFraction >= 1.0 )
106
  {
107
    UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr );
108
    if ( tr.flFraction < 1.0 )
109
    {
110
      // Calculate the point of intersection of the line (or hull) and the object we hit
111
      // This is and approximation of the "best" intersection
112
      CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit );
113
      if ( !pHit || pHit->IsBSPModel() )
114
        FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() );
115
      vecEnd = tr.vecEndPos;	// This is the point on the actual surface (the hull could have hit space)
116
    }
117
  }
118
#endif
119
 
120
  PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
121
  0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
122
  0.0, 0, 0.0 );
123
 
124
 
125
  if ( tr.flFraction >= 1.0 )
126
  {
127
    if (fFirst)
128
    {
129
      // miss
130
      m_flNextPrimaryAttack = GetNextAttackDelay(0.5);
131
      //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
132
 
133
      // player "shoot" animation
134
      m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
135
    }
136
  }
137
  else
138
  {
139
    switch( ((m_iSwing++) % 2) + 1 )
140
    {
141
    case 0:
142
        SendWeaponAnim( CROWBAR_ATTACK1HIT ); break;
143
    case 1:
144
        SendWeaponAnim( CROWBAR_ATTACK2HIT ); break;
145
    case 2:
146
        SendWeaponAnim( CROWBAR_ATTACK3HIT ); break;
147
    }
148
 
149
    // player "shoot" animation
150
    m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
151
 
152
#ifndef CLIENT_DLL
153
 
154
    // hit
155
    fDidHit = TRUE;
156
    CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
157
 
158
    ClearMultiDamage( );
159
 
160
    if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
161
    {
162
      // first swing does full damage
163
      pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
164
    }
165
    else
166
    {
167
      // subsequent swings do half
168
      pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
169
    }
170
    ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
171
 
172
    // play thwack, smack, or dong sound
173
    float flVol = 1.0;
174
    int fHitWorld = TRUE;
175
 
176
    if (pEntity)
177
    {
178
      if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
179
      {
180
        // play thwack or smack sound
181
        switch( RANDOM_LONG(0,2) )
182
        {
183
        case 0:
184
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break;
185
        case 1:
186
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break;
187
        case 2:
188
            EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break;
189
        }
190
        m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME;
191
        if ( !pEntity->IsAlive() )
192
          return TRUE;
193
        else
194
          flVol = 0.1;
195
 
196
        fHitWorld = FALSE;
197
      }
198
    }
199
 
200
    // play texture hit sound
201
    // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line
202
 
203
    if (fHitWorld)
204
    {
205
      float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR);
206
 
207
      if ( g_pGameRules->IsMultiplayer() )
208
      {
209
        // override the volume here, cause we don't play texture sounds in multiplayer,
210
        // and fvolbar is going to be 0 from the above call.
211
 
212
        fvolbar = 1;
213
      }
214
 
215
      // also play crowbar strike
216
      switch( RANDOM_LONG(0,1) )
217
      {
218
      case 0:
219
          EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
220
        break;
221
      case 1:
222
          EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
223
        break;
224
      }
225
 
226
      // delay the decal a bit
227
      m_trHit = tr;
228
    }
229
 
230
    m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
231
#endif
232
    m_flNextPrimaryAttack = GetNextAttackDelay(0.5);
233
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
234
 
235
    SetThink( &CCrowbar::Smack );
236
    pev->nextthink = UTIL_WeaponTimeBase() + 0.5;
237
  }
238
  return fDidHit;
239
}

Вот эвент в хлдм.цпп, его я не трогал, только список анимаций обновил
C++ Source Code:
1
enum crowbar_e {
2
  CROWBAR_IDLE = 0,
3
  CROWBAR_DRAW,
4
  //CROWBAR_HOLSTER,
5
  CROWBAR_ATTACK1,
6
  CROWBAR_ATTACK1MISS,
7
  CROWBAR_ATTACK1HIT,
8
  CROWBAR_ATTACK2,
9
  CROWBAR_ATTACK2MISS,
10
  CROWBAR_ATTACK2HIT,
11
  CROWBAR_ATTACK3,
12
  CROWBAR_ATTACK3MISS,
13
  CROWBAR_ATTACK3HIT
14
};
15
 
16
int g_iSwing;
17
 
18
//Only predict the miss sounds, hit sounds are still played
19
//server side, so players don't get the wrong idea.
20
void EV_Crowbar( event_args_t *args )
21
{
22
  int idx;
23
  vec3_t origin;
24
  vec3_t angles;
25
  vec3_t velocity;
26
 
27
  idx = args->entindex;
28
  VectorCopy( args->origin, origin );
29
 
30
  //Play Swing sound
31
  gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
32
 
33
  if ( EV_IsLocal( idx ) )
34
  {
35
    gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK1MISS, 1 );
36
 
37
    switch( (g_iSwing++) % 3 )
38
    {
39
    case 0:
40
        gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK1MISS, 1 ); break;
41
    case 1:
42
        gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK2MISS, 1 ); break;
43
    case 2:
44
        gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK3MISS, 1 ); break;
45
    }
46
  }
47
}

А насчет анимаций я уверен, модель моя, в qc никаких лупов не добавлял.

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

Старое сообщение 15-11-2017 22:11
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6771
Возраст: 33

Рейтинг



Хм. А в коде гранаты две переменных: одна для стадии броска (выдёргивание чеки и замах, а потом бросок), и одна для времени, потраченного на это. А у тебя только одна SwingStart. Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.

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

Старое сообщение 16-11-2017 02:40
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1856

Рейтинг



Цитата:
Ku2zoff писал:
Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.


Если нету я могу скинуть код опфоровского ключа из кода Raven City ну или HL Enhanced: https://github.com/SamVanheer/HLEnh...ntities/weapons

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

Старое сообщение 16-11-2017 09:16
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6771
Возраст: 33

Рейтинг



Chyvachok этот код может помочь топикстартеру. Скорее всего он что-то упустил у себя.

Добавлено 16-11-2017 в 17:32:

И да, очень громоздко. У меня намного меньше строк. Если интересно, могу поделиться.

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

Старое сообщение 16-11-2017 10:32
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Chyvachok, добавил условие в айдле, как у тебя, и все исправилось.

C++ Source Code:
1
if ( (SwingStart != 0) )
2
{
3
  if ( SwingStart == 1 )
4
  {
5
    //SetThink( &CCrowbar::SwingAgain );
6
    //pev->nextthink = gpGlobals->time + 1.0;
7
    ALERT(at_console, "swinging! \n");
8
    Swing( 0 );
9
    SwingStart = 2;
10
  }
11
  else
12
  {
13
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
14
    SwingStart = 0;
15
    ALERT(at_console, "end swinging! \n");
16
  }
17
}

Спасибо, пацаны.
Ku2zoff, конечно интересно.

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

Старое сообщение 16-11-2017 13:51
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1856

Рейтинг



sas интересно анимации твои? Неплохо выглядят, кстати если все работает как надо ALERT-ы можешь закомментировать, если что оно только текст пишет в консоли, правда оно и не мешает особо тоже.

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

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

Старое сообщение 16-11-2017 14:57
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Chyvachok, да анимашки мои.
Что за хлве, а то я не в теме. Это то, что ты выше кинул?

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

Старое сообщение 16-11-2017 15:06
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1856

Рейтинг



sas ХЛВЕ это мод авторства Ghoul [BB], он тоже кстати тут зарегистрирован, то я с другого совсем мода код скинул, ссылку на ХЛВЕ и код можно тут найти, только увы последняя версия глючная увы, вылетает: http://www.moddb.com/mods/half-life-weapon-edition

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

Старое сообщение 16-11-2017 15:51
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Chyvachok, а все понял, благодарю

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

Старое сообщение 16-11-2017 19:27
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6771
Возраст: 33

Рейтинг



Цитата:
sas писал:
Ku2zoff, конечно интересно.

В аттаче код самого оружия, а в посте кусок из ev_hldm.cpp. Правда, нужно ещё кое-что переписать для красоты, но код вполне читаемый и понятный.
C++ Source Code:
1
void EV_WrenchAttack(event_args_t *args)
2
{
3
  int idx;
4
  vec3_t origin;
5
 
6
  idx = args->entindex;
7
  VectorCopy(args->origin, origin);
8
 
9
  int m_iHit = args->bparam1;
10
  int m_iHitWorld = args->bparam2;
11
  int m_iSecAttack = args->iparam2;
12
 
13
  if (!m_iSecAttack)
14
  {
15
    switch (gEngfuncs.pfnRandomLong(0, 1))
16
    {
17
      case 0:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
18
        "weapons/wrench_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
19
      break;
20
      case 1:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
21
        "weapons/wrench_miss2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
22
      break;
23
    }
24
  }
25
  else if (m_iSecAttack != 2)
26
  {
27
    gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
28
    "weapons/wrench_miss_big.wav", 1, ATTN_NORM, 0, PITCH_NORM);
29
  }
30
 
31
  if (EV_IsLocal(idx))
32
  {
33
    if (m_iSecAttack == 1)
34
      gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_HIT : WRENCH_MISS, 0);
35
    else if (m_iSecAttack == 2)
36
      gEngfuncs.pEventAPI->EV_WeaponAnimation(WRENCH_CHARGE, 0);
37
    else
38
    {
39
      switch (gEngfuncs.pfnRandomLong(0, 2))
40
      {
41
      case 0:
42
          gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK1HIT : WRENCH_ATTACK1MISS, 0); break;
43
      case 1:
44
          gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK2HIT : WRENCH_ATTACK2MISS, 0); break;
45
      case 2:
46
          gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK3HIT : WRENCH_ATTACK3MISS, 0); break;
47
      }
48
    }
49
  }
50
 
51
  if (m_iHit) // удар
52
  {
53
    if (m_iHitWorld) // по брашу
54
    {
55
      if (m_iSecAttack)
56
      {
57
        switch (gEngfuncs.pfnRandomLong(0, 1))
58
        {
59
          case 0:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
60
            "weapons/wrench_hitwall_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
61
          break;
62
          case 1:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
63
            "weapons/wrench_hitwall_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
64
          break;
65
        }
66
      }
67
      else
68
      {
69
        switch (gEngfuncs.pfnRandomLong(0, 1))
70
        {
71
          case 0:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
72
            "weapons/wrench_hitwall1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
73
          break;
74
          case 1:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
75
            "weapons/wrench_hitwall2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
76
          break;
77
        }
78
      }
79
    }
80
    else // по мясу
81
    {
82
      if (m_iSecAttack)
83
      {
84
        switch (gEngfuncs.pfnRandomLong(0, 1))
85
        {
86
          case 0:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
87
            "weapons/wrench_hitbod_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
88
          break;
89
          case 1:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
90
            "weapons/wrench_hitbod_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
91
          break;
92
        }
93
      }
94
      else
95
      {
96
        switch (gEngfuncs.pfnRandomLong(0, 2))
97
        {
98
          case 0:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
99
            "weapons/wrench_hitbod1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
100
          break;
101
          case 1:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
102
            "weapons/wrench_hitbod2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
103
          break;
104
          case 2:	gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
105
            "weapons/wrench_hitbod3.wav", 1, ATTN_NORM, 0, PITCH_NORM);
106
          break;
107
        }
108
      }
109
    }
110
  }
111
}


Добавлено 17-11-2017 в 18:36:

А, блин, хеадер забыл
C++ Source Code:
1
class CWPNWrench : public CBasePlayerWeapon
2
{
3
public:
4
  void Spawn(void);
5
  void Precache(void);
6
 
7
  int GetItemInfo(ItemInfo *p);
8
  int AddToPlayer(CBasePlayer *pPlayer);
9
 
10
  BOOL Deploy(void);
11
  void Holster(int skiplocal = 0);
12
 
13
  void PrimaryAttack(void);
14
  void SecondaryAttack(void);
15
  void Attack(bool fSecAttack);
16
 
17
  void WeaponIdle(void);
18
 
19
  virtual BOOL UseDecrement(void)
20
  {
21
#if defined( CLIENT_WEAPONS )
22
    return TRUE;
23
#else
24
    return FALSE;
25
#endif
26
  }
27
 
28
  virtual float GetSpread(void) { return 0.05; };
29
private:
30
  float m_flSwingTime;
31
  float m_flSwingRelease;
32
 
33
  unsigned short m_usWrenchAttack;
34
};


Добавлено 17-11-2017 в 18:38:

GetSpread - функция разброса пуль, в халфе её нет. В нестреляющих оружиях я использую затычки, чтобы был фиксированный размер прицела.

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

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

Старое сообщение 17-11-2017 11:38
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 15

Рейтинг



Ku2zoff, о спасибо, полезная вещь!
Вот еще вопрос вдогонку: допустим, я хочу сделать на фомке допатаку - удар кулаком. Как мне сделать задержку между нажатием на пкм и самим ударом, т.е. я нажимаю атаку, затем проигрывается анимация и только потом в ее конце происходит удар.

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

Старое сообщение 17-11-2017 12:31
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 00:06. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Пара вопросов по оружию
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

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

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

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

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