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=1067)
Отправлено rocksTaa 25-12-2007 в 11:17:
Благодарю)))
__________________
rt
Отправлено rocksTaa 25-12-2007 в 15:23:
Ku2zoff>> я сделал примари атакуу эМки скажем так:
************************
void Cm4a1::PrimaryAttack()
{
// don't fire if empty
if (m_iClip <= 0)
}
// one less round in the clip
m_iClip--;
// add a muzzle flash
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
// player "shoot" animation
{
if(m_iAnimLevel == 0)
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1-unsil.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 110 );
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
m_pPlayer->pev->punchangle.x -= 1.2;
SendWeaponAnim( m4a1_FIRE3 );
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
}
if(m_iAnimLevel == 1)
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1-1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 110 );
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
m_pPlayer->pev->punchangle.x -= 1.5;
SendWeaponAnim( m4a1_FIRE1 );
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
}
}
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc(m_pPlayer->GetGunPosition());
Vector vecAim(m_pPlayer->GetAutoaimVector(AUTOAIM_2DEGREES));
Vector vecAcc(VECTOR_CONE_2DEGREES);
Vector vecDir(m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAim, vecAcc, 8192,BULLET_PLAYER_m4a1, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed ));
m_pPlayer->random_seed;
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_event, 0.0,
(float *)&g_vecZero, (float *)&g_vecZero,
vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.085;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 1.085,2.085);
}
как сделать такие вот везчи я думаю ты 100 пудо взнаеш ну хотяб приблизительно));
1-SendWeaponAnim( m4a1_FIRE1 );-как поставить рандомно m4a1_FIRE1 или m4a1_FIRE2, а то ( m4a1_FIRE1, m4a1_FIRE1 )не катит.
/
2-пунч англ и сделал разным но хочецо и скажем
Vector vecAcc(VECTOR_CONE_2DEGREES);исправить для разных условий с глушаком и без, а то я пробовал но както не выходит ничего.
__________________
rt
Отправлено Ku2zoff 26-12-2007 в 07:16:
switch(RANDOM_LONG(0,1))
{
case 0:
SendWeaponAnim( m4a1_FIRE1 ); break;
case 1:
SendWeaponAnim( m4a1_FIRE2 ); break;
}
кейсов может быть дофига. Рандом лонг - значение от минимального до максимального номера кейса.
Вроде нигде не ошибся 
Отправлено rocksTaa 26-12-2007 в 09:35:
Пасиба а то я пробовал делать как на клиенте но неполучалось)), а по 2му вапросу нет никаких идей?
__________________
rt
Отправлено Ku2zoff 26-12-2007 в 12:52:
Vector vecAcc; //Просто обозначим
if(m_iAnimLevel == 0)
{
vecAcc = Vector(VECTOR_CONE_2DEGREES); //зададим значение
}
if(m_iAnimLevel == 1)
{
vecAcc = Vector(VECTOR_CONE_4DEGREES); //зададим значение
}
и вот ещё таблица точности(я это так назвал) - для пулемёта, например, т.к. разброс большой. В ней учитывается разброс пуль в зависимости от скорости игрока и его положения(сидит, стоит и т.п.)
C++ Source Code:
3 | float speed = m_pPlayer->pev->velocity.Length(); |
5 | //This is my accuracy table |
6 | if(speed >= 400) accuracy = Vector( 0.18, 0.18, 0.18 ); |
7 | if(speed >= 300 && speed < 400) accuracy = Vector( 0.16, 0.16, 0.16 ); |
8 | if(speed >= 200 && speed < 300) accuracy = Vector( 0.14, 0.14, 0.14 ); |
9 | if(speed >= 150 && speed < 200) accuracy = Vector( 0.12, 0.12, 0.12 ); |
10 | if(speed >= 100 && speed < 150) accuracy = Vector( 0.10, 0.10, 0.10 ); |
11 | if(speed >= 50 && speed < 100) accuracy = Vector( 0.08, 0.08, 0.08 ); |
12 | if(speed >= 0 && speed < 50) accuracy = Vector( 0.06, 0.06, 0.06 ); |
13 | else accuracy = Vector( 0.2, 0.2, 0.2 ); |
15 | if ( m_pPlayer->pev->flags & FL_DUCKING ) // crouching |
17 | accuracy = accuracy/2;//It`s really works! |
19 | else if(!(FBitSet(m_pPlayer->pev->flags, FL_ONGROUND)) //player is in air |
21 | accuracy = accuracy*2; |
28 | vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, accuracy, 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); |
Vector( 0.18, 0.18, 0.18 );
значения отклонения у каждой пушки могут быть свои. Значение speed лучше не менять. Чем больше цифры, тем больше разброс(зависит от свойств пушки).
Отправлено rocksTaa 26-12-2007 в 17:58:
НУ БЛИН КРУТА!!!! Пасиб бальшое)))
Добавлено 26-12-2007 в 20:58:
Ku2zoff>> слухай мот я чё нитак делаю но у меня ничег о не изменяется после добавления выше указанных строк всё компица и cl, и mp, но не робит и всё тут может гдето нужно указать чтонибудь ежо?
__________________
rt
Отправлено Ku2zoff 27-12-2007 в 01:54:
rocksTaa что именно не работает?
Добавлено 27-12-2007 в 07:54:
Может у тебя FireBulletsPlayer вызывается несколько раз(с одной и с другой меткостью)? Или вектор меткости определён несколько раз совершенно по-разному?
Совет: вставляешь "таблицу" меткости, уменьшаешь немного значения отклонений(процентов на 15) и дописываешь условие:
C++ Source Code:
3 | accuracy = accuracy;//без глушака - бьёт метко |
7 | accuracy = accuracy*0.2;//с глушаком чуть-чуть косее |
А свой vecAcc убираешь из кода.
Отправлено rocksTaa 27-12-2007 в 09:07:
Ku2zoff>>сделал вот так вот но нифиг всерно одинаково;
*********************
void Cm4a1::PrimaryAttack()
{
// don't fire if empty
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
}
// one less round in the clip
m_iClip--;
// add a muzzle flash
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
// player "shoot" animation
{
if(m_iAnimLevel == 0)
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1-unsil.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 110 );
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
m_pPlayer->pev->punchangle.x -= 1.2;
SendWeaponAnim( m4a1_FIRE3 );
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
}
if(m_iAnimLevel == 1)
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1-1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 110 );
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
m_pPlayer->pev->punchangle.x -= 1.5;
SendWeaponAnim( m4a1_FIRE1 );
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
}
}
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc(m_pPlayer->GetGunPosition());
Vector vecAim(m_pPlayer->GetAutoaimVector(AUTOAIM_2DEGREES));
Vector accuracy;
float speed = m_pPlayer->pev->velocity.Length();
//This is my accuracy table
if(speed >= 400) accuracy = Vector( 0.18, 0.18, 0.18 );
if(speed >= 300 && speed < 400) accuracy = Vector( 0.16, 0.16, 0.16 );
if(speed >= 200 && speed < 300) accuracy = Vector( 0.14, 0.14, 0.14 );
if(speed >= 150 && speed < 200) accuracy = Vector( 0.12, 0.12, 0.12 );
if(speed >= 100 && speed < 150) accuracy = Vector( 0.10, 0.10, 0.10 );
if(speed >= 50 && speed < 100) accuracy = Vector( 0.08, 0.08, 0.08 );
if(speed >= 0 && speed < 50) accuracy = Vector( 0.06, 0.06, 0.06 );
else accuracy = Vector( 0.2, 0.2, 0.2 );
if ( m_pPlayer->pev->flags & FL_DUCKING )// crouching
{
accuracy = accuracy/2;//It`s really works!
}
else if(!(FBitSet(m_pPlayer->pev->flags, FL_ONGROUND))) //player is in air
{
accuracy = accuracy*2;
}
else
{
accuracy = accuracy;
}
Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAim, accuracy, 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
m_pPlayer->random_seed;
if(m_iAnimLevel == 0)
{
accuracy = accuracy;
}
if(m_iAnimLevel == 1)
{
accuracy = accuracy*0.2;
}
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_event, 0.0,
(float *)&g_vecZero, (float *)&g_vecZero,
vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.085;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 1.085,2.085);
}
__________________
rt
Отправлено Ku2zoff 28-12-2007 в 07:28:
C++ Source Code:
1 | [color=red]Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAim, accuracy, 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );[/color] |
10 | accuracy = accuracy*0.2; |
rocksTaa вектор accuracy должен быть определён раньше вызова стрельбы, т.е. все строчки с accuracy = должны быть выше строчки Vector vecDir = m_pPlayer->FireBulletsPlayer
вроде из-за этого и не работет
Отправлено rocksTaa 29-12-2007 в 15:57:
Ku2zoff>>я ваще низнаю чё может быть переделал и так и этак нихочет и всё может в другом дело?
__________________
rt
Отправлено Ku2zoff 29-12-2007 в 16:05:
Код прмари аттак из пулемёта:
C++ Source Code:
1 | void CMGun::PrimaryAttack() |
3 | if ( m_iClip && m_pPlayer->pev->waterlevel != 3)//don't fire underwater |
6 | m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; |
7 | m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; |
11 | // player "shoot" animation |
12 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
14 | UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); |
16 | Vector vecSrc = m_pPlayer->GetGunPosition( ); |
17 | Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); |
23 | float speed = m_pPlayer->pev->velocity.Length(); |
25 | //This is my accuracy table |
26 | if(speed >= 400) accuracy = Vector( 0.18, 0.18, 0.18 ); |
27 | if(speed >= 300 && speed < 400) accuracy = Vector( 0.16, 0.16, 0.16 ); |
28 | if(speed >= 200 && speed < 300) accuracy = Vector( 0.14, 0.14, 0.14 ); |
29 | if(speed >= 150 && speed < 200) accuracy = Vector( 0.12, 0.12, 0.12 ); |
30 | if(speed >= 100 && speed < 150) accuracy = Vector( 0.10, 0.10, 0.10 ); |
31 | if(speed >= 50 && speed < 100) accuracy = Vector( 0.08, 0.08, 0.08 ); |
32 | if(speed >= 0 && speed < 50) accuracy = Vector( 0.06, 0.06, 0.06 ); |
33 | else accuracy = Vector( 0.2, 0.2, 0.2 ); |
35 | if ( m_pPlayer->pev->flags & FL_DUCKING ) // crouching |
37 | accuracy = accuracy/2;//It`s really works! |
44 | vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, accuracy, 8192, BULLET_PLAYER_MGUN, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); |
46 | PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usFireMachinegun, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, pev->body, 0, 0, 0 ); |
48 | m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward * 45; //Step back, we have a high muzzle energy |
50 | m_flNextPrimaryAttack = gpGlobals->time + 0.09; |
51 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.46; |
56 | m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1; |
Здесь игрока ещё и назад относит отдачей :grin:
Отправлено rocksTaa 01-01-2008 в 13:45:
пасиб попробую применить может получится.))
Добавлено вчера в 19:45:
Ku2zoff>> всё работает просто супер, но вот проблемка ездь и суть её заложена как я понял в строке,
******
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usFireMachinegun, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, pev->body, 0, 0, 0 );
********
у меня пушка стреляет и оставляет на стене 2 декаля , т.е по 2 патрона как сделать чтоб по нармальному шмаляла?
__________________
rt
Отправлено Тренсфер 02-01-2008 в 13:41:
А нука покажи код на клиенте
Вот там декали и накладываются.
Хотя можно тут поробовать заменить на :
C++ Source Code:
2 | #if defined( CLIENT_WEAPONS ) |
8 | PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireMachinegun, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, pev->body, 0, 0, 0 ); //Посылаем эвент на клиент |
Но врядли от флага эвента прок будет
Ещё глянь в vecDir = m_pPlayer->FireBulletsPlayer( 1/*количество пуль одновременно*/
Колиличество пуль верно указано.
Добавлено 02-01-2008 в 16:41:
Хоть убей-после нового года ни как не вспомню что флаг делает 
__________________
Хотелось бы, чтобы не только хотелось...
Отправлено rocksTaa 02-01-2008 в 14:42:
Тренсфер>> этат код не кактит разброс перестаёт работать а вот мой клиент:
************************
//======================
// m4a1 START
//======================
enum m4a1_e
{
m4a1_IDLE = 0,
m4a1_FIRE1,
m4a1_FIRE2,
m4a1_FIRE3,
m4a1_RELOAD,
m4a1_DEPLOY,
};
void EV_Firem4a1( event_args_t *args )
{
int idx;
vec3_t origin;
vec3_t angles;
vec3_t velocity;
vec3_t ShellVelocity;
vec3_t ShellOrigin;
int shell;
vec3_t vecSrc, vecAiming;
vec3_t up, right, forward;
float flSpread = 0.01;
idx = args->entindex;
VectorCopy( args->origin, origin );
VectorCopy( args->angles, angles );
VectorCopy( args->velocity, velocity );
AngleVectors( angles, forward, right, up );
if ( EV_IsLocal( idx ) )
{
V_PunchAxis( 0, gEngfuncs.pfnRandomFloat( -2, 2 ) );
}
shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");
EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 12, -10, 7 );
EV_EjectBrass(ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL);
switch( gEngfuncs.pfnRandomLong( 0, 1 ) )
{
case 0:
break;
case 1:
break;
}
EV_GetGunPosition( args, vecSrc, origin );
EV_HLDM_MuzzleFlash( vecSrc, 2.0 + gEngfuncs.pfnRandomFloat( -0.2, 0.2 ) );
VectorCopy( forward, vecAiming );
EV_HLDM_FireBullets( idx,
forward,
right,
up,
1,
vecSrc,
vecAiming,
8192,
BULLET_PLAYER_m4a1,
0,
0,
args->fparam1,
args->fparam2 );
}
//======================
// m4a1 END
//======================
Добавлено 02-01-2008 в 17:42:
АХ ДА ВОТ ЕЩЁ ЧТО:
я вот эдыкыю хрень придумал но надо бы её подмозговать, а вот собсно что я придумал вот отрывок кода
****************
void Cak47::PrimaryAttack()
{
// don't fire if empty
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
}
// Weapon sound
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
// one less round in the clip
m_iClip--;
// add a muzzle flash
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc(m_pPlayer->GetGunPosition());
Vector vecAim(m_pPlayer->GetAutoaimVector(AUTOAIM_2DEGREES));
Vector vecAcc(VECTOR_CONE_2DEGREES);
Vector vecDir(m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAim, vecAcc, 8192,BULLET_PLAYER_ak47, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed ));
m_pPlayer->random_seed;
switch(RANDOM_LONG(0,5))
{
case 0:
m_pPlayer->pev->punchangle.x = 1.2;
break;
case 1:
m_pPlayer->pev->punchangle.x -= 3.2;
break;
case 2:
m_pPlayer->pev->punchangle.y -= 2.7;
break;
case 3:
m_pPlayer->pev->punchangle.x -= 1.2;
break;
case 4:
m_pPlayer->pev->punchangle.y = 2.3;
break;
case 5:
m_pPlayer->pev->punchangle.x -= 2.4;
break;
}
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_event, 0.0,
(float *)&g_vecZero, (float *)&g_vecZero,
vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat(m_pPlayer->random_seed, 1.085,2.085);
}
***************************
а вот что надо я хочу чтобы эти условия:
switch(RANDOM_LONG(0,5))
{
case 0:
m_pPlayer->pev->punchangle.x = 1.2;
break;
case 1:
m_pPlayer->pev->punchangle.x -= 3.2;
break;
case 2:
m_pPlayer->pev->punchangle.y -= 2.7;
break;
case 3:
m_pPlayer->pev->punchangle.x -= 1.2;
break;
case 4:
m_pPlayer->pev->punchangle.y = 2.3;
break;
case 5:
m_pPlayer->pev->punchangle.x -= 2.4;
break;
}
начали работать только после скажем 2х или 3х выстрелов
можно ли это сделать?
__________________
rt
Отправлено Тренсфер 02-01-2008 в 15:06:
C++ Source Code:
1 | switch( gEngfuncs.pfnRandomLong( 0, 1 ) ) |
Убери раз ничего не делает.
C++ Source Code:
EV_HLDM_MuzzleFlash( vecSrc, 2.0 + gEngfuncs.pfnRandomFloat( -0.2, 0.2 ) ); |
Случайно не EV_MuzzleFlash(); ? Это так к слову
Попробуй поколдовать над последними четыремя параметрами в EV_HLDM_FireBullets примерно так.
C++ Source Code:
EV_HLDM_FireBullets( idx, forward, right, up, 1/*количество пуль вылетающих одновременно*/, vecSrc/*откуда вылетает пуля (позиция пушки)*/, vecAiming/*куда попадает пуля*/, 8192/*дальность*/, BULLET_PLAYER_m4a1/*тип пуль */, 2/*количество трассирующих пуль*/, &tracerCount[idx-1], args->fparam1, args->fparam2 ); |
Работать после трёх выстрелов... Это как ? Назови максимальное время между двумя очередями для расчёта.
Добавлено 02-01-2008 в 18:06:
Заведи переменную и при каждом выстреле увеличивай её на 1. Перед толчком делай проверку на (i>=3). Вфункции idle обнуляй её.__________________
Хотелось бы, чтобы не только хотелось...