HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Затык с патронной лентом М249
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



Затык с патронной лентом М249

реально ламерский вопрос, но уже всю голову себе сломал над проблемой неправильного отображения патронов, оставшихся в ленте М249

В общем, суть такова:

При стрельбе одно кол-во патронов в ленте, а как только включается Idle анимация, там оно совсем другое (отличается на 1-2 штуки)
Причём, в Idle отображается РЕАЛЬНОЕ количество патронов в ленте.

В итоге, что я хочу сказать: в idlde всё правильно рисуется, в PrimaryAttack некорректно обновляется. И хоть волком вой...

C++ Source Code:
1
#include "extdll.h"
2
#include "util.h"
3
#include "cbase.h"
4
#include "monsters.h"
5
#include "weapons.h"
6
#include "nodes.h"
7
#include "player.h"
8
#include "soundent.h"
9
#include "gamerules.h"
10
 
11
class Cm249 : public CBasePlayerWeapon
12
{
13
public:
14
  void Spawn( void );
15
  void Precache( void );
16
  int GetItemInfo(ItemInfo *p);
17
 
18
  void PrimaryAttack( void );
19
  BOOL Deploy( void );
20
  void Reload( void );
21
  void Holster( void );
22
  void WeaponIdle( void );
23
 
24
  void BuyPrimaryAmmo( void );
25
  void SellWeapon( void );
26
};
27
 
28
void Cm249::BuyPrimaryAmmo( void )
29
{
30
  BuyAmmo(100, (char*)pszAmmo1(), COST_HEAVY_AMMO);
31
}
32
 
33
void Cm249::SellWeapon( void )
34
{
35
  m_pPlayer->m_flMoneyAmount += COST_M249/2;
36
}
37
 
38
enum m249_e
39
{
40
  M249_IDLE,
41
  M249_FIRE,
42
  M249_FIRE_SOLID,
43
  M249_START_RELOAD,
44
  M249_RELOAD,
45
  M249_DRAW,
46
  M249_HOLSTER
47
};
48
 
49
LINK_ENTITY_TO_CLASS( weapon_m249, Cm249 );
50
 
51
void Cm249::Spawn( )
52
{
53
  Precache( );
54
  SET_MODEL(ENT(pev), "models/p_m249.mdl");
55
  m_iId = WEAPON_M249;
56
  m_iDefaultAmmo = 200;
57
  pev->weapons = CLIP_M249;
58
  FallInit();
59
}
60
 
61
void Cm249::Precache( void )
62
{
63
  PRECACHE_MODEL("models/v_m249.mdl");
64
  PRECACHE_MODEL("models/p_m249.mdl");
65
  PRECACHE_SOUND ("weapons/m249_fire.wav");
66
}
67
 
68
int Cm249::GetItemInfo(ItemInfo *p)
69
{
70
  p->pszName = STRING(pev->classname);
71
  p->pszAmmo1 = "556Nato";
72
  p->iMaxAmmo1 = 999;
73
  p->pszAmmo2 = NULL;
74
  p->iMaxAmmo2 = -1;
75
  p->iMaxClip = 100;
76
  p->iSlot = 4;
77
  p->iPosition = 0;
78
  p->iFlags = ITEM_FLAG_SELECTONEMPTY;
79
  p->iId = WEAPON_M249;
80
  p->iWeight = M249_WEIGHT;
81
  p->iMaxspeed = M249_MAXSPEED;
82
  return 1;
83
}
84
 
85
BOOL Cm249::Deploy( )
86
{
87
  if(m_iClip < 11 && m_iClip)
88
    pev->body = m_iClip;
89
  else
90
    pev->body = 10;
91
 
92
  return DefaultDeploy( "models/v_m249.mdl", "models/p_m249.mdl", M249_DRAW, "saw", 0.9 );
93
}
94
 
95
void Cm249::Holster( )
96
{
97
  m_fInReload = FALSE;
98
  m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.7;
99
  SendWeaponAnim( M249_HOLSTER );
100
}
101
 
102
void Cm249::PrimaryAttack()
103
{
104
  if (m_pPlayer->pev->waterlevel == 3 || m_iClip <= 0)
105
  {
106
    PlayEmptySound( );
107
    m_flNextPrimaryAttack = gpGlobals->time + 0.5;
108
    return;
109
  }
110
 
111
  if (!m_pPlayer->m_fHeavyArmor)
112
  {
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;
117
  }
118
 
119
  m_iClip--;
120
  m_iFiredAmmo++;
121
 
122
  if(m_iClip < 11 && m_iClip)
123
    pev->body = m_iClip;
124
  else
125
    pev->body = 10;
126
 
127
  if ( gpGlobals->time >= m_flShockTime )
128
  {
129
    SendWeaponAnim( (m_pPlayer->m_fHeavyArmor)?M249_FIRE_SOLID:M249_FIRE );
130
    m_flShockTime = gpGlobals->time + 0.2;
131
  }
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 );
136
 
137
  m_flNextPrimaryAttack = gpGlobals->time  + 0.07;
138
  m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT (5,7);
139
  if (!m_pPlayer->m_fHeavyArmor)
140
  {
141
    m_pPlayer->pev->punchangle.x -= RANDOM_FLOAT(-1,1.7);
142
    m_pPlayer->pev->punchangle.y -= 0.4;
143
  }
144
}
145
 
146
void Cm249 :: Reload( void )
147
{
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;
152
}
153
 
154
void Cm249::WeaponIdle( void )
155
{
156
  if(m_iClip < 11 && m_iClip)
157
    pev->body = m_iClip;
158
  else
159
    pev->body = 10;
160
 
161
  if (m_fInSpecialReload)
162
  {
163
    SendWeaponAnim( M249_RELOAD );
164
    m_fInSpecialReload = 0;
165
  }
166
  if ( m_flTimeWeaponIdle > gpGlobals->time )
167
    return;
168
 
169
  SendWeaponAnim( M249_IDLE );
170
  m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT (8, 12);
171
}
172
 
173
 


Добавлено 14-05-2012 в 20:35:

Сама модель ( в сжатом, худшем качестве по текстурам, чтоб сюда влезла)

Вложение: v_m249.rar (229.5 кб)
Этот файл был скачан 187 раз.

Сообщить модератору | IP: Записан
Сообщение: 98176

Старое сообщение 14-05-2012 16:35
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1861

Рейтинг



Ghoul [BB] может это дело в анимации? Дело в том что в анимации стрельбы лента с патронами залазит в пулемет, тоесть третий патрон при выстреле станет вторым, а в IDLE третий патрон вернется на свое место, можно сделать анимацию стрельбы так чтобы лента дёргалась, но не заезжала в пулемет(типа заезжала) С анимацией врядли помогу - анимировать не умею.

Добавлено 14-05-2012 в 19:41:

Еще вот вопрос, а если у игрока закончится обойма, и он зарядит 2 патрона, на ленте все патроны будут или 2 патрона и на ленте будет? Дело в том что в ОП (Опозинг Форс) там при перезарядке задается боди всей обоймы даже если игрок зарядит всего 2 патрона.

Сообщить модератору | IP: Записан
Сообщение: 98178

Старое сообщение 14-05-2012 16:41
- За что?
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



так я тут код написал, что идёт проверка на кол-во заряжаемых патронов. Если игрок зарядит 2 патрона, то в ленте их будет 2.

if(m_iClip < 11 && m_iClip)
pev->body = m_iClip;
else
pev->body = 10;

Этот код работает.

В анимации - ну погляди модельку. Я не зря её прилепил.
Но, хочу сказать сразу, что лента не убирается анимацией. Она убирается боди-группами.

Сообщить модератору | IP: Записан
Сообщение: 98183

Старое сообщение 14-05-2012 19:30
- За что?
HAWK0044
Житель форума

Дата регистрации: Oct 2010
Проживает: Анапа
Сообщений: 563
Возраст: 28

Рейтинг



я думаю что мало сменить pev->body на сервере , обнови еще на клиенте.
Мессагой или еще чем-нибудь.

cl_entity_t *view = gEngfuncs.GetViewModel(); // вроде так
if(!view)
return;

view->curstate.body = my_body;

Сообщить модератору | IP: Записан
Сообщение: 98190

Старое сообщение 14-05-2012 20:20
- За что?
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



У меня всё оружие серверное. Боди на клиенте нету.
У меня стоит Ксаш Веапон Систем, поэтому вообще удивительно, что не работает правильно. (там мессага на клиент идёт с обновлением бодигрупп)

Сообщить модератору | IP: Записан
Сообщение: 98197

Старое сообщение 15-05-2012 10:57
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 22:56. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Затык с патронной лентом М249
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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