Advertisement
Nero-San

Laser Tripmine

Sep 19th, 2018
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.51 KB | None | 0 0
  1. class monster_lasertripmine : ScriptBaseMonsterEntity
  2. {
  3.     float TRIPMINE_LASERDAMAGE  = 2000.0f;
  4.     int TRIPMINE_RED            = 255;
  5.     int TRIPMINE_GREEN          = 0;
  6.     int TRIPMINE_BLUE           = 0;
  7.    
  8.     float       m_flPowerUp;
  9.     Vector      m_vecDir;
  10.     Vector      m_vecEnd;
  11.     float       m_flBeamLength;
  12.  
  13.     edict_t@    m_hOwner;
  14.     CBeam@      m_pBeam;
  15.     Vector      m_posOwner;
  16.     Vector      m_angleOwner;
  17.  
  18.     void Spawn()
  19.     {
  20.         Precache();
  21.         self.pev.movetype = MOVETYPE_FLY;
  22.         self.pev.solid = SOLID_NOT;
  23.  
  24.         g_EntityFuncs.SetModel( self, "models/v_tripmine.mdl" );
  25.         self.pev.frame = 0;
  26.         self.pev.body = 3;
  27.         self.pev.sequence = 7;
  28.         self.ResetSequenceInfo();
  29.         self.pev.framerate = 0;
  30.  
  31.         g_EntityFuncs.SetSize( self.pev, Vector(-8, -8, -8), Vector(8, 8, 8) );
  32.         g_EntityFuncs.SetOrigin( self, pev.origin );
  33.  
  34.         @m_pBeam = null; //?
  35.  
  36.         if( (pev.spawnflags & 1) == 1 )
  37.             m_flPowerUp = g_Engine.time + 1.0f;
  38.         else
  39.             m_flPowerUp = g_Engine.time + 2.5f;
  40.  
  41.         SetThink( ThinkFunction(this.PowerupThink) );
  42.         self.pev.nextthink = g_Engine.time + 0.2f;
  43.  
  44.         self.pev.takedamage = DAMAGE_YES;
  45.         self.pev.health = 1;
  46.  
  47.         if( pev.owner !is null )
  48.         {
  49.             g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_VOICE, "weapons/mine_deploy.wav", 1.0f, 0.8f, 0, 100 );
  50.             g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_BODY, "weapons/mine_charge.wav", 0.2f, 0.8f, 0, 100 );
  51.         }
  52.  
  53.         Math.MakeAimVectors( pev.angles );
  54.  
  55.         m_vecDir = g_Engine.v_forward;
  56.         m_vecEnd = pev.origin + m_vecDir * 2048;
  57.     }
  58.  
  59.     int BloodColor()
  60.     {
  61.         return DONT_BLEED;
  62.     }
  63.  
  64.     void Precache()
  65.     {
  66.         g_Game.PrecacheModel( "models/v_tripmine.mdl" );
  67.         g_Game.PrecacheModel( "sprites/zbeam2.spr" );
  68.  
  69.         g_SoundSystem.PrecacheSound( "weapons/mine_deploy.wav" );
  70.         g_SoundSystem.PrecacheSound( "weapons/mine_activate.wav" );
  71.         g_SoundSystem.PrecacheSound( "weapons/mine_charge.wav" );
  72.     }
  73.  
  74.     int TakeDamage( entvars_t@ pevInflictor, entvars_t@ pevAttacker, float flDamage, int bitsDamageType )
  75.     {
  76.         return 0;
  77.     }
  78.  
  79.     void PowerupThink()
  80.     {
  81.         TraceResult tr;
  82.  
  83.         if( m_hOwner is null )
  84.         {
  85.             edict_t@ oldowner = pev.owner;
  86.             @pev.owner = null;
  87.             g_Utility.TraceLine( pev.origin + m_vecDir * 8, pev.origin - m_vecDir * 32, ignore_monsters, self.edict(), tr );
  88.             if( tr.fStartSolid != 0 or (oldowner !is null and tr.pHit is oldowner) )
  89.             {
  90.                 @pev.owner = oldowner;
  91.                 m_flPowerUp += 0.1f;
  92.                 pev.nextthink = g_Engine.time + 0.1f;
  93.  
  94.                 return;
  95.             }
  96.  
  97.             if( tr.flFraction < 1.0f )
  98.             {
  99.                 @pev.owner = tr.pHit;
  100.                 @m_hOwner = pev.owner;
  101.                 m_posOwner = m_hOwner.vars.origin;
  102.                 m_angleOwner = m_hOwner.vars.angles;
  103.             }
  104.             else
  105.             {
  106.                 g_SoundSystem.StopSound( self.edict(), CHAN_VOICE, "weapons/mine_deploy.wav" );
  107.                 g_SoundSystem.StopSound( self.edict(), CHAN_BODY, "weapons/mine_charge.wav" );
  108.                 SetThink( ThinkFunction(this.SUB_Remove) );
  109.                 pev.nextthink = g_Engine.time + 0.1f;
  110.                 CBaseEntity@ pMine = g_EntityFuncs.Create( "weapon_lasertripmine", pev.origin + m_vecDir * 24, pev.angles, false );
  111.                 pMine.pev.spawnflags |= SF_NORESPAWN;
  112.                 KillBeam();
  113.  
  114.                 return;
  115.             }
  116.         }
  117.         else if( m_posOwner != m_hOwner.vars.origin or m_angleOwner != m_hOwner.vars.angles )
  118.         {
  119.             g_SoundSystem.StopSound( self.edict(), CHAN_VOICE, "weapons/mine_deploy.wav" );
  120.             g_SoundSystem.StopSound( self.edict(), CHAN_BODY, "weapons/mine_charge.wav" );
  121.             CBaseEntity@ pMine = g_EntityFuncs.Create( "weapon_lasertripmine", pev.origin + m_vecDir * 24, pev.angles, false );
  122.             pMine.pev.spawnflags |= SF_NORESPAWN;
  123.  
  124.             SetThink( ThinkFunction(this.SUB_Remove) );
  125.             KillBeam();
  126.             pev.nextthink = g_Engine.time + 0.1f;
  127.             return;
  128.         }
  129.  
  130.         if( g_Engine.time > m_flPowerUp )
  131.         {
  132.             pev.solid = SOLID_BBOX;
  133.             g_EntityFuncs.SetOrigin( self, pev.origin );
  134.  
  135.             MakeBeam();
  136.  
  137.             g_SoundSystem.EmitSoundDyn( self.edict(), CHAN_VOICE, "weapons/mine_activate.wav", 0.5f, ATTN_NORM, 1.0f, 75 );
  138.         }
  139.  
  140.         pev.nextthink = g_Engine.time + 0.1f;
  141.     }
  142.  
  143.     void BeamBreakThink()
  144.     {
  145.         bool bBeamBroken = false;
  146.  
  147.         TraceResult tr;
  148.  
  149.         g_Utility.TraceLine( pev.origin, m_vecEnd, dont_ignore_monsters, self.edict(), tr );
  150.  
  151.         if( m_pBeam is null )
  152.         {
  153.             MakeBeam();
  154.             if( tr.pHit !is null )
  155.                 @m_hOwner = tr.pHit;
  156.         }
  157.  
  158.         if( abs(m_flBeamLength - tr.flFraction) > 0.001f )
  159.             bBeamBroken = true;
  160.  
  161.         if( bBeamBroken )
  162.         {
  163.             if( tr.pHit is null ) return;
  164.  
  165.             CBaseEntity@ pEntity = g_EntityFuncs.Instance( tr.pHit );
  166.  
  167.             if( pEntity.pev.takedamage == DAMAGE_NO ) return;
  168.  
  169.             g_WeaponFuncs.ClearMultiDamage();
  170.  
  171.             float flDamage = TRIPMINE_LASERDAMAGE;
  172.  
  173.             pEntity.TraceAttack( self.pev, flDamage, g_vecZero, tr, (DMG_ENERGYBEAM|DMG_ALWAYSGIB) );
  174.             g_WeaponFuncs.ApplyMultiDamage( self.pev, self.pev );
  175.  
  176.             bBeamBroken = false;
  177.         }
  178.  
  179.         pev.nextthink = g_Engine.time + 0.01f;
  180.     }
  181.  
  182.     void MakeBeam()
  183.     {
  184.         TraceResult tr;
  185.  
  186.         g_Utility.TraceLine( pev.origin, m_vecEnd, ignore_monsters, self.edict(), tr );
  187.  
  188.         m_flBeamLength = tr.flFraction;
  189.  
  190.         SetThink( ThinkFunction(this.BeamBreakThink) );
  191.         pev.nextthink = g_Engine.time + 0.1f;
  192.  
  193.         Vector vecTmpEnd = pev.origin + m_vecDir * 2048 * m_flBeamLength;
  194.  
  195.         @m_pBeam = g_EntityFuncs.CreateBeam( "sprites/zbeam2.spr", 24 );
  196.         m_pBeam.PointEntInit( vecTmpEnd, self.entindex() );
  197.         m_pBeam.SetColor( TRIPMINE_RED, TRIPMINE_GREEN, TRIPMINE_BLUE );
  198.         m_pBeam.SetScrollRate( 32 );
  199.         m_pBeam.SetBrightness( 200 );
  200.         m_pBeam.SetFlags(bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE); //768
  201.     }
  202.  
  203.     void KillBeam()
  204.     {
  205.         if( m_pBeam !is null )
  206.         {
  207.             g_EntityFuncs.Remove( m_pBeam );
  208.             @m_pBeam = null;
  209.         }
  210.     }
  211.  
  212.     void SUB_Remove()
  213.     {
  214.         self.SUB_Remove();
  215.     }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement