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=5057)
Отправлено sas 15-11-2017 в 17:18:
Пара вопросов по оружию
Первое, сделал монтировку с замахом на манер ключа из опфора, т.е. зажимаешь лкм, затем отпускаешь, и фомка дает люлей.
Прикол в том, что при промахе игрок продолжает замахиваться, пока кого-нибудь(или что-нибудь) не стукнет. При попадании все вроде нормально, как задумано.
Код:
C++ Source Code:
1 | void CCrowbar::PrimaryAttack() |
6 | SendWeaponAnim( CROWBAR_ATTACK1 ); |
7 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; |
Айдл-функция, когда лкм отпускаешь:
C++ Source Code:
1 | void CCrowbar::WeaponIdle( void ) |
3 | if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) |
6 | if ( (SwingStart != 0) ) |
8 | //SetThink( &CCrowbar::SwingAgain ); |
9 | //pev->nextthink = gpGlobals->time + 1.0; |
12 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0; |
16 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); |
17 | SendWeaponAnim( CROWBAR_IDLE ); |
Функция Swing() валвовская, там я ничего, кроме таймингов не менял.
И объясните, пожалуйста, что делает SetThink. Что с ним, что без него разницы никакой(на первый взгляд).
Отправлено Ku2zoff 15-11-2017 в 18:33:
sas проверь клиентский эвент монитровки. Вполне возможно, что это из-за него. Анимации в модели не лупленные? Тоже вариант проблемы. А вообще бы хорошо весь код в студию, т.к. эти два отрывка ни о чём не говорят. m_flNextAttack чему равно? Ни в одной, ни в другой функции нет ограничения по времени перед новой атакой.
Отправлено sas 15-11-2017 в 20:08:
Ku2zoff, окей, задержка между атаками внизу
C++ Source Code:
1 | int CCrowbar::Swing( int fFirst ) |
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 |
11 | UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); |
14 | if ( tr.flFraction >= 1.0 ) |
16 | UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); |
17 | if ( tr.flFraction < 1.0 ) |
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) |
29 | PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, |
30 | 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, |
34 | if ( tr.flFraction >= 1.0 ) |
39 | m_flNextPrimaryAttack = GetNextAttackDelay(1.0); |
40 | //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.2; |
42 | // player "shoot" animation |
43 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
48 | switch( ((m_iSwing++) % 2) + 1 ) |
51 | SendWeaponAnim( CROWBAR_ATTACK1HIT ); break; |
53 | SendWeaponAnim( CROWBAR_ATTACK2HIT ); break; |
55 | SendWeaponAnim( CROWBAR_ATTACK3HIT ); break; |
58 | // player "shoot" animation |
59 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
65 | CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); |
69 | if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() ) |
71 | // first swing does full damage |
72 | pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB ); |
76 | // subsequent swings do half |
77 | pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB ); |
79 | ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); |
81 | // play thwack, smack, or dong sound |
87 | if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) |
89 | // play thwack or smack sound |
90 | switch( RANDOM_LONG(0,2) ) |
93 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break; |
95 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break; |
97 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break; |
99 | m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; |
100 | if ( !pEntity->IsAlive() ) |
109 | // play texture hit sound |
110 | // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line |
114 | float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); |
116 | if ( g_pGameRules->IsMultiplayer() ) |
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. |
124 | // also play crowbar strike |
125 | switch( RANDOM_LONG(0,1) ) |
128 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
131 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
135 | // delay the decal a bit |
139 | m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; |
141 | m_flNextPrimaryAttack = GetNextAttackDelay(1.0); |
142 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0; |
144 | SetThink( &CCrowbar::Smack ); |
145 | pev->nextthink = UTIL_WeaponTimeBase() + 1.0; |
С анимациями все в поряде, проблема в коде, где-то в айдле(а может и нет, черт знает), но я не догоняю.
Видос с этим
Нажимаю лкм в самом начале и самом конце, а дальше оно само.
Отправлено Chyvachok 15-11-2017 в 21:20:
sas лучше не куски кода, а как сказал Ku2zoff тупо весь код лома выложи, и судя по видео возможно дело таки в модели, у тебя анимация замахивания повторяется опять и опять, возможно у этой анимации стоит параметр loop, который зацикливает анимацию, (он нужен для анимаций вроде idle или зарядки гаусс пушки где анимация отыгрываться зациклено должна, а анимации вроде удара или перезарядки будут повторяться где не надо). Чтобы исправить это тебе надо декомпилировать модель, если у этой анимации есть loop то убрать его и заново скомпилировать.
Ну и код лома с ev_hldm.cpp на клиенте тоже надо проверить.
Отправлено sas 15-11-2017 в 22:11:
Chyvachok, crowbar.cpp
C++ Source Code:
1 | void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) |
5 | float *minmaxs[2] = {mins, maxs}; |
7 | Vector vecHullEnd = tr.vecEndPos; |
12 | vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); |
13 | UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); |
14 | if ( tmpTrace.flFraction < 1.0 ) |
20 | for ( i = 0; i < 2; i++ ) |
22 | for ( j = 0; j < 2; j++ ) |
24 | for ( k = 0; k < 2; k++ ) |
26 | vecEnd.x = vecHullEnd.x + minmaxs[i][0]; |
27 | vecEnd.y = vecHullEnd.y + minmaxs[j][1]; |
28 | vecEnd.z = vecHullEnd.z + minmaxs[k][2]; |
30 | UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); |
31 | if ( tmpTrace.flFraction < 1.0 ) |
33 | float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); |
34 | if ( thisDistance < distance ) |
37 | distance = thisDistance; |
46 | void CCrowbar::PrimaryAttack() |
48 | if ( SwingStart == 0 ) |
51 | ALERT(at_console, "swing! \n"); |
52 | SendWeaponAnim( CROWBAR_ATTACK1 ); |
54 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7; |
55 | /*SetThink( &CCrowbar::SwingAgain ); |
56 | pev->nextthink = gpGlobals->time + 0.1;*/ |
61 | void CCrowbar::Smack( ) |
63 | DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); |
67 | void CCrowbar::SwingAgain( void ) |
72 | void CCrowbar::WeaponIdle( void ) |
74 | if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) |
77 | if ( (SwingStart != 0) ) |
79 | //SetThink( &CCrowbar::SwingAgain ); |
80 | //pev->nextthink = gpGlobals->time + 1.0; |
83 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7; |
87 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); |
88 | SendWeaponAnim( CROWBAR_IDLE ); |
92 | int CCrowbar::Swing( int fFirst ) |
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 |
102 | UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); |
105 | if ( tr.flFraction >= 1.0 ) |
107 | UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); |
108 | if ( tr.flFraction < 1.0 ) |
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) |
120 | PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, |
121 | 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, |
125 | if ( tr.flFraction >= 1.0 ) |
130 | m_flNextPrimaryAttack = GetNextAttackDelay(0.5); |
131 | //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0; |
133 | // player "shoot" animation |
134 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
139 | switch( ((m_iSwing++) % 2) + 1 ) |
142 | SendWeaponAnim( CROWBAR_ATTACK1HIT ); break; |
144 | SendWeaponAnim( CROWBAR_ATTACK2HIT ); break; |
146 | SendWeaponAnim( CROWBAR_ATTACK3HIT ); break; |
149 | // player "shoot" animation |
150 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
156 | CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); |
160 | if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() ) |
162 | // first swing does full damage |
163 | pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB ); |
167 | // subsequent swings do half |
168 | pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB ); |
170 | ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); |
172 | // play thwack, smack, or dong sound |
174 | int fHitWorld = TRUE; |
178 | if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) |
180 | // play thwack or smack sound |
181 | switch( RANDOM_LONG(0,2) ) |
184 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break; |
186 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break; |
188 | EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break; |
190 | m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; |
191 | if ( !pEntity->IsAlive() ) |
200 | // play texture hit sound |
201 | // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line |
205 | float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); |
207 | if ( g_pGameRules->IsMultiplayer() ) |
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. |
215 | // also play crowbar strike |
216 | switch( RANDOM_LONG(0,1) ) |
219 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
222 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); |
226 | // delay the decal a bit |
230 | m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; |
232 | m_flNextPrimaryAttack = GetNextAttackDelay(0.5); |
233 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; |
235 | SetThink( &CCrowbar::Smack ); |
236 | pev->nextthink = UTIL_WeaponTimeBase() + 0.5; |
Вот эвент в хлдм.цпп, его я не трогал, только список анимаций обновил
C++ Source Code:
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 ) |
28 | VectorCopy( args->origin, origin ); |
31 | gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
33 | if ( EV_IsLocal( idx ) ) |
35 | gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK1MISS, 1 ); |
37 | switch( (g_iSwing++) % 3 ) |
40 | gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK1MISS, 1 ); break; |
42 | gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK2MISS, 1 ); break; |
44 | gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK3MISS, 1 ); break; |
А насчет анимаций я уверен, модель моя, в qc никаких лупов не добавлял.
Отправлено Ku2zoff 16-11-2017 в 02:40:
Хм. А в коде гранаты две переменных: одна для стадии броска (выдёргивание чеки и замах, а потом бросок), и одна для времени, потраченного на это. А у тебя только одна SwingStart. Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.
Отправлено Chyvachok 16-11-2017 в 09:16:
Цитата:
Ku2zoff писал:
Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.
Если нету я могу скинуть код опфоровского ключа из кода Raven City ну или HL Enhanced: https://github.com/SamVanheer/HLEnh...ntities/weapons
Отправлено Ku2zoff 16-11-2017 в 10:32:
Chyvachok этот код может помочь топикстартеру. Скорее всего он что-то упустил у себя.
Добавлено 16-11-2017 в 17:32:
И да, очень громоздко. У меня намного меньше строк. Если интересно, могу поделиться.
Отправлено sas 16-11-2017 в 13:51:
Chyvachok, добавил условие в айдле, как у тебя, и все исправилось.
C++ Source Code:
1 | if ( (SwingStart != 0) ) |
5 | //SetThink( &CCrowbar::SwingAgain ); |
6 | //pev->nextthink = gpGlobals->time + 1.0; |
7 | ALERT(at_console, "swinging! \n"); |
13 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); |
15 | ALERT(at_console, "end swinging! \n"); |
Спасибо, пацаны.
Ku2zoff, конечно интересно.
Отправлено Chyvachok 16-11-2017 в 14:57:
sas интересно анимации твои? Неплохо выглядят, кстати если все работает как надо ALERT-ы можешь закомментировать, если что оно только текст пишет в консоли, правда оно и не мешает особо тоже.
Ну и в плане кода оружия в общем если что-то не ясно очень полезны исходники ХЛВЕ, там есть чего подсмотреть.
Отправлено sas 16-11-2017 в 15:06:
Chyvachok, да анимашки мои.
Что за хлве, а то я не в теме. Это то, что ты выше кинул?
Отправлено Chyvachok 16-11-2017 в 15:51:
sas ХЛВЕ это мод авторства Ghoul [BB], он тоже кстати тут зарегистрирован, то я с другого совсем мода код скинул, ссылку на ХЛВЕ и код можно тут найти, только увы последняя версия глючная увы, вылетает: http://www.moddb.com/mods/half-life-weapon-edition
Отправлено sas 16-11-2017 в 19:27:
Chyvachok, а все понял, благодарю
Отправлено Ku2zoff 17-11-2017 в 11:38:
Цитата:
sas писал:
Ku2zoff, конечно интересно.
В аттаче код самого оружия, а в посте кусок из ev_hldm.cpp. Правда, нужно ещё кое-что переписать для красоты, но код вполне читаемый и понятный.
C++ Source Code:
1 | void EV_WrenchAttack(event_args_t *args) |
7 | VectorCopy(args->origin, origin); |
9 | int m_iHit = args->bparam1; |
10 | int m_iHitWorld = args->bparam2; |
11 | int m_iSecAttack = args->iparam2; |
15 | switch (gEngfuncs.pfnRandomLong(0, 1)) |
17 | case 0: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON, |
18 | "weapons/wrench_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
20 | case 1: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON, |
21 | "weapons/wrench_miss2.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
25 | else if (m_iSecAttack != 2) |
27 | gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON, |
28 | "weapons/wrench_miss_big.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
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); |
39 | switch (gEngfuncs.pfnRandomLong(0, 2)) |
42 | gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK1HIT : WRENCH_ATTACK1MISS, 0); break; |
44 | gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK2HIT : WRENCH_ATTACK2MISS, 0); break; |
46 | gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK3HIT : WRENCH_ATTACK3MISS, 0); break; |
53 | if (m_iHitWorld) // по брашу |
57 | switch (gEngfuncs.pfnRandomLong(0, 1)) |
59 | case 0: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
60 | "weapons/wrench_hitwall_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
62 | case 1: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
63 | "weapons/wrench_hitwall_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
69 | switch (gEngfuncs.pfnRandomLong(0, 1)) |
71 | case 0: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
72 | "weapons/wrench_hitwall1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
74 | case 1: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
75 | "weapons/wrench_hitwall2.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
84 | switch (gEngfuncs.pfnRandomLong(0, 1)) |
86 | case 0: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
87 | "weapons/wrench_hitbod_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
89 | case 1: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
90 | "weapons/wrench_hitbod_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
96 | switch (gEngfuncs.pfnRandomLong(0, 2)) |
98 | case 0: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
99 | "weapons/wrench_hitbod1.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
101 | case 1: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
102 | "weapons/wrench_hitbod2.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
104 | case 2: gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM, |
105 | "weapons/wrench_hitbod3.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
Добавлено 17-11-2017 в 18:36:
А, блин, хеадер забыл
C++ Source Code:
1 | class CWPNWrench : public CBasePlayerWeapon |
7 | int GetItemInfo(ItemInfo *p); |
8 | int AddToPlayer(CBasePlayer *pPlayer); |
11 | void Holster(int skiplocal = 0); |
13 | void PrimaryAttack(void); |
14 | void SecondaryAttack(void); |
15 | void Attack(bool fSecAttack); |
17 | void WeaponIdle(void); |
19 | virtual BOOL UseDecrement(void) |
21 | #if defined( CLIENT_WEAPONS ) |
28 | virtual float GetSpread(void) { return 0.05; }; |
31 | float m_flSwingRelease; |
33 | unsigned short m_usWrenchAttack; |
Добавлено 17-11-2017 в 18:38:
GetSpread - функция разброса пуль, в халфе её нет. В нестреляющих оружиях я использую затычки, чтобы был фиксированный размер прицела.
Отправлено sas 17-11-2017 в 12:31:
Ku2zoff, о спасибо, полезная вещь!
Вот еще вопрос вдогонку: допустим, я хочу сделать на фомке допатаку - удар кулаком. Как мне сделать задержку между нажатием на пкм и самим ударом, т.е. я нажимаю атаку, затем проигрывается анимация и только потом в ее конце происходит удар.