Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //TTT Convertion Code \\
- SWEP.BASE = "weapon_tttbase"
- SWEP.Kind = WEAPON_HEAVY
- SWEP.CanBuy = { ROLE_TRAITOR }
- SWEP.AutoSpawnable = false
- SWEP.InLoadoutFor = nil
- SWEP.AllowDrop = true
- SWEP.IsSilent = false
- SWEP.NoSights = true
- SWEP.AmmoEnt = "item_box_buckshot_ttt"
- SWEP.LimitedStock = false
- if CLIENT then
- SWEP.PrintName = "Dragons Breath"
- SWEP.Slot = 6
- SWEP.EquipMenuData = {
- type = "Dragons Breath",
- desc = "A shotgun with the power of a dragon"
- };
- SWEP.Icon = "vgui/ttt/icon_nades"
- end
- if SERVER then
- AddCSLuaFile( "dragons_breath20.lua" )
- SWEP.HoldType = "shotgun"
- end
- if CLIENT then
- surface.CreateFont( "dragon_digital", {
- font = "Digital-7",
- size = 45,
- antialias = true
- } )
- SWEP.HoldType = "shotgun"
- SWEP.Author = "Zikerd,Bombobux"
- SWEP.PrintName = "Dragon's breath"
- SWEP.Category = "Dragon's breath"
- SWEP.Contact = ""
- SWEP.Purpose = ""
- SWEP.Instructions = ""
- SWEP.AdminOnly = false
- SWEP.AutoSwitchTo = false
- SWEP.AutoSwitchFrom = false
- SWEP.FiresUnderwater = false
- SWEP.Spawnable = true
- SWEP.Weight = 1
- SWEP.DrawCrosshair = false
- SWEP.Slot = 6
- SWEP.SlotPos = 0
- SWEP.UseHands = true
- SWEP.ViewModelFOV = 50
- end
- SWEP.ViewModel = "models/weapons/dragons_breath/xm1014_dragons_breath.mdl"
- SWEP.WorldModel = "models/weapons/w_shotgun.mdl"
- SWEP.ViewModelFlip = false
- SWEP.ShowViewModel = true
- SWEP.ShowWorldModel = true
- SWEP.Primary.Damage = 9
- SWEP.Primary.ClipSize = 7
- SWEP.Primary.DefaultClip = 7
- SWEP.Primary.Spread = 1.2
- SWEP.Primary.Ammo = "none"
- SWEP.Primary.Automatic = true
- SWEP.Primary.NumberofShots = 7
- SWEP.Primary.Recoil = 12
- SWEP.Primary.Delay = 1.07
- SWEP.Primary.Force = 18
- SWEP.Secondary.ClipSize = -1
- SWEP.Secondary.DefaultClip = -1
- SWEP.Secondary.Ammo = "Buckshot"
- SWEP.Secondary.Automatic = false
- SWEP.Secondary.Recoil = 0
- SWEP.Secondary.Delay = 1
- SWEP.Charge = 0
- SWEP.Shootanim = 0
- SWEP.DragonsEnergy = 0
- --SCK WE/VE models-
- SWEP.VElements = {
- ["base_misc"] = { type = "Model", model = "models/props_combine/combine_mortar01a.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(0, -4.651, 0), angle = Angle(180, 0, 0), size = Vector(0.028, 0.028, 0.028), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
- ["base_decor1++"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(-0.35, -3.5, -3), angle = Angle(30, 90, 165), size = Vector(0.15, 0.1, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["charge+"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(1.5, -4.651, -22), angle = Angle(-180, -180, 0), size = Vector(0.4, 0.3, 0.4), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["base_decor1"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(-0.35, -4, -1.9), angle = Angle(15, 90, 165), size = Vector(0.15, 0.1, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["charge_hud"] = { type = "Quad", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(1, -6.5, 0), angle = Angle(45, 0, -10), size = 0.025, draw_func = nil},
- ["base_decor1+++"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(0.349, -4.6, -1.5), angle = Angle(0, 90, -165), size = Vector(0.15, 0.1, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["base_decor1+"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(-0.35, -4.6, -1.5), angle = Angle(0, 90, 165), size = Vector(0.15, 0.1, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["radiator"] = { type = "Model", model = "models/props_c17/metalladder001.mdl", bone = "v_weapon.xm1014_Parent", rel = "charge", pos = Vector(0.4, 0, -3.6), angle = Angle(90, 0, 0), size = Vector(0.029, 0.035, 0.029), color = Color(15, 15, 15, 255), surpresslightning = true, material = "", skin = 0, bodygroup = {} },
- ["charge"] = { type = "Model", model = "models/props_combine/breenlight.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(-1.5, -4.651, -22), angle = Angle(-180, 0, 0), size = Vector(0.4, 0.3, 0.4), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/weapons/dragons_breath/breenlight_edit", skin = 0, bodygroup = {} },
- ["base_decor_light+++"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "base_decor1+++", pos = Vector(0, 0, -1.5), size = { x = 1.5, y = 1.5 }, color = Color(0, 155, 255, 100), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = false},
- ["base_decor_light++"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "base_decor1++", pos = Vector(0, 0, -1.5), size = { x = 1.5, y = 1.5 }, color = Color(0, 155, 255, 100), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = true},
- ["charge_decor_light"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "charge", pos = Vector(0, 0, -4.5), size = { x = 4, y = 4 }, color = Color(0, 155, 255, 255), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = false},
- ["base_decor_light"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "base_decor1", pos = Vector(0, 0, -1.5), size = { x = 1.5, y = 1.5 }, color = Color(0, 155, 255, 100), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = true},
- ["base_decor_light+"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "base_decor1+", pos = Vector(0, 0, -1.5), size = { x = 1.5, y = 1.5 }, color = Color(0, 155, 255, 100), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = true},
- ["charge_decor_light+"] = { type = "Sprite", sprite = "sprites/animglow02", bone = "v_weapon.xm1014_Parent", rel = "charge+", pos = Vector(0, 0, -4.5), size = { x = 4, y = 4 }, color = Color(0, 155, 255, 150), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = false},
- ["ring"] = { type = "Model", model = "models/props_combine/combine_mortar01b.mdl", bone = "v_weapon.xm1014_Parent", rel = "", pos = Vector(-0.801, -4, -2), angle = Angle(100, 0, -8), size = Vector(0.039, 0.039, 0.019), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
- }
- SWEP.WElements = {}
- --SCK END--
- function SWEP:Deploy()
- self.Owner:EmitSound("dragonsbreath/Dragon_charging.wav",45)
- self:SendWeaponAnim( ACT_VM_DRAW )
- end
- function SWEP:Initialize()
- local viewmodel = self.Owner:GetViewModel()
- self.Charge = 0
- self.Shootanim = 0
- self.DragonsEnergy = 0
- if SERVER then
- self:SetWeaponHoldType( self.HoldType )
- end
- end
- function SWEP:PrimaryAttack()
- if ( !self:CanPrimaryAttack() ) then return end
- local bullet = {}
- bullet.Num = self.Primary.NumberofShots
- bullet.Src = self.Owner:GetShootPos()
- bullet.Dir = self.Owner:GetAimVector()
- bullet.Spread = Vector( self.Primary.Spread * 0.1 ,0, 0)
- bullet.Tracer = 1
- bullet.TracerName = "shotgun_trace"
- bullet.Force = 4
- bullet.Damage = self.Primary.Damage
- bullet.AmmoType = self.Primary.Ammo
- if SERVER then
- bullet.Callback = function(ent,tr,dmginfo) if IsValid(tr.Entity) then tr.Entity:Ignite(5)
- ParticleEffectAttach( "dragon_ignition", 1, tr.Entity, 1 )
- end
- dmginfo:SetDamageType(DMG_BLAST)
- end
- end
- local rnda = self.Primary.Recoil * -0.3
- local rndb = self.Primary.Recoil * math.random(-0.3, 0.3)
- self:ShootEffects()
- self.Owner:FireBullets( bullet )
- if SERVER then
- self.Owner:EmitSound("dragonsbreath/dragon_primary_" .. math.random( 1, 4 ) .. ".wav", 100, math.random( 85, 100 ))
- end
- self.Owner:ViewPunch( Angle( rnda,rndb,-5 ) )
- self:TakePrimaryAmmo(1)
- self:SendWeaponAnim( ACT_VM_PRIMARYATTACK )
- self.Owner:SetAnimation( PLAYER_ATTACK1 )
- self:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
- self:SetNextSecondaryFire( CurTime() + self.Primary.Delay )
- self.Charge = 0
- if SERVER then
- self.Owner:SendLua( "LocalPlayer():GetActiveWeapon():Shootanim1()" )
- ParticleEffectAttach( "dragon_muzzle", PATTACH_POINT_FOLLOW, self.Owner:GetViewModel(), self.Owner:GetViewModel():LookupAttachment("1") )
- self.Owner:SetVelocity(self.Owner:GetAngles():Forward()*-190)
- end
- end
- function SWEP:Think()
- self:SetWeaponHoldType( self.HoldType )
- //SCK ANIMS//
- self.VElements["charge"].pos = Vector(-1.5, -4.651,-self.Shootanim/1.5)
- self.VElements["charge+"].pos = Vector(1.5, -4.651,-self.Shootanim/1.5)
- self.VElements["charge_decor_light+"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- self.VElements["charge_decor_light"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- self.VElements["base_decor_light"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- self.VElements["base_decor_light+"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- self.VElements["base_decor_light++"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- self.VElements["base_decor_light+++"].color = Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, 150)
- //SCK MODELS END//
- //MUZZLE CHARGE PARTICLE+SOUND//
- if( self.Owner:KeyPressed( IN_ATTACK2 ) ) and self:Clip1() > 0 then
- self.Charge = 0
- ParticleEffectAttach( "dragon_charge", PATTACH_POINT_FOLLOW, self.Owner:GetViewModel(), self.Owner:GetViewModel():LookupAttachment("1") )
- self.Owner:EmitSound("dragonsbreath/Dragon_charging.wav",80)
- end
- //CHARGING//
- if( self.Owner:KeyDown( IN_ATTACK2 ) ) and self:Clip1() > 0 then
- self:Charger1()
- end
- //SHOOT//
- if ( self.Owner:KeyReleased( IN_ATTACK2 ) ) and self:Clip1() > 0 then
- self:SecondaryAttack()
- end
- //CHARING FIX//
- if( !self.Owner:KeyDown( IN_ATTACK2 ) ) and self.DragonsEnergy > 0 then
- self.DragonsEnergy = 0
- end
- //I HOPE//
- //RELOAD//
- if self:Clip1() < 7 and self.Charge > 0 then
- self:Reload()
- end
- if self:Clip1() > 6 then
- self.Charge = 0
- end
- if self.Shootanim < 33 then
- self.Shootanim = self.Shootanim + 1
- end
- end
- function SWEP:Shootanim1()
- self.Shootanim = 10
- end
- function SWEP:Charger1()
- local chargemax = self:Clip1() * 30
- if self.DragonsEnergy < chargemax then
- self.DragonsEnergy = self.DragonsEnergy + 1
- end
- end
- function SWEP:Reload()
- //
- if self.ReloadingTime and CurTime() <= self.ReloadingTime then return end
- if ( self:Clip1() < self.Primary.ClipSize and self.Owner:GetAmmoCount( self.Primary.Ammo ) > 0 ) then
- if self:Clip1() < 7 then
- self.Charge = 1
- self.Weapon:SetClip1( self.Weapon:Clip1() + 1 )
- self.Owner:RemoveAmmo( 1, self.Primary.Ammo, false )
- self.Weapon:SendWeaponAnim( ACT_VM_RELOAD )
- local AnimationTime = self.Owner:GetViewModel():SequenceDuration()
- self.ReloadingTime = (CurTime() + AnimationTime)
- self:SetNextPrimaryFire(CurTime() + AnimationTime -0.2)
- self:SetNextSecondaryFire(CurTime() + AnimationTime -0.2)
- if self:Clip1() > 6 then
- timer.Create( "timer1", AnimationTime, 1, function() self.Weapon:SendWeaponAnim( ACT_VM_IDLE ) end )
- else
- timer.Create( "timer2", AnimationTime, 1, function() self.Weapon:SendWeaponAnim( ACT_VM_IDLE ) end )
- end
- end
- end
- end
- function SWEP:SecondaryAttack()
- local Ammotake = math.Round(self.DragonsEnergy/30,0)
- if self.DragonsEnergy > 29 then
- if self:Clip1() > self.DragonsEnergy/30
- then
- self:TakePrimaryAmmo(Ammotake)
- else
- self:TakePrimaryAmmo(self:Clip1())
- end
- //CHERT YA ETO DNO TROGARY VTOROY RAZ NE BUDU//
- if SERVER then
- local blastdamage = self.DragonsEnergy*2
- local ent = ents.Create( "dragon_fireball" )
- if ( IsValid( ent ) ) then
- ent:SetPos( self.Owner:GetShootPos())
- end
- ent:SetAngles( self.Owner:EyeAngles() )
- ent:SetOwner( self.Owner )
- ent:Spawn()
- ent:Activate()
- self.Owner:EmitSound("dragonsbreath/tf_dragonsfury_shoot.wav", 100, math.random( 75, 100 ))
- local phys = ent:GetPhysicsObject()
- if ( IsValid( phys ) ) then phys:Wake() phys:AddVelocity( ent:GetForward() * 3500 ) end
- //KABOOM CODE//
- function ent:DragonsBoom()
- if SERVER then
- local DragonsBoom = EffectData()
- DragonsBoom:SetOrigin( ent:GetPos() )
- DragonsBoom:SetNormal( ent:GetPos():GetNormal() )
- DragonsBoom:SetEntity( ent )
- util.BlastDamage(ent, self.Owner, self:GetPos(), blastdamage, blastdamage)
- ent:Remove()
- end
- end
- //PONYATNO?//
- self.Owner:ViewPunch( Angle( -6,-1,-8 ) )
- self:SendWeaponAnim( ACT_VM_PRIMARYATTACK )
- self.Owner:SetAnimation( PLAYER_ATTACK1 )
- //ZAPARTICLISHSYA ETO DELATY//
- ParticleEffectAttach( "dragon_muzzle_alt", PATTACH_POINT_FOLLOW, self.Owner:GetViewModel(), self.Owner:GetViewModel():LookupAttachment("1") )
- end
- end
- end
- function SWEP:DoImpactEffect( tr, nDamageType )
- if ( tr.HitSky ) then return end
- ParticleEffect( "dragons_breath_impact", tr.HitPos, self.Owner:EyeAngles(), self )
- return false
- end
- function SWEP:GetViewModelPosition( EyePos, EyeAng )
- local sineus = math.sin( CurTime() * 0.9 ) / 10000
- local sinevec = 1 + -sineus
- return EyePos*sinevec, EyeAng
- end
- /********************************************************
- SWEP Construction Kit base code
- Created by Clavus
- Available for public use, thread at:
- facepunch.com/threads/1032378
- DESCRIPTION:
- This script is meant for experienced scripters
- that KNOW WHAT THEY ARE DOING. Don't come to me
- with basic Lua questions.
- Just copy into your SWEP or SWEP base of choice
- and merge with your own code.
- The SWEP.VElements, SWEP.WElements and
- SWEP.ViewModelBoneMods tables are all optional
- and only have to be visible to the client.
- ********************************************************/
- function SWEP:Initialize()
- if CLIENT then
- self.VElements["charge_hud"].draw_func = function( weapon )
- draw.SimpleText(math.Round(self.DragonsEnergy/30,1), "dragon_digital", 0, 0, Color(self.DragonsEnergy*1.2, 155-self.DragonsEnergy/1.5, 255-self.DragonsEnergy, self.DragonsEnergy*3), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
- end
- end
- // other initialize code goes here
- if CLIENT then
- // Create a new table for every weapon instance
- self.VElements = table.FullCopy( self.VElements )
- self.WElements = table.FullCopy( self.WElements )
- self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
- self:CreateModels(self.VElements) // create viewmodels
- self:CreateModels(self.WElements) // create worldmodels
- // init view model bone build function
- if IsValid(self.Owner) then
- local vm = self.Owner:GetViewModel()
- if IsValid(vm) then
- self:ResetBonePositions(vm)
- // Init viewmodel visibility
- if (self.ShowViewModel == nil or self.ShowViewModel) then
- vm:SetColor(Color(255,255,255,255))
- else
- // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
- vm:SetColor(Color(255,255,255,1))
- // ^ stopped working in GMod 13 because you have to do Entity:SetRenderMode(1) for translucency to kick in
- // however for some reason the view model resets to render mode 0 every frame so we just apply a debug material to prevent it from drawing
- vm:SetMaterial("Debug/hsv")
- end
- end
- end
- end
- end
- function SWEP:Holster()
- timer.Remove("timer1")
- timer.Remove("timer2")
- if CLIENT and IsValid(self.Owner) then
- local vm = self.Owner:GetViewModel()
- if IsValid(vm) then
- self:ResetBonePositions(vm)
- end
- end
- return true
- end
- function SWEP:OnRemove()
- self:Holster()
- end
- if CLIENT then
- SWEP.vRenderOrder = nil
- function SWEP:ViewModelDrawn()
- local vm = self.Owner:GetViewModel()
- if !IsValid(vm) then return end
- if (!self.VElements) then return end
- self:UpdateBonePositions(vm)
- if (!self.vRenderOrder) then
- // we build a render order because sprites need to be drawn after models
- self.vRenderOrder = {}
- for k, v in pairs( self.VElements ) do
- if (v.type == "Model") then
- table.insert(self.vRenderOrder, 1, k)
- elseif (v.type == "Sprite" or v.type == "Quad") then
- table.insert(self.vRenderOrder, k)
- end
- end
- end
- for k, name in ipairs( self.vRenderOrder ) do
- local v = self.VElements[name]
- if (!v) then self.vRenderOrder = nil break end
- if (v.hide) then continue end
- local model = v.modelEnt
- local sprite = v.spriteMaterial
- if (!v.bone) then continue end
- local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
- if (!pos) then continue end
- if (v.type == "Model" and IsValid(model)) then
- model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- model:SetAngles(ang)
- //model:SetModelScale(v.size)
- local matrix = Matrix()
- matrix:Scale(v.size)
- model:EnableMatrix( "RenderMultiply", matrix )
- if (v.material == "") then
- model:SetMaterial("")
- elseif (model:GetMaterial() != v.material) then
- model:SetMaterial( v.material )
- end
- if (v.skin and v.skin != model:GetSkin()) then
- model:SetSkin(v.skin)
- end
- if (v.bodygroup) then
- for k, v in pairs( v.bodygroup ) do
- if (model:GetBodygroup(k) != v) then
- model:SetBodygroup(k, v)
- end
- end
- end
- if (v.surpresslightning) then
- render.SuppressEngineLighting(true)
- end
- render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
- render.SetBlend(v.color.a/255)
- model:DrawModel()
- render.SetBlend(1)
- render.SetColorModulation(1, 1, 1)
- if (v.surpresslightning) then
- render.SuppressEngineLighting(false)
- end
- elseif (v.type == "Sprite" and sprite) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- render.SetMaterial(sprite)
- render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
- elseif (v.type == "Quad" and v.draw_func) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- cam.Start3D2D(drawpos, ang, v.size)
- v.draw_func( self )
- cam.End3D2D()
- end
- end
- end
- SWEP.wRenderOrder = nil
- function SWEP:DrawWorldModel()
- if (self.ShowWorldModel == nil or self.ShowWorldModel) then
- self:DrawModel()
- end
- if (!self.WElements) then return end
- if (!self.wRenderOrder) then
- self.wRenderOrder = {}
- for k, v in pairs( self.WElements ) do
- if (v.type == "Model") then
- table.insert(self.wRenderOrder, 1, k)
- elseif (v.type == "Sprite" or v.type == "Quad") then
- table.insert(self.wRenderOrder, k)
- end
- end
- end
- if (IsValid(self.Owner)) then
- bone_ent = self.Owner
- else
- // when the weapon is dropped
- bone_ent = self
- end
- for k, name in pairs( self.wRenderOrder ) do
- local v = self.WElements[name]
- if (!v) then self.wRenderOrder = nil break end
- if (v.hide) then continue end
- local pos, ang
- if (v.bone) then
- pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
- else
- pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
- end
- if (!pos) then continue end
- local model = v.modelEnt
- local sprite = v.spriteMaterial
- if (v.type == "Model" and IsValid(model)) then
- model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- model:SetAngles(ang)
- //model:SetModelScale(v.size)
- local matrix = Matrix()
- matrix:Scale(v.size)
- model:EnableMatrix( "RenderMultiply", matrix )
- if (v.material == "") then
- model:SetMaterial("")
- elseif (model:GetMaterial() != v.material) then
- model:SetMaterial( v.material )
- end
- if (v.skin and v.skin != model:GetSkin()) then
- model:SetSkin(v.skin)
- end
- if (v.bodygroup) then
- for k, v in pairs( v.bodygroup ) do
- if (model:GetBodygroup(k) != v) then
- model:SetBodygroup(k, v)
- end
- end
- end
- if (v.surpresslightning) then
- render.SuppressEngineLighting(true)
- end
- render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
- render.SetBlend(v.color.a/255)
- model:DrawModel()
- render.SetBlend(1)
- render.SetColorModulation(1, 1, 1)
- if (v.surpresslightning) then
- render.SuppressEngineLighting(false)
- end
- elseif (v.type == "Sprite" and sprite) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- render.SetMaterial(sprite)
- render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
- elseif (v.type == "Quad" and v.draw_func) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- cam.Start3D2D(drawpos, ang, v.size)
- v.draw_func( self )
- cam.End3D2D()
- end
- end
- end
- function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
- local bone, pos, ang
- if (tab.rel and tab.rel != "") then
- local v = basetab[tab.rel]
- if (!v) then return end
- // Technically, if there exists an element with the same name as a bone
- // you can get in an infinite loop. Let's just hope nobody's that stupid.
- pos, ang = self:GetBoneOrientation( basetab, v, ent )
- if (!pos) then return end
- pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- else
- bone = ent:LookupBone(bone_override or tab.bone)
- if (!bone) then return end
- pos, ang = Vector(0,0,0), Angle(0,0,0)
- local m = ent:GetBoneMatrix(bone)
- if (m) then
- pos, ang = m:GetTranslation(), m:GetAngles()
- end
- if (IsValid(self.Owner) and self.Owner:IsPlayer() and
- ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
- ang.r = -ang.r // Fixes mirrored models
- end
- end
- return pos, ang
- end
- function SWEP:CreateModels( tab )
- if (!tab) then return end
- // Create the clientside models here because Garry says we can't do it in the render hook
- for k, v in pairs( tab ) do
- if (v.type == "Model" and v.model and v.model != "" and (!IsValid(v.modelEnt) or v.createdModel != v.model) and
- string.find(v.model, ".mdl") and file.Exists (v.model, "GAME") ) then
- v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
- if (IsValid(v.modelEnt)) then
- v.modelEnt:SetPos(self:GetPos())
- v.modelEnt:SetAngles(self:GetAngles())
- v.modelEnt:SetParent(self)
- v.modelEnt:SetNoDraw(true)
- v.createdModel = v.model
- else
- v.modelEnt = nil
- end
- elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
- and file.Exists ("materials/"..v.sprite..".vmt", "GAME")) then
- local name = v.sprite.."-"
- local params = { ["$basetexture"] = v.sprite }
- // make sure we create a unique name based on the selected options
- local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
- for i, j in pairs( tocheck ) do
- if (v[j]) then
- params["$"..j] = 1
- name = name.."1"
- else
- name = name.."0"
- end
- end
- v.createdSprite = v.sprite
- v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
- end
- end
- end
- local allbones
- local hasGarryFixedBoneScalingYet = false
- function SWEP:UpdateBonePositions(vm)
- if self.ViewModelBoneMods then
- if (!vm:GetBoneCount()) then return end
- // !! WORKAROUND !! //
- // We need to check all model names :/
- local loopthrough = self.ViewModelBoneMods
- if (!hasGarryFixedBoneScalingYet) then
- allbones = {}
- for i=0, vm:GetBoneCount() do
- local bonename = vm:GetBoneName(i)
- if (self.ViewModelBoneMods[bonename]) then
- allbones[bonename] = self.ViewModelBoneMods[bonename]
- else
- allbones[bonename] = {
- scale = Vector(1,1,1),
- pos = Vector(0,0,0),
- angle = Angle(0,0,0)
- }
- end
- end
- loopthrough = allbones
- end
- // !! ----------- !! //
- for k, v in pairs( loopthrough ) do
- local bone = vm:LookupBone(k)
- if (!bone) then continue end
- // !! WORKAROUND !! //
- local s = Vector(v.scale.x,v.scale.y,v.scale.z)
- local p = Vector(v.pos.x,v.pos.y,v.pos.z)
- local ms = Vector(1,1,1)
- if (!hasGarryFixedBoneScalingYet) then
- local cur = vm:GetBoneParent(bone)
- while(cur >= 0) do
- local pscale = loopthrough[vm:GetBoneName(cur)].scale
- ms = ms * pscale
- cur = vm:GetBoneParent(cur)
- end
- end
- s = s * ms
- // !! ----------- !! //
- if vm:GetManipulateBoneScale(bone) != s then
- vm:ManipulateBoneScale( bone, s )
- end
- if vm:GetManipulateBoneAngles(bone) != v.angle then
- vm:ManipulateBoneAngles( bone, v.angle )
- end
- if vm:GetManipulateBonePosition(bone) != p then
- vm:ManipulateBonePosition( bone, p )
- end
- end
- else
- self:ResetBonePositions(vm)
- end
- end
- function SWEP:ResetBonePositions(vm)
- if (!vm:GetBoneCount()) then return end
- for i=0, vm:GetBoneCount() do
- vm:ManipulateBoneScale( i, Vector(1, 1, 1) )
- vm:ManipulateBoneAngles( i, Angle(0, 0, 0) )
- vm:ManipulateBonePosition( i, Vector(0, 0, 0) )
- end
- end
- /**************************
- Global utility code
- **************************/
- // Fully copies the table, meaning all tables inside this table are copied too and so on (normal table.Copy copies only their reference).
- // Does not copy entities of course, only copies their reference.
- // WARNING: do not use on tables that contain themselves somewhere down the line or you'll get an infinite loop
- function table.FullCopy( tab )
- if (!tab) then return nil end
- local res = {}
- for k, v in pairs( tab ) do
- if (type(v) == "table") then
- res[k] = table.FullCopy(v) // recursion ho!
- elseif (type(v) == "Vector") then
- res[k] = Vector(v.x, v.y, v.z)
- elseif (type(v) == "Angle") then
- res[k] = Angle(v.p, v.y, v.r)
- else
- res[k] = v
- end
- end
- return res
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement