All pastes #2069761 Raw Edit

Gas Can SWEP

public text v1 · immutable
#2069761 ·published 2011-05-27 03:33 UTC
rendered paste body
SWEP.PrintName            = "Gas Can"            
SWEP.Slot                = 5
SWEP.SlotPos            = 5
SWEP.DrawCrosshair        = true
SWEP.Instructions    = "Left click to pour gas, right click to throw a match."
SWEP.ViewModel            = "models/props_junk/gascan001a.mdl"
SWEP.WorldModel            = "models/props_junk/gascan001a.mdl"

SWEP.Primary.ClipSize        = -1
SWEP.Primary.DefaultClip    = -1
SWEP.Primary.Automatic        = true
SWEP.Primary.Ammo            = "none"
SWEP.Secondary.ClipSize        = -1
SWEP.Secondary.DefaultClip    = -1
SWEP.Secondary.Automatic    = false
SWEP.Secondary.Ammo            = "none"

SWEP.Fires = { }
SWEP.MaxFires = 256

SWEP.Matches = { }
SWEP.MaxMatches = 8

SWEP.Pouring = false

PrecacheParticleSystem( "fire_verysmall_01" )
PrecacheParticleSystem( "water_splash_01_surface1" )

util.PrecacheSound( "ambient/water/water_spray1.wav" )
util.PrecacheSound( "ambient/water/water_spray2.wav" )
util.PrecacheSound( "ambient/water/water_spray3.wav" )

util.PrecacheSound( "weapons/slam/throw.wav" )

if not util.IsValidModel( "models/props/de_inferno/Splinter_Damage_01.mdl" ) then
    SWEP.MatchModel = Model( "models/props_debris/wood_splinters01a.mdl" )
    SWEP.MatchOffset = Vector( -.012, -.163, 3.065 )
else
    SWEP.MatchModel = Model( "models/props/de_inferno/Splinter_Damage_01.mdl" )
    SWEP.MatchOffset = Vector( .3, 4.5, .3 )
end

SWEP.Irons = {
    Normal = {
        Pos = Vector( 68.67, -30, -35 ),
        Ang = Vector( 3.95, 86.76, -24.98 ),
    },
 
    Pour = {
        Pos = Vector( 68.67, -30, -55 ),
        Ang = Vector( 3.95, 86.76, -34.98 ),     
    },
}

SWEP.Offset = {
    Pos = {
        Right = 1,
        Forward = -4,
        Up = 0,
    },
    Ang = {
        Right = 0,
        Forward = 0,
        Up = 0,
    },
    Scale = Vector( .5, .5, .5 ),
}

function SWEP:Initialize( )
    self:SetWeaponHoldType( "slam" )
end

function SWEP:PrimaryAttack( )
    local fire, tr
    
    self:SetNextPrimaryFire( CurTime( ) + .05 )
    
    if CLIENT then
        return
    end
    
    tr = util.TraceLine{
        start = self.Owner:GetShootPos( ),
        endpos = self.Owner:GetShootPos( ) + self.Owner:GetAimVector( ) * 160,
        filter = self.Owner
    }
    
    if not tr.Hit then
        return
    end
    
    fire = ents.Create( "env_fire" )
    fire:SetKeyValue( "health", 20 )
    fire:SetKeyValue( "firesize", 36 )
    fire:SetKeyValue( "fireattack", .01 )
    fire:SetKeyValue( "ignitionpoint", 6 )
    fire:SetKeyValue( "damagescale", 25 )

    fire:Fire( "AddOutput", "OnExtinguished !self,Kill", 0 )
    
    fire:SetKeyValue( "spawnflags", 2 + ( ValidEntity( tr.Entity ) and 16 or 0 ) + 32 + 256 )
    
    fire:SetPos( tr.HitPos )
    fire:Spawn( )
    
    fire:SetPhysicsAttacker( self.Owner )

    if ValidEntity( tr.Entity ) then
        fire:SetParent( tr.Entity )
    end
    
    SafeRemoveEntity( table.remove( self.Fires, self.MaxFires ) )
    table.insert( self.Fires, 1, fire )
    
    SafeRemoveEntityDelayed( fire, 45 )
    
    self.Owner:EmitSound( "ambient/water/water_spray" .. math.random( 3 ) .. ".wav", 50, 75 )
    
    util.Decal( "BeerSplash", tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal )
    ParticleEffect( "water_splash_01_surface1", tr.HitPos, tr.HitNormal:Angle( ) )
end

