![]() |
Страницы (4): [1] 2 3 4 » Показать все 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)
И снова анимации
парни здарова, у меня апять тупик ()сразу прошу прощения за великоватое сообщение() вот два отрывка кода:
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
Эх... Ну тут проще написать тебе код, чем объяснять, что да как. Жаль, что у меня сейчас на это времени ну совсем нет...
__________________
ну там же савсем немного написать то надо, мне пазарез надо исправит первые 2а бага , я это и сам почти сделал но както каряво а хочеццо то по людски))).плиззз хэлп!
Добавлено сегодня в 16:41:
ну неужели никто ничего подобного не делал?
__________________
rt
rocksTaa Жди пока я приеду домой... ))) и обьясню ))
__________________
Сайт латвийского мода
Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.
Я делал, и в своё время с этим 3 дня мучился. Насколько я понял глушак на стволе делается анимацией (как в контре), а не сменой бодей. Очень советую хотя бы милкшейпом превратить глушак в отдельную боди, а то запаришься каждый раз вести проверку переменной для выбора нужной анимации. Боди на пошке сменяется командой pev->body номер боди. Можешь посмотреть как это в питоне сделано. Однако есть тонкости:
1 указывать боди при каждом проигравании анимации пушки в качестве 2 параметра.
2 указывать боди из процудуры Deploy
3 Отсылать боди в эвенте который ты посылаешь при выстреле.
4 боди хоть и сохраняется в сейв, но восстанавливается на модели пушки после сохранения\загрузки не сразу, поэтому надо вызвать из прекиша ресурсов функцию idle или воспользоваться тутором Xash weapon system там это дело хорошо пролечили.
5 (сам шишку набил ) если ты решил не юзать Xash weapon system то на клиенте неизбежно возникнет глюк с разногласием значений переменных которыя хранят текущее состояние глушителя после сохранения\загрузки. Выход: установи условную компиляцию на код проверок состояния глушителя.
P.S. слишком мудрёно описал - устал просто
Добавлено 22-12-2007 в 22:57:
Не как руки не дойдут написать тутор про глушители -наверное пора от лени лечится
__________________
Хотелось бы, чтобы не только хотелось...
мдю блин тут вся загвоздка на клиенте в ев_хлдм.срр, косяк токо при стрельбе, примерно так делал-
аним левель= 0
то играет анимация m4a1_Fire1
если аним левель= 1
то играет анимация m4a1_Fire2;
но просит задеклорировать переменную-m_iAnimLevel декларирую на ев_хлдм.н, в игре косяк с глушаком прапал,но вместо анимаций выстрела играет анимайия idle
__________________
rt
rocksTaa не парься и сделай анимации и звуки стрельбы на сервере а в клиент не лазь.
Ku2zoff>> если не трогать клиент то анимации стрельбы не будет , или не так? коли не так то напиши что сделать?раз знаеш.
__________________
rt
Можно ибез клиента анимацию проиграть в праймару атак вставь SendWeaponAnim( m4a1_FIRE); перед m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
А на клиенте убери соответственный:
gEngfuncs.pEventAPI->EV_WeaponAnimation(m4a1_FIRE1 + gEngfuncs.pfnRandomLong(0,2), 2); |
__________________
Хотелось бы, чтобы не только хотелось...
>>если не трогать клиент то анимации стрельбы не будет , или не так? коли не так то напиши что сделать?раз знаеш.
Вот отрывок кода из лазерного пистолета:
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 ); |
Пасиб пацаны, прям низнаю чтоб без вас бы делал), и вот чтоб не создавать новую тему помогите плизз ещё с 1й идейкой-Zoom, с состряпал модельку оптическоо прицела(позаимствовал систему из firearms) вот и вопрос как сделать чтоб при секондарнай атаке эта модель сменяла пушку , но чтобы и FOV с срайтом прицела никуда не пропал?
__________________
rt
rocksTaa меняй у игрока pev->viewmodel на модель прицела, а когда прицел отключается, возвращай нормальную, вот и всё. Как это делается - смотри weapons.cpp CBasePlayerWeapon::DefaultDeploy всё просто (-;
пасиб))
__________________
rt
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
rocksTaa пишешь после = вот что:
m_pPlayer->pev->viewmodel = MAKE_STRING("models/scope_sig.mdl");
или другую нужную тебе модель. (модель не забудь прекешить)
Только не pev->weaponmodel а pev->viewmodel( pev->weaponmodel это модель от третьего лица в руках игрока, а pev->viewmodel это модель от первого лица)
Временная зона GMT. Текущее время 15:56. | Страницы (4): [1] 2 3 4 » Показать все 52 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024