Вот я решил выложить на форуме несколько своих творений - исходников оружия. Возможно, они не совсем оригинальны, но для модостроителей могут оказаться полезными.
И начну я со своего любимого оружия ближнего боя - ножа.
Вот значит, weapon_knife (Нож) с двумя режимами атаки: Slash и Stab.
Нож мой похож на нож в Counter-Strike. Кто хочет - юзайте как хотите и где хотите.
В Readme можете меня не упомянать(Если не хотите).
Для начала надо добавить в проект файл knife.cpp
Потом открываем game.cpp и добавляем в него:
// Tripmine
cvar_t sk_plr_tripmine1 = {"sk_plr_tripmine1","0"};
cvar_t sk_plr_tripmine2 = {"sk_plr_tripmine2","0"};
cvar_t sk_plr_tripmine3 = {"sk_plr_tripmine3","0"};// <= уже есть этот код
void PrimaryAttack( void );
void SecondaryAttack( void );
int Stab( int fFirst );
int Slash( int fFirst );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
int m_iSlash;
int m_iStab;
TraceResult m_trHit;
// Store off the old count
gEngfuncs.pEventAPI->EV_PushPMStates();
// Now add in all of the players.
gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc + forward * 20, vecSrc + forward * 64, PM_NORMAL, -1, &tr );
//Find space to drop the thing.
if ( tr.allsolid == 0 && tr.startsolid == 0 && tr.fraction > 0.25 )
gEngfuncs.pEventAPI->EV_WeaponAnimation ( SQUEAK_THROW, 0 );
gEngfuncs.pEventAPI->EV_PopPMStates();
}
//======================
// SQUEAK END
//======================
Ku2zoff ну что сложного с дымом то... Определяешь радиус, в котором дым есть, центр - это граната. В ф-и "смотрения вперед" бота делаешь проверку на пересечение луча (взгляда бота) и сферы (дыма) и в завис. от расстояния до центра сферы и плотности дыма определяешь, видит он или нет.
Так как винтовка это огнестрельное оружие, надо
провести ещё несколько операций, для полной её работоспособности:
Открывем файл cbase.h и добавляем:
int ammo_9mm;
int ammo_357;
int ammo_bolts;
int ammo_buckshot;
int ammo_rockets;
int ammo_uranium;
int ammo_hornets;
int ammo_argrens;
int ammo_338;//Если мы создали для винтовки новые патроны, то придётся повозиться, иначе будут косяки с перезарядкой
После идём в client.cpp и в функции void UpdateClientData делаем так:
cd->ammo_rockets = pl->ammo_rockets;
cd->ammo_cells = pl->ammo_uranium;
cd->vuser2.x = pl->ammo_hornets;
cd->vuser2.y = pl->ammo_338;//Если это не сделать то время от времени у винтовки не будет рисоваться анимация перезарядки
!!!Внимание!!! параметр cd->vuser2.y обязательно должен отличаться от уже имеющихся cd->ammo_rockets, cd->vuser2.x и других подобных им
После этого идём в combat.cpp и добавляем в функцию Vector CBaseEntity::FireBulletsPlayer вот это:
case BULLET_PLAYER_BUCKSHOT:
// make distance based!
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgBuckshot, vecDir, &tr, DMG_BULLET);
break;
case BULLET_PLAYER_357:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BULLET);
break;
case BULLET_PLAYER_338:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgSniper, vecDir, &tr, DMG_BULLET); //Вот она, убойная сила винтовки
break;
После этого открываем player.cpp и дописываем в функцию void CBasePlayer::TabulateAmmo() это:
class CHudZoom: public CHudBase
{
public:
int Init( void );
int VidInit( void );
int Draw(float flTime);
int MsgFunc_ZoomHUD(const char *pszName, int iSize, void *pbuf );
int m_iHudMode;
private:
HSPRITE m_hBottom_Left;
HSPRITE m_hBottom_Right;
HSPRITE m_hTop_Left;
HSPRITE m_hTop_Right;
HSPRITE m_hBlack;
};
Теперь нам надо задать условие, при котором на экране будет отображаться оптический прицел.
Прокрутим вниз до функции void CBasePlayer :: UpdateClientData( void )
Если вы хотите, чтобы оптический прицел рисовался не только у снайперки, но и
у арбалета и револьвера, то уберите условия m_iFOV != 20 и m_iFOV != 40
(20 это арбалет, а 40 это револьвер) И не забывайте стирать лишние &&