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=947)
Отправлено NorthWanderer 19-10-2007 в 16:05:
 Винчестер 
здрасте товариши кодеры вот пробовал я написать код винчестера, так вот код я написал все скомпелил вроде ошибок нет но при вводе кода give weapon_winch иногда игра вылитает, и при перезарядки анимация WINCH_PUMP не проигровается вчем дело может кто подскажет ниже сам код и вставки в другие файлы:
winch.cpp
C++ Source Code:
1  | #define VECTOR_CONE_DM_SHOTGUN	Vector( 0.08716, 0.04362, 0.00  )// 10 degrees by 5 degrees  | 
2  | #define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degree  | 
23  | LINK_ENTITY_TO_CLASS( weapon_winch, CWinch );  | 
29  |   SET_MODEL(ENT(pev), "models/w_winch.mdl");  | 
31  |   m_iDefaultAmmo = WINCH_DEFAULT_GIVE;  | 
33  |   FallInit();// get ready to fall  | 
37  | void CWinch::Precache( void )  | 
39  |   PRECACHE_MODEL("models/v_winch.mdl"); | 
40  |   PRECACHE_MODEL("models/w_winch.mdl"); | 
41  |   PRECACHE_MODEL("models/p_winch.mdl"); | 
43  |   m_iShell = PRECACHE_MODEL ("models/shell.mdl");// shotgun shell | 
45  |   PRECACHE_SOUND("items/9mmclip1.wav"); | 
47  |   PRECACHE_SOUND ("weapons/dbarrel1.wav");//shotgun | 
48  |   PRECACHE_SOUND ("weapons/sbarrel1.wav");//shotgun | 
50  |   PRECACHE_SOUND ("weapons/reload1.wav");	// shotgun reload | 
51  |   PRECACHE_SOUND ("weapons/reload3.wav");	// shotgun reload | 
53  |   //	PRECACHE_SOUND ("weapons/sshell1.wav");	// shotgun reload - played on client | 
54  |   //	PRECACHE_SOUND ("weapons/sshell3.wav");	// shotgun reload - played on client | 
56  |   PRECACHE_SOUND ("weapons/357_cock1.wav"); // gun empty sound | 
57  |   PRECACHE_SOUND ("weapons/scock1.wav");	// cock gun | 
59  |   m_usWinchFire = PRECACHE_EVENT( 1, "events/winch.sc" );  | 
62  | int CWinch::AddToPlayer( CBasePlayer *pPlayer )  | 
64  |   if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )  | 
66  |     MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );  | 
75  | int CWinch::GetItemInfo(ItemInfo *p)  | 
77  |   p->pszName = STRING(pev->classname);  | 
79  |   p->iMaxAmmo1 = _9MM_MAX_CARRY;  | 
82  |   p->iMaxClip = WINCH_MAX_CLIP;  | 
86  |   p->iId = m_iId = WEAPON_WINCH;  | 
87  |   p->iWeight = WINCH_WEIGHT;  | 
96  |   return DefaultDeploy( "models/v_winch.mdl", "models/p_winch.mdl", WINCH_DRAW, "winch" );  | 
99  | //void CWinch::PrimaryAttack()  | 
101  |   //	// don't fire underwater  | 
102  |   //	if (m_pPlayer->pev->waterlevel == 3)  | 
104  |     //		PlayEmptySound( );  | 
105  |     //		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;  | 
113  |       //			PlayEmptySound( );  | 
117  |       //	m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;  | 
118  |       //	m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;  | 
123  |       //#if defined( CLIENT_WEAPONS )  | 
124  |       //	flags = FEV_NOTHOST;  | 
130  |       //	m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;  | 
132  |       //	Vector vecSrc	 = m_pPlayer->GetGunPosition( );  | 
133  |       //	Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );  | 
138  |       //	if ( bIsMultiplayer() )  | 
140  |       //	if ( g_pGameRules->IsMultiplayer() )  | 
143  |         //		vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );  | 
147  |           //		// regular old, untouched spread.  | 
148  |           //		vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );  | 
151  |           //	PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usWinchFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );  | 
154  |           //	if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)  | 
155  |           //		// HEV suit - indicate out of ammo condition  | 
156  |           //		m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); | 
159  |           //		m_flPumpTime = gpGlobals->time + 0.5;  | 
161  |           //	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;  | 
162  |           //	m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;  | 
164  |           //		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;  | 
166  |           //		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75;  | 
167  |           //	m_fInSpecialReload = 0;  | 
170  |           void CWinch::PrimaryAttack()  | 
172  |             // don't fire underwater  | 
173  |             if (m_pPlayer->pev->waterlevel == 3)  | 
176  |               m_flNextPrimaryAttack = 0.15;  | 
186  |                 EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM);  | 
187  |                 m_flNextPrimaryAttack = 0.15;  | 
193  |             m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;  | 
194  |             m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;  | 
198  |             m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;  | 
200  |             // player "shoot" animation  | 
201  |             m_pPlayer->SetAnimation( PLAYER_ATTACK1 );  | 
204  |             UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );  | 
206  |             Vector vecSrc	 = m_pPlayer->GetGunPosition( );  | 
207  |             Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );  | 
210  |             vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );  | 
213  | #if defined( CLIENT_WEAPONS )  | 
219  |             PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usWinchFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );  | 
221  |             if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)  | 
222  |               // HEV suit - indicate out of ammo condition  | 
223  |             m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); | 
225  |             m_flNextPrimaryAttack = 0.75;  | 
226  |             m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );  | 
230  |           void CWinch::SecondaryAttack( void )  | 
236  |           void CWinch::Reload( void )  | 
238  |             if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == WINCH_MAX_CLIP)  | 
241  |             // don't reload until recoil is done  | 
242  |             if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase())  | 
245  |             // check to see if we're ready to reload  | 
246  |             if (m_fInSpecialReload == 0)  | 
248  |               SendWeaponAnim( WINCH_START_RELOAD );  | 
249  |               m_fInSpecialReload = 1;  | 
250  |               m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6;  | 
251  |               m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6;  | 
252  |               m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0;  | 
253  |               m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;  | 
256  |             else if (m_fInSpecialReload == 1)  | 
258  |               if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())  | 
260  |               // was waiting for gun to move to side  | 
261  |               m_fInSpecialReload = 2;  | 
263  |               if (RANDOM_LONG(0,1))  | 
264  |                 EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f));  | 
266  |                 EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f));  | 
268  |               SendWeaponAnim( WINCH_RELOAD );  | 
270  |               m_flNextReload = UTIL_WeaponTimeBase() + 0.5;  | 
271  |               m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;  | 
275  |               // Add them to the clip  | 
277  |               m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 1;  | 
278  |               m_fInSpecialReload = 1;  | 
283  |           void CWinch::WeaponIdle( void )  | 
287  |             m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );  | 
289  |             if ( m_flPumpTime && m_flPumpTime < gpGlobals->time )  | 
291  |               // play pumping sound  | 
292  |               EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));  | 
296  |             if (m_flTimeWeaponIdle <  UTIL_WeaponTimeBase() )  | 
298  |               if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])  | 
302  |               else if (m_fInSpecialReload != 0)  | 
304  |                 if (m_iClip != 8 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])  | 
310  |                   // reload debounce has timed out  | 
311  |                   SendWeaponAnim( WINCH_PUMP );  | 
313  |                   // play cocking sound  | 
314  |                   EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));  | 
315  |                   m_fInSpecialReload = 0;  | 
316  |                   m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;  | 
322  |                 float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );  | 
326  |                   m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (60.0/12.0);// * RANDOM_LONG(2, 5);  | 
328  |                 SendWeaponAnim( iAnim );  | 
335  |           class CWinchAmmoClip : public CBasePlayerAmmo  | 
340  |               SET_MODEL(ENT(pev), "models/w_9mmARclip.mdl");  | 
341  |               CBasePlayerAmmo::Spawn( );  | 
343  |             void Precache( void )  | 
345  |               PRECACHE_MODEL ("models/w_9mmARclip.mdl"); | 
346  |               PRECACHE_SOUND("items/9mmclip1.wav"); | 
348  |             BOOL AddAmmo( CBaseEntity *pOther )  | 
350  |               int bResult = (pOther->GiveAmmo( AMMO_WINCHCLIP_GIVE, "9mm", _9MM_MAX_CARRY) != -1);  | 
353  |                 EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);  | 
358  |           LINK_ENTITY_TO_CLASS( ammo_winchclip, CWinchAmmoClip );  | 
 
