summaryrefslogtreecommitdiff
path: root/gamemode/structuresystem/common.lua
diff options
context:
space:
mode:
Diffstat (limited to 'gamemode/structuresystem/common.lua')
-rw-r--r--gamemode/structuresystem/common.lua233
1 files changed, 233 insertions, 0 deletions
diff --git a/gamemode/structuresystem/common.lua b/gamemode/structuresystem/common.lua
new file mode 100644
index 0000000..56cb355
--- /dev/null
+++ b/gamemode/structuresystem/common.lua
@@ -0,0 +1,233 @@
+
+
+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 \ No newline at end of file