aboutsummaryrefslogtreecommitdiff
path: root/gamemode
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-10-09 16:20:46 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2017-10-09 16:20:46 -0400
commitda81a0a23a3704dd2de3ab2249496c1ad1912d1c (patch)
tree915edc671acbb292191adad2f25f87ba26e567cf /gamemode
parent497be6ff15989c7bf9de5beb138d2ef042dca6bd (diff)
downloadartery-da81a0a23a3704dd2de3ab2249496c1ad1912d1c.tar.gz
artery-da81a0a23a3704dd2de3ab2249496c1ad1912d1c.tar.bz2
artery-da81a0a23a3704dd2de3ab2249496c1ad1912d1c.zip
Updated internal representation of inventories
Diffstat (limited to 'gamemode')
-rw-r--r--gamemode/client/cl_inventory.lua64
-rw-r--r--gamemode/client/qpanels/inventory.lua194
-rw-r--r--gamemode/client/qpanels/prayers.lua170
-rw-r--r--gamemode/client/qpanels/quests.lua31
-rw-r--r--gamemode/client/qpanels/skills.lua10
-rw-r--r--gamemode/client/qtabs/cl_qinventory.lua1
-rw-r--r--gamemode/config/sv_newplayer.lua4
-rw-r--r--gamemode/core/combat/cl_damage.lua3
-rw-r--r--gamemode/core/database/sv_queries.lua4
-rw-r--r--gamemode/core/dataloader/cl_loadglobals.lua2
-rw-r--r--gamemode/core/inventory/cl_invtracker.lua121
-rw-r--r--gamemode/core/inventory/inventory.lua1
-rw-r--r--gamemode/core/inventory/item.lua2
-rw-r--r--gamemode/core/inventory/sv_invtracker.lua22
-rw-r--r--gamemode/core/mapstich/sv_mapstich.lua1
-rw-r--r--gamemode/inventorysystem/prayers/cl_prayers.lua67
-rw-r--r--gamemode/inventorysystem/prayers/sh_prayers.lua13
-rw-r--r--gamemode/itemsystem/exampleitem.lua2
-rw-r--r--gamemode/itemsystem/testprayer.lua42
-rw-r--r--gamemode/shared/log.lua9
20 files changed, 328 insertions, 435 deletions
diff --git a/gamemode/client/cl_inventory.lua b/gamemode/client/cl_inventory.lua
index 92eae94..4e2545d 100644
--- a/gamemode/client/cl_inventory.lua
+++ b/gamemode/client/cl_inventory.lua
@@ -8,7 +8,7 @@
3 - Skills
4 - Quests
]]
-local qinv = nrequire("cl_qinventory.lua")
+--local qinv = nrequire("cl_qinventory.lua")
local state = nrequire("cl_state.lua") --Holds weather or not player is in inventory
local itm = nrequire("core/inventory/common/items.lua")
--local qpray = nrequire("cl_qprayers.lua")
@@ -38,6 +38,8 @@ local creditslabel
local droppanel --Dpanel to drop things on when they are dropped, should be the backmost panel, and cover the entire screen.
inv.tabsheet = nil
+local clt = nrequire("cl_invtracker.lua")
+
local player_data --The data the player needs to show the q panel
net.Receive("art_load_player_data",function()
--print("Got player data")
@@ -49,6 +51,34 @@ net.Receive("art_load_player_data",function()
--print("Credits was", credits)
end)
+local function CreateSheetTree(tabs,dpropertysheet)
+ print("Createing sheet tree!")
+ PrintTable(tabs)
+ for k,v in pairs(tabs) do
+ if type(k) == "string" then
+ print("Makeing inventory ", k)
+ local tsheet = vgui.Create( "DPropertySheet", dpropertysheet )
+ dpropertysheet:AddSheet(k,tsheet,"icon16/user.png")
+ CreateSheetTree(v,tsheet)
+ elseif type(k) == "number" then
+ print("Makeing inventory number ", k)
+ local tsheet = vgui.Create("DPanel")
+ dpropertysheet:AddSheet(v.Name,tsheet,"icon16/user.png")
+ v:DrawOnDPanel(tsheet)
+ else
+ error("k was not a number or string, it was a " .. type(k))
+ end
+ end
+ --local invsheet = qinv.CreateInventorySheet(inv.tabsheet)
+ --qpray.CreatePrayerSheet(tabsheet)
+ --invsheet.id = #qtabs + 1
+ --qtabs[#qtabs + 1] = invsheet
+ --prasheet.id = #qtabs + 1
+ --qtabs[#qtabs + 1] = prasheet
+ --inv.tabsheet:AddSheet("Inventory",invsheet,"icon16/user.png")
+ --tabsheet:AddSheet("Prayers",prasheet,"icon16/user.png")
+end
+
local function BuildInventory()
--print("Building inventory")
if qframe and IsValid(qframe) then return end
@@ -80,17 +110,10 @@ local function BuildInventory()
creditstext:SetText("Credits:")
creditstext:SetPos(100,5)
- inv.tabsheet = vgui.Create("DPropertySheet",qframe)
- inv.tabsheet:Dock(FILL)
+ local initalsheet = vgui.Create("DPropertySheet",qframe)
+ initalsheet:Dock(FILL)
- local invsheet = qinv.CreateInventorySheet(inv.tabsheet)
- --qpray.CreatePrayerSheet(tabsheet)
- invsheet.id = #qtabs + 1
- qtabs[#qtabs + 1] = invsheet
- --prasheet.id = #qtabs + 1
- --qtabs[#qtabs + 1] = prasheet
- inv.tabsheet:AddSheet("Inventory",invsheet,"icon16/user.png")
- --tabsheet:AddSheet("Prayers",prasheet,"icon16/user.png")
+ CreateSheetTree(clt.known_inventories,initalsheet)
end
@@ -139,13 +162,20 @@ local viewdistance = 100
local rotatespeed = 65
local bone = nil
local previousheadscale = Vector(1,1,1)
+local toggle_arteryview = true
hook.Add("CalcView","ArteryInventoryView",function(ply,pos,ang,fov,nearz,farz)
+ if not toggle_arteryview then return end
if bone == nil then
bone = LocalPlayer():LookupBone("ValveBiped.Bip01_Head1")
end
local view = {}
--view.origin = LocalPlayer():GetBonePosition(bone) + LocalPlayer():GetUp() * 2
- view.origin = pos
+ local tr = util.TraceLine({
+ start = pos,
+ endpos = (ang:Forward() * -100) + pos,
+ filter = LocalPlayer()
+ })
+ view.origin = tr.HitPos or (ang:Forward() * -100) + pos
if state.invopen then
local trot = math.rad(CurTime() * rotatespeed)
local xoff = viewdistance * math.sin(trot)
@@ -161,9 +191,17 @@ hook.Add("CalcView","ArteryInventoryView",function(ply,pos,ang,fov,nearz,farz)
else
LocalPlayer():ManipulateBoneScale(bone,previousheadscale)
end
- view.drawviewer = state.invopen
+ view.drawviewer = true--state.invopen
return view
end)
+concommand.Add("delete_inventory",function(ply,cmd,args)
+ qframe = nil
+end)
+
+concommand.Add("toggle_artery_view",function(ply,cmd,args)
+ toggle_arteryview = not toggle_arteryview
+end)
+
return inv
diff --git a/gamemode/client/qpanels/inventory.lua b/gamemode/client/qpanels/inventory.lua
deleted file mode 100644
index 4dc5075..0000000
--- a/gamemode/client/qpanels/inventory.lua
+++ /dev/null
@@ -1,194 +0,0 @@
--- do return end
--- local invfuncs
--- invfuncs = ART.invfuncs
--- --invfuncs = include("../gamemodes/artery/gamemode/shared/inventory_common.lua")
--- --invfuncs = include("../shared/inventory_common.lua")
--- assert(invfuncs ~= nil, "Dependency failed")
---
--- local function createMenuFor(menu, tbl)
--- for k,v in pairs(tbl) do
--- if isfunction(v) then --This is a dead-end, add the menu
--- local thisoption = menu:AddOption(k,v)
--- else --Otherwise it should be a table, recursively call to create
--- local submenu = menu:AddSubMenu(k)
--- createMenuFor(submenu,v)
--- end
--- end
--- end
---
--- local function DrawBackpackOnDPanel(dp, backpack, backpacknum, tent)
--- local width = ScrW()
--- local height = ScrH()
--- local slotsize = math.Round(width / 32)
--- local backgrid = vgui.Create( "DGrid", dp )
--- backgrid:SetPos( 10, 30 )
--- backgrid:SetCols( backpack[2][1] )
--- backgrid:SetColWide( backpack[2][2] )
--- backgrid:Dock(FILL)
--- for i = 1,#(backpack[1]) do
--- for j = 1,#(backpack[1][i]) do
--- local item = backpack[1][j][i]
--- if type(backpack[1][j][i]) == "table" then
--- local itemwidth = 0
--- for _,l in pairs(item.Shape) do
--- itemwidth = math.Max(itemwidth,#l)
--- end
--- local itemheight = #item.Shape
--- local invicon = vgui.Create( "DImageButton", dp )
--- invicon:SetSize(slotsize * itemwidth, slotsize * itemheight)
--- invicon:SetPos(slotsize * (i - 1), slotsize * (j - 1))
--- invicon:SetText(item.Name)
--- if item.Tooltip then
--- invicon:SetTooltip(item.Tooltip)
--- end
--- if item.Paint then
--- invicon.Paint = item.Paint
--- end
--- if item.DoOnPanel then
--- item.DoOnPanel(invicon)
--- end
--- --invicon.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,100,0)) end
--- invicon.DoClick = function()
--- if not item.GetOptions then return end
--- local menu = vgui.Create("DMenu")
--- createMenuFor(menu,item:GetOptions())
--- menu:Open()
--- end
--- invicon.Item = item
--- invicon.invpos = {j,i}
--- invicon.ent = tent
--- invicon.backpacknum = backpacknum
--- invicon:Droppable("Inventory")
--- elseif not backpack[1][j][i] then
--- local emptyslot = vgui.Create("DPanel", dp)
--- emptyslot:SetSize(slotsize,slotsize)
--- emptyslot:SetPos(slotsize * (i - 1), slotsize * (j - 1))
--- --emptyslot.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,0,100)) end
--- emptyslot:Receiver( "Inventory", function( receiver, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY )
--- if not isDropped then return end
--- local icon = tableOfDroppedPanels[1]
--- local item = icon.Item
--- local curpos = icon.invpos
--- --Set the shape it was at to false
--- if not icon.wasequiped and icon.ent == tent then
--- assert(curpos ~= nil, "print curpos was nil when not equiped")
--- for k = 1,#item.Shape do
--- for l = 1,#(item.Shape[k]) do
--- if k == 1 and l == 1 then continue end
--- backpack[1][curpos[1] + k - 1][curpos[2] + l - 1] = false
--- end
--- end
--- backpack[1][curpos[1]][curpos[2]] = false
--- end
--- if invfuncs.CanFitInBackpack(backpack,j,i,item) then
--- local fromtbl = icon.invpos
--- local wasequiped = icon.wasequiped
--- local ondropped = icon.ondropped
--- if ondropped then
--- ondropped(backpacknum,j,i,item)
--- elseif wasequiped then
--- net.Start("unequipitem")
--- net.WriteString(wasequiped)
--- net.WriteUInt(backpacknum,16)
--- net.WriteUInt(i,16)
--- net.WriteUInt(j,16)
--- net.SendToServer()
--- else
--- net.Start("moveitem")
--- net.WriteEntity(icon.ent) -- from ent
--- net.WriteEntity(tent) -- to ent
--- net.WriteUInt(icon.backpacknum,16) -- from backpack number
--- net.WriteUInt(backpacknum,16) -- to backpack number
--- net.WriteUInt(fromtbl[1],16) -- From position
--- net.WriteUInt(fromtbl[2],16)
--- net.WriteUInt(j,16) -- To position
--- net.WriteUInt(i,16)
--- net.SendToServer()
--- if item.onEquip ~= nil then
--- item:onEquip(LocalPlayer())
--- end
--- end
--- end
--- end, {} )
--- end
--- end
--- end
--- end
---
--- local invsheetfunc = function()
--- local width = ScrW()
--- local height = ScrH()
---
---
--- local invsheet = vgui.Create( "DPanel" )
---
--- invsheet.Paint = function( self, w, h ) end
---
--- --Display gear
--- local slotsize = math.Round(width / 32)
--- local displaypos = {
--- ["Head"] = {(width / 8) - slotsize, 25},
--- ["Body"] = {(width / 8) - slotsize, slotsize + 26},
--- ["Legs"] = {(width / 8) - slotsize, (slotsize * 2) + 27},
--- ["Boots"] = {(width / 8) - slotsize, (slotsize * 3) + 28},
--- ["Gloves"] = {(width / 8) + (slotsize), (slotsize * 2) + 27},
--- ["Left"] = {(width / 8) - (1.5 * slotsize), (slotsize * 4) + 29},
--- ["Right"] = {(width / 8) - (0.5 * slotsize), (slotsize * 4) + 29}
--- }
--- for k,v in pairs (LocalPlayer().Inventory.Equiped) do
--- if v == false then
--- local eqslot = vgui.Create( "DPanel", invsheet )
--- eqslot:SetSize( slotsize, slotsize )
--- eqslot:SetPos(displaypos[k][1],displaypos[k][2])
--- eqslot:Receiver( "Inventory", function( receiver, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY )
--- if not isDropped then return end
--- print("Attempting to equip")
--- local icon = tableOfDroppedPanels[1]
--- local item = icon.Item
--- if item.Equipable == k then
--- net.Start("equipitem")
--- net.WriteUInt(icon.backpacknum,16) -- Backpack number
--- local fromtbl = icon.invpos
--- net.WriteUInt(fromtbl[1],16) -- From position
--- net.WriteUInt(fromtbl[2],16)
--- net.WriteString(k)
--- net.SendToServer()
--- end
--- end, {} )
--- else
--- local eqslot = vgui.Create("DImageButton",invsheet)
--- eqslot:SetSize(slotsize,slotsize)
--- eqslot:SetPos(displaypos[k][1],displaypos[k][2])
--- if v.PaintEquiped then
--- eqslot.Paint = v.PaintEquiped
--- end
--- if v.DoOnEquipPanel then
--- v.DoOnEquipPanel(eqslot)
--- end
--- eqslot:Droppable("Inventory")
--- eqslot.Item = v
--- eqslot.wasequiped = k
--- end
--- end
--- local moneylabel = vgui.Create("DLabel",invsheet)
--- moneylabel:SetPos(0,0)
--- moneylabel:SetSize(width/5,18)
--- moneylabel:SetText(string.format("Credits:%7d", ART.Credits or 0))
--- print("Displaying credits:" .. string.format("Credits:%7d", ART.Credits or 0))
---
--- local backpacksheet = vgui.Create( "DPropertySheet", invsheet )
--- backpacksheet:SetPos(0,slotsize * 6)
--- backpacksheet:SetSize((width / 4) - 26, height - (slotsize * 6) - 70)
--- for k,v in pairs(LocalPlayer().Inventory.Backpacks) do
--- local tbacksheet = vgui.Create( "DPanel", backpacksheet )
--- tbacksheet.Paint = function( self, w, h ) draw.RoundedBox( 4, 0, 0, w, h, Color( 157, 160, 167 ) ) end
--- backpacksheet:AddSheet( v[3], tbacksheet, "icon16/cross.png" )
---
--- DrawBackpackOnDPanel(tbacksheet,v,k,LocalPlayer())
--- end
---
--- return "Inventory", invsheet, "icon16/cross.png"
--- end
---
---
--- ART.RegisterInventorySheet(invsheetfunc)
diff --git a/gamemode/client/qpanels/prayers.lua b/gamemode/client/qpanels/prayers.lua
deleted file mode 100644
index 674d5d8..0000000
--- a/gamemode/client/qpanels/prayers.lua
+++ /dev/null
@@ -1,170 +0,0 @@
--- do return end
--- local refreshboundprayers
--- local infopart
--- local prayersheet
---
--- local function displaydefaulthelp(panel)
--- local ll = vgui.Create("DLabel",panel)
--- ll:Dock(FILL)
--- ll:SetWrap(true)
--- ll:SetDark(true)
--- ll:SetText("Oh no! It looks like this dosen't have any help text yet!")
--- end
---
--- local function createprayericon(parrent,prayer,equiped,place)
---
--- local width = ScrW()
--- local height = ScrH()
---
--- local ret = vgui.Create("DButton",parrent)
--- ret:SetText(prayer)
--- ret:SetWrap(true)
--- ret:SetSize(64,64)
--- local prayertbl = ART.GetPrayerByName(prayer)
--- assert(prayertbl ~= nil, "Could not find an appropriate prayer!")
--- if prayertbl.Paint then
--- ret.Paint = prayertbl.Paint
--- end
--- if prayertbl.DoOnPanel then
--- prayertbl.DoOnPanel(ret)
--- end
--- if equiped then
--- ret.DoClick = function(self)
--- self:Remove()
--- ART.PrayerEquiped[place] = false
--- refreshboundprayers()
--- infopart:Remove()
--- infopart = vgui.Create("DPanel")
--- infopart:SetSize( (width / 4) - 10, height / 3)
--- infopart:SetPos(0, height * 2 / 3)
--- prayersheet:Add(infopart)
--- end
--- else
--- ret:Droppable("PrayerBind")
--- ret.PrayerName = prayer
--- ret:SetSize(64,64)
--- ret.DoClick = function(self)
--- infopart:Remove()
--- infopart = vgui.Create("DPanel")
--- infopart:SetSize( (width / 4) - 10, height / 3)
--- prayersheet:Add(infopart)
--- local rettbl = ART.GetPrayerByName(prayer)
--- if rettbl.DisplayHelp ~= nil then
--- rettbl.DisplayHelp(infopart)
--- else
--- displaydefaulthelp(infopart)
--- end
--- end
--- end
--- return ret
--- end
---
--- local function createreceiver(parrent,num)
--- local prayerbut = vgui.Create( "DPanel", parrent )
--- local prayerlabel = vgui.Create("DLabel",prayerbut)
--- prayerlabel:SetText( "F" .. num )
--- prayerlabel.Paint = function( self, w, h ) end
--- prayerlabel:SetWrap(true)
--- prayerlabel:SetDark(true)
--- prayerlabel:Dock(FILL)
--- prayerbut:Dock(FILL)
--- prayerbut:Receiver( "PrayerBind", function( self, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY )
--- if not isDropped then return end
--- local pname = tableOfDroppedPanels[1].PrayerName
--- print("Prayer name:")
--- print(pname)
--- ART.PrayerEquiped[num] = pname
--- print("Prayer bound to " .. num)
--- prayerbut:Remove()
--- createprayericon(parrent,pname,true,num)
--- end)
--- end
---
--- local function displayboundprayers(panel)
---
--- local width = ScrW()
--- local height = ScrH()
---
--- local prayerbindgrid = nil
---
--- refreshboundprayers = function()
---
--- if prayerbindgrid ~= nil then prayerbindgrid:Remove() end
---
--- prayerbindgrid = vgui.Create("DGrid")
--- prayerbindgrid:SetPos(height * (2 / 3),5)
--- prayerbindgrid:SetSize((width / 4) - 20, height / 3)
--- prayerbindgrid:SetColWide(64)
--- prayerbindgrid:SetRowHeight(64)
--- function prayerbindgrid:Paint(w,h)
--- draw.RoundedBox( 8, 0, 0, w, h, Color( 0, 255, 0 ) )
--- end
---
--- for k,v in pairs(ART.PrayerEquiped) do
--- local but = vgui.Create( "DPanel", prayerbindgrid )
--- but:SetSize(64, 64)
--- if v ~= false then
--- createprayericon(but,v,true,k)
--- else
--- createreceiver(but,k)
--- end
--- prayerbindgrid:AddItem(but)
--- end
--- panel:Add(prayerbindgrid)
--- end
--- refreshboundprayers()
--- end
---
--- ART.RegisterInventorySheet(function()
---
--- local width = ScrW()
--- local height = ScrH()
---
--- prayersheet = vgui.Create( "DListLayout")
---
--- local prayergridscroll = vgui.Create("DScrollPanel")
--- prayergridscroll:SetSize( (width / 4) - 20, height / 3 )
--- prayergridscroll:SetPos( 5, 5 )
--- prayersheet:Add(prayergridscroll)
--- local prayergrid = vgui.Create( "DGrid", prayergridscroll )
--- prayergrid:SetPos( 5 , 5 )
--- prayergrid:Dock(FILL)
---
--- prayergrid:SetCols( (width / 4) / 64 )
--- prayergrid:SetColWide( 64 )
--- prayergrid:SetRowHeight(64)
--- prayergridscroll:AddItem(prayergrid)
---
--- for k,v in pairs(ART.MyPrayer) do
--- print("Displaying prayer:" .. k)
--- print("Type:" .. type(k))
--- if k == "" then
--- ART.MyPrayer[k] = nil
--- end
--- local but = createprayericon(prayergrid,k,false,nil)
--- prayergrid:AddItem(but)
--- end
---
--- displayboundprayers(prayersheet)
---
--- infopart = vgui.Create("DPanel")
--- infopart:SetSize( (width / 4) - 10, height / 3)
--- infopart:SetPos(0, height * 2 / 3)
--- prayersheet:Add(infopart)
---
--- return "Prayers", prayersheet, "icon16/tick.png"
--- end)
---
--- hook.Add("Think","art_prayer_keybinds",function()
--- local mapping = {
--- KEY_F1,
--- KEY_F2,
--- KEY_F3,
--- KEY_F4,
--- }
--- for k,v in pairs(mapping) do
--- if input.IsKeyDown(v) and ART.PrayerEquiped[k] then
--- ART.GetPrayerByName(ART.PrayerEquiped[k]).Pray()
--- end
--- end
--- end)
diff --git a/gamemode/client/qpanels/quests.lua b/gamemode/client/qpanels/quests.lua
deleted file mode 100644
index eda9e31..0000000
--- a/gamemode/client/qpanels/quests.lua
+++ /dev/null
@@ -1,31 +0,0 @@
--- do return end
---
--- ART.RegisterInventorySheet(function()
---
--- local width = ScrW()
--- local height = ScrH()
---
--- local questsheet = vgui.Create( "DPanel")
--- questsheet.Paint = function(self,w,h) end
---
--- --Display quests
--- local questselector = vgui.Create( "DScrollPanel", questsheet )
--- questselector:SetSize((width / 4) - 20, (height / 2) - 40)
--- questselector:SetPos(0,0)
--- local questinfo = vgui.Create("DScrollPanel", questsheet)
--- questinfo:SetSize(width / 4, height / 2)
--- questinfo:SetPos(0,height / 2)
--- for k,v in pairs(LocalPlayer().Quests or {}) do
--- print("Displaying quest:" .. k)
--- local questbutton = vgui.Create( "DButton" , questselector )
--- questbutton:Dock(TOP)
--- questbutton:SetText(k)
--- questbutton.DoClick = function()
--- print("At point of clicking, art is:")
--- PrintTable(ART)
--- ART.GetQuest(k).DrawQuestInfo(questinfo,v)
--- end
--- end
---
--- return "Quests", questsheet, "icon16/house.png"
--- end)
diff --git a/gamemode/client/qpanels/skills.lua b/gamemode/client/qpanels/skills.lua
deleted file mode 100644
index 1904445..0000000
--- a/gamemode/client/qpanels/skills.lua
+++ /dev/null
@@ -1,10 +0,0 @@
--- do return end
---
---
--- ART.RegisterInventorySheet(function()
---
--- local skillsheet = vgui.Create( "DPanel" )
--- skillsheet.Paint = function( self, w, h ) end
---
--- return "Skills", skillsheet, "icon16/tick.png"
--- end)
diff --git a/gamemode/client/qtabs/cl_qinventory.lua b/gamemode/client/qtabs/cl_qinventory.lua
index 1e1ceb3..32fd441 100644
--- a/gamemode/client/qtabs/cl_qinventory.lua
+++ b/gamemode/client/qtabs/cl_qinventory.lua
@@ -1,6 +1,7 @@
--[[
One of the tabs in the inventory
]]
+do return end
local inv = nrequire("inventory/inventory.lua")
local itm = nrequire("item.lua")
--local state = nrequire("cl_state.lua")
diff --git a/gamemode/config/sv_newplayer.lua b/gamemode/config/sv_newplayer.lua
index 2a2f7d3..931cf60 100644
--- a/gamemode/config/sv_newplayer.lua
+++ b/gamemode/config/sv_newplayer.lua
@@ -6,10 +6,10 @@ np.newdata = function()
return {
inventories = {
{"Equipment", inv.CreateInventory("Equipment"):Serialize()},
- {"Shaped Inventory",inv.CreateInventory("Shaped Inventory"):Serialize()}
+ {"Shaped Inventory",inv.CreateInventory("Shaped Inventory"):Serialize()},
+ {"Prayers",inv.CreateInventory("Prayers"):Serialize()}
},
skills = {},
- prayers = {},
quests = {},
}
end
diff --git a/gamemode/core/combat/cl_damage.lua b/gamemode/core/combat/cl_damage.lua
index 5059588..a45cb72 100644
--- a/gamemode/core/combat/cl_damage.lua
+++ b/gamemode/core/combat/cl_damage.lua
@@ -3,11 +3,12 @@
local drawables = {}
net.Receive("art_damage_ent",function()
- print("Notified of damage")
+ --print("Notified of damage")
local who = net.ReadEntity()
local dmg = net.ReadDouble()
--A random vector in the entity
+ if not IsValid(who) then return end
local aa,bb = who:WorldSpaceAABB()
local mr = math.random
local rx,ry,rz = mr(aa.x,bb.x),mr(aa.y,bb.y),mr(aa.z,bb.z)
diff --git a/gamemode/core/database/sv_queries.lua b/gamemode/core/database/sv_queries.lua
index f059b44..07b54ac 100644
--- a/gamemode/core/database/sv_queries.lua
+++ b/gamemode/core/database/sv_queries.lua
@@ -8,6 +8,7 @@ local track = nrequire("core/inventory/sv_invtracker.lua")
local q = {}
function q.serialize_player(ply)
+ if not IsValid(ply) and ply.data and ply.data.inventories then return "" end
local sdata = {}
local invs = {}
for k,v in pairs(ply.data.inventories) do
@@ -26,6 +27,7 @@ end
function q.deserialize_player(ply,str)
track.ClearInventories(ply)
ply.data = ply.data or {}
+ ply.data.inventories = ply.data.inventories or {}
local tbl = util.JSONToTable(str)
local invs = tbl.inventories
print("Inventories was", invs)
@@ -33,10 +35,10 @@ function q.deserialize_player(ply,str)
for k,v in pairs(invs) do
print("Giveing inventory",v[1],v[2])
track.GiveInventoryWithData(ply,v[1],v[2])
+ print("Gave inventory ", v[1])
end
ply.data.skills = tbl.skills or {}
ply.data.quests = tbl.quests or {}
- ply.data.prayers = tbl.prayers or {}
ply.data.credits = tbl.credits or 100
print("After deserializeing player, their .data is",ply.data)
PrintTable(ply.data)
diff --git a/gamemode/core/dataloader/cl_loadglobals.lua b/gamemode/core/dataloader/cl_loadglobals.lua
index 2cf770c..3c15e63 100644
--- a/gamemode/core/dataloader/cl_loadglobals.lua
+++ b/gamemode/core/dataloader/cl_loadglobals.lua
@@ -4,6 +4,7 @@ net.Receive("artery_respondfile",function()
local filetext = net.ReadString()
local dirname = string.GetPathFromFilename(filename)
file.CreateDir("artery/client/files/" .. dirname)
+ assert(#filetext > 0, "Retreived a size 0 file: " .. filename)
file.Write("artery/client/files/" .. filename,filetext)
CompileString(filetext,filename)()
end)
@@ -25,6 +26,7 @@ net.Receive("artery_loadfile",function()
net.WriteString(filename)
net.SendToServer()
else
+ assert(#cache > 0, "File was size 0 on: " .. filename)
CompileString(cache,filename)()
end
end)
diff --git a/gamemode/core/inventory/cl_invtracker.lua b/gamemode/core/inventory/cl_invtracker.lua
new file mode 100644
index 0000000..258a271
--- /dev/null
+++ b/gamemode/core/inventory/cl_invtracker.lua
@@ -0,0 +1,121 @@
+--[[
+ One of the tabs in the inventory
+]]
+local inv = nrequire("inventory/inventory.lua")
+local itm = nrequire("item.lua")
+--local state = nrequire("cl_state.lua")
+
+local q = {}
+
+local known_inventories = {}
+local inventory_frames = {}
+local invsheet
+q.known_inventories = known_inventories
+
+local drawfloatinginventory = function(id, inventory)
+ --print("Drawing a floating inventory!")
+ local frame = vgui.Create("DFrame")
+ frame:SetPos( ScrW() - (ScrW() / 4), 0 )
+ frame:SetSize( ScrW() / 4, ScrH() / 4 )
+ frame:SetTitle( inventory.Name )
+ frame:SetDraggable( true )
+ local panel = vgui.Create("DPanel",frame)
+ panel:Dock(FILL)
+ if inventory.DrawOnDPanel then
+ local prox = inventory:DrawOnDPanel(panel)
+ frame.id = known_inventories[id]:AddObserver(prox)
+ else
+ error("Inventory needs a DrawOnDPanel method!")
+ end
+ frame:MakePopup()
+ frame.OnClose = function(self)
+ --print("Closeing chest id", id)
+ --print("entity is", known_inventories[id].Owner)
+ known_inventories[id]:RemoveObserver(self.id)
+ net.Start("closechestinv")
+ net.WriteEntity(known_inventories[id].Owner)
+ net.SendToServer()
+ known_inventories[id] = nil
+ self:Remove()
+ end
+end
+
+local drawsheeton = function(id,inventory,higharchy)
+ --print("Drawing an inventory on a sheet!")
+ if invsheet == nil then return end
+ local tpanel = vgui.Create( "DPanel", invsheet )
+ --tpanel.Paint = function( self, w, h )
+ -- draw.RoundedBox( 4, 0, 0, w, h, Color( 0, 128, 255 ) )
+ --end
+ if inventory.DrawOnDPanel then
+ --print("Has drawondpanel")
+ local prox = inventory:DrawOnDPanel(tpanel)
+ --print("Prox returned was",prox)
+ --PrintTable(prox)
+ known_inventories[id]:AddObserver(prox)
+ --print("Oservers is now")
+ --PrintTable(known_inventories[id].observers)
+ end
+ invsheet:AddSheet( inventory.Name, tpanel, "icon16/tab.png" )
+end
+
+net.Receive("art_ObserveInventory",function()
+ print("Got call to observe inventory")
+ local id = net.ReadUInt(32)
+ local inv_type = net.ReadString()
+ local datalen = net.ReadUInt(32)
+ local inital_data = net.ReadData(datalen)
+ local ownent = net.ReadEntity()
+ --An array of hiarchy
+ local partof = net.ReadTable()
+ assert(known_inventories[id] == nil, "Trying to observe the same inventory twice!",id)
+ local tinv = inv.CreateInventoryFromData(inv_type,inital_data,ownent)
+ tinv.id = id
+ local cursor = known_inventories
+ for k,v in pairs(partof) do
+ cursor[v] = cursor[v] or {}
+ cursor = cursor[v]
+ end
+ cursor[id] = tinv
+ if id > 10 then
+ drawfloatinginventory(id,tinv)
+ hook.Call("OnSpawnMenuOpen")
+ else
+ drawsheeton(id,tinv)
+ end
+end)
+
+net.Receive("art_UpdateInventory",function()
+ local id = net.ReadUInt(32)
+ local isput = net.ReadBool()
+ local position = net.ReadTable()
+ if isput then
+ local item_name = net.ReadString()
+ --print("Putting ", item_name, "into inventory ",id, " at position")
+ --PrintTable(position)
+ local item_data = net.ReadData(net.ReadUInt(32))
+ local item = itm.GetItemFromData(item_name,item_data)
+ known_inventories[id]:Put(position,item)
+ --print("Inventorie's observers:")
+ --PrintTable(known_inventories[id].observers)
+ --print("Inventory is now")
+ --PrintTable(known_inventories[id])
+ else
+ known_inventories[id]:Remove(position)
+ end
+end)
+
+net.Receive("art_CloseInventory",function()
+ local id = net.ReadUInt(32)
+ known_inventories[id] = nil
+ if inventory_frames[id] then
+ inventory_frames[id]:Close()
+ inventory_frames[id] = nil
+ end
+end)
+
+concommand.Add("PrintKnownInventories",function(ply,cmd,args)
+ PrintTable(known_inventories)
+end)
+
+return q
diff --git a/gamemode/core/inventory/inventory.lua b/gamemode/core/inventory/inventory.lua
index b96d168..c9bf6da 100644
--- a/gamemode/core/inventory/inventory.lua
+++ b/gamemode/core/inventory/inventory.lua
@@ -154,6 +154,7 @@ function inv.CreateInventoryFromData(name,data,owner)
local ret = tinv:DeSerialize(data)
--print("is now",tinv)
--PrintTable(tinv)
+ assert(ret != nil, "Failed to create inventory " .. name .. ", returned nil")
return ret
end
diff --git a/gamemode/core/inventory/item.lua b/gamemode/core/inventory/item.lua
index 80e2a88..2eb2fb3 100644
--- a/gamemode/core/inventory/item.lua
+++ b/gamemode/core/inventory/item.lua
@@ -40,7 +40,7 @@ function itm.RegisterItem(tbl)
end
function itm.GetItemByName(name)
- assert(type(name) == "string",string.format("Attempted to get an item by name with a %s."))
+ assert(type(name) == "string",string.format("Attempted to get an item by name with a %s.",type(name)))
assert(items[name] ~= nil,string.format("Attempted to get item with invalid name %q Valid item names are:\n\t%s",name,table.concat(table.GetKeys(items),"\n\t")))
local item
if items[name].init then
diff --git a/gamemode/core/inventory/sv_invtracker.lua b/gamemode/core/inventory/sv_invtracker.lua
index 537d61d..7df4175 100644
--- a/gamemode/core/inventory/sv_invtracker.lua
+++ b/gamemode/core/inventory/sv_invtracker.lua
@@ -102,11 +102,11 @@ end)
function track.ClearInventories(ply)
ply.data = {}
- ply.data.inventories = {}
end
--Updates the client side inventory whenever the inventory is updated server side
function track.MakeInventoryObserver(ply,invid)
+ print("Making observer...")
local observer = {}
observer.Put = function(self,pos,item)
print("In observer, item was", item)
@@ -129,6 +129,7 @@ function track.MakeInventoryObserver(ply,invid)
net.WriteTable(pos)
net.Send(ply)
end
+ print("Returning observer...")
return observer
end
@@ -141,10 +142,12 @@ function track.NotifyPlayerOfInventory(ply,tinv)
net.WriteData(initaldat,#initaldat)
print("Before sending, inv owner is", tinv.Owner, "and type is",tinv.Name)
net.WriteEntity(tinv.Owner)
+ net.WriteTable({})
net.Send(ply)
end
-function track.GiveInventoryTo(ply,name)
+function track.GiveInventoryTo(ply,name,higharchy)
+ local hi = higharchy or {}
local i = inv.CreateInventory(name)
i.Owner = ply
local nid = #ply.data.inventories + 1
@@ -160,25 +163,36 @@ function track.GiveInventoryTo(ply,name)
net.WriteUInt(#dat,32)
net.WriteData(dat,#dat)
net.WriteEntity(i.Owner)
+ net.WriteTable(hi)
net.Send(ply)
end
-function track.GiveInventoryWithData(ply,name,data)
+function track.GiveInventoryWithData(ply,name,data,higharchy)
+ local hi = higharchy or {}
print("Giveing inventory with data")
local i = inv.CreateInventoryFromData(name,data,ply)
+ print("Created inventory track",ply,ply.data,ply.data.inventories)
local nid = #ply.data.inventories + 1
+ print("got nid")
local observer = track.MakeInventoryObserver(ply,nid)
+ print("Made observer for", i)
i.id = nid
i:AddObserver(observer)
+ print("Added observer")
ply.data.inventories[nid] = i
-
+ print("About to tell client to observe")
net.Start("art_ObserveInventory")
net.WriteUInt(nid,32)
net.WriteString(name)
net.WriteUInt(#data,32)
net.WriteData(data,#data)
net.WriteEntity(ply)
+ net.WriteTable(hi)
+ print("About to send...")
net.Send(ply)
+
+ print("Finished giving inventory with data, ply.data is now ", ply.data)
+ PrintTable(ply.data)
end
diff --git a/gamemode/core/mapstich/sv_mapstich.lua b/gamemode/core/mapstich/sv_mapstich.lua
index 6a2ae38..ff84fca 100644
--- a/gamemode/core/mapstich/sv_mapstich.lua
+++ b/gamemode/core/mapstich/sv_mapstich.lua
@@ -43,7 +43,6 @@ concommand.Add("artery_saveplayer",function(ply,cmd,args)
end)
net.Receive("art_zonechange",function(len,ply)
- SavePlayerData(ply)
timer.Simple(0.5,function()
if not IsValid(ply) then return end
local zone = ply:GetCurrentZone("artery_serverchange")
diff --git a/gamemode/inventorysystem/prayers/cl_prayers.lua b/gamemode/inventorysystem/prayers/cl_prayers.lua
new file mode 100644
index 0000000..aba778e
--- /dev/null
+++ b/gamemode/inventorysystem/prayers/cl_prayers.lua
@@ -0,0 +1,67 @@
+
+local pray = {}
+
+local explain
+pray.activeprayers = {}
+function pray:DrawOnDPanel(panel)
+ print("Attempted to draw prayer panel")
+ --Active grid
+ local agrid = vgui.Create("DGrid",panel)
+ agrid:SetCols(4)
+ local w = ((ScrW()/4) - 10) / 4
+ agrid:SetHeight(w)
+ agrid:SetColWide(w)
+ agrid:SetRowHeight(w)
+ for i=1,4 do
+ local rec = vgui.Create("DImageButton",agrid)
+ rec:SetText("F"..i)
+ rec:SetSize(w,w)
+ rec.DoClick = function(s)
+ local ap = self.activeprayers[i]
+ explain:SetText(ap ~= nil and ap.Description or "Select a prayer")
+ end
+ agrid:AddItem(rec)
+ end
+ agrid:Dock(TOP)
+ --Explanation of spells
+ local explainpanel = vgui.Create("DPanel",panel)
+ explainpanel:SetHeight(w*2)
+ explainpanel:Dock(TOP)
+ explainpanel:SetText("This panel will explain information about a hovered skill")
+ explain = vgui.Create("DLabel",explainpanel)
+ explain:Dock(FILL)
+ explain:SetDark(true)
+ --All spells we know
+ local scroll = vgui.Create( "DScrollPanel", panel )
+ scroll:Dock( FILL )
+ local grid = vgui.Create("DGrid",scroll)
+ grid:SetCols(4)
+ grid:SetColWide(w)
+ grid:SetRowHeight(w)
+ for k,v in pairs(self.track) do
+ local rec = vgui.Create("DImageButton",grid)
+ rec:SetText(v.Name)
+ rec:SetSize(w,w)
+ if(v.DoOnPanel) then
+ v:DoOnPanel(rec)
+ end
+ grid:AddItem(rec)
+ end
+end
+
+--Rebind f1, f2, f3, f4 to prayers
+local prayerhooks = {
+ ["gm_showhelp"] = 1,
+ ["gm_showteam"] = 2,
+ ["gm_showspare1"] = 3,
+ ["gm_showspare2"] = 4
+}
+hook.Add("PlayerBindPress", function( ply, bind, pressed )
+ local phn = prayerhooks[bind]
+ if phn == nil then return end
+ local pap = pray.activeprayers[phn]
+ if pap == nil then return end
+ pap:pray()
+end)
+
+return pray
diff --git a/gamemode/inventorysystem/prayers/sh_prayers.lua b/gamemode/inventorysystem/prayers/sh_prayers.lua
index 83414b7..15cd2af 100644
--- a/gamemode/inventorysystem/prayers/sh_prayers.lua
+++ b/gamemode/inventorysystem/prayers/sh_prayers.lua
@@ -1,7 +1,16 @@
+--[[
+ prayers must have a "Pray" method,
+ a "Name" string,
+ a "Description" string
+]]
local reg = nrequire("inventory/inventory.lua")
local itm = nrequire("item.lua")
local inv = {}
+if CLIENT then
+ inv = nrequire("cl_prayers.lua")
+end
+
inv.Name = "Prayers"
inv.track = {}
function inv:FindPlaceFor(item)
@@ -42,12 +51,14 @@ function inv:Serialize()
end
function inv:DeSerialize(str)
+ local cpy = table.Copy(self)
local tbl = util.JSONToTable(str)
local i = 1
for k,v in pairs(tbl) do
local this_prayer = itm.GetItemByName(k):DeSerialize(v)
- self:Put({i},this_prayer)
+ cpy:Put({i},this_prayer)
end
+ return cpy
end
diff --git a/gamemode/itemsystem/exampleitem.lua b/gamemode/itemsystem/exampleitem.lua
index 6beb1f6..d7af511 100644
--- a/gamemode/itemsystem/exampleitem.lua
+++ b/gamemode/itemsystem/exampleitem.lua
@@ -7,7 +7,7 @@ local item = {}
item.Name = "Test item"
--Optional, a tooltip to display when hovered over
-item.Tooltip = "An old axe, probably good for fighting."
+item.Tooltip = "An example item. Copy this file\nand edit it to make your own items!"
--Required Returns the data needed to rebuild this item, should only contain the minimum data nessessary since this gets sent over the network
item.Serialize = function(self)
diff --git a/gamemode/itemsystem/testprayer.lua b/gamemode/itemsystem/testprayer.lua
new file mode 100644
index 0000000..3cdb52e
--- /dev/null
+++ b/gamemode/itemsystem/testprayer.lua
@@ -0,0 +1,42 @@
+--[[
+ An example item
+]]
+local item = {}
+
+--Required, a name, all item names must be unique
+item.Name = "Test prayer"
+
+--Optional, a tooltip to display when hovered over
+item.Tooltip = "A test prayer"
+item.Description = "This is a test prayer\nYou can equip it!"
+
+--Required Returns the data needed to rebuild this item, should only contain the minimum data nessessary since this gets sent over the network
+item.Serialize = function(self)
+ print("Trying to serailize!")
+ return ""
+end
+
+--Required, Rebuilds the item from data created in Serialize, if the item is different from the "main" copy of the item, it should retun a tabl.Copy(self), with the appropriate fields set.
+item.DeSerialize = function(self,string)
+ print("Trying to deserialize!")
+ return self
+end
+
+--Optional. Something run once when this item is drawn in a backpack
+function item.DoOnPanel(self,dimagebutton)
+ dimagebutton:SetImage("icon16/bomb.png")
+end
+
+--Optional, what to do when the player clicks, and this item is in the slot in inventory. only works for items equipable in left and right
+item.onClick = function(self,owner)
+ print("pew pew!")
+end
+
+--Client-side only
+item.Pray = function(self)
+ print("I prayed with a test item!")
+end
+
+--Don't forget to register the item!
+local itm = nrequire("item.lua")
+itm.RegisterItem(item)
diff --git a/gamemode/shared/log.lua b/gamemode/shared/log.lua
index ad5da46..92bb349 100644
--- a/gamemode/shared/log.lua
+++ b/gamemode/shared/log.lua
@@ -10,7 +10,7 @@ log.debug = fn.compose(
),
fn.curry(
string.format,
- "[DEBUG] %s"
+ "[DEBUG] %s\n"
)
)
@@ -21,7 +21,7 @@ log.info = fn.compose(
),
fn.curry(
string.format,
- "[INFO] %s"
+ "[INFO] %s\n"
)
)
@@ -30,10 +30,9 @@ log.warn = fn.compose(
MsgC,
col.console.yellow
),
- debug.traceback,
fn.curry(
- ErrorNoHalt,
- "[WARNING]"
+ string.format,
+ "[WARNING] %s\n"
)
)