ниже класс в weapon.h
C++ Source Code:
1  | class CWinch : public CBasePlayerWeapon  | 
6  |   //	int		Save( CSave &save );  | 
7  |   //	int		Restore( CRestore &restore );  | 
8  |   //	static	TYPEDESCRIPTION m_SaveData[];  | 
13  |   void Precache( void );  | 
14  |   int iItemSlot( ) { return 3; } | 
15  |   int GetItemInfo(ItemInfo *p);  | 
16  |   int AddToPlayer( CBasePlayer *pPlayer );  | 
18  |   void PrimaryAttack( void );  | 
19  |   void SecondaryAttack( void );  | 
22  |   void WeaponIdle( void );  | 
27  |   virtual BOOL UseDecrement( void )  | 
29  | #if defined( CLIENT_WEAPONS )  | 
37  |   unsigned short m_usWinchFire;  | 
 
на клиенте ev_hldm.cpp
C++ Source Code:
1  | //======================  | 
3  | //======================  | 
4  | void EV_FireWinch( event_args_t *args )  | 
14  |   vec3_t vecSrc, vecAiming;  | 
16  |   vec3_t up, right, forward;  | 
17  |   float flSpread = 0.01;  | 
20  |   VectorCopy( args->origin, origin );  | 
21  |   VectorCopy( args->angles, angles );  | 
22  |   VectorCopy( args->velocity, velocity );  | 
24  |   AngleVectors( angles, forward, right, up );  | 
26  |   shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell | 
28  |   if ( EV_IsLocal( idx ) )  | 
30  |     // Add muzzle flash to current weapon model  | 
32  |     gEngfuncs.pEventAPI->EV_WeaponAnimation( WINCH_FIRE, 2 );  | 
34  |     V_PunchAxis( 0, -5.0 );  | 
37  |   EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 32, -12, 6 );  | 
39  |   EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHOTSHELL );  | 
41  |   gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/sbarrel1.wav", gEngfuncs.pfnRandomFloat(0.95, 1.0), ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0x1f ) );  | 
43  |   EV_GetGunPosition( args, vecSrc, origin );  | 
44  |   EV_HLDM_MuzzleFlash( vecSrc, 2.5 + gEngfuncs.pfnRandomFloat( -0.2, 0.2 ) );  | 
46  |   VectorCopy( forward, vecAiming );  | 
48  |   if ( gEngfuncs.GetMaxClients() > 1 )  | 
50  |     EV_HLDM_FireBullets( idx, forward, right, up, 4, vecSrc, vecAiming, 2048, BULLET_PLAYER_9MM, 0, &tracerCount[idx-1], 0.08716, 0.04362 );  | 
54  |     EV_HLDM_FireBullets( idx, forward, right, up, 6, vecSrc, vecAiming, 2048, BULLET_PLAYER_9MM, 0, &tracerCount[idx-1], 0.08716, 0.08716 );  | 
57  | //======================  | 
59  | //======================  | 
 
