Error in Code Please Help

I’m getting this error, anyone know why (I’m not too experienced with lua :P)?:


[ERROR] [ERROR] gamemodes/terrortown/entities/weapons/weapon_zm_improvised/shared.lua:273: attempt to index global 'SWEP' (a nil value)
  1. unknown - gamemodes/terrortown/entities/weapons/weapon_zm_improvised/shared.lua:273
   2. Give - [C]:-1
    3. GiveLoadoutWeapons - gamemodes/terrortown/gamemode/weaponry.lua:69
     4. Call - gamemodes/terrortown/gamemode/weaponry.lua:166
      5. unknown - gamemodes/terrortown/gamemode/player.lua:83

Here is my lua for weapon_zm_improvise:



if SERVER then
   AddCSLuaFile( "shared.lua" )
   
end

SWEP.HoldType			= "melee"

if CLIENT then
   SWEP.PrintName			= "Diamond Minecraft Sword"

   SWEP.Slot				= 0

   SWEP.Icon = "VGUI/ttt/icon_cbar"   
   SWEP.ViewModelFOV = 70
end

SWEP.UseHands			= true
SWEP.Base				= "weapon_tttbase"
SWEP.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
SWEP.WorldModel			= "models/weapons/w_iron_mc_sword.mdl"
SWEP.Weight			= 5
SWEP.DrawCrosshair		= false
SWEP.ViewModelFlip		= false
SWEP.Primary.Damage = 20
SWEP.Primary.ClipSize		= -1
SWEP.Primary.DefaultClip	= -1
SWEP.Primary.Automatic		= true
SWEP.Primary.Delay = 0.5
SWEP.Primary.Ammo		= "none"
SWEP.Secondary.ClipSize		= -1
SWEP.Secondary.DefaultClip	= -1
SWEP.Secondary.Automatic	= true
SWEP.Secondary.Ammo		= "none"
SWEP.Secondary.Delay = 5

SWEP.Kind = WEAPON_MELEE
SWEP.WeaponID = AMMO_CROWBAR

SWEP.InLoadoutFor = {ROLE_INNOCENT, ROLE_TRAITOR, ROLE_DETECTIVE}

SWEP.NoSights = true
SWEP.IsSilent = true

SWEP.AutoSpawnable = false

SWEP.AllowDelete = false -- never removed for weapon reduction
SWEP.AllowDrop = false

local sound_single = Sound("Weapon_Crowbar.Single")
local sound_open = Sound("DoorHandles.Unlocked3")

if SERVER then
   CreateConVar("ttt_crowbar_unlocks", "1", FCVAR_ARCHIVE)
   CreateConVar("ttt_crowbar_pushforce", "395", FCVAR_NOTIFY)
end

-- only open things that have a name (and are therefore likely to be meant to
-- open) and are the right class. Opening behaviour also differs per class, so
-- return one of the OPEN_ values
local function OpenableEnt(ent)
   local cls = ent:GetClass()
   if ent:GetName() == "" then
      return OPEN_NO
   elseif cls == "prop_door_rotating" then
      return OPEN_ROT
   elseif cls == "func_door" or cls == "func_door_rotating" then
      return OPEN_DOOR
   elseif cls == "func_button" then
      return OPEN_BUT
   elseif cls == "func_movelinear" then
      return OPEN_NOTOGGLE
   else
      return OPEN_NO
   end
end


local function CrowbarCanUnlock(t)
   return not GAMEMODE.crowbar_unlocks or GAMEMODE.crowbar_unlocks[t]
end

-- will open door AND return what it did
function SWEP:OpenEnt(hitEnt)
   -- Get ready for some prototype-quality code, all ye who read this
   if SERVER and GetConVar("ttt_crowbar_unlocks"):GetBool() then
      local openable = OpenableEnt(hitEnt)

      if openable == OPEN_DOOR or openable == OPEN_ROT then
         local unlock = CrowbarCanUnlock(openable)
         if unlock then
            hitEnt:Fire("Unlock", nil, 0)
         end

         if unlock or hitEnt:HasSpawnFlags(256) then
            if openable == OPEN_ROT then
               hitEnt:Fire("OpenAwayFrom", self.Owner, 0)
            end
            hitEnt:Fire("Toggle", nil, 0)
         else
            return OPEN_NO
         end
      elseif openable == OPEN_BUT then
         if CrowbarCanUnlock(openable) then
            hitEnt:Fire("Unlock", nil, 0)
            hitEnt:Fire("Press", nil, 0)
         else
            return OPEN_NO
         end
      elseif openable == OPEN_NOTOGGLE then
         if CrowbarCanUnlock(openable) then
            hitEnt:Fire("Open", nil, 0)
         else
            return OPEN_NO
         end
      end
      return openable
   else
      return OPEN_NO
   end
end

function SWEP:PrimaryAttack()
   self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )

   if not IsValid(self.Owner) then return end

   if self.Owner.LagCompensation then -- for some reason not always true
      self.Owner:LagCompensation(true)
   end

   local spos = self.Owner:GetShootPos()
   local sdest = spos + (self.Owner:GetAimVector() * 70)

   local tr_main = util.TraceLine({start=spos, endpos=sdest, filter=self.Owner, mask=MASK_SHOT_HULL})
   local hitEnt = tr_main.Entity

   self.Weapon:EmitSound(sound_single)

   if IsValid(hitEnt) or tr_main.HitWorld then
      self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )

      if not (CLIENT and (not IsFirstTimePredicted())) then
         local edata = EffectData()
         edata:SetStart(spos)
         edata:SetOrigin(tr_main.HitPos)
         edata:SetNormal(tr_main.Normal)

         --edata:SetSurfaceProp(tr_main.MatType)
         --edata:SetDamageType(DMG_CLUB)
         edata:SetEntity(hitEnt)

         if hitEnt:IsPlayer() or hitEnt:GetClass() == "prop_ragdoll" then
            util.Effect("BloodImpact", edata)

            -- does not work on players rah
            --util.Decal("Blood", tr_main.HitPos + tr_main.HitNormal, tr_main.HitPos - tr_main.HitNormal)

            -- do a bullet just to make blood decals work sanely
            -- need to disable lagcomp because firebullets does its own
            self.Owner:LagCompensation(false)
            self.Owner:FireBullets({Num=1, Src=spos, Dir=self.Owner:GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=0})
         else
            util.Effect("Impact", edata)
         end
      end
   else
      self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER )
   end


   if CLIENT then
      -- used to be some shit here
   else -- SERVER

      -- Do another trace that sees nodraw stuff like func_button
      local tr_all = nil
      tr_all = util.TraceLine({start=spos, endpos=sdest, filter=self.Owner})
      
      self.Owner:SetAnimation( PLAYER_ATTACK1 )

      if hitEnt and hitEnt:IsValid() then
         if self:OpenEnt(hitEnt) == OPEN_NO and tr_all.Entity and tr_all.Entity:IsValid() then
            -- See if there's a nodraw thing we should open
            self:OpenEnt(tr_all.Entity)
         end

         local dmg = DamageInfo()
         dmg:SetDamage(self.Primary.Damage)
         dmg:SetAttacker(self.Owner)
         dmg:SetInflictor(self.Weapon)
         dmg:SetDamageForce(self.Owner:GetAimVector() * 1500)
         dmg:SetDamagePosition(self.Owner:GetPos())
         dmg:SetDamageType(DMG_CLUB)

         hitEnt:DispatchTraceAttack(dmg, spos + (self.Owner:GetAimVector() * 3), sdest)

--         self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )         

--         self.Owner:TraceHullAttack(spos, sdest, Vector(-16,-16,-16), Vector(16,16,16), 30, DMG_CLUB, 11, true)
--         self.Owner:FireBullets({Num=1, Src=spos, Dir=self.Owner:GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=20})
      
      else
--         if tr_main.HitWorld then
--            self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )
--         else
--            self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER )
--         end

         -- See if our nodraw trace got the goods
         if tr_all.Entity and tr_all.Entity:IsValid() then
            self:OpenEnt(tr_all.Entity)
         end
      end
   end

   if self.Owner.LagCompensation then
      self.Owner:LagCompensation(false)
   end
end

function SWEP:SecondaryAttack()
   self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
   self.Weapon:SetNextSecondaryFire( CurTime() + 0.1 )

   local tr = self.Owner:GetEyeTrace(MASK_SHOT)

   if tr.Hit and IsValid(tr.Entity) and tr.Entity:IsPlayer() and (self.Owner:EyePos() - tr.HitPos):Length() < 100 then
      local ply = tr.Entity

      if SERVER and (not ply:IsFrozen()) then
         local pushvel = tr.Normal * GetConVar("ttt_crowbar_pushforce"):GetFloat()

         -- limit the upward force to prevent launching
         pushvel.z = math.Clamp(pushvel.z, 50, 100)

         ply:SetVelocity(ply:GetVelocity() + pushvel)
         self.Owner:SetAnimation( PLAYER_ATTACK1 )

         ply.was_pushed = {att=self.Owner, t=CurTime()} --, infl=self}
      end

      self.Weapon:EmitSound(sound_single)      
      self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )

      self.Weapon:SetNextSecondaryFire( CurTime() + self.Secondary.Delay )
   end
end

function SWEP:GetClass()
	return "weapon_zm_improvised"
end

function SWEP:OnDrop()
	self:Remove()
end

function SWEP:Equip(ply)
   if ply:IsUserGroup("premium") then
      SWEP.ViewModel			= "models/weapons/v_gold_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_gold_mc_sword.mdl"
   else
      SWEP.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_iron_mc_sword.mdl"
   end
end

function SWEP:Equip(ply)
   if ply:IsUserGroup("admin") or ply:IsUserGroup("superadmin") then
      SWEP.ViewModel			= "models/weapons/v_diamond_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_diamond_mc_sword.mdl"
   else
      SWEP.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_iron_mc_sword.mdl"
   end
end




function SWEP:Equip(ply)
   if ply:IsUserGroup("premium") then
      SWEP.ViewModel			= "models/weapons/v_gold_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_gold_mc_sword.mdl"
   else
      SWEP.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_iron_mc_sword.mdl"
   end
end

Replace SWEP with self inside a SWEP:* hook.

How would I go about doing that? (LUA Noobie Sorry :()

Inside the function, highlight the first instance of SWEP.
Press delete or backspace.
Type “self” (without quotes).
Repeat for next instance of SWEP inside a function

Does this look correct?


function SWEP:Equip(ply)
   if ply:IsUserGroup("premium") then
      self.ViewModel			= "models/weapons/v_gold_mc_sword.mdl"
      self.WorldModel	   = "models/weapons/w_gold_mc_sword.mdl"
   else
      self.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
      self.WorldModel	   = "models/weapons/w_iron_mc_sword.mdl"
   end
end

or


function SWEP:Equip(ply)
   if ply:IsUserGroup("premium") then
      self.ViewModel			= "models/weapons/v_gold_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_gold_mc_sword.mdl"
   else
      SWEP.ViewModel			= "models/weapons/v_iron_mc_sword.mdl"
      SWEP.WorldModel	   = "models/weapons/w_iron_mc_sword.mdl"
   end
end

Just fucking put in the code and launch the game, try both, see which ones works. Is this really something supernatural to ask for? If you don’t know how to code, learn how to do it FIRST. There are hundreds of tutorials all around the Internet.

One of them follows step 4, one of them doesn’t. I’m sure you can work it out.

Okay, seems to have fixed it, thanks. Admin users have a separate crowbar, but for both ‘User’ and ‘Premium’ their model is uncoloured (plain black, they should have separate coloured ones as well); think it’s something wrong with the actual files?

Edit: Found out that there’s something with the files.