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

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:

Эх... Ну тут проще написать тебе код, чем объяснять, что да как. Жаль, что у меня сейчас на это времени ну совсем нет...

__________________

xaerox on Vivino


Отправлено 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:
1
Vector accuracy;
2
 
3
float speed = m_pPlayer->pev->velocity.Length();
4
 
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 );
14
 
15
if ( m_pPlayer->pev->flags & FL_DUCKING )	// crouching
16
{
17
  accuracy = accuracy/2;//It`s really works!
18
}
19
else if(!(FBitSet(m_pPlayer->pev->flags, FL_ONGROUND)) //player is in air
20
{
21
  accuracy = accuracy*2;
22
}
23
else
24
{
25
  accuracy = accuracy;
26
}
27
 
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:
1
if(m_iAnimLevel == 0)
2
{
3
  accuracy = accuracy;//без глушака - бьёт метко
4
}
5
if(m_iAnimLevel == 1)
6
{
7
  accuracy = accuracy*0.2;//с глушаком чуть-чуть косее
8
}


А свой 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]
2
m_pPlayer->random_seed;
3
 
4
if(m_iAnimLevel == 0)
5
{
6
  accuracy = accuracy;
7
}
8
if(m_iAnimLevel == 1)
9
{
10
  accuracy = accuracy*0.2;
11
}


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()
2
{
3
  if ( m_iClip && m_pPlayer->pev->waterlevel != 3)//don't fire underwater
4
  {
5
 
6
    m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
7
    m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;
8
 
9
    m_iClip--;
10
 
11
    // player "shoot" animation
12
    m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
13
 
14
    UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
15
 
16
    Vector vecSrc	 = m_pPlayer->GetGunPosition( );
17
    Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
18
 
19
    Vector vecDir;
20
 
21
    Vector accuracy;
22
 
23
    float speed = m_pPlayer->pev->velocity.Length();
24
 
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 );
34
 
35
    if ( m_pPlayer->pev->flags & FL_DUCKING )	// crouching
36
    {
37
      accuracy = accuracy/2;//It`s really works!
38
    }
39
    else
40
    {
41
      accuracy = accuracy;
42
    }
43
 
44
    vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, accuracy, 8192, BULLET_PLAYER_MGUN, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
45
 
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 );
47
 
48
    m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward * 45; //Step back, we have a high muzzle energy
49
 
50
    m_flNextPrimaryAttack = gpGlobals->time + 0.09;
51
    m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.46;
52
  }
53
  else
54
  {
55
    PlayEmptySound( 4 );
56
    m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
57
  }
58
}


Здесь игрока ещё и назад относит отдачей :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:
1
int flags;
2
#if defined( CLIENT_WEAPONS )
3
flags = FEV_NOTHOST;
4
#else
5
flags = 0;
6
#endif
7
 
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 ) )
2
{
3
case 0:
4
    break;
5
case 1:
6
    break;
7
}

Убери раз ничего не делает.
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:
1
int flags;
2
#if defined( CLIENT_WEAPONS )
3
flags = FEV_NOTHOST;
4
#else
5
flags = 0;
6
#endif
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
//Это всего лишь пример :)
2
 
3
CBasePlayer::DropGun(void)
4
{
5
  if(!primary) //boolean (0,1)
6
    return;
7
 


Отправлено 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)// слот примари
  return;


этот кусочек кода вставить в функцию выброса оружия


Отправлено 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


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

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