summaryrefslogtreecommitdiff
path: root/gamemode/structuresystem
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2016-05-25 22:06:26 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2016-05-25 22:06:26 -0400
commit4adec24c3a2a53f518d817ae8a6ddd0c4c47422c (patch)
treeadb91a867dfda05f5c2880e19d0111fb657ecb9f /gamemode/structuresystem
parent699df0d5df4e7d00a0d2b838b8c851c9b5027cea (diff)
downloadgmstranded-4adec24c3a2a53f518d817ae8a6ddd0c4c47422c.tar.gz
gmstranded-4adec24c3a2a53f518d817ae8a6ddd0c4c47422c.tar.bz2
gmstranded-4adec24c3a2a53f518d817ae8a6ddd0c4c47422c.zip
more work on the structure system
Diffstat (limited to 'gamemode/structuresystem')
-rw-r--r--gamemode/structuresystem/common_smelt.lua83
-rw-r--r--gamemode/structuresystem/loadstructures.lua34
-rw-r--r--gamemode/structuresystem/structures/aaaStructureExample.lua22
-rw-r--r--gamemode/structuresystem/structures/stonefurnace.lua31
4 files changed, 170 insertions, 0 deletions
diff --git a/gamemode/structuresystem/common_smelt.lua b/gamemode/structuresystem/common_smelt.lua
new file mode 100644
index 0000000..bb34331
--- /dev/null
+++ b/gamemode/structuresystem/common_smelt.lua
@@ -0,0 +1,83 @@
+
+if SERVER then
+ util.AddNetworkString( "makerecipe" )
+end
+function genericMakeFurnace(tbl)
+ local oldusefunc = tbl.onUse
+ local overrideuse = function(self, ply)
+ if SERVER or ply != LocalPlayer() then return end
+ print("I am the local player!")
+ local DermaPanel = vgui.Create( "DFrame" )
+ DermaPanel:SetPos( 100, 100 )
+ DermaPanel:SetSize( ScrW() / 1.3, ScrH() / 1.4 )
+ DermaPanel:SetTitle( tbl.Name )
+ DermaPanel:SetDraggable( true )
+ DermaPanel:Center()
+ local Grid = vgui.Create("DGrid",DermaPanel)
+ Grid:SetPos(10,30)
+ Grid:SetColWide(128)
+ Grid:SetRowHeight(128)
+ for k,v in pairs(tbl.Recipes) do
+ local testbut = vgui.Create("DButton")
+ testbut:SetText(v.Name)
+ testbut:SetSize(128,128)
+ testbut.DoClick = function(button)
+ net.Start("makerecipe")
+ net.WriteString(tbl.Name)
+ if(tbl.uniquedata) then net.WriteUInt(self:EntIndex(), GMS.NETINT_BITCOUNT) end
+ net.WriteUInt(k, GMS.NETINT_BITCOUNT)
+ net.SendToServer()
+ end
+ Grid:AddItem(testbut)
+ DermaPanel:MakePopup()
+ end
+ oldusefunc(self,ply)
+ end
+ tbl.onUse = overrideuse
+end
+net.Receive( "makerecipe", function(ln,ply)
+ local tblname = net.ReadString()
+ local tbl = GMS.Structures[tblname]
+ print("Table is:")
+ PrintTable(tbl)
+ print("Recipes table is:")
+ PrintTable(tbl.Recipes)
+ assert(tbl != nil,"Maybe someone's trying to hack lol")
+ if tbl.uniquedata then
+ local entnum = net.ReadUInt(GMS.NETINT_BITCOUNT)
+ tbl = GMS.UniqueStructures[entnum]
+ end
+ local recipenum = net.ReadUInt(GMS.NETINT_BITCOUNT)
+ print("Useing recipes:")
+ PrintTable(tbl.Recipes)
+ print("And recipenum:")
+ PrintTable(tbl.Recipes[recipenum])
+ assert(tbl.Recipes != nil and tbl.Recipes[recipenum] != nil, "Invalid recpie!")
+ print("Attempting to craft recpie:")
+ PrintTable(tbl.Recipes[recipenum])
+ local recipe = tbl.Recipes[recipenum]
+ local numrequired = 1
+ for k, v in pairs( recipe.Req ) do
+ numrequired = numrequired + v
+ print("numrequired is now:" .. numrequired)
+ end
+ local time = math.pow(numrequired,tbl.timemult) - ((numrequired * tbl.timemult) * math.pow(ply:GetSkill("Smelting"),tbl.skillease))
+ time = time * numrequired / 5
+ --time = math.max( time - math.floor( ply:GetSkill( "Smelting" ) / 5 ), math.max( timecount * tbl.skillease, 2 ) )
+
+ print("I think smelting this should take " .. time .. " seconds")
+
+end)
+
+function recipieForSmelt(tbl, name, description, required, result, ratio, mults)
+ for k,v in pairs(mults) do
+ local thisrecipie = {}
+ thisrecipie.Name = name .. " x" .. v
+ thisrecipie.Description = description
+ thisrecipie.Req = {}
+ thisrecipie.Req[required] = ratio[1] * v
+ thisrecipie.Results = {}
+ thisrecipie.Results[result] = ratio[2] * v
+ table.insert(tbl,0,thisrecipie)
+ end
+end
diff --git a/gamemode/structuresystem/loadstructures.lua b/gamemode/structuresystem/loadstructures.lua
new file mode 100644
index 0000000..858d976
--- /dev/null
+++ b/gamemode/structuresystem/loadstructures.lua
@@ -0,0 +1,34 @@
+print("Loading structures!")
+GMS = GMS or {}
+GMS.Structures = GMS.Structures or {}
+GMS.UniqueStructures = {}
+
+function registerStructure(tbl)
+ assert(tbl.Name != nil, "Structure's name is nil!")
+ GMS.Structures[tbl.Name] = tbl
+end
+
+concommand.Add("gms_spawnstructure",function(ply,cmd,args)
+ if !ply:IsDeveloper() then return end
+ assert(args[1] != "","Failed to find structure name")
+ assert(GMS.Structures[args[1]] != nil, "Structure \"" .. args[1] .. "\" does not exist!")
+
+ local tr = ply:GetEyeTrace()
+ local e = ents.Create("gms_generic_structure")
+
+ local tbl = GMS.Structures[args[1]]
+ if tbl.uniquedata then
+ tbl = table.Copy(tbl)
+ GMS.UniqueStructures[e:EntIndex()] = tbl
+ end
+
+ for k,v in pairs(tbl) do
+ print("Setting " .. k .. " to")
+ print(v)
+ e[k] = v
+ end
+ e:Spawn()
+ e:SetPos(tr.HitPos)
+ SPropProtection.PlayerMakePropOwner( ply, e )
+ --e:SetNWString("Owner",ply:Nick())
+end)
diff --git a/gamemode/structuresystem/structures/aaaStructureExample.lua b/gamemode/structuresystem/structures/aaaStructureExample.lua
new file mode 100644
index 0000000..abe91ba
--- /dev/null
+++ b/gamemode/structuresystem/structures/aaaStructureExample.lua
@@ -0,0 +1,22 @@
+--This file is to help developers add new structures to the game!
+
+STRUCT = {}
+
+--A name for this structure, each type of structure must have a different name
+STRUCT.Name = "Example Structure"
+
+--The model for this structure.
+STRUCT.Model = "models/props/de_inferno/ClayOven.mdl"
+
+--The initalize method. Called on both the server and the client
+STRUCT.onInitialize = function(self)
+ print("Initalize called!")
+end
+
+--If this structure is not like every other structures of the same name (for example, if it has an internal inventory)
+STRUCT.uniquedata = false
+
+--Called when a player presses e on this structure, called on both the server and the client. Keep in mind that on the client side, ply may not be the local player!
+STRUCT.onUse = function(self,ply)
+ print("onUse called!")
+end
diff --git a/gamemode/structuresystem/structures/stonefurnace.lua b/gamemode/structuresystem/structures/stonefurnace.lua
new file mode 100644
index 0000000..84c0311
--- /dev/null
+++ b/gamemode/structuresystem/structures/stonefurnace.lua
@@ -0,0 +1,31 @@
+local STRUCT = {}
+
+STRUCT.Name = "Stone Furnace"
+STRUCT.Model = "models/props/de_inferno/ClayOven.mdl"
+
+STRUCT.Structure = {
+ {"models/props/de_inferno/ClayOven.mdl",Vector(0,0,0),Angle(0,0,0)}
+}
+
+STRUCT.onInitialize = function(self)
+ print("Initalize called!")
+end
+
+STRUCT.uniquedata = false
+
+STRUCT.onUse = function(self, ply)
+ print("I am the old use function!")
+end
+
+STRUCT.Recipes = {}
+
+STRUCT.timemult = 0.5
+STRUCT.skillease = 0.25
+
+genericMakeFurnace(STRUCT)
+recipieForSmelt(STRUCT.Recipes,"Copper", "Smelt copper ore into copper", "Copper Ore", "Copper", {1,1}, {1,5,10})
+
+print("stone furnace's recipies:")
+PrintTable(STRUCT.Recipes)
+
+registerStructure(STRUCT)