185 lines
4.3 KiB
C
185 lines
4.3 KiB
C
/***
|
|
*
|
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
|
*
|
|
* See the file LICENSE attached with the sources for usage details.
|
|
*
|
|
****/
|
|
|
|
weaponinfo_t wptTable[ CS_WEAPON_COUNT ] = {
|
|
{ 0, 0, 0, 0, 240, 0, 0, 0, 0, 0.0, 0.0, 0, 0.0, 0.0, iAmmo_9MM, iAmmo_9MM, 0.0, 0.0, 0.0, 0, 0 },
|
|
wptKNIFE,
|
|
wptUSP45,
|
|
wptGLOCK18,
|
|
wptDEAGLE,
|
|
wptP228,
|
|
wptELITES,
|
|
wptFIVESEVEN,
|
|
wptM3,
|
|
wptXM1014,
|
|
wptMP5,
|
|
wptP90,
|
|
wptUMP45,
|
|
wptMAC10,
|
|
wptTMP,
|
|
wptAK47,
|
|
wptSG552,
|
|
wptM4A1,
|
|
wptAUG,
|
|
wptSCOUT,
|
|
wptAWP,
|
|
wptG3SG1,
|
|
wptSG550,
|
|
wptPARA,
|
|
wptC4BOMB,
|
|
wptFLASHBANG,
|
|
wptHEGRENADE,
|
|
wptSMOKEGRENADE
|
|
};
|
|
|
|
#ifdef SSQC
|
|
.int iShotMultiplier;
|
|
.float fDecreaseShotTime;
|
|
//.int iOldShotMultiplier;
|
|
#endif
|
|
|
|
/*
|
|
====================
|
|
BaseGun_ShotMultiplierHandle
|
|
====================
|
|
*/
|
|
void BaseGun_ShotMultiplierHandle( float fShots ) {
|
|
#ifdef SSQC
|
|
if ( self.iShotMultiplier > 12 ) {
|
|
self.iShotMultiplier = 12;
|
|
} else {
|
|
self.iShotMultiplier += fShots;
|
|
}
|
|
self.fDecreaseShotTime = time + 0.2;
|
|
#else
|
|
vector vPunch;
|
|
if ( pSeat->iShotMultiplier > 12 ) {
|
|
pSeat->iShotMultiplier = 12;
|
|
} else {
|
|
pSeat->iShotMultiplier += fShots;
|
|
}
|
|
|
|
vPunch[0] = -2 * ( pSeat->iShotMultiplier / 6 );
|
|
vPunch[1] = random( -1, 1 );
|
|
View_AddPunchAngle( vPunch );
|
|
#endif
|
|
}
|
|
|
|
#ifdef SSQC
|
|
/*
|
|
====================
|
|
BaseGun_ShotMultiplierUpdate
|
|
|
|
This is being triggered in PlayerPreThink after the input
|
|
====================
|
|
*/
|
|
void BaseGun_ShotMultiplierUpdate( void ) {
|
|
if ( ( self.iShotMultiplier > 0 ) && ( self.fDecreaseShotTime < time ) ) {
|
|
self.fDecreaseShotTime = time + wptTable[ self.weapon ].fAttackFinished + 0.01;
|
|
self.iShotMultiplier--;
|
|
}
|
|
}
|
|
|
|
/*
|
|
====================
|
|
BaseGun_Draw
|
|
====================
|
|
*/
|
|
void BaseGun_Draw( void ) {
|
|
self.iCurrentMag = self.(wptTable[ self.weapon ].iMagfld);
|
|
self.iCurrentCaliber = self.(wptTable[ self.weapon ].iCaliberfld);
|
|
Client_SendEvent( self, EV_WEAPON_DRAW );
|
|
}
|
|
|
|
/*
|
|
====================
|
|
BaseGun_AccuracyCalc
|
|
====================
|
|
*/
|
|
void BaseGun_AccuracyCalc( void ) {
|
|
if ( wptTable[ self.weapon ].fAccuracyDivisor == -1 ) {
|
|
if ( self.viewzoom < 1.0f ) {
|
|
self.fAccuracy = 0.0f;
|
|
} else {
|
|
self.fAccuracy = 0.05f;
|
|
}
|
|
} else {
|
|
self.fAccuracy = ( self.iShotMultiplier / wptTable[ self.weapon ].fAccuracyDivisor );
|
|
}
|
|
}
|
|
|
|
/*
|
|
====================
|
|
BaseGun_PrimaryFire
|
|
|
|
Returns whether or not to play an animation
|
|
====================
|
|
*/
|
|
float BaseGun_PrimaryFire( void ) {
|
|
// Nothing in the clip anymore? Don't even attempt
|
|
if ( ( self.(wptTable[ self.weapon ].iMagfld) - 1 ) < 0 ) {
|
|
return FALSE;
|
|
}
|
|
|
|
// Responsible for semi-automatic switch
|
|
if ( wptTable[ self.weapon ].fWeaponType == TYPE_SEMI ) {
|
|
self.flags = self.flags - ( self.flags & FL_SEMI_TOGGLED );
|
|
}
|
|
|
|
BaseGun_ShotMultiplierHandle( wptTable[ self.weapon ].iBullets );
|
|
BaseGun_AccuracyCalc();
|
|
TraceAttack_FireBullets( wptTable[ self.weapon ].iBullets, ( self.origin + self.view_ofs ), wptTable[self.weapon].iDamage, [self.fAccuracy, self.fAccuracy] );
|
|
Animation_ShootWeapon( self );
|
|
|
|
self.(wptTable[ self.weapon ].iMagfld) -= 1;
|
|
self.fAttackFinished = time + wptTable[ self.weapon ].fAttackFinished;
|
|
Client_SendEvent( self, EV_WEAPON_PRIMARYATTACK );
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
====================
|
|
BaseGun_Reload
|
|
====================
|
|
*/
|
|
float BaseGun_Reload( void ) {
|
|
static void BaseGun_FinishReload( void ) {
|
|
int iNeed = wptTable[ self.weapon ].iMagSize - self.(wptTable[ self.weapon ].iMagfld);
|
|
int iHave = self.(wptTable[ self.weapon ].iCaliberfld);
|
|
|
|
if ( iNeed > iHave ) {
|
|
self.(wptTable[ self.weapon ].iMagfld) += iHave;
|
|
self.(wptTable[ self.weapon ].iCaliberfld) = 0;
|
|
} else {
|
|
self.(wptTable[ self.weapon ].iMagfld) += iNeed;
|
|
self.(wptTable[ self.weapon ].iCaliberfld) -= iNeed;
|
|
}
|
|
|
|
Weapon_UpdateCurrents();
|
|
}
|
|
|
|
// Don't bother reloading the gun when full
|
|
if ( self.(wptTable[ self.weapon ].iMagfld) == wptTable[ self.weapon ].iMagSize ) {
|
|
return FALSE;
|
|
}
|
|
|
|
// Also don't bother reloading the gun if you've got nothing to reload it with
|
|
if ( self.(wptTable[ self.weapon ].iCaliberfld) <= 0 ) {
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
self.think = BaseGun_FinishReload;
|
|
self.nextthink = time + wptTable[ self.weapon ].fReloadFinished - 0.1f; // Hack - in some cases input might happen first
|
|
self.fAttackFinished = self.nextthink + 0.1f;
|
|
|
|
Animation_ReloadWeapon( self );
|
|
Client_SendEvent( self, EV_WEAPON_RELOAD );
|
|
return TRUE;
|
|
}
|
|
#endif
|