Snipra
Teraz si spravíme snipru. Podobne
ako u AK47 si teraz skopírujeme p_awp.mdl, v_awp.mdl, w_awp.mdl,
weapon_awp.txt ale ten uložíme ako weapon_magnum.txt a zvuk awp1.wav
Otvoríme si hl.dsp a vytvoríme nový súbor do ktorý
uložíme ako magnum.cpp a do neho vložíme nasledujúci text:
#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"
enum MAGNUM_e
{
MAGNUM_IDLE1 = 0,
MAGNUM_1,
MAGNUM_FIRE1,
MAGNUM_FIRE2,
MAGNUM_RELOAD,
MAGNUM_DRAW,
};
class CMAGNUM : public
CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) {
return 3; }
int GetItemInfo(ItemInfo
*p);
int AddToPlayer( CBasePlayer
*pPlayer );
void PrimaryAttack( void
);
void SecondaryAttack(
void );
void Holster( int
skiplocal = 0 );
int SecondaryAmmoIndex(
void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flNextAnimTime;
int m_iShell;
int m_fInAttack;
float m_flStartCharge;
float
m_flPlayAftershock;
void StartFire( void );
void Fire( Vector
vecOrigSrc, Vector vecDirShooting, float flDamage );
float GetFullChargeTime(
void );
int m_fInZoom;
int m_iBalls;
int m_iGlow;
int m_iBeam;
int m_iSoundState; //
don't save this
BOOL m_fPrimaryFire;
float
m_flNextAmmoBurn;// while charging, when to absorb another unit of player's
ammo?
private:
BOOL m_iFiring;
unsigned short
m_usMAGNUM;
};
LINK_ENTITY_TO_CLASS( weapon_MAGNUM,
CMAGNUM );
int CMAGNUM::SecondaryAmmoIndex(
void )
{
return
m_iSecondaryAmmoType;
}
void CMAGNUM::Spawn( )
{
pev->classname =
MAKE_STRING("weapon_MAGNUM"); // hack to allow for old names
Precache( );
SET_MODEL(ENT(pev),
"models/w_awp.mdl");
m_iId = WEAPON_MAGNUM;
m_iDefaultAmmo =
10;//MAGNUM_DEFAULT_GIVE
FallInit();// get ready
to fall down.
}
void CMAGNUM::Precache( void )
{
PRECACHE_MODEL("models/v_awp.mdl");
PRECACHE_MODEL("models/w_awp.mdl");
PRECACHE_MODEL("models/p_awp.mdl");
// m_iShell =
PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL
PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND("items/clipinsert1.wav");
PRECACHE_SOUND("items/cliprelease1.wav");
PRECACHE_SOUND
("weapons/awp1.wav");// H to the K
PRECACHE_SOUND
("weapons/357_cock1.wav");
}
int CMAGNUM::GetItemInfo(ItemInfo
*p)
{
p->pszName =
STRING(pev->classname);
p->pszAmmo1 =
"338";
p->iMaxAmmo1 = 60;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = 10;
p->iSlot = 3;
p->iPosition = 0;
p->iFlags = 0;
p->iId = m_iId =
WEAPON_MAGNUM;
p->iWeight = 25;
return 1;
}
int CMAGNUM::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 CMAGNUM::Deploy( )
{
m_fInReload = FALSE;//
cancel any reload in progress.
if ( m_fInZoom )
{
SecondaryAttack(
);
}
return DefaultDeploy(
"models/v_awp.mdl", "models/p_awp.mdl", MAGNUM_DRAW,
"MAGNUM" );
}
void CMAGNUM::PrimaryAttack()
{
// don't fire underwater
if
(m_pPlayer->pev->waterlevel == 3)
{
PlayEmptySound(
);
m_flNextPrimaryAttack
= gpGlobals->time + 0.08;
return;
}
//Place holder to hold the number of
rounds to fire this attack
int iRoundsToFire;
//If firing, fire one round else
fire 3 rounds
if (m_iFiring)
iRoundsToFire =3;
else
iRoundsToFire =1;
// return DefaultDeploy(
"models/v_awp.mdl", "models/p_awp.mdl", MAGNUM_DRAW,
"MAGNUM" );
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack
= gpGlobals->time + 1.3;
return;
}
// player
"shoot" animation
m_pPlayer->SetAnimation(
PLAYER_ATTACK1 );
EMIT_SOUND(ENT(m_pPlayer->pev),
CHAN_WEAPON, "weapons/awp1.wav", 1.0, ATTN_NORM);
SendWeaponAnim(
MAGNUM_FIRE1 );
m_pPlayer->m_iWeaponVolume
= NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash
= NORMAL_GUN_FLASH;
m_iClip--;
Vector vecSrc =
m_pPlayer->GetGunPosition();
Vector vecAiming =
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
m_pPlayer->FireBullets
(1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 16000, BULLET_PLAYER_9MM, 0.5, 4);
Vector vecShellVelocity =
m_pPlayer->pev->velocity
+ gpGlobals->v_right *
RANDOM_FLOAT(50,70)
+ gpGlobals->v_up *
RANDOM_FLOAT(100,150)
+ gpGlobals->v_forward * 25;
EjectBrass ( pev->origin +
m_pPlayer->pev->view_ofs + gpGlobals->v_up * -12 +
gpGlobals->v_forward * 15 + gpGlobals->v_right * 6 , vecShellVelocity,
pev->angles.y, m_iShell, TE_BOUNCE_SHELL );
//m_pPlayer->SetSuitUpdate("!HEV_AMO0",
FALSE, 0);
m_pPlayer->pev->punchangle.x
-= 10;
if (
g_pGameRules->IsDeathmatch() )
{
// optimized
multiplayer. Widened to make it easier to hit a moving player8192
m_pPlayer->FireBullets(
1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 16000, BULLET_PLAYER_338, 3 );
}
else
{
// single
player spread
m_pPlayer->FireBullets(
1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 16000, BULLET_PLAYER_338, 3 );
}
if (!m_iClip &&
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
// HEV suit
- indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0",
FALSE, 0);
m_flNextPrimaryAttack =
m_flNextPrimaryAttack + 1.3;
if
(m_flNextPrimaryAttack < gpGlobals->time)
m_flNextPrimaryAttack
= gpGlobals->time + 1.3;
m_flTimeWeaponIdle =
gpGlobals->time + RANDOM_FLOAT ( 1, 1 );
}
void CMAGNUM::SecondaryAttack( void
)
{
if (m_fInZoom == 0)
{
m_pPlayer->pev->fov
= m_pPlayer->m_iFOV = 20;
m_fInZoom =
1;
}
else if (m_fInZoom == 1)
{
m_pPlayer->pev->fov
= m_pPlayer->m_iFOV = 0;
m_fInZoom =
0;
}
m_flNextSecondaryAttack
= gpGlobals->time + 0.8;
}
void CMAGNUM::Reload( void )
{
if ( m_fInZoom )
{
SecondaryAttack();
}
DefaultReload( 10,
MAGNUM_RELOAD, 3.0 );
}
void CMAGNUM::WeaponIdle( void )
{
ResetEmptySound( );
m_pPlayer->GetAutoaimVector(
AUTOAIM_5DEGREES );
if (m_flTimeWeaponIdle
> gpGlobals->time)
return;
int iAnim;
switch ( RANDOM_LONG( 0,
1 ) )
{
case 0:
iAnim =
MAGNUM_IDLE1;
break;
default:
case 1:
iAnim =
MAGNUM_IDLE1;
break;
}
SendWeaponAnim( iAnim );
m_flTimeWeaponIdle =
gpGlobals->time + RANDOM_FLOAT ( 10, 15 );// how long till we do this again.
}
void CMAGNUM::Holster( int skiplocal
)
{
m_fInReload = FALSE;//
cancel any reload in progress.
if ( m_fInZoom )
{
SecondaryAttack(
);
}
m_pPlayer->m_flNextAttack
= UTIL_WeaponTimeBase() + 0.5;
/* if (m_iClip)
SendWeaponAnim(
MAGNUM_HOLSTER );//CROSSBOW_HOLSTER1
else
SendWeaponAnim(
MAGNUM_HOLSTER );//CROSSBOW_HOLSTER2*/
}
a otvoríme weapons.cpp a nájdeme:
#if !defined( OEM_BUILD )
&& !defined( HLDEMO_BUILD )
// rpg
UTIL_PrecacheOtherWeapon(
"weapon_rpg" );
UTIL_PrecacheOther(
"ammo_rpgclip" );
#endif
a pod neho vložíme:
#if !defined( OEM_BUILD ) &&
!defined( HLDEMO_BUILD )
// magnum
UTIL_PrecacheOtherWeapon(
"weapon_MAGNUM" );
UTIL_PrecacheOther(
"ammo_338" );
#endif
teraz otvoríme weapons.h a nájdeme:
#define WEAPON_AK47 16
a pod neho vložíme:
#define WEAPON_MAGNUM 17
ešte na koniec si dáme našu zbraň na impulse tak ako ak47
v player.cpp kde nájdeme:
case 108:// show shortest paths
for entire level to nearest node
{
GiveNamedItem(
"weapon_AK47" );
A pod neho vložíme:
GiveNamedItem(
"weapon_MAGNUM" );
No malo by to byť všetko.