Advertisement
Guest User

modelchange.lua

a guest
Jun 23rd, 2012
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.32 KB | None | 0 0
  1.      /**************************************************
  2.     SWEP Construction Kit base code
  3.         Created by Clavus
  4.     Available for public use, thread at:
  5.        facepunch.com/threads/1032378
  6. **************************************************/
  7.  
  8. /*
  9.  
  10. function SWEP:Initialize()
  11.  self:SetWeaponHoldType(self.HoldType)
  12.     // other initialize code goes here
  13.  
  14.     if CLIENT then
  15.      
  16.         self:CreateModels(self.VElements) // create viewmodels
  17.         self:CreateModels(self.WElements) // create worldmodels
  18.          
  19.         // init view model bone build function
  20.         self.BuildViewModelBones = function( s )
  21.             if LocalPlayer():GetActiveWeapon() == self and self.ViewModelBonescales then
  22.                 for k, v in pairs( self.ViewModelBonescales ) do
  23.                     local bone = s:LookupBone(k)
  24.                     if (!bone) then continue end
  25.                     local m = s:GetBoneMatrix(bone)
  26.                     if (!m) then continue end
  27.                     m:Scale(v)
  28.                     s:SetBoneMatrix(bone, m)
  29.                 end
  30.             end
  31.         end
  32.          
  33.     end
  34.  
  35. end
  36.  
  37.  
  38. function SWEP:OnRemove()
  39.      
  40.     // other onremove code goes here
  41.      
  42.     if CLIENT then
  43.         self:RemoveModels()
  44.     end
  45.      
  46. end
  47.  
  48. */
  49.  
  50. if CLIENT then
  51.  
  52.     SWEP.vRenderOrder = nil
  53.     function SWEP:ViewModelDrawn()
  54.          
  55.         local vm = self.Owner:GetViewModel()
  56.         if !ValidEntity(vm) then return end
  57.          
  58.         if (!self.VElements) then return end
  59.          
  60.         if vm.BuildBonePositions ~= self.BuildViewModelBones then
  61.             vm.BuildBonePositions = self.BuildViewModelBones
  62.         end
  63.  
  64.         if (self.ShowViewModel == nil or self.ShowViewModel) then
  65.             vm:SetColor(255,255,255,255)
  66.         else
  67.             // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
  68.             vm:SetColor(255,255,255,1)
  69.         end
  70.          
  71.         if (!self.vRenderOrder) then
  72.              
  73.             // we build a render order because sprites need to be drawn after models
  74.             self.vRenderOrder = {}
  75.  
  76.             for k, v in pairs( self.VElements ) do
  77.                 if (v.type == "Model") then
  78.                     table.insert(self.vRenderOrder, 1, k)
  79.                 elseif (v.type == "Sprite" or v.type == "Quad") then
  80.                     table.insert(self.vRenderOrder, k)
  81.                 end
  82.             end
  83.              
  84.         end
  85.  
  86.         for k, name in ipairs( self.vRenderOrder ) do
  87.          
  88.             local v = self.VElements[name]
  89.             if (!v) then self.vRenderOrder = nil break end
  90.          
  91.             local model = v.modelEnt
  92.             local sprite = v.spriteMaterial
  93.              
  94.             if (!v.bone) then continue end
  95.             local bone = vm:LookupBone(v.bone)
  96.             if (!bone) then continue end
  97.              
  98.             local pos, ang = Vector(0,0,0), Angle(0,0,0)
  99.             local m = vm:GetBoneMatrix(bone)
  100.             if (m) then
  101.                 pos, ang = m:GetTranslation(), m:GetAngle()
  102.             end
  103.              
  104.             if (self.ViewModelFlip) then
  105.                 ang.r = -ang.r // Fixes mirrored models
  106.             end
  107.              
  108.             if (v.type == "Model" and ValidEntity(model)) then
  109.  
  110.                 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  111.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  112.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  113.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  114.  
  115.                 model:SetAngles(ang)
  116.                 model:SetModelScale(v.size)
  117.                  
  118.                 if (v.material == "") then
  119.                     model:SetMaterial("")
  120.                 elseif (model:GetMaterial() != v.material) then
  121.                     model:SetMaterial( v.material )
  122.                 end
  123.                  
  124.                 if (v.skin and v.skin != model:GetSkin()) then
  125.                     model:SetSkin(v.skin)
  126.                 end
  127.                  
  128.                 if (v.bodygroup) then
  129.                     for k, v in pairs( v.bodygroup ) do
  130.                         if (model:GetBodygroup(k) != v) then
  131.                             model:SetBodygroup(k, v)
  132.                         end
  133.                     end
  134.                 end
  135.                  
  136.                 if (v.surpresslightning) then
  137.                     render.SuppressEngineLighting(true)
  138.                 end
  139.                  
  140.                 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  141.                 render.SetBlend(v.color.a/255)
  142.                 model:DrawModel()
  143.                 render.SetBlend(1)
  144.                 render.SetColorModulation(1, 1, 1)
  145.                  
  146.                 if (v.surpresslightning) then
  147.                     render.SuppressEngineLighting(false)
  148.                 end
  149.                  
  150.             elseif (v.type == "Sprite" and sprite) then
  151.                  
  152.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  153.                 render.SetMaterial(sprite)
  154.                 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  155.                  
  156.             elseif (v.type == "Quad" and v.draw_func) then
  157.                  
  158.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  159.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  160.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  161.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  162.                  
  163.                 cam.Start3D2D(drawpos, ang, v.size)
  164.                     v.draw_func( self )
  165.                 cam.End3D2D()
  166.  
  167.             end
  168.              
  169.         end
  170.          
  171.     end
  172.  
  173.     SWEP.wRenderOrder = nil
  174.     function SWEP:DrawWorldModel()
  175.          
  176.         if (self.ShowWorldModel == nil or self.ShowWorldModel) then
  177.             self:DrawModel()
  178.         end
  179.          
  180.         if (!self.WElements) then return end
  181.          
  182.         if (!self.wRenderOrder) then
  183.  
  184.             self.wRenderOrder = {}
  185.  
  186.             for k, v in pairs( self.WElements ) do
  187.                 if (v.type == "Model") then
  188.                     table.insert(self.wRenderOrder, 1, k)
  189.                 elseif (v.type == "Sprite" or v.type == "Quad") then
  190.                     table.insert(self.wRenderOrder, k)
  191.                 end
  192.             end
  193.  
  194.         end
  195.          
  196.         local opos, oang = self:GetPos(), self:GetAngles()
  197.         local bone_ent
  198.  
  199.         if (ValidEntity(self.Owner)) then
  200.             bone_ent = self.Owner
  201.         else
  202.             // when the weapon is dropped
  203.             bone_ent = self
  204.         end
  205.          
  206.         local bone = bone_ent:LookupBone("ValveBiped.Bip01_R_Hand")
  207.         if (bone) then
  208.             local m = bone_ent:GetBoneMatrix(bone)
  209.             if (m) then
  210.                 opos, oang = m:GetTranslation(), m:GetAngle()
  211.             end
  212.         end
  213.          
  214.         for k, name in pairs( self.wRenderOrder ) do
  215.          
  216.             local v = self.WElements[name]
  217.             if (!v) then self.wRenderOrder = nil break end
  218.          
  219.             local model = v.modelEnt
  220.             local sprite = v.spriteMaterial
  221.  
  222.             local pos, ang = Vector(opos.x, opos.y, opos.z), Angle(oang.p, oang.y, oang.r)
  223.  
  224.             if (v.type == "Model" and ValidEntity(model)) then
  225.  
  226.                 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  227.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  228.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  229.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  230.  
  231.                 model:SetAngles(ang)
  232.                 model:SetModelScale(v.size)
  233.                  
  234.                 if (v.material == "") then
  235.                     model:SetMaterial("")
  236.                 elseif (model:GetMaterial() != v.material) then
  237.                     model:SetMaterial( v.material )
  238.                 end
  239.                  
  240.                 if (v.skin and v.skin != model:GetSkin()) then
  241.                     model:SetSkin(v.skin)
  242.                 end
  243.                  
  244.                 if (v.bodygroup) then
  245.                     for k, v in pairs( v.bodygroup ) do
  246.                         if (model:GetBodygroup(k) != v) then
  247.                             model:SetBodygroup(k, v)
  248.                         end
  249.                     end
  250.                 end
  251.                  
  252.                 if (v.surpresslightning) then
  253.                     render.SuppressEngineLighting(true)
  254.                 end
  255.                  
  256.                 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  257.                 render.SetBlend(v.color.a/255)
  258.                 model:DrawModel()
  259.                 render.SetBlend(1)
  260.                 render.SetColorModulation(1, 1, 1)
  261.                  
  262.                 if (v.surpresslightning) then
  263.                     render.SuppressEngineLighting(false)
  264.                 end
  265.                  
  266.             elseif (v.type == "Sprite" and sprite) then
  267.                  
  268.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  269.                 render.SetMaterial(sprite)
  270.                 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  271.                  
  272.             elseif (v.type == "Quad" and v.draw_func) then
  273.                  
  274.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  275.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  276.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  277.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  278.                  
  279.                 cam.Start3D2D(drawpos, ang, v.size)
  280.                     v.draw_func( self )
  281.                 cam.End3D2D()
  282.  
  283.             end
  284.              
  285.         end
  286.          
  287.     end
  288.  
  289.     function SWEP:CreateModels( tab )
  290.  
  291.         if (!tab) then return end
  292.  
  293.         // Create the clientside models here because Garry says we can't do it in the render hook
  294.        for k, v in pairs( tab ) do
  295.            if (v.type == "Model" and v.model and v.model != "" and (!ValidEntity(v.modelEnt) or v.createdModel != v.model) and
  296.                    string.find(v.model, ".mdl") and file.Exists ("../"..v.model) ) then
  297.                
  298.                v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  299.                if (ValidEntity(v.modelEnt)) then
  300.                    v.modelEnt:SetPos(self:GetPos())
  301.                    v.modelEnt:SetAngles(self:GetAngles())
  302.                    v.modelEnt:SetParent(self)
  303.                    v.modelEnt:SetNoDraw(true)
  304.                    v.createdModel = v.model
  305.                else
  306.                    v.modelEnt = nil
  307.                end
  308.                
  309.            elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
  310.                and file.Exists ("../materials/"..v.sprite..".vmt")) then
  311.                
  312.                local name = v.sprite.."-"
  313.                local params = { ["$basetexture"] = v.sprite }
  314.                // make sure we create a unique name based on the selected options
  315.                local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
  316.                for i, j in pairs( tocheck ) do
  317.                    if (v[j]) then
  318.                        params["$"..j] = 1
  319.                        name = name.."1"
  320.                    else
  321.                        name = name.."0"
  322.                    end
  323.                end
  324.  
  325.                v.createdSprite = v.sprite
  326.                v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
  327.                
  328.            end
  329.        end
  330.        
  331.    end
  332.  
  333.    function SWEP:RemoveModels()
  334.        if (self.VElements) then
  335.            for k, v in pairs( self.VElements ) do
  336.                if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  337.            end
  338.        end
  339.        if (self.WElements) then
  340.            for k, v in pairs( self.WElements ) do
  341.                if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  342.            end
  343.        end
  344.        self.VElements = nil
  345.        self.WElements = nil
  346.    end
  347.  
  348. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement