Beginner Question about creating UI

So, I am trying to create a weapon that shoots various objects at high velocities. I want to be able to change what item you are shooting by pasting the model into the context menu, but when I run my code I get this error:


[ERROR] addons/chairlauncher/lua/weapons/chairgungui.lua:44: attempt to index upvalue 'frameUI' (a nil value)
  1. Call - addons/chairlauncher/lua/weapons/chairgungui.lua:44
   2. unknown - gamemodes/base/gamemode/cl_spawnmenu.lua:63
    3. unknown - lua/includes/modules/concommand.lua:54

Here is my source



local ply = LocalPlayer()
local frameExists = false

function ChairGunUI()
	//Creates a canvas to work on
	local Frame = vgui.Create("DFrame")
	frameExists = true
	Frame:SetPos(1920, 1080)
	Frame:SetSize(300,150)
	Frame:SetTitle("Chairgun Settings")
	Frame:SetVisible(true)
	Frame:SetDraggable(false)
	Frame:ShowCloseButton(false)
	Frame:MakePopup()
	Frame:SetKeyboardInputEnabled(true)
	Frame:SetMouseInputEnabled(true)

	Frame:SetKeyboardInputEnabled(false)
	Frame:SetMouseInputEnabled(false)

	
	/*Textbox for choosing your model */
	local ModelNameInput = vgui.Create("DTextEntry", Frame)
	ModelNameInput:SetPos(25, 50)
	ModelNameInput:SetSize(75,85)
	ModelNameInput:SetText(ShootModel)
	ModelNameInput.OnEnter = function(self)
		ShootModel = self:GetValue()
	end
end

function GAMEMODE:OnContextMenuOpen()
	print( ply:GetActiveWeapon():GetClass() ) //Checking to make sure the hook works. It does :D
	if ((ply:GetActiveWeapon():GetClass() == 'chairgun') && (!frameExists)) then
		ChairGunUI()
	end
	else if ((ply:GetActiveWeapon():GetClass() == 'chairgun')) && (frameExists) then
			Frame:Show()
	end
end

function GAMEMODE:OnContextMenuClose()
	Frame:Hide()
end

You have ‘local’ in front of the frame, so it only exists inside the function. Either change that, or create a function within ChairGunUI() that hides/removes it

Okay, so I changed a lot in my code. I found it works much better when I use a chat command to open up the GUI. Problem is, the GUI code is running serverside, not clientside and I have no idea how to fix this. Here is my code now:




SWEP.PrintName		= "Chair Gun"
SWEP.Author			= "Kim Jong Bitch"
SWEP.Instructions	= "LMB: Single fire, RMB: Automatic"

//Spawn Info
SWEP.Spawnable 	= true
SWEP.AdminOnly = false

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

SWEP.Weight	= 5
SWEP.AutoSwitchTo	= true
SWEP.AutoSwitchFrom	= true

SWEP.Slot		= 1
SWEP.SlotPos	= 1
SWEP.DrawAmmo	= false
SWEP.DrawCrosshair	= true

//models
SWEP.ViewModel	= "models/weapons/v_pistol.mdl"
SWEP.WorldModel	= "models/weapons/w_pistol.mdl"
//The Model to shoot with. !!THIS IS A GLOBAL VARIABLE!!
ShootModel = "models/props_combine/combine_train02a.mdl"

//Precache Sounds - Experiment with this
local ShootSound = Sound("Metal.SawBladeStick")

function SWEP:PrimaryAttack()
	//Rate of fire
	self.Weapon:SetNextPrimaryFire( CurTime() + 0.5 )
	
	//Call 'ThrowChair'
	self:ThrowModel( ShootModel )
end

function SWEP:SecondaryAttack()
	self:ThrowModel( ShootModel )
	self.Weapon:SetNextSecondaryFire( CurTime() + 0.1)
end

function SWEP:ThrowModel( model_file )
	self:EmitSound( ShootSound ) //Play Precached Sounds
	
	if ( CLIENT ) then return end //If you are the client then STOP
	
	//Creates prop_physics entity
	--local ent = ents.Create( "prop_ragdoll" )
	local ent = ents.Create( "prop_physics" )
	//Set the entity's model_file
	ent:SetModel( model_file )
	
	//Set ent spawn pos
	ent:SetPos( self.Owner:EyePos() + (self.Owner:GetAimVector() * 16) )
	ent:SetAngles( self.Owner:EyeAngles() )
	ent:Spawn()	
	
	//Get Physics obj
	local phys = ent:GetPhysicsObject()
	if ( !IsValid( phys ) ) then ent:Remove() return end
	
	//Apply Force
	local velocity = self.Owner:GetAimVector()
	velocity = velocity * 100000000
	velocity = velocity + ( VectorRand() * 10 ) --Random element?
	phys:ApplyForceCenter( velocity )
	
	//Undo list
	cleanup.Add( self.Owner, "props", ent )
	undo.Create( "that_fucking_bitch." )
		undo.AddEntity( ent )
		undo.SetPlayer( self.Owner )
	undo.Finish()
	
	//Prevents the game from getting overwhelmed by props
end

/*GUI Elements*/
function ChairGunUI()
	//Creates a canvas to work on
	print(CLIENT)
	local ChairGunMenu = vgui.Create("DFrame")
	ChairGunMenu:SetPos(1920, 1080)
	ChairGunMenu:SetSize(300,150)
	ChairGunMenu:SetTitle("Chairgun Settings")
	ChairGunMenu:SetVisible(true)
	ChairGunMenu:SetDraggable(true)
	ChairGunMenu:ShowCloseButton(true)
	ChairGunMenu:MakePopup()
	
	
	/*Textbox for choosing your model */
	local ModelNameInput = vgui.Create("DTextEntry", ChairGunMenu)
	ModelNameInput:SetPos(25, 50)
	ModelNameInput:SetSize(75,85)
	ModelNameInput:SetText(ShootModel)
	ModelNameInput.OnEnter = function(self)
		ShootModel = self:GetValue()
	end
end

hook.Add( "PlayerSay", "/chairgunmenu", ChairGunUI)

Did you try putting AddCSLuaFile() at the start (sends the file to the client)?