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 19-12-2007 в 17:31:
И снова анимации
парни здарова, у меня апять тупик ()сразу прошу прощения за великоватое сообщение() вот два отрывка кода:
C++(M4A1.cpp):
******************************************/
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "soundent.h"
#include "gamerules.h"
LINK_ENTITY_TO_CLASS( weapon_m4a1, Cm4a1 );
enum m4a1_e
{
m4a1_IDLE = 0,
m4a1_FIRE1,
m4a1_FIRE2,
m4a1_FIRE3, //shot unsil
m4a1_RELOAD,
m4a1_RELOAD1, //reload unsil
m4a1_DEPLOY,
m4a1_DEPLOY1, //draw unsil
m4a1_IDLE2, //add unsil
m4a1_IDLE3, //del unsil
m4a1_IDLE4, //idle unsil
};
void Cm4a1::Spawn( )
{
pev->classname = MAKE_STRING("weapon_m4a1");
Precache( );
SET_MODEL(ENT(pev), "models/weapons/primary/w_m4a1.mdl");
m_iAnimLevel = 0;
m_iId = 19;
m_iDefaultAmmo = 30;
FallInit();
}
void Cm4a1::Precache( void )
{
PRECACHE_MODEL("models/weapons/primary/v_m4a1.mdl");
PRECACHE_MODEL("models/weapons/primary/p_m4a1.mdl");
PRECACHE_MODEL("models/weapons/primary/w_m4a1.mdl");
PRECACHE_MODEL("models/weapons/ammo/w_ammo556.mdl");
m_iShell = PRECACHE_MODEL ("models/shell.mdl");
PRECACHE_SOUND ("weapons/m4a1-1.wav");
PRECACHE_SOUND ("weapons/m4a1-2.wav");
m_event = PRECACHE_EVENT( 1, "events/m4a1.sc" );
}
int Cm4a1::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "ammo_m4a1"; // The type of ammo it uses
p->iMaxAmmo1 = 90; // Max ammo the player can carry
p->pszAmmo2 = NULL; // No secondary ammo
p->iMaxAmmo2 = -1;
p->iMaxClip = 30; // The clip size
p->iSlot = 0; // The number in the HUD
p->iPosition = 3; // The position in a HUD slot
p->iFlags = 0;
p->iId = m_iId = 19; // The weapon id
p->iWeight = 15; // for autoswitching
return 1;
}
int Cm4a1::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
BOOL Cm4a1::Deploy( )
{
g_engfuncs.pfnSetClientMaxspeed(m_pPlayer->edict(), 210 );
if(m_iAnimLevel == 1)
return DefaultDeploy("models/weapons/primary/v_m4a1.mdl", "models/weapons/primary/p_m4a1.mdl",
m4a1_DEPLOY,"bow");
return DefaultDeploy("models/weapons/primary/v_m4a1.mdl", "models/weapons/primary/p_m4a1.mdl",
m4a1_DEPLOY1,"bow");
}
void Cm4a1::PrimaryAttack()
{
// don't fire if empty
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
{
if(m_iAnimLevel == 0)
{
SendWeaponAnim( m4a1_FIRE3);
}
if(m_iAnimLevel == 1)
{
SendWeaponAnim( m4a1_FIRE1);
}
}
}
// Weapon sound
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_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_m4a1, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed ));
m_pPlayer->random_seed, m_pPlayer->pev->punchangle.x -= 1.8;
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);
}
void Cm4a1::SecondaryAttack( void )
{
if(m_iAnimLevel == 0)
{
SendWeaponAnim( m4a1_IDLE2 );
m_iAnimLevel = 1;
}
else if(m_iAnimLevel == 1)
{
SendWeaponAnim( m4a1_IDLE3 );
m_iAnimLevel = 0;
}
m_flNextSecondaryAttack = 2.5;
m_flNextPrimaryAttack = 2.5;
}
void Cm4a1::Reload( void )
{
DefaultReload( 30, m4a1_RELOAD, 2.9 );
{
if(m_iAnimLevel == 0)
{
SendWeaponAnim( m4a1_RELOAD1);
}
if(m_iAnimLevel == 1)
{
SendWeaponAnim( m4a1_RELOAD);
}
}
}
void Cm4a1::WeaponIdle( void )
{
ResetEmptySound( );
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())
return;
SendWeaponAnim( m4a1_IDLE );
m_flTimeWeaponIdle = UTIL_SharedRandomFloat(m_pPlayer->random_seed, 10, 15);
{
if(m_iAnimLevel == 0)
{
SendWeaponAnim( m4a1_IDLE4 );
}
if(m_iAnimLevel == 1)
{
SendWeaponAnim( m4a1_IDLE );
}
}
}
//Ammo clip
class Cm4a1AmmoClip : public CBasePlayerAmmo
{
virtual void Spawn( void );
virtual void Precache( void );
virtual BOOL AddAmmo( CBaseEntity *pOther );
};
void Cm4a1AmmoClip::Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/weapons/ammo/w_ammo556.mdl");
CBasePlayerAmmo::Spawn( );
}
void Cm4a1AmmoClip::Precache( void )
{
PRECACHE_MODEL ("models/weapons/ammo/w_ammo556.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}
BOOL Cm4a1AmmoClip::AddAmmo( CBaseEntity *pOther )
{
int bResult = (pOther->GiveAmmo(30, "ammo_m4a1",90) != -1);
if (bResult)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
}
return bResult;
}
LINK_ENTITY_TO_CLASS( ammo_m4a1, Cm4a1AmmoClip );
*********************************************/
и
*********************************************/
C++(ev_hldm.cpp):
//======================
// m4a1 START
//======================
enum m4a1_e
{
m4a1_IDLE = 0,
m4a1_FIRE1,
m4a1_FIRE2,
m4a1_FIRE3, //shot unsil
m4a1_RELOAD,
m4a1_RELOAD1, //reload unsil
m4a1_DEPLOY,
m4a1_DEPLOY1, //draw unsil
m4a1_IDLE2, //add sil
m4a1_IDLE3, //del sil
m4a1_IDLE4, //idle unsil
};
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 ) )
{
EV_MuzzleFlash();
gEngfuncs.pEventAPI->EV_WeaponAnimation(m4a1_FIRE1 + gEngfuncs.pfnRandomLong(0,2), 2);
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:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/m4a1-1.wav",
1, ATTN_NORM, 0,
94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
break;
case 1:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/m4a1-2.wav",
1, ATTN_NORM, 0,
94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
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
//======================
как вы уже наерно догадались дело идёт о накручивании и скручивании глушака на Мке
и всё что с ним связано, а вот и вопрос всё работает но вот есть пара недачётов буду примного благодарен
за помощь в их решении:
1-как исправить стрельбу (немогу понять но походу надо на ev_hldm чёто написать но я незнаю что"ибо не кодер))"), чтобы после
снятия силенцера(впрочем если он и одет тож самое) при стрельбе он не появлялся и не ищезал(чтоб при одетом играли анимации-=-m4a1_FIRE1,m4a1_FIRE2
а при снятом м4а1_FIRE3.)
2-звук при одетом силенцере скажем (m4a1-1, m4a1-2) а при снятом (m4a1-3),
3-(ах да и музелфлаш чтоб не отображался спритес выстрела при одетом глушак)-не обязательно но всёже).
4-и вот ещё что, иногда происходят накладки анимации, начиная проигрывать анимацию снятия глушака(или одевания) тутже воспроизв-ся анимация IDLE.
но это не так страшно как первые два гала.
Пасиба за внимание))).
__________________
rt
Отправлено XaeroX 19-12-2007 в 18:01:
Эх... Ну тут проще написать тебе код, чем объяснять, что да как. Жаль, что у меня сейчас на это времени ну совсем нет... 
__________________
Отправлено rocksTaa 21-12-2007 в 10:41:
ну там же савсем немного написать то надо, мне пазарез надо исправит первые 2а бага , я это и сам почти сделал но както каряво а хочеццо то по людски))).плиззз хэлп!
Добавлено сегодня в 16:41:
ну неужели никто ничего подобного не делал?
__________________
rt
Отправлено ToMMuK 22-12-2007 в 11:09:
rocksTaa Жди пока я приеду домой... ))) и обьясню ))
__________________
Сайт латвийского мода
Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.
Отправлено Тренсфер 22-12-2007 в 19:57:
Я делал, и в своё время с этим 3 дня мучился. Насколько я понял глушак на стволе делается анимацией (как в контре), а не сменой бодей. Очень советую хотя бы милкшейпом превратить глушак в отдельную боди, а то запаришься каждый раз вести проверку переменной для выбора нужной анимации. Боди на пошке сменяется командой pev->body номер боди. Можешь посмотреть как это в питоне сделано. Однако есть тонкости:
1 указывать боди при каждом проигравании анимации пушки в качестве 2 параметра.
2 указывать боди из процудуры Deploy
3 Отсылать боди в эвенте который ты посылаешь при выстреле.
4 боди хоть и сохраняется в сейв, но восстанавливается на модели пушки после сохранения\загрузки не сразу, поэтому надо вызвать из прекиша ресурсов функцию idle или воспользоваться тутором Xash weapon system там это дело хорошо пролечили.
5 (сам шишку набил
) если ты решил не юзать Xash weapon system то на клиенте неизбежно возникнет глюк с разногласием значений переменных которыя хранят текущее состояние глушителя после сохранения\загрузки. Выход: установи условную компиляцию на код проверок состояния глушителя.
P.S. слишком мудрёно описал
- устал просто 
Добавлено 22-12-2007 в 22:57:
Не как руки не дойдут написать тутор про глушители -наверное пора от лени лечится 
__________________
Хотелось бы, чтобы не только хотелось...
Отправлено rocksTaa 23-12-2007 в 10:40:
мдю блин тут вся загвоздка на клиенте в ев_хлдм.срр, косяк токо при стрельбе, примерно так делал-
аним левель= 0
то играет анимация m4a1_Fire1
если аним левель= 1
то играет анимация m4a1_Fire2;
но просит задеклорировать переменную-m_iAnimLevel декларирую на ев_хлдм.н, в игре косяк с глушаком прапал,но вместо анимаций выстрела играет анимайия idle
__________________
rt
Отправлено Ku2zoff 23-12-2007 в 11:05:
rocksTaa не парься и сделай анимации и звуки стрельбы на сервере а в клиент не лазь.
Отправлено rocksTaa 23-12-2007 в 15:16:
Ku2zoff>> если не трогать клиент то анимации стрельбы не будет , или не так? коли не так то напиши что сделать?раз знаеш.
__________________
rt
Отправлено Тренсфер 23-12-2007 в 15:43:
Можно ибез клиента анимацию проиграть в праймару атак вставь SendWeaponAnim( m4a1_FIRE); перед m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
А на клиенте убери соответственный:
C++ Source Code:
gEngfuncs.pEventAPI->EV_WeaponAnimation(m4a1_FIRE1 + gEngfuncs.pfnRandomLong(0,2), 2); |
Добавлено 23-12-2007 в 18:43:
Примерно тоже самое и со звуками.__________________
Хотелось бы, чтобы не только хотелось...
Отправлено Ku2zoff 23-12-2007 в 16:51:
>>если не трогать клиент то анимации стрельбы не будет , или не так? коли не так то напиши что сделать?раз знаеш.
Вот отрывок кода из лазерного пистолета:
C++ Source Code:
1 | EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/railgun/fire1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 110 ); |
2 | m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; |
3 | SendWeaponAnim( RAIL_FIRE ); |
4 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
Ивэнты можно тогда вообще убрать.
Отправлено rocksTaa 24-12-2007 в 11:57:
Пасиб пацаны, прям низнаю чтоб без вас бы делал), и вот чтоб не создавать новую тему помогите плизз ещё с 1й идейкой-Zoom, с состряпал модельку оптическоо прицела(позаимствовал систему из firearms) вот и вопрос как сделать чтоб при секондарнай атаке эта модель сменяла пушку , но чтобы и FOV с срайтом прицела никуда не пропал?
__________________
rt
Отправлено Ku2zoff 24-12-2007 в 17:43:
rocksTaa меняй у игрока pev->viewmodel на модель прицела, а когда прицел отключается, возвращай нормальную, вот и всё. Как это делается - смотри weapons.cpp CBasePlayerWeapon::DefaultDeploy всё просто (-;
Отправлено rocksTaa 24-12-2007 в 18:53:
пасиб))
__________________
rt
Отправлено rocksTaa 25-12-2007 в 09:45:
Ku2zoff- а чё писать то? я нашол>>m_pPlayer->pev->weaponmodel = MAKE_STRING(szWeaponModel); меня интересует что писать после"=" пишу скажем - void Csig::SecondaryAttack()
{
if ( m_pPlayer->pev->fov != 0 )
{
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov
m_fInZoom = 0;
m_pPlayer->pev->weaponmodel = MAKE_STRING(v_sig);
}
else if ( m_pPlayer->pev->fov != 20 )
{
m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 20;
m_fInZoom = 1;
m_pPlayer->pev->weaponmodel = MAKE_STRING(scope_sig);
}
pev->nextthink = UTIL_WeaponTimeBase() + 0.1;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
}
он просит меня задеклорировать "scope_sig" и "v_sig" но это не поможет, мот чёт другое надо писать?
__________________
rt
Отправлено Ku2zoff 25-12-2007 в 10:51:
rocksTaa пишешь после = вот что:
m_pPlayer->pev->viewmodel = MAKE_STRING("models/scope_sig.mdl");
или другую нужную тебе модель. (модель не забудь прекешить)
Только не pev->weaponmodel а pev->viewmodel( pev->weaponmodel это модель от третьего лица в руках игрока, а pev->viewmodel это модель от первого лица)
Отправлено 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 обнуляй её.__________________
Хотелось бы, чтобы не только хотелось...
Отправлено rocksTaa 02-01-2008 в 15:18:
Ну чтож попробую может чё получитса).
__________________
rt
Отправлено rocksTaa 03-01-2008 в 10:29:
мда ничё хорошего ни получаеццо над всёрно ждать Кутузова, пока ток он может сказать что к чему.
__________________
rt
Отправлено Ku2zoff 03-01-2008 в 14:24:
rocksTaa ты работаешь с сдк 2.3? Если да, то скинь мне ev_hldm.cpp и cpp-шник нужной пушки.
Отправлено rocksTaa 03-01-2008 в 14:43:
ок!
__________________
rt
Отправлено Тренсфер 04-01-2008 в 12:50:
Ну всё понятно. Код пушки (m4a1.cpp) находится у тебя на сервере и на клиенте, верно ?
Как только ты стреляешь эвент который рисует выстрел и декаль посылается 2 раза! Один с сервера, один с клиента. Нас такой расклад не устраивает по этому в коде пушке на сервере меняем:
C++ Source Code:
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_event, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 ); |
на
C++ Source Code:
2 | #if defined( CLIENT_WEAPONS ) |
7 | PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_event, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 ); |
Этим мы устанавливаем возможности отправки эвента выстрела с клиента.
Компиль сервер.
Теперь открывай клиент-там посмотри в тот же (!!!) файл - если там flags в эвенте стоит значит всё ок, если нет сделай тоже самое. Компиль и клиент. Заменяй обе (!!!)дилки в своём моде на свеже скомпиленые.
В коде есть всякие левые глюки но они не влияют 
__________________
Хотелось бы, чтобы не только хотелось...
Отправлено rocksTaa 04-01-2008 в 14:32:
Агромне челавеческае Пасиб парни))))), всё заработало как часы!!!!,---,аж сам удивляюсь)):
***************************************
я вот тут давненько создавал тему про команды, ну тоесть тупо примитив Red and Blue и чтоб спавнились они на разных точках старта(плыйрстарт и дезматчстарт)(там менюха убогенькая какаянить при подключении высвечивалась типа выбор команды:
1Red
2Blue
, но чёт толком на неё не посматрели чтоли вобщем так никто и не поведал хоть о чём нибудь, вот и подумал может стоит спросить сдесь не подымая старой темы.
__________________
rt
Отправлено Ku2zoff 04-01-2008 в 21:54:
rocksTaa читай про создание VGUI менюшек здесь. Если хоть немного знаешь английский - проблем не будет.
http://articles.thewavelength.net/section/23/
Отправлено rocksTaa 05-01-2008 в 12:22:
Ku2zoff>>пасиб,"ммм... весьма интересный реурс, благо на английском а то немецкие и француские уже задалбали)))
__________________
rt
Отправлено Ku2zoff 05-01-2008 в 12:41:
>>а то немецкие и француские уже задалбали
это ещё ничего, я какой-то тутор на чешском находил... или на каком-то другом, вобщем пишут латиницей и очень созвучно со славянским...
Отправлено rocksTaa 06-01-2008 в 10:31:
ну хотя можно было и без VGUI обойтись ведь практически 99% играков в кс не пользуют вгу менюху))
Добавлено 05-01-2008 в 15:51:
я чёт вроде про команды найти ничё немогу,(или ижчу плохо)
Добавлено вчера в 16:31:
блин всётаки всё перерыл НЕТУ там ничё про команды Аблом аднака, я вот что хотел как научить ХЛ выкидывать пушку, хрен с ним даж этат галимый выпон бох, но тока с примари ганом?(и даж при смерти штоб тож тока примари).
__________________
rt
Отправлено Ku2zoff 06-01-2008 в 10:47:
rocksTaa сделай проверку, примари ган оружие или нет, если не примари, то делай возврат и нифига не выпадет:
C++ Source Code:
1 | //Это всего лишь пример :) |
3 | CBasePlayer::DropGun(void) |
5 | if(!primary) //boolean (0,1) |
Отправлено rocksTaa 06-01-2008 в 14:53:
не чёт с новой переменной парица не охота да и функция выбрасывания ствола уже в родном вельвевском коде ездь ток надо цуцуть подкорректировать.... вот как эт уже хз....
__________________
rt
Отправлено Ku2zoff 06-01-2008 в 15:12:
rocksTaa у тебя пушки уже разделены на примари и секондари? Если есть переменная(флаг) отвечающая, то тут и делать нечего, просто после проверки на класс пушки по этой переменной выбрасывание срабатывает тоько для примари.
Отправлено rocksTaa 07-01-2008 в 10:10:
ну вобщем неумею говорить по прогерски а скажу как оно ездь, у меня 7стволов расположены в 1м слоте, 2ствола во 2м, нож в 3м , и гранаты в 4м, вот и всё но у меня перестала работать стандартная халфавская функция выкидывания ствола drop, незнаю из за чего.
__________________
rt
Отправлено Ku2zoff 07-01-2008 в 10:15:
rocksTaa вот и проверяй по номеру слота:
C++ Source Code:
if(m_pCurrentWeapon->iSlot != 0)// слот примари |
этот кусочек кода вставить в функцию выброса оружия
Отправлено rocksTaa 10-01-2008 в 14:47:
так у меня созрел ещё вопрос-----а именно посмотрев на музлефлашы выстрелов а именно сам спритерс (muzzleflash1) например, захотелось сделать чёньть по грандиознее а вот что я состряпал скажем "muz_rif1.mdl" объёмную вспышку выстрела, с 0, 0, 0-маской разумеецо- вот теперь и суть как
1)-отключить родные муззлы чтоб спритерсы не играли.
2)И главное как заставить модель "muz_rif1.mdl" появляца на конце ствола каждый выстрел?
__________________
rt
Отправлено Тренсфер 10-01-2008 в 18:55:
Не хочу показаться пердельно кратким, но все кроется в модели. Декомпилируй v-модель (например v_9mmar.mdl) и открой qc-файл блокнотом там посматри на $attachment вот на его конце и вспышка и пули летят...
Потом посмори на анимацию выстрела: $sequence "shoot_1" "shoot_1" fps 10 { event 5001 0 "40" }
Видишь вызывается эвент. Теперь смотриш имя спрайта вспышки и ищешь его в с писке спрайтов (в тхт или коде -я не помню
наверно в текстовиках). Вот там -то и меняешь вспышку на свою.
__________________
Хотелось бы, чтобы не только хотелось...
Отправлено Ku2zoff 11-01-2008 в 04:38:
rocksTaa в Half-Life: Arrangement мазлфлэши как в хл2, судя по ролику. Там они реализуются через переделанный эвент - код слегка усложнён. Не знаю, можно ли сделать вспышку моделью, все варианты, что я знаю, это спрайты.
Отправлено rocksTaa 11-01-2008 в 09:23:
мда.........хотя..., а если так----сделать бодю к пушке с закреплённым на конце ствола муззлом("muz_rif1.mdl"), ну там несколько бодей разных для реальности, то собсно и вопрос что написать в коде пушки чтоб при выстреле менялась бодя скажем на 0.1сек. а потом возвращалась нормальная бодя?
__________________
rt
Отправлено Ku2zoff 12-01-2008 в 16:26:
rocksTaa многовато работы...
Отправлено Дядя Миша 12-01-2008 в 18:46:
rocksTaa Ku2zoff ну в первом квейке выстрел именно таким способом и был сделан.
Но спрайтовый огонь симпатичнее смотрится.
Кажись я в Xash делал кастомный эвент для вспышек.
Отправлено rocksTaa 13-01-2008 в 09:33:
А нельзя ли поподробнее? ну код тама например для смены бодей?
__________________
rt