function SWEP:SecondaryAttack( )
    local match, heat, att, phys, tr, particle
    
    self.Owner:AnimRestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_ITEM_PLACE )
    self:SetNextSecondaryFire( CurTime( ) + 1 )
    
    if CLIENT then
        return
    end
    
    self.Owner:EmitSound( "weapons/slam/throw.wav" )
    
    self.Hand = self.Hand or self.Owner:LookupAttachment( "anim_attachment_lh" )
    
    match = ents.Create( "prop_physics" )
    match:SetModel( self.MatchModel )
    match:SetOwner( self.Owner )
    match:SetSolid( SOLID_NONE )
    
    if self.Hand == -1 then
        att = self.Owner:GetAttachment( self.Hand )
        match:SetPos( att.Pos )
    else
        match:SetPos( self.Owner:GetShootPos( ) )
    end
    
    match:Spawn( )
    
    heat = ents.Create( "env_firesource" )
    heat:SetPos( match:GetPos( ) )
    heat:SetParent( match )
    heat:SetLocalPos( self.MatchOffset )
    
    heat:SetKeyValue( "fireradius", 36 )
    heat:SetKeyValue( "firedamage", 50 )
    
    heat:Spawn( )
    heat:Input( "Enable" )
    
    phys = match:GetPhysicsObject( )
    
    tr = util.TraceLine{
        start = self.Owner:GetShootPos( ),
        endpos = self.Owner:GetShootPos( ) + self.Owner:GetAimVector( ) * 512,
        filter = { match, heat, self.Owner, particle },
    }
    
    SafeRemoveEntityDelayed( match, 30 )
    
    particle = ents.Create( "info_particle_system" )
    particle:SetKeyValue( "start_active", 1 )
    particle:SetKeyValue( "effect_name", "fire_verysmall_01" )
    particle:Spawn( )
    
    particle:SetPos( match:GetPos( ) )
    particle:SetParent( match )
    particle:SetLocalPos( self.MatchOffset )
    particle:Activate( )
    
    if ValidEntity( phys ) then
        phys:SetVelocity( ( tr.HitPos - match:GetPos( ) ):GetNormal( ) * 128 * phys:GetMass( ) )
    end
    
    SafeRemoveEntity( table.remove( self.Matches, self.MaxMatches ) )    
    table.insert( self.Matches, 1, match )
end

function SWEP:Think( )
    if CLIENT then
        self.Pouring = self.Owner:KeyDown( IN_ATTACK )
    end
end

function SWEP:DrawWorldModel( )
    if not ValidEntity( self.Owner ) then
        return self:DrawModel( )
    end
    
    local offset, hand
    
    self.Hand2 = self.Hand2 or self.Owner:LookupAttachment( "anim_attachment_rh" )
    
    hand = self.Owner:GetAttachment( self.Hand2 )
    
    if not hand then
        return
    end
    
    offset = hand.Ang:Right( ) * self.Offset.Pos.Right + hand.Ang:Forward( ) * self.Offset.Pos.Forward + hand.Ang:Up( ) * self.Offset.Pos.Up
    
    hand.Ang:RotateAroundAxis( hand.Ang:Right( ), self.Offset.Ang.Right )
    hand.Ang:RotateAroundAxis( hand.Ang:Forward( ), self.Offset.Ang.Forward )
    hand.Ang:RotateAroundAxis( hand.Ang:Up( ), self.Offset.Ang.Up )
    
    self:SetRenderOrigin( hand.Pos + offset )
    self:SetRenderAngles( hand.Ang )
    
    self:SetModelScale( self.Offset.Scale )
    
    self:DrawModel( )
end

function SWEP:GetViewModelPosition( pos, ang )
    local b, r, u, f, n, x, y, z, to, from
    
    b = self.Pouring
    
    if b == nil then
        b = false
    end
    
    if b ~= self.LastIron then
        self.BlendProgress = 0
        self.LastIron = b
    end
    
    self.SwayScale    = 1.0
    self.BobScale    = 1.0
    
    if b then
        to = self.Irons.Pour
        from = self.Irons.Normal
    else
        to = self.Irons.Normal
        from = self.Irons.Pour
    end
    
    self.BlendProgress = math.Approach( self.BlendProgress, 1, FrameTime( ) * 2 )
    
    n = 1 - self.BlendProgress
    
    r, u, f = ang:Right( ), ang:Up( ), ang:Forward( )
    x = to.Ang.x * self.BlendProgress + from.Ang.x * n
    y = to.Ang.y * self.BlendProgress + from.Ang.y * n
    z = to.Ang.z * self.BlendProgress + from.Ang.z * n
    
    ang:RotateAroundAxis( r, x )
    ang:RotateAroundAxis( u, y )
    ang:RotateAroundAxis( f, z )
        
    r, u, f = ang:Right( ), ang:Up( ), ang:Forward( )
    
    x = to.Pos.x * self.BlendProgress + from.Pos.x * n
    y = to.Pos.y * self.BlendProgress + from.Pos.y * n
    z = to.Pos.z * self.BlendProgress + from.Pos.z * n
       
    pos = pos + x * r
    pos = pos + y * f
    pos = pos + z * u
    
    return pos, ang
end