cs的源代码解析
大家都玩cs吗?
今天我谈一谈m4和ak的问题,绝对正确的,不是经验之谈。
哈哈,是cs的源代码(hl2中的)
cs用的是c++语言编写,代码有mfc的风格,很讨厌。
class CWeaponM4A1 : public CWeaponCSBaseGun
那个基类就不管了,m4的基本属性如下
CWeaponM4A1::CWeaponM4A1()
{
m_bSilencerOn = false; //默认的消声器是不上的
}
void CWeaponM4A1::Spawn( )
{
m_flAccuracy = 0.2; //准确度是0.2,我看过,mp5是0.0
m_iShotsFired = 0;
m_bDelayFire = true; //ak没有这个参数,平时我打ak也是很快的
CCSBaseGunInfo info;
info.m_flAccuracyDivisor = 220; //ak值200
info.m_flAccuracyOffset = 0.3; //ak值0.35 info.m_flMaxInaccuracy = 1; //最大错误1,ak是1.25
info.m_iPenetration = 2; //和ak一样的
info.m_iDamage = 33; //ak为36
info.m_flRangeModifier = 0.99; //ak为0.98
info.m_flTimeToIdleAfterFire = 1.5; //ak为1.9,要多等一会,晕
info.m_flIdleInterval = 60; //这项ak为20
CSBaseGunSpawn( &info );
}
bool CWeaponM4A1:eploy()
{
m_flAccuracy = 0.2;
m_iShotsFired = 0;
m_bDelayFire = true;
return BaseClass:eploy(); //没什么好说的
}
void CWeaponM4A1::SecondaryAttack() //这个函数写的是加了消声器的攻击参数
{
if ( m_bSilencerOn )
{
m_bSilencerOn = false;
SendWeaponAnim( ACT_VM_DETACH_SILENCER );
WeaponSound( SPECIAL2 );
}
else
{
m_bSilencerOn = true;
SendWeaponAnim( ACT_VM_ATTACH_SILENCER );
WeaponSound( SPECIAL3 );
}
m_flNextSecondaryAttack = gpGlobals->curtime + 2;
m_flNextPrimaryAttack = gpGlobals->curtime + 2;
m_flTimeWeaponIdle = gpGlobals->curtime + 2.0; //注意,时间都变慢了
}
void CWeaponM4A1::PrimaryAttack() //不加消声器
{
CCSPlayer *pPlayer = GetPlayerOwner();
if ( !FBitSet( pPlayer->GetFlags(), FL_ONGROUND ) )
{
M4A1Fire( 0.035 + (0.4) * (m_flAccuracy), 0.0875 );
//第一个参数是准星的扩散速度,狠狠,改!
}
else if (pPlayer->GetAbsVelocity().Length2D() > 140)
{
M4A1Fire( 0.035 + (0.07) * (m_flAccuracy), 0.0875 );
}
else
{
if ( m_bSilencerOn )
M4A1Fire( (0.025) * (m_flAccuracy), 0.0875 );
else
M4A1Fire( (0.02) * (m_flAccuracy), 0.0875 );
}
}
void CWeaponM4A1::M4A1Fire( float flSpread, float flCycleTime )
{
if ( !CSBaseGunFire( flSpread, flCycleTime ) )
return;
CCSPlayer *pPlayer = GetPlayerOwner();
if (pPlayer->GetAbsVelocity().Length2D() > 0)
KickBack (1.0, 0.45, 0.28, 0.045, 3.75, 3, 7);
else if ( !FBitSet( pPlayer->GetFlags(), FL_ONGROUND ) )
KickBack (1.2, 0.5, 0.23, 0.15, 5.5, 3.5, 6);
else if ( FBitSet( pPlayer->GetFlags(), FL_DUCKING ) )
KickBack (0.6, 0.3, 0.2, 0.0125, 3.25, 2, 7);
else
KickBack (0.65, 0.35, 0.25, 0.015, 3.5, 2.25, 7);
}
float CWeaponM4A1::GetRangeModifier() const
{
if ( m_bSilencerOn )
return 0.95;
else
return 0.97;
}
void CWeaponM4A1:oFireEffects()
{
if ( m_bSilencerOn )
{
WeaponSound( SPECIAL1 );
}
else
{
m_fEffects |= EF_MUZZLEFLASH;
WeaponSound( SINGLE );
}
}
以后大家讨论游戏也有依据了。
我贴在cs-cn上没人看,呜呜。