HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Затык с патронной лентом М249 (https://hlfx.ru/forum/showthread.php?threadid=3410)
Отправлено Ghoul [BB] 14-05-2012 в 16:35:
Затык с патронной лентом М249
реально ламерский вопрос, но уже всю голову себе сломал над проблемой неправильного отображения патронов, оставшихся в ленте М249
В общем, суть такова:
При стрельбе одно кол-во патронов в ленте, а как только включается Idle анимация, там оно совсем другое (отличается на 1-2 штуки)
Причём, в Idle отображается РЕАЛЬНОЕ количество патронов в ленте.
В итоге, что я хочу сказать: в idlde всё правильно рисуется, в PrimaryAttack некорректно обновляется. И хоть волком вой...
C++ Source Code:
11 | class Cm249 : public CBasePlayerWeapon |
15 | void Precache( void ); |
16 | int GetItemInfo(ItemInfo *p); |
18 | void PrimaryAttack( void ); |
22 | void WeaponIdle( void ); |
24 | void BuyPrimaryAmmo( void ); |
25 | void SellWeapon( void ); |
28 | void Cm249::BuyPrimaryAmmo( void ) |
30 | BuyAmmo(100, (char*)pszAmmo1(), COST_HEAVY_AMMO); |
33 | void Cm249::SellWeapon( void ) |
35 | m_pPlayer->m_flMoneyAmount += COST_M249/2; |
49 | LINK_ENTITY_TO_CLASS( weapon_m249, Cm249 ); |
54 | SET_MODEL(ENT(pev), "models/p_m249.mdl"); |
57 | pev->weapons = CLIP_M249; |
61 | void Cm249::Precache( void ) |
63 | PRECACHE_MODEL("models/v_m249.mdl"); |
64 | PRECACHE_MODEL("models/p_m249.mdl"); |
65 | PRECACHE_SOUND ("weapons/m249_fire.wav"); |
68 | int Cm249::GetItemInfo(ItemInfo *p) |
70 | p->pszName = STRING(pev->classname); |
71 | p->pszAmmo1 = "556Nato"; |
78 | p->iFlags = ITEM_FLAG_SELECTONEMPTY; |
80 | p->iWeight = M249_WEIGHT; |
81 | p->iMaxspeed = M249_MAXSPEED; |
87 | if(m_iClip < 11 && m_iClip) |
92 | return DefaultDeploy( "models/v_m249.mdl", "models/p_m249.mdl", M249_DRAW, "saw", 0.9 ); |
98 | m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.7; |
99 | SendWeaponAnim( M249_HOLSTER ); |
102 | void Cm249::PrimaryAttack() |
104 | if (m_pPlayer->pev->waterlevel == 3 || m_iClip <= 0) |
107 | m_flNextPrimaryAttack = gpGlobals->time + 0.5; |
111 | if (!m_pPlayer->m_fHeavyArmor) |
113 | UTIL_MakeVectors (m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle); |
114 | float flZVel = m_pPlayer->pev->velocity.z; |
115 | m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward * 35; |
116 | m_pPlayer->pev->velocity.z = flZVel; |
122 | if(m_iClip < 11 && m_iClip) |
127 | if ( gpGlobals->time >= m_flShockTime ) |
129 | SendWeaponAnim( (m_pPlayer->m_fHeavyArmor)?M249_FIRE_SOLID:M249_FIRE ); |
130 | m_flShockTime = gpGlobals->time + 0.2; |
132 | m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
133 | UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle); |
134 | m_pPlayer->FireMagnumBullets(m_pPlayer->GetGunPosition(), gpGlobals->v_forward, (m_pPlayer->pev->flags & FL_DUCKING)?VECTOR_CONE_6DEGREES:VECTOR_CONE_7DEGREES, 16384, BULLET_556Nato, m_pPlayer->pev); |
135 | FX_FireGun( m_pPlayer->GetGunPosition(), m_pPlayer->pev->v_angle, m_pPlayer->entindex(), 200, 0, FIREGUN_M249 ); |
137 | m_flNextPrimaryAttack = gpGlobals->time + 0.07; |
138 | m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT (5,7); |
139 | if (!m_pPlayer->m_fHeavyArmor) |
141 | m_pPlayer->pev->punchangle.x -= RANDOM_FLOAT(-1,1.7); |
142 | m_pPlayer->pev->punchangle.y -= 0.4; |
146 | void Cm249 :: Reload( void ) |
148 | DefaultReload( 100, M249_START_RELOAD, 2.6, 2.0 ); |
149 | m_fInSpecialReload = 1; |
150 | m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6; |
151 | m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->time + 5.5; |
154 | void Cm249::WeaponIdle( void ) |
156 | if(m_iClip < 11 && m_iClip) |
161 | if (m_fInSpecialReload) |
163 | SendWeaponAnim( M249_RELOAD ); |
164 | m_fInSpecialReload = 0; |
166 | if ( m_flTimeWeaponIdle > gpGlobals->time ) |
169 | SendWeaponAnim( M249_IDLE ); |
170 | m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT (8, 12); |
Добавлено 14-05-2012 в 20:35:
Сама модель ( в сжатом, худшем качестве по текстурам, чтоб сюда влезла)
Отправлено Chyvachok 14-05-2012 в 16:41:
Ghoul [BB] может это дело в анимации? Дело в том что в анимации стрельбы лента с патронами залазит в пулемет, тоесть третий патрон при выстреле станет вторым, а в IDLE третий патрон вернется на свое место, можно сделать анимацию стрельбы так чтобы лента дёргалась, но не заезжала в пулемет(типа заезжала) С анимацией врядли помогу - анимировать не умею.
Добавлено 14-05-2012 в 19:41:
Еще вот вопрос, а если у игрока закончится обойма, и он зарядит 2 патрона, на ленте все патроны будут или 2 патрона и на ленте будет? Дело в том что в ОП (Опозинг Форс) там при перезарядке задается боди всей обоймы даже если игрок зарядит всего 2 патрона.
Отправлено Ghoul [BB] 14-05-2012 в 19:30:
так я тут код написал, что идёт проверка на кол-во заряжаемых патронов. Если игрок зарядит 2 патрона, то в ленте их будет 2.
if(m_iClip < 11 && m_iClip)
pev->body = m_iClip;
else
pev->body = 10;
Этот код работает.
В анимации - ну погляди модельку. Я не зря её прилепил.
Но, хочу сказать сразу, что лента не убирается анимацией. Она убирается боди-группами.
Отправлено HAWK0044 14-05-2012 в 20:20:
я думаю что мало сменить pev->body на сервере , обнови еще на клиенте.
Мессагой или еще чем-нибудь.
cl_entity_t *view = gEngfuncs.GetViewModel(); // вроде так
if(!view)
return;
view->curstate.body = my_body;
Отправлено Ghoul [BB] 15-05-2012 в 10:57:
У меня всё оружие серверное. Боди на клиенте нету.
У меня стоит Ксаш Веапон Систем, поэтому вообще удивительно, что не работает правильно. (там мессага на клиент идёт с обновлением бодигрупп)