Error with Weapon on TTT

My Co Owner is trying to add a weapon to TTT and he is getting this error he doesnt understand and neither do I. any help?


 [ERROR] gamemodes/terrortown/entities/weapons/weapon_ttt_fa-6/shared.lua:134: Tried to use a NULL entity!
  1. SetColor - [C]:-1
   2. unknown - gamemodes/terrortown/entities/weapons/weapon_ttt_fa-6/shared.lua:134


[

Here is the code for the weapon:


 
 
if ( CLIENT ) then
 
  SWEP.PrintName = "Bianchi FA-6";
   SWEP.Slot = 4;
   SWEP.SlotPos = 1;
   SWEP.DrawAmmo = true;
   SWEP.DrawCrosshair = false;
  SWEP.Category = "Babel Industries"
   SWEP.Author = "Chris (Model by DeadPixel, Animations by KingFriday)";
   SWEP.Contact = "Babel Industries";
   SWEP.Purpose = "";
   SWEP.Instructions = ""
   SWEP.WepSelectIcon        = surface.GetTextureID("vgui/entities/weapon_bianchi")
 
SWEP.WElements = {
        ["element_name"] = { type = "Model", model = "models/weapons/w_bach_m249para.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(4.622, 0.256, 0.063), angle = Angle(-9.181, -1.231, 180), size = Vector(0.5, 0.5, 0.5), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
}
 
end
 
// Use the same holdtype that you used for your design
SWEP.Base               = "weapon_mad_base"
 
 
SWEP.Spawnable                  = false
SWEP.AdminSpawnable             = true
 
SWEP.HoldType = "ar2"
SWEP.ViewModelFOV = 70
SWEP.ViewModelFlip = false
SWEP.ViewModel = "models/weapons/v_bach_m249para.mdl"
SWEP.WorldModel = "models/weapons/w_irifle.mdl"
SWEP.ShowViewModel = true
SWEP.ShowWorldModel = true
SWEP.ViewModelBoneMods = {}
 
SWEP.IronSightsPos = Vector(-4.572, -4.115, 2.24)
SWEP.IronSightsAng = Vector(0, 0, 0)
 
SWEP.RunArmOffset  = Vector(0.381, -1.566, 2.055)
SWEP.RunArmAngle   = Vector(-16.241, 39.08, 0)
 
 
SWEP.Secondary.ClipSize         = -1                                    // Size of a clip
SWEP.Secondary.DefaultClip      = -1                                    // Default number of bullets in a clip
SWEP.Secondary.Automatic        = false                         // Automatic/Semi Auto
SWEP.Secondary.Ammo             = "none"
 
 
SWEP.Pistol                             = false
SWEP.Rifle                              = false
SWEP.Shotgun                    = false
SWEP.Sniper                             = true
  SWEP.NextPrimaryAttack = 1
 
SWEP.Base = "weapon_tttbase"
SWEP.AutoSpawnable = false
SWEP.AmmoEnt = "item_ammo_smg1_ttt"
SWEP.InLoadoutFor = nil
SWEP.AllowDrop = true
SWEP.IsSilent = false
SWEP.NoSights = false
 
function SWEP:Reload()
        if !( ( self.Weapon:Clip1() ) < ( self.Primary.ClipSize ) ) then return end
        self.Weapon:DefaultReload( ACT_VM_RELOAD )
        self:EmitSound( "weapons/Bianachi/bian-reload3.wav" )
       
end
 
 
function SWEP:Deploy()
    self.Weapon:SendWeaponAnim( ACT_VM_DRAW )
 
        self.Owner:EmitSound( "weapons/Bianachi/mach_parts2.wav" ) ;
       
        return true;
end
 
 
SWEP.Primary.Sound              = Sound("weapons/Bianachi/bian-2.wav")  
SWEP.Primary.Recoil             = .07
SWEP.Primary.Damage             = 20
SWEP.Primary.NumShots   = 1
SWEP.Primary.Cone           = 0.02
SWEP.Primary.Delay              = .10
SWEP.Primary.Force      = 130;
 
SWEP.Primary.ClipSize           = 150                                   // Size of a clip
SWEP.Primary.DefaultClip        = 450           // Default number of bullets in a clip
SWEP.Primary.Automatic          = true                          // Automatic/Semi Auto
SWEP.Primary.Ammo                       = "smg1"
 
SWEP.Secondary.ClipSize         = -1                                    // Size of a clip
SWEP.Secondary.DefaultClip      = -1                                    // Default number of bullets in a clip
SWEP.Secondary.Automatic        = false                         // Automatic/Semi Auto
SWEP.Secondary.Ammo             = "none"
 
 
SWEP.Pistol                             = false
SWEP.Rifle                              = false
SWEP.Shotgun                    = false
SWEP.Sniper                             = true
 
 
 
 
 
 
 
function SWEP:Initialize()
 
        // 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
                local vm = self.Owner:GetViewModel()
                if IsValid(vm) then
                        self:ResetBonePositions(vm)
                end
               
                // 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
 
function SWEP:Holster()
       
        if CLIENT then
                local vm = self.Owner:GetViewModel()
                if IsValid(vm) then
                        self:ResetBonePositions(vm)
                end
        end
       
        return true
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


Who wrote this code… Blurgh.

[lua]if (self.ShowViewModel == nil or self.ShowViewModel) then [/lua]

Anyway, you can stop these errors by surrounding your vm:SetColor(…) statement in an IsValid(vm) check like so:

[lua]
if not vm:IsValid() then return end – add this line
if (self.ShowViewModel == nil or self.ShowViewModel) then
vm:SetColor(Color(255,255,255,255))
else
– … you get the idea.
[/lua]

First of all - If you want anyweapon to work on TTT you have to change
SWEP.Base = “weapon_mad_base” to “weapon_tttbase”
And I think that all for you, because you get stuck on so easy thing. If you cant code, dont try to recode weapon. Try to change if that wouldn’t work wait for another good guy who will make it for you, for today is enough for me.
But if you are really try hard, just add to weapon_mad_base line SWEP.Base = “weapon_tttbase” and can cause many errors, but w/e

[editline]19th October 2013[/editline]

I think that’s weapon made in SWEP Construction kit, this weapon public realised in WorkShop works well, this guy wants this on TTT w/o changing simple SWEP.Base :smiley:

on that statement i also have the error
[ERROR] gamemodes/terrortown/entities/weapons/weapon_ttt_fa-6/shared.lua:150: attempt to call method ‘GetViewModel’ (a nil value)

  1. unknown - gamemodes/terrortown/entities/weapons/weapon_ttt_fa-6/shared.lua:150

Listen this SWEP isn’t designed for TTT at all, as the guy before you posted the bases mismatch. It’ll be incredibly difficult for you to try and convert this by yourself with the little coding knowledge you have.
So I really suggest asking a friend who know some more about coding to convert it for you, otherwise we’re going to have several pages of spoon feeding and misunderstandings.

the model works extremely well just using the base conversion code this just two errors. The one i stated secondly rarely creates an issue i also am not an idiot and as such would like not to be treated as such.

Listen to these guys. They know more than you. You’re trying to do something that wasn’t meant to be done, and we don’t want to spoonfeed you code, or help you with every single one of the hundreds of problems you’re going to have.

Give this a whirl.

He updated it and it works using this thread so thanks guys!