Registration - or - Enter
Natural SelectionNatural Selection

Крупный мультиплеерный мод о противостоянии людей и пришельцев...

20/02/2006
The Citizen Part IThe Citizen Part I

Шутер от первого лица...

20/02/2008

По просьбам трудящихся коментирую код МР5


  • Description
  • Link and installation

Разбираемся в коде пушки МР5

По просьбам трудящихся коментирую код МР5


Author/s of lesson : Durane
Views : 635 ( +1 )
Downloads : 0
Uploaded by : Streit
Created : 04/07/2011 5:34:59 PM
Source : http://www.sharaw.deagle.ru
Rating :
 ( 0 ) 
Share :


Available following translations : | russian |

Code:

#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 mp5_e // Загрузка анимаций
{
   MP5_LONGIDLE = 0, // Длинное бездействие
   MP5_IDLE1, // Бездействие
   MP5_LAUNCH, // Выстрел подствольным гранатометом
   MP5_RELOAD, // Перезарядка
   MP5_DEPLOY, // Взятие в руки
   MP5_FIRE1, // Выстрел
   MP5_FIRE2, // Выстрел
   MP5_FIRE3, // Выстрел
};

LINK_ENTITY_TO_CLASS( weapon_mp5, CMP5 ); // Создание ентайта
LINK_ENTITY_TO_CLASS( weapon_9mmAR, CMP5 );

//=========================================================
//=========================================================
int CMP5::SecondaryAmmoIndex( void )
{
   return m_iSecondaryAmmoType;
}

void CMP5::Spawn( ) // Загрузка на карту
{
   pev->classname = MAKE_STRING("weapon_9mmAR"); // hack to allow for old names
   Precache( );
   SET_MODEL(ENT(pev), "models/w_9mmAR.mdl"); // Какая модель на карте
   m_iId = WEAPON_MP5;

   m_iDefaultAmmo = MP5_DEFAULT_GIVE; // Кол-во патронов (weapon.h)

   FallInit();// get ready to fall down. // Создание на карте
}


void CMP5::Precache( void ) // Кеширование (загрузка) необходимых файлов
{
   PRECACHE_MODEL("models/v_9mmAR.mdl"); // Модель оружия в руках
   PRECACHE_MODEL("models/w_9mmAR.mdl"); // Модель оружия на земле
   PRECACHE_MODEL("models/p_9mmAR.mdl"); // Модель оружия у противника

   m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL // Модель гильзы

   PRECACHE_MODEL("models/grenade.mdl"); // grenade // Модель гранаты

   PRECACHE_MODEL("models/w_9mmARclip.mdl"); // Модель обоймы
   PRECACHE_SOUND("items/9mmclip1.wav"); // Звук поднятия обоймы с земли

   PRECACHE_SOUND("items/clipinsert1.wav");
   PRECACHE_SOUND("items/cliprelease1.wav");

   PRECACHE_SOUND ("weapons/hks1.wav");// H to the K // Звук выстрела
   PRECACHE_SOUND ("weapons/hks2.wav");// H to the K // -----//------
   PRECACHE_SOUND ("weapons/hks3.wav");// H to the K // -----//------

   PRECACHE_SOUND( "weapons/glauncher.wav" ); // Звук выстрела гранатой
   PRECACHE_SOUND( "weapons/glauncher2.wav" ); // ----------//----------

   PRECACHE_SOUND ("weapons/357_cock1.wav");

   m_usMP5 = PRECACHE_EVENT( 1, "events/mp5.sc" ); // Загрузка евент-файла
   m_usMP52 = PRECACHE_EVENT( 1, "events/mp52.sc" );
}

int CMP5::GetItemInfo(ItemInfo *p) // Основная инфа об оружии
{
   p->pszName = STRING(pev->classname);
   p->pszAmmo1 = "9mm"; // Тип патронов
   p->iMaxAmmo1 = _9MM_MAX_CARRY; // Макс. количество с собой
   p->pszAmmo2 = "ARgrenades"; // Тип патронов 2
   p->iMaxAmmo2 = M203_GRENADE_MAX_CARRY; // Макс. кол-во с собой 2
   p->iMaxClip = MP5_MAX_CLIP; // Кол-во пуль в обойме
   p->iSlot = 2; // На какой цыфре оружие (значение + 1), если 2 значит в третьей
   p->iPosition = 0; // Какая позици в этом разделе (значение + 2), если 0 значит первая
   p->iFlags = 0;
   p->iId = m_iId = WEAPON_MP5; // Ентайт
   p->iWeight = MP5_WEIGHT; // Значимость по отношению к другим пушкам

   return 1;
}

int CMP5::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 CMP5::Deploy( ) // Взятие в руки
{
   return DefaultDeploy( "models/v_9mmAR.mdl", "models/p_9mmAR.mdl", MP5_DEPLOY, "mp5" );
}


void CMP5::PrimaryAttack() // Основная атака
{
   // don't fire underwater // Не стрелять под водой
   if (m_pPlayer->pev->waterlevel == 3) // Если чувак под водой
   {
     PlayEmptySound( ); // Играть звук невозможности стрелять
     m_flNextPrimaryAttack = 0.15; // Время через которое можно опять стрелять
     return;
   }

   if (m_iClip <= 0) // Провека на наличие патронов
   {
     PlayEmptySound(); // Играть звук невозможности стрелять
     m_flNextPrimaryAttack = 0.15; // Время через которое можно опять стрелять
     return;
   }

   m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
   m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;

   m_iClip--;


   m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;

   // player "shoot" animation
   m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); // Анимация стрельбы игроком

   Vector vecSrc = m_pPlayer->GetGunPosition( );
   Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
   Vector vecDir;

   #ifdef CLIENT_DLL
     if ( !bIsMultiplayer() )
   #else
     if ( !g_pGameRules->IsMultiplayer() ) // Если мультиплеер
   #endif
     {
       // optimized multiplayer. Widened to make it easier to hit a moving player // Облегчение попадания в движущегося игрока
       vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_6DEGREES, 8192, BULLET_PLAYER_MP5, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed );
     }
     else // Если сингл
     {
       // single player spread // Стандартное попадание
       vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed );
     }

   int flags;
   #if defined( CLIENT_WEAPONS )
     flags = FEV_NOTHOST;
   #else
     flags = 0;
   #endif

   PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );

   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 = UTIL_WeaponTimeBase() + 0.1; // Когда следующий выстрел

   if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() )
     m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1; // Когда следующий выстрел

   m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}



void CMP5::SecondaryAttack( void ) // Второстепенная атака
{
   // don't fire underwater // Не стрелять под водой
   if (m_pPlayer->pev->waterlevel == 3)
   {
     PlayEmptySound( );
     m_flNextPrimaryAttack = 0.15;
     return;
   }

   if (m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] == 0) // Проверка на наличия второго типа патронов
   {
     PlayEmptySound( );
     return;
   }

   m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
   m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;

   m_pPlayer->m_iExtraSoundTypes = bits_SOUND_DANGER;
   m_pPlayer->m_flStopExtraSoundTime = UTIL_WeaponTimeBase() + 0.2;

   m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType]--;

   // player "shoot" animation
   m_pPlayer->SetAnimation( PLAYER_ATTACK1 );

   UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );

   // we don't add in player velocity anymore.
   CGrenade::ShootContact( m_pPlayer->pev,
   m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16,
gpGlobals->v_forward * 800 );

   int flags;
   #if defined( CLIENT_WEAPONS )
     flags = FEV_NOTHOST;
   #else
     flags = 0;
   #endif

   PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usMP52 );

   m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1; // Следующая основная атака
   m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1; // Следующая второстепенная атака
   m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5;// idle pretty soon after shooting.

   if (!m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType])
   // HEV suit - indicate out of ammo condition // Костюм говорит что нет пуль
   m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0);
}

void CMP5::Reload( void ) // Перезарядка
{
   if ( m_pPlayer->ammo_9mm <= 0 )
     return;

   DefaultReload( MP5_MAX_CLIP, MP5_RELOAD, 1.5 );
}


void CMP5::WeaponIdle( void ) // Бездействие
{
   ResetEmptySound( );

   m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );

   if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
     return;

   int iAnim;
   switch ( RANDOM_LONG( 0, 1 ) )  // Рандомное чило или 1, или 0 для выбора анимации
   {
     case 0:  // Если 0
       iAnim = MP5_LONGIDLE; // Длинная анимация бездействия
       break;

     default: // Если 1
     case 1:
       iAnim = MP5_IDLE1; // Анимация бездействия
       break;
   }

   SendWeaponAnim( iAnim );

   m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again.
}



class CMP5AmmoClip : public CBasePlayerAmmo // Патроны
{
   void Spawn( void )
   {
     Precache( );
     SET_MODEL(ENT(pev), "models/w_9mmARclip.mdl");
     CBasePlayerAmmo::Spawn( );
   }
   void Precache( void )
   {
     PRECACHE_MODEL ("models/w_9mmARclip.mdl");
     PRECACHE_SOUND("items/9mmclip1.wav");
   }
   BOOL AddAmmo( CBaseEntity *pOther )
   {
     int bResult = (pOther->GiveAmmo( AMMO_MP5CLIP_GIVE, "9mm", _9MM_MAX_CARRY) != -1);
     if (bResult)
     {
       EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
     }
     return bResult;
   }
};
LINK_ENTITY_TO_CLASS( ammo_mp5clip, CMP5AmmoClip );
LINK_ENTITY_TO_CLASS( ammo_9mmAR, CMP5AmmoClip );



class CMP5Chainammo : public CBasePlayerAmmo // Патроны
{
   void Spawn( void )
   {
     Precache( );
     SET_MODEL(ENT(pev), "models/w_chainammo.mdl");
     CBasePlayerAmmo::Spawn( );
   }
   void Precache( void )
   {
     PRECACHE_MODEL ("models/w_chainammo.mdl");
     PRECACHE_SOUND("items/9mmclip1.wav");
   }
   BOOL AddAmmo( CBaseEntity *pOther )
   {
     int bResult = (pOther->GiveAmmo( AMMO_CHAINBOX_GIVE, "9mm", _9MM_MAX_CARRY) != -1);
     if (bResult)
     {
       EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
     }
     return bResult;
   }
};
LINK_ENTITY_TO_CLASS( ammo_9mmbox, CMP5Chainammo );


class CMP5AmmoGrenade : public CBasePlayerAmmo // Патроны
{
   void Spawn( void )
   {
     Precache( );
     SET_MODEL(ENT(pev), "models/w_ARgrenade.mdl");
     CBasePlayerAmmo::Spawn( );
   }
   void Precache( void )
   {
     PRECACHE_MODEL ("models/w_ARgrenade.mdl");
     PRECACHE_SOUND("items/9mmclip1.wav");
   }
   BOOL AddAmmo( CBaseEntity *pOther )
   {
     int bResult = (pOther->GiveAmmo( AMMO_M203BOX_GIVE, "ARgrenades", M203_GRENADE_MAX_CARRY ) != -1);

     if (bResult)
     {
       EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
     }
     return bResult;
   }
};
LINK_ENTITY_TO_CLASS( ammo_mp5grenades, CMP5AmmoGrenade );
LINK_ENTITY_TO_CLASS( ammo_ARgrenades, CMP5AmmoGrenade );


Similar1. Смена моделей персонажей - Смена моделей персонажей прямо в Хамере
2. субтитры из паранойи - субтитры из паранойи.
Ссылки на объект
Полная ссылка на текущем языке :
Короткая ссылка :
Ссылка на превью-картинку :
Ссылка на картинку в полном размере :
Ссылка для вашего форума или сайта
BB код ссылка:
BB код ссылка с картинкой :
BB код картинки :
HTML код ссылка:
HTML код ссылка с картинкой :
HTML код картинки :
You cannot comment, because you are not registered.
    Akimbo Barrett's
    The SpecialistsAkimbo Barrett's
    Akimbo Default Desert Eagles
    The SpecialistsAkimbo Default Desert Eagles
    Colt's Government M1911A1 (Default Colts Reskin)
    The SpecialistsColt's Government M1911A1 (Default Colts Reskin)
    FN Browning High Power
    The SpecialistsFN Browning High Power