local inv = {} --[[ inv.allskills = { ["forageing"] = { "hunting", "butchering", "woodcutting", "plant identification", }, ["farming"] = { "domestication", "sowing", "arboriculture", "apiarism", "reaping", "fishing", }, ["artisanship"] = { "pottery", "glass blowing", "cooking", "tanning", "tailoring", "metalworking", "lockpicking", "herbalism", "alchemy", "jewlery", }, ["culture"] = { "litteracy", "writeing", "speech", "negotiation", "painting", "performing", }, ["adventuring"] = { "polearm", "axeplay", "swordplay", "knifeing", "fenceing", "lockpicking", "archery", "throwing", }, } ]] --the gui elements local elements = {} --return level, frac local xpmult = 1.5 --the lower, the more lvl per xp local levelfunc = function(val) local curlvl = math.log(val,xpmult) local prevlvlxp = xpmult ^ math.floor(curlvl) local nextlvlxp = xpmult ^ (math.floor(curlvl) + 1) local sp = nextlvlxp - prevlvlxp local frac = (val - prevlvlxp) / ((sp ~= 0) and sp or 1) --don't divide by 0 return math.floor(curlvl), frac end local set_xp_of = function(name,ammt) local lvl,frac = levelfunc(ammt) elements[name].label:SetText(string.format("%s : %d (%d%%)",name,lvl,frac)) elements[name].bar:SetFraction(frac) end inv.DrawOnDPanel = function(self,panel) print("Drawing skills on panel") local sheet = vgui.Create( "DColumnSheet", panel ) sheet:Dock( FILL ) for k,v in pairs(self.allskills) do local spanel = vgui.Create("DPanel", sheet) spanel:Dock(FILL) local layout = vgui.Create("DListLayout", spanel) layout:MakeDroppable("skill_layout") for i,j in pairs(v) do local ipanel = vgui.Create("DListLayout",layout) local label = vgui.Create("DLabel",ipanel) label:Dock(TOP) label:SetDark(true) local bar = vgui.Create("DProgress",ipanel) bar:Dock(TOP) elements[j] = { ["label"] = label, ["bar" ] = bar, } set_xp_of(j,self.skills[j]) ipanel:Add(label) ipanel:Add(bar) ipanel:InvalidateLayout() ipanel:SizeToChildren(true,true) layout:Add(ipanel) end layout:Dock(FILL) sheet:AddSheet(k, spanel, "icon16/cross.png") end local prox = {} prox.Put = function(s,position,item) set_xp_of(position[1],s[position[1]]) end prox.Remove = function(s,position) set_xp_of(position[1],s[position[1]]) end return prox end return inv