A Small Derma/Player Kick Issue

Hey all. I’ll keep this brief and as informative as possible.

I’m having an issue with making it so that when I want to kick a player (actually, in this case a bot, same thing :stuck_out_tongue: ), it occurs with an error. I’ve tried to work around it, but I lack the knowledge to do so. :frowning:

So, here’s my error…:


[@lua\dermapanel.lua:48] bad argument #1 to 'pairs' (table expected, got string)

Here’s my code…:

[LUA]
–local PlayerCollect
– for k, v in pairs(player.GetAll) do

local DermaBase = vgui.Create(“DFrame”)
DermaBase:SetPos( ScrW() / 33.5, ScrH() / 26.3 )
DermaBase:SetSize( 430, 369 )
DermaBase:SetTitle(“BACONLUL”)
DermaBase:SetVisible( true )
DermaBase:SetDraggable( false )
DermaBase:SetBackgroundBlur( true )
DermaBase:MakePopup()

local DermaBasePanel = vgui.Create("DPanel", DermaBase)
DermaBasePanel:SetPos( 5, 27 )
DermaBasePanel:SetSize( 420, 297 )
DermaBasePanel:SetVisible( true )

local DermaBasePanelTextEnt1 = vgui.Create("DTextEntry", DermaBasePanel)
DermaBasePanelTextEnt1:SetPos( 10, 10 )
DermaBasePanelTextEnt1:SetSize( 335, 20 )
DermaBasePanelTextEnt1:SetVisible( true )
DermaBasePanelTextEnt1:SetMultiline( false )

local DermaBasePanelTextBut1 = vgui.Create("DButton", DermaBasePanel)
DermaBasePanelTextBut1:SetPos( 350, 10 )
DermaBasePanelTextBut1:SetSize( 60, 20 )
DermaBasePanelTextBut1:SetText( "Enter" )
DermaBasePanelTextBut1:SetVisible( true )
DermaBasePanelTextBut1.DoClick = function()
	Msg(DermaBasePanelTextEnt1:GetValue().."

")
DermaBase:Close()
end

local DermaBaseCombo1 = vgui.Create("DComboBox", DermaBasePanel)
DermaBaseCombo1:SetPos( 10, 45 )
DermaBaseCombo1:SetSize( 140, 235 )
DermaBaseCombo1:SetVisible( true )
DermaBaseCombo1:SetMultiple( true )
DermaBaseCombo1:EnableHorizontal( false )
DermaBaseCombo1:EnableVerticalScrollbar( true )

for k, v in pairs(player.GetAll()) do --k = Key, v = Value
	DermaBaseCombo1:AddItem( v:Nick().."

" )
end

function PlayerKick()
	for _, v in pairs( DermaBaseCombo1:GetSelectedItems()[1]:GetValue() ) do --DermaBaseCombo1:GetSelectedItems()[1]:GetValue()
		v:Kick("I don't need to give you a reason!

")
end
end

local KickPlayerButton1 = vgui.Create("DButton", DermaBasePanel)
KickPlayerButton1:SetPos( 215, 45 )
KickPlayerButton1:SetSize( 70, 25 )
KickPlayerButton1:SetText("Kick Players")
KickPlayerButton1:SetVisible( true )
KickPlayerButton1.DoClick = function()
	PlayerKick()
end

-- New Panel... thing
local DermaBasePanel2 = vgui.Create("DPanel", DermaBase)
DermaBasePanel2:SetPos( 5, 329 )
DermaBasePanel2:SetSize( 420, 35 )
DermaBasePanel2:SetVisible( true )
	
local DermaBaseButton = vgui.Create("DButton", DermaBasePanel2)
DermaBaseButton:SetPos( 345, 5 )
DermaBaseButton:SetSize( 70, 25 )
DermaBaseButton:SetText("Close")
DermaBaseButton:SetVisible( true )
DermaBaseButton.DoClick = function()
	DermaBase:Close()
end

[/LUA]

And here’s a pic…:

http://img155.imageshack.us/img155/9384/botdermakickpanel.png

Hopefully this is enough info for you to work with. I know where the problem lies, but how do I fix it?

Cheers.

[lua] function PlayerKick()
for _, v in pairs( DermaBaseCombo1:GetSelectedItems()[1]:GetValue() ) do --DermaBaseCombo1:GetSelectedItems()[1]:GetValue()
v:Kick("I don’t need to give you a reason!
")
end
end[/lua]

Is the issue

Maybe try

[lua]function PlayerKick()
for _, v in pairs( DermaBaseCombo1:GetSelectedItems() ) do
if( string.len( DermaBasePanelTextEnt1:GetValue() ) > 0 ) then
v:Kick(DermaBasePanelTextEnt1:GetValue())
else
v:Kick("I don’t need to give you a reason!
")
end
end
end[/lua]

Of course I’m not sure if you have to cast a player string name to some kind of entity, somehow to allow that to work. (the v:Kick part)

[editline]e[/editline]

Instead of
[lua]DermaBaseCombo1:AddItem( v:Nick()…"
" )[/lua]

do

[lua]DermaBaseCombo1:AddItem(v:Nick())[/lua]

and try looking up the nick through player.GetAll, like maybe

[lua]function PlayerByComboItem( text )
for k, v in pairs(player.GetAll) do
if( v:Nick() == text ) then return v end
end
end

– meanwhile

function PlayerKick()
for _, v in pairs( DermaBaseCombo1:GetSelectedItems() ) do
if( string.len( DermaBasePanelTextEnt1:GetValue() ) > 0 ) then
PlayerByComboItem(v):Kick(DermaBasePanelTextEnt1:GetValue())
else
PlayerByComboItem(v):Kick("I don’t need to give you a reason!
")
end
end
end[/lua]

Sanity checking not included

Nice try, but now it’s appeared with this error:


[lua\dermapanel.lua:58] attempt to call method 'Kick' (a nil value)

Really dislikes the v:Kick… lol



function PlayerKick()
	for _, v in pairs( DermaBaseCombo1:GetSelectedItems() ) do
		if( string.len( DermaBasePanelTextEnt1:GetValue() ) > 0 ) then
			v:Kick(DermaBasePanelTextEnt1:GetValue())
		else
			v:Kick("I don't need to give you a reason!
") --THIS is the line with the error (line 58, in my code, cut down to save post space)
		end
	end
end


EDIT:
The lua tags aren’t working… Hang on.

EDIT2:
Fuck it. Code tags FTW.

You are using kick clientside when its a serverside function

Try making a console command and calling it in the derma menus via RunConsoleCommand (command, arguments)

[lua]
function PlayerKick()
for _, v in pairs( DermaBaseCombo1:GetSelectedItems()[1]:GetValue() ) do
RunConsoleCommand (“PlayerKick”, <insert your reason here>)
end
end

function PlayerKickConsole (ply, cmd, args)
if ply:IsAdmin () then
args[1]:Kick (args[2])
end
end

concommand.Add (“PlayerKick”, PlayerKickConsole)[/lua]

Or something like that. Just make sure to pass a player argument, and not a string one.

Found a way around it.



	for k, v in pairs(player.GetAll()) do --k = Key, v = Value
		DermaBaseCombo1:AddItem( v:Nick() )
	end
	
	local function PlayerKick()
		if DermaBaseCombo1:GetSelectedItems() and DermaBaseCombo1:GetSelectedItems()[1] then
			LocalPlayer():ConCommand( "kick "..DermaBaseCombo1:GetSelectedItems()[1]:GetValue() )
		end
	end


The “kick” command is OK, but I can’t seem to find a way of doing “kickid”. Changing onto that, does anyone have an idea? :stuck_out_tongue:

Look at code above your post

AFAIK (Just tested now) kickid <player id> <reason> uses the IDs from the status commands, which in turn can be retrieved with player:UserID ()

If you pass it to the concommand you should be done (ply:UserID () is shared so there should be no problem in creating proper derma callbacks involving the kickid concommand)

Sorry I don’t understand what you mean. :open_mouth:

Bear with me, I had to look around on tutorials to get the…


DermaBaseCombo1:GetSelectedItems()[1]:GetValue()

…Thing.

Also, I don’t understand your function here. Mind taking me through it? The ply:IsAdmin() line makes sense, but where did you get those arguments from?

args[1] is the first argument and args[2] is the second argument PlayerKick “El_Jameo” “Lua” and it’ll kick that person ply:IsAdmin is an check to see if the player is an Admin but he’s done it an stupid way and I don’t recommend using it like that.