Change default derma skin for a SERVER

How? I have this so far:

lua/skins/black_orange.lua

lua/autorun/client/skinovr.lua

I want people to join my game and get a Q menu with an arbitrary skin…

So what’s your actual problem then, any errors?

First guess is, you have a file in autorun/client where it belongs, but is there an AddCSLuaFile() call in a serverside file to actually send the client your file?

Well, it doesn’t even work when I listen (I automatically run the file that way, right?). Skin is the same. No errors. There were errors until I timer’d it. I’m guessing that’s cause the script runs before the GM initializes.

[editline]5th February 2014[/editline]

I’m hearing that there’s a problem with GAMEMODE:ForceDermaSkin(), is this true?

Yeah that should work then.

If you want to use function GM: then it needs to be in the gamemode code, not in autorun. Use hook.Add instead.

I haven’t used it myself, so I can’t say. Put a print statement in there and see if it prints. I’ll give it a try now.

[editline]5th February 2014[/editline]
[lua]hook.Add(“ForceDermaSkin”, “Foreskin”, function()
print(“FORCING DERMA SKIN”)
return “black_orange”
end)[/lua]
This prints for me.

I added a print to the skin file and it didn’t print. Then I realised, do lua files in the skins directory get included automatically? You probably need to actually include the skin file.

I’ll do that now and report back.

[editline]5th February 2014[/editline]

You do have to include the skin file yourself, but I still can’t get it to actually show.

This is my two files I was testing with, in singleplayer.

lua/autorun/client/foreskin.lua
[lua]hook.Add(“ForceDermaSkin”, “Foreskin”, function()
print(“FORCING DERMA SKIN”) --This does print ok
return “black_orange”
end)
include(‘skins/black_orange.lua’)

concommand.Add(“testorangeskin”, function() --Just opens a dframe to see if our skin is working
local f = vgui.Create(“DFrame”)
f:SetSize(400,400)
f:Center()
f:MakePopup()
end)[/lua]

lua/skins/black_orange.lua I’ve just changed everything to red to see if it even works, and added a print to DFrame paint (never prints)
[lua]local SKIN = {}

// These are used in the settings panel

SKIN.PrintName = “Black and Orange”
SKIN.Author = “”
SKIN.DermaVersion = 1

SKIN.colOutline = Color( 255, 0, 0, 20 )

// You can change the colours from the Default skin

SKIN.colPropertySheet = Color( 255, 0, 0, 20 )
SKIN.colTab = SKIN.colPropertySheet
SKIN.colTabText = Color( 255, 0, 0, 20 )
SKIN.colTabInactive = Color( 255, 0, 0, 20 )
SKIN.colTabShadow = Color( 255, 0, 0, 20 )
SKIN.fontButton = “Default”
SKIN.fontTab = “Default”
SKIN.bg_color = Color( 255, 0, 0, 20 )
SKIN.bg_color_sleep = Color( 255, 0, 0, 20 )
SKIN.bg_color_dark = Color( 255, 0, 0, 20 )
SKIN.bg_color_bright = Color( 255, 0, 0, 20 )
SKIN.listview_hover = Color( 255, 0, 0, 20 )
SKIN.listview_selected = Color( 255, 0, 0, 20 )
SKIN.control_color = Color( 255, 0, 0, 20 )
SKIN.control_color_highlight = Color( 255, 0, 0, 20 )
SKIN.control_color_active = Color( 255, 0, 0, 20 )
SKIN.control_color_bright = Color( 255, 0, 0, 20 )
SKIN.control_color_dark = Color( 255, 0, 0, 20 )
SKIN.text_bright = Color( 255, 0, 0, 20 )
SKIN.text_normal = Color( 255, 0, 0, 20 )
SKIN.text_dark = Color( 255, 0, 0, 20 )
SKIN.text_highlight = Color( 255, 0, 0, 20 )
SKIN.colCategoryText = Color( 255, 0, 0, 20 )
SKIN.colCategoryTextInactive = Color( 255, 0, 0, 20 )
SKIN.fontCategoryHeader = “TabLarge”
SKIN.colTextEntryTextHighlight = Color( 255, 0, 0, 20 )
SKIN.colTextEntryTextHighlight = Color( 255, 0, 0, 20 )
SKIN.colCategoryText = Color( 255, 255, 255, 255 )
SKIN.colCategoryTextInactive = Color( 200, 200, 200, 255 )
SKIN.fontCategoryHeader = “TabLarge”
SKIN.tooltip = Color( 255, 127, 0, 255 )

// Or any of the functions

function SKIN:DrawSquaredBox( x, y, w, h, color )

surface.SetDrawColor( color )
surface.DrawRect( x, y, w, h )

surface.SetDrawColor( self.colOutline )
surface.DrawOutlinedRect( x, y, w, h )

end

function SKIN:PaintFrame( panel )

print(“PAINTING FRAME FROM SKIN”) --this never prints

local color = self.bg_color

self:DrawSquaredBox( 0, 0, panel:GetWide(), panel:GetTall(), color )

surface.SetDrawColor( 0, 0, 0, 75 )
surface.DrawRect( 0, 0, panel:GetWide(), 21 )

surface.SetDrawColor( self.colOutline )
surface.DrawRect( 0, 21, panel:GetWide(), 1 )

end

// Or just start a new skin from scratch by overriding the whole thing

//
// You need to add this to the bottom of your skin to register it in Derma.
// Parameters are name (which should have no spaces or special chacters), description, then the SKIN table
//

derma.DefineSkin( “black_orange”, “A black and orange skin”, SKIN )

print(“REGISTERED ORANGE_BLACK”) --this does print after the file is included[/lua]

So unless I’m missing something, it seems the ForceDermaSkin does get called but it doesn’t actually affect anything.
I’m going to try overriding derma.GetDefaultSkin and see if I have any luck.

[editline]5th February 2014[/editline]

I got it working! I just need to figure out what I did… It was either removing the _ in black_orange, or calling derma.RefreshSkins()

[editline]5th February 2014[/editline]

Hmmm. The above code seems to work for me fine after restarting gmod, without needing to call derma.RefreshSkins()

It affects the DFrame opened by the test command I added, but it doesn’t affect the sandbox spawn menu for some reason.