Advertisement
Guest User

Untitled

a guest
May 27th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.74 KB | None | 0 0
  1. /*  
  2. * The original Half-Life version of the mp5
  3. */
  4.  
  5. enum Mp5Animation
  6. {
  7.     MP5_LONGIDLE = 0,
  8.     MP5_IDLE1,
  9.     MP5_LAUNCH,
  10.     MP5_RELOAD,
  11.     MP5_DEPLOY,
  12.     MP5_FIRE1,
  13.     MP5_FIRE2,
  14.     MP5_FIRE3,
  15. };
  16.  
  17. const int MP5_DEFAULT_GIVE  = 150;
  18. const int MP5_DEFAULT_GIVE2     = 2;
  19. const int MP5_MAX_CARRY     = 300;
  20. const int MP5_MAX_CARRY2    = 10;
  21. const int MP5_MAX_AMMO      = 450;
  22. const int MP5_MAX_AMMO2     = 30;
  23. const int MP5_MAX_CLIP      = 150;
  24. const int MP5_WEIGHT        = 5;
  25.  
  26. class weapon_mp5inator : ScriptBasePlayerWeaponEntity
  27. {
  28.     float m_flNextAnimTime;
  29.     int m_iShell;
  30.     int m_iSecondaryAmmo;
  31.    
  32.     void Spawn()
  33.     {
  34.         Precache();
  35.         g_EntityFuncs.SetModel( self, "models/w_9mmAR.mdl" );
  36.  
  37.         self.m_iDefaultAmmo = MP5_DEFAULT_GIVE;
  38.         self.m_iSecondaryAmmoType = 0;
  39.         self.FallInit();
  40.     }
  41.  
  42.     void Precache()
  43.     {
  44.         self.PrecacheCustomModels();
  45.         g_Game.PrecacheModel( "models/v_9mmAR.mdl"  );
  46.         g_Game.PrecacheModel( "models/w_9mmAR.mdl"  );
  47.         g_Game.PrecacheModel( "models/gonome.mdl"   );
  48.         g_Game.PrecacheModel( "models/gman.mdl"     );
  49.         g_Game.PrecacheModel( "models/pit_drone.mdl"    );
  50.         g_Game.PrecacheModel( "models/big_mom.mdl"  );
  51.         g_Game.PrecacheModel( "models/controller.mdl"   );
  52.         g_Game.PrecacheModel( "models/garg.mdl"     );
  53.         g_Game.PrecacheModel( "models/houndeye.mdl" );
  54.         g_Game.PrecacheModel( "models/strooper.mdl" );
  55.         g_Game.PrecacheModel( "models/headcrab.mdl" );
  56.  
  57.         m_iShell = g_Game.PrecacheModel( "models/shell.mdl" );
  58.  
  59.         g_Game.PrecacheModel( "models/grenade.mdl" );
  60.  
  61.         g_Game.PrecacheModel( "models/w_9mmARclip.mdl" );
  62.         g_SoundSystem.PrecacheSound( "items/9mmclip1.wav" );              
  63.  
  64.         //These are played by the model, needs changing there
  65.         g_SoundSystem.PrecacheSound( "items/clipinsert1.wav" );
  66.         g_SoundSystem.PrecacheSound( "items/cliprelease1.wav" );
  67.         g_SoundSystem.PrecacheSound( "items/guncock1.wav" );
  68.        
  69.         g_SoundSystem.PrecacheSound( "weapons/hks1.wav" );
  70.         g_SoundSystem.PrecacheSound( "weapons/hks2.wav" );
  71.         g_SoundSystem.PrecacheSound( "weapons/hks3.wav" );
  72.  
  73.         g_SoundSystem.PrecacheSound( "weapons/glauncher.wav" );
  74.         g_SoundSystem.PrecacheSound( "weapons/glauncher2.wav" );
  75.  
  76.         g_SoundSystem.PrecacheSound( "weapons/357_cock1.wav" );
  77.     }
  78.  
  79.     bool GetItemInfo( ItemInfo& out info )
  80.     {
  81.         info.iMaxAmmo1  = MP5_MAX_AMMO;
  82.         info.iMaxAmmo2  = MP5_MAX_AMMO2;
  83.         info.iMaxClip   = MP5_MAX_CLIP;
  84.         info.iSlot  = 2;
  85.         info.iPosition  = 4;
  86.         info.iFlags     = 0;
  87.         info.iWeight    = MP5_WEIGHT;
  88.  
  89.         return true;
  90.     }
  91.  
  92.     bool AddToPlayer( CBasePlayer@ pPlayer )
  93.     {
  94.         if( BaseClass.AddToPlayer( pPlayer ) )
  95.         {
  96.             NetworkMessage message( MSG_ONE, NetworkMessages::WeapPickup, pPlayer.edict() );
  97.                 message.WriteLong( self.m_iId );
  98.             message.End();
  99.             return true;
  100.         }
  101.        
  102.         return false;
  103.     }
  104.    
  105.     bool PlayEmptySound()
  106.     {
  107.         if( self.m_bPlayEmptySound )
  108.         {
  109.             self.m_bPlayEmptySound = false;
  110.            
  111.             g_SoundSystem.EmitSoundDyn( self.m_pPlayer.edict(), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM, 0, PITCH_NORM );
  112.         }
  113.        
  114.         return false;
  115.     }
  116.  
  117.     bool Deploy()
  118.     {
  119.     float test;
  120.     test = Math.RandomLong(0 ,8);
  121.     switch(int(test))
  122.     {
  123.         case 0: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/gman.mdl" ), MP5_DEPLOY, "mp5" );
  124.         case 1: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/gonome.mdl" ), MP5_DEPLOY, "mp5" );
  125.         case 2: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/controller.mdl" ), MP5_DEPLOY, "mp5" );
  126.         case 3: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/strooper.mdl" ), MP5_DEPLOY, "mp5" );
  127.         case 4: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/big_mom.mdl" ), MP5_DEPLOY, "mp5" );
  128.         case 5: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/garg.mdl" ), MP5_DEPLOY, "mp5" );
  129.         case 6: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/pit_drone.mdl" ), MP5_DEPLOY, "mp5" );
  130.         case 7: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/houndeye.mdl" ), MP5_DEPLOY, "mp5" );
  131.         case 8: return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/headcrab.mdl" ), MP5_DEPLOY, "mp5" );
  132.     }
  133.        
  134.     return self.DefaultDeploy( self.GetV_Model( "models/v_9mmAR.mdl" ), self.GetP_Model( "models/big_mom.mdl" ), MP5_DEPLOY, "mp5" );
  135.     }
  136.    
  137.     float WeaponTimeBase()
  138.     {
  139.         return g_Engine.time; //g_WeaponFuncs.WeaponTimeBase();
  140.     }
  141.  
  142.     void PrimaryAttack()
  143.     {
  144.         // don't fire underwater
  145.         if( self.m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD )
  146.         {
  147.             self.PlayEmptySound( );
  148.             self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.05;
  149.             return;
  150.         }
  151.  
  152.         if( self.m_iClip <= 0 )
  153.         {
  154.             self.PlayEmptySound();
  155.             self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.05;
  156.             return;
  157.         }
  158.  
  159.         self.m_pPlayer.m_iWeaponVolume = NORMAL_GUN_VOLUME;
  160.         self.m_pPlayer.m_iWeaponFlash = NORMAL_GUN_FLASH;
  161.  
  162.         --self.m_iClip;
  163.        
  164.         switch ( g_PlayerFuncs.SharedRandomLong( self.m_pPlayer.random_seed, 0, 2 ) )
  165.         {
  166.         case 0: self.SendWeaponAnim( MP5_FIRE1, 0, 0 ); break;
  167.         case 1: self.SendWeaponAnim( MP5_FIRE2, 0, 0 ); break;
  168.         case 2: self.SendWeaponAnim( MP5_FIRE3, 0, 0 ); break;
  169.         }
  170.        
  171.         g_SoundSystem.EmitSoundDyn( self.m_pPlayer.edict(), CHAN_WEAPON, "weapons/357_shot1.wav", 1.0, ATTN_NORM, 0, 95 + Math.RandomLong( 0, 10 ) );
  172.  
  173.         // player "shoot" animation
  174.         self.m_pPlayer.SetAnimation( PLAYER_ATTACK1 );
  175.  
  176.         Vector vecSrc    = self.m_pPlayer.GetGunPosition();
  177.         Vector vecAiming = self.m_pPlayer.GetAutoaimVector( AUTOAIM_2DEGREES );
  178.        
  179.         // optimized multiplayer. Widened to make it easier to hit a moving player
  180.         self.m_pPlayer.FireBullets( 1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 8192, BULLET_PLAYER_357, 2 );
  181.  
  182.         if( self.m_iClip == 0 && self.m_pPlayer.m_rgAmmo( self.m_iPrimaryAmmoType ) <= 0 )
  183.             // HEV suit - indicate out of ammo condition
  184.             self.m_pPlayer.SetSuitUpdate( "!HEV_AMO0", false, 0 );
  185.  
  186.         self.m_flNextPrimaryAttack = g_Engine.time + 0.05;
  187.         if( self.m_flNextPrimaryAttack < WeaponTimeBase() )
  188.             self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.05;
  189.  
  190.         self.m_flTimeWeaponIdle = WeaponTimeBase() + g_PlayerFuncs.SharedRandomFloat( self.m_pPlayer.random_seed,  10, 15 );
  191.        
  192.         TraceResult tr;
  193.        
  194.         float x, y;
  195.        
  196.         g_Utility.GetCircularGaussianSpread( x, y );
  197.        
  198.         Vector vecDir = vecAiming
  199.                         + x * VECTOR_CONE_1DEGREES.x * g_Engine.v_right
  200.                         + y * VECTOR_CONE_1DEGREES.y * g_Engine.v_up;
  201.  
  202.         Vector vecEnd   = vecSrc + vecDir * 4096;
  203.  
  204.         g_Utility.TraceLine( vecSrc, vecEnd, dont_ignore_monsters, self.m_pPlayer.edict(), tr );
  205.        
  206.         if( tr.flFraction < 1.0 )
  207.         {
  208.             if( tr.pHit !is null )
  209.             {
  210.                 CBaseEntity@ pHit = g_EntityFuncs.Instance( tr.pHit );
  211.                
  212.                 if( pHit is null || pHit.IsBSPModel() )
  213.                     g_WeaponFuncs.DecalGunshot( tr, BULLET_PLAYER_MP5 );
  214.             }
  215.         }
  216.     }
  217.  
  218.     void SecondaryAttack()
  219.     {
  220.         // don't fire underwater
  221.         if( self.m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD )
  222.         {
  223.             self.PlayEmptySound();
  224.             self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.15;
  225.             return;
  226.         }
  227.        
  228.         if( self.m_pPlayer.m_rgAmmo(self.m_iSecondaryAmmoType) <= 0 )
  229.         {
  230.             self.PlayEmptySound();
  231.             return;
  232.         }
  233.  
  234.         self.m_pPlayer.m_iWeaponVolume = NORMAL_GUN_VOLUME;
  235.         self.m_pPlayer.m_iWeaponFlash = BRIGHT_GUN_FLASH;
  236.  
  237.         self.m_pPlayer.m_iExtraSoundTypes = bits_SOUND_DANGER;
  238.         self.m_pPlayer.m_flStopExtraSoundTime = WeaponTimeBase() + 0.2;
  239.  
  240.         self.m_pPlayer.m_rgAmmo( self.m_iSecondaryAmmoType, self.m_pPlayer.m_rgAmmo( self.m_iSecondaryAmmoType ) - 1 );
  241.  
  242.         self.SendWeaponAnim( MP5_LAUNCH );
  243.  
  244.         // player "shoot" animation
  245.         self.m_pPlayer.SetAnimation( PLAYER_ATTACK1 );
  246.  
  247.         if ( g_PlayerFuncs.SharedRandomLong( self.m_pPlayer.random_seed, 0, 1 ) != 0 )
  248.         {
  249.             // play this sound through BODY channel so we can hear it if player didn't stop firing MP3
  250.             g_SoundSystem.EmitSoundDyn( self.m_pPlayer.edict(), CHAN_WEAPON, "weapons/glauncher.wav", 0.8, ATTN_NORM, 0, PITCH_NORM );
  251.         }
  252.         else
  253.         {
  254.             // play this sound through BODY channel so we can hear it if player didn't stop firing MP3
  255.             g_SoundSystem.EmitSoundDyn( self.m_pPlayer.edict(), CHAN_WEAPON, "weapons/glauncher2.wav", 0.8, ATTN_NORM, 0, PITCH_NORM );
  256.         }
  257.    
  258.         Math.MakeVectors( self.m_pPlayer.pev.v_angle + self.m_pPlayer.pev.punchangle );
  259.  
  260.         // we don't add in player velocity anymore.
  261.         if( ( self.m_pPlayer.pev.button & IN_DUCK ) != 0 )
  262.         {
  263.             g_EntityFuncs.ShootContact( self.m_pPlayer.pev,
  264.                                 self.m_pPlayer.pev.origin + g_Engine.v_forward * 16 + g_Engine.v_right * 6,
  265.                                 g_Engine.v_forward * 900 ); //800
  266.         }
  267.         else
  268.         {
  269.             g_EntityFuncs.ShootContact( self.m_pPlayer.pev,
  270.                                 self.m_pPlayer.pev.origin + self.m_pPlayer.pev.view_ofs * 0.5 + g_Engine.v_forward * 16 + g_Engine.v_right * 6,
  271.                                 g_Engine.v_forward * 900 ); //800
  272.         }
  273.         self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.01;
  274.         self.m_flNextSecondaryAttack = WeaponTimeBase() + 0.25;
  275.         self.m_flTimeWeaponIdle = WeaponTimeBase() + 5;// idle pretty soon after shooting.
  276.  
  277.         if( self.m_pPlayer.m_rgAmmo(self.m_iSecondaryAmmoType) <= 0 )
  278.             // HEV suit - indicate out of ammo condition
  279.             self.m_pPlayer.SetSuitUpdate( "!HEV_AMO0", false, 0 );
  280.     }
  281.  
  282.     void Reload()
  283.     {
  284.         self.DefaultReload( MP5_MAX_CLIP, MP5_RELOAD, 1.5, 0 );
  285.  
  286.         //Set 3rd person reloading animation -Sniper
  287.         BaseClass.Reload();
  288.     }
  289.  
  290.     void WeaponIdle()
  291.     {
  292.         self.ResetEmptySound();
  293.  
  294.         self.m_pPlayer.GetAutoaimVector( AUTOAIM_5DEGREES );
  295.  
  296.         if( self.m_flTimeWeaponIdle > WeaponTimeBase() )
  297.             return;
  298.  
  299.         int iAnim;
  300.         switch( g_PlayerFuncs.SharedRandomLong( self.m_pPlayer.random_seed,  0, 1 ) )
  301.         {
  302.         case 0:
  303.             iAnim = MP5_LONGIDLE;  
  304.             break;
  305.        
  306.         case 1:
  307.             iAnim = MP5_IDLE1;
  308.             break;
  309.            
  310.         default:
  311.             iAnim = MP5_IDLE1;
  312.             break;
  313.         }
  314.  
  315.         self.SendWeaponAnim( iAnim );
  316.  
  317.         self.m_flTimeWeaponIdle = WeaponTimeBase() + g_PlayerFuncs.SharedRandomFloat( self.m_pPlayer.random_seed,  10, 15 );// how long till we do this again.
  318.     }
  319. }
  320. class MP5AmmoBox : ScriptBasePlayerAmmoEntity
  321. {
  322.     void Spawn()
  323.     {
  324.         Precache();
  325.         g_EntityFuncs.SetModel( self, "models/w_9mmbox.mdl" );
  326.         BaseClass.Spawn();
  327.     }
  328.    
  329.     void Precache()
  330.     {
  331.         g_Game.PrecacheModel( "models/w_9mmbox.mdl" );
  332.         g_SoundSystem.PrecacheSound( "items/9mmclip1.wav" );
  333.     }
  334.  
  335.     bool AddAmmo( CBaseEntity@ pither )
  336.     {
  337.         int iGive;
  338.        
  339.         iGive = MP5_DEFAULT_GIVE;
  340.        
  341.         if( pither.GiveAmmo( iGive, "ammo_mp5inator", MP5_MAX_CARRY ) != -1 )
  342.         {
  343.             g_SoundSystem.EmitSound( self.edict(), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
  344.             return true;
  345.         }
  346.         return false;
  347.     }
  348. }
  349. class MP5Grenades : ScriptBasePlayerAmmoEntity
  350. {
  351.     void Spawn()
  352.     {
  353.         Precache();
  354.         g_EntityFuncs.SetModel( self, "models/w_argrenade.mdl" );
  355.         BaseClass.Spawn();
  356.     }
  357.    
  358.     void Precache()
  359.     {
  360.         g_Game.PrecacheModel( "models/w_argrenade.mdl" );
  361.         g_SoundSystem.PrecacheSound( "items/9mmclip1.wav" );
  362.     }
  363.  
  364.     bool AddAmmo( CBaseEntity@ pither )
  365.     {
  366.         int iGive;
  367.        
  368.         iGive = MP5_DEFAULT_GIVE2;
  369.        
  370.         if( pither.GiveAmmo( iGive, "ammo_mp5nades", MP5_MAX_CARRY2 ) != -1 )
  371.         {
  372.             g_SoundSystem.EmitSound( self.edict(), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
  373.             return true;
  374.         }
  375.         return false;
  376.     }
  377. }
  378. string GetName()
  379. {
  380.     return "weapon_mp5inator";
  381. }
  382. string GetAmmoName()
  383. {
  384.     return "ammo_mp5inator";
  385. }
  386. string GetAmmo2Name()
  387. {
  388.     return "ammo_mp5nades";
  389. }
  390.  
  391. void RegisterMP5()
  392. {
  393.     g_CustomEntityFuncs.RegisterCustomEntity( GetName(), GetName() );
  394.     g_ItemRegistry.RegisterWeapon( GetName(), "hl_weapons", GetAmmoName(), GetAmmo2Name);
  395. }
  396. void RegisterMP5AmmoBox()
  397. {
  398.     g_CustomEntityFuncs.RegisterCustomEntity( "MP5AmmoBox", GetAmmoName() );
  399. }
  400. Void RegisterMP5Grenades()
  401. {
  402.     g_CustomEntityFuncs.RegisterCustomEntity( "MP5Grenades", GetAmmo2Name() );
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement