local buts = 90 local recipeWidth = buts*4 local recipeHeight = buts*1.5 local function makeCraftingWindow(name) local pw = 735 local ph = 500 local DermaPanel = vgui.Create( "DFrame" ) DermaPanel:SetPos( 100, 100 ) DermaPanel:SetSize( pw, ph ) DermaPanel:SetTitle( name ) DermaPanel:SetDraggable( true ) DermaPanel:Center() DermaPanel.Paint = function(self,w,h) draw.RoundedBox( 0, 0, 0, w, h, Color(86,86,86,200) ) end DermaPanel.scroll = vgui.Create( "DScrollPanel", DermaPanel ) DermaPanel.scroll:Dock(FILL) DermaPanel.scroll:SetPos( 0, 25 ) DermaPanel.Grid = vgui.Create("DGrid",DermaPanel.scroll) DermaPanel.Grid:SetPos(0,0) DermaPanel.Grid:SetColWide(recipeWidth+5) DermaPanel.Grid:SetCols(pw / recipeWidth) DermaPanel.Grid:SetRowHeight(recipeHeight+5) return DermaPanel end if SERVER then util.AddNetworkString( "makerecipe" ) end function genericMakeCrafting(tbl) local oldusefunc = tbl.onUse local overrideuse = function(self, ply) oldusefunc(self,ply) if SERVER or ply != LocalPlayer() then return end tbl.Recipes = {} for k,v in pairs(tbl.genericRecipes) do local mults = v.Mults if v.SmeltAll == true and !table.HasValue(mults,-1) then table.insert(mults,-1) end for i,j in pairs(mults) do local thisrecipe = {} thisrecipe.Req = {} thisrecipe.Results = {} thisrecipe.Ratio = v.Ratio for l,m in pairs(v.Requirements) do if v.SmeltAll and j == -1 then thisrecipe.Req[l] = thisrecipe.Ratio[1] * m break end thisrecipe.Req[l] = thisrecipe.Ratio[1] * j * m end for l,m in pairs(v.Results) do thisrecipe.Results[l] = thisrecipe.Ratio[2] * j * m end thisrecipe.Name = v.Name .. " x" .. j thisrecipe.Description = v.Description thisrecipe.genericNum = k thisrecipe.Image = v.Image thisrecipe.haslevelsfor = v.CanCraft(ply) thisrecipe.hasmatsfor = true for l,m in pairs(thisrecipe.Req) do if(Resources[l] == nil or Resources[l] < m) then thisrecipe.hasmatsfor = false break end end thisrecipe.mult = j if j == -1 then thisrecipe.Name = "All "..v.Name thisrecipe.hasmatsfor = true thisrecipe.SmeltAll = true thisrecipe.MaxAmount = v.MaxAmount if(Resources[v.Name] == nil or Resources[v.Name] < 1) then thisrecipe.hasmatsfor = false else thisrecipe.mult = Resources[v.Name] end end table.insert(tbl.Recipes,0,thisrecipe) end end local DermaPanel = makeCraftingWindow(tbl.Name) local infoPosX = 130 local infoPosY = 0 for k,v in pairs(tbl.Recipes) do local recipeButton = vgui.Create("DButton") local text = v.Name .. "\n" .. v.Description .. "\nRequires:" for i,j in pairs(v.Req) do text = text .. "\n" .. i .. " x" .. j if v.SmeltAll then text = text .. "\nMax Amount - " ..v.MaxAmount end end recipeButton.text = text recipeButton:SetText("") recipeButton:SetSize(recipeWidth,recipeHeight) DermaPanel.infotext = vgui.Create("DLabel",recipeButton) DermaPanel.infotext:SetText(text) DermaPanel.infotext:SetPos(infoPosX,infoPosY) DermaPanel.infotext:SetSize(recipeWidth-infoPosX,recipeHeight) DermaPanel.infotext:SetFont( "TargetID" ) DermaPanel.infotext:SetWrap(true) recipeButton.Paint = function() //draw.RoundedBox( 8, 5, 5, w-10, h-10, Color( 0, 0, 0 ) ) local fillcolor = Color(255,255,255) if v.haslevelsfor then if v.hasmatsfor then fillcolor = Color(23,180,23) else fillcolor = Color(200,0,0) end else fillcolor = Color(200,200,0) end draw.RoundedBox(0,0,0,recipeWidth,recipeHeight,Color(48,48,48,255)) draw.RoundedBox(0,15,15,110,recipeHeight-30,fillcolor) draw.RoundedBox(8,20,20,100,recipeHeight-40,Color(98,98,98)) for t,y in pairs(v.Req) do if v.SmeltAll and Resources[t] != nil and Resources[t] >= 1 then v.hasmatsfor = true break end if Resources[t] != nil and Resources[t] < y then v.hasmatsfor = false break end end end recipeButton.DoClick = function(button) DermaPanel.structname = tbl.Name DermaPanel.recipeNum = v.genericNum DermaPanel.recipeMult = v.mult net.Start("makerecipe") net.WriteString(DermaPanel.structname) if tbl.uniquedata then net.WriteUInt(self:EntIndex(), GMS.NETINT_BITCOUNT) end net.WriteUInt(DermaPanel.recipeNum, GMS.NETINT_BITCOUNT) net.WriteUInt(DermaPanel.recipeMult, GMS.NETINT_BITCOUNT) net.WriteTable(v.Ratio) net.WriteBool(v.SmeltAll) if v.SmeltAll then net.WriteUInt(v.MaxAmount, GMS.NETINT_BITCOUNT) end net.SendToServer() end local img = vgui.Create("DImage", recipeButton) img:SetPos(24, 20) img:SetSize(buts, buts) img:SetImage(v.Image) DermaPanel.Grid:AddItem(recipeButton) DermaPanel:MakePopup() end end tbl.onUse = overrideuse end net.Receive( "makerecipe", function(ln,ply) local tblname = net.ReadString() local tbl = GMS.Structures[tblname] assert(tbl != nil,"Tried to make a recipe in a structure that dosen't exist!") if tbl.uniquedata then local entnum = net.ReadUInt(GMS.NETINT_BITCOUNT) tbl = GMS.UniqueStructures[entnum] end local recipenum = net.ReadUInt(GMS.NETINT_BITCOUNT) local mult = net.ReadUInt(GMS.NETINT_BITCOUNT) local recipe = tbl.genericRecipes[recipenum] local ratio = net.ReadTable() local SmeltAll = net.ReadBool() local maxAmount if SmeltAll then maxAmount = net.ReadUInt(GMS.NETINT_BITCOUNT) end --Check that we have enough ingredients for k,v in pairs(recipe.Requirements) do if SmeltAll and ply:GetResource(k) > 1 then mult = ply:GetResource(k) if ply:GetResource(k) > maxAmount then mult = maxAmount end else if ply:GetResource(k) < ratio[1] * v * mult then ply:SendMessage("You don't have enough!", 3, Color(255, 255, 255, 255)) return end end end --Check that we're allowed to craft this if not recipe.CanCraft(ply) then ply:SendMessage("You can't craft that!", 3, Color(255, 255, 255, 255)) return end --We have enough resources! make it! local prsName = "Crafting" if recipe.Skill != nil then prsName = recipe.Skill end local prcName = prsName if prcName == "Weapon_Crafting" then prcName = "Crafting" end startProcessGeneric(ply,prcName.." " .. recipe.Name, recipe.Time(ply,mult), function(player) for k,v in pairs(recipe.Requirements) do player:DecResource(k,ratio[1]*v*mult) end for k,v in pairs(recipe.Results) do player:IncResource(k,ratio[2]*v*mult) end if recipe.Skill != nil then if recipe.Skill == "Smelting" then player:IncXP( prsName, math.Clamp( math.Round( ( mult * 10 ) / player:GetSkill( prsName ) ), 1, 1000 ) ) elseif recipe.Skill == "Weapon_Crafting" then player:IncXP( prsName, math.Clamp( math.Round( ( mult * 15 ) / player:GetSkill( prsName ) ), 1, 1000 ) ) --elseif recipe.Skill == "Swimming" then player:IncXP( recipe.Skill, math.Clamp( math.Round( 100 / player:GetSkill( prsName ) ), 1, 1000 ) ) else player:IncXP( prsName, math.Clamp( math.Round( 150 / player:GetSkill( prsName ) ), 1, 1000 ) ) end end end) end) function genericGiveRecipie(tbl, recipe) tbl.genericRecipes = tbl.genericRecipes or {} table.insert(tbl.genericRecipes, recipe) end