ну вроде все вписал где можно совершитть ошибку
Отправлено FiEctro 19-10-2007 в 16:16:
 
NorthWanderer его по моему еще в player.cpp 
Там что то типа GiveNamedItem( "weapon_winch" );
прописать нада ...
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено NorthWanderer 19-10-2007 в 16:32:
 
там я прописал.
у меня вылетает тоже после того как я ввожу impulse 101 
и give weapon_winch но не всегда вчем проблема не знаю
да и еше винчестер мажет это наверное осталось от дробовика
Отправлено ToMMuK 19-10-2007 в 16:51:
 
C++ Source Code:
#define VECTOR_CONE_DM_SHOTGUN    Vector( 0.08716, 0.04362, 0.00  )// 10 degrees by 5 degrees  | 
#define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degree  | 
 
Этим помойму задаётся точность 
__________________
Сайт латвийского мода
Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.
Отправлено NorthWanderer 19-10-2007 в 17:12:
 
а я то думал для чего эти строчки
Добавлено 19-10-2007 в 23:12:
хотя ствол не мажет мажет декаль которая ресуется на стине
Отправлено ToMMuK 19-10-2007 в 19:51:
 
Где-то в PrimaryAttack посмотри 
__________________
Сайт латвийского мода
Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.
Отправлено Тренсфер 20-10-2007 в 05:46:
 
А мне две последние цифры в EV_HLDM_FireBullets не нравятся.
Внутри EV_HLDM_FireBullets и рисуются декали.
Если делаешь что-то наподобие дробовика тебе прийдётся рандомизировать попадения пули в void EV_HLDM_FireBullets...
Добавлено 20-10-2007 в 09:46:
Да, последние два параметра в EV_HLDM_FireBullets означают "распостронение" по оси х и по оси у.
__________________
Хотелось бы, чтобы не только хотелось...