aboutsummaryrefslogtreecommitdiff
path: root/gamemode/client/qtabs/cl_qinventory.lua
blob: 32fd441d00295f50a81ef93e4513a9dd61c02bc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
--[[
	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")

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)
	--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()
	--print("Got inv type", inv_type,"id",id)
	local datalen = net.ReadUInt(32)
	local inital_data = net.ReadData(datalen)
	local ownent = net.ReadEntity()
	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
	known_inventories[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)

q.CreateInventorySheet = function(dpanel_parent)
	--assert(known_inventories[watch_id] ~= nil,"Attempted to watch an inventory that dosn't exist!")
	--Display the equipment inventories
	invsheet = vgui.Create( "DPropertySheet", dpanel_parent )
	invsheet:Dock( FILL )

	for k,v in pairs(known_inventories) do
		--print("This inventory id in known_inventories is", k)
		if k <= 10 then
			drawsheeton(k,v)
		else
			drawfloatinginventory(k,v)
		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 v.DrawOnDPanel then
			local prox = v:DrawOnDPanel(tpanel)
			known_inventories[k]:AddObserver(prox)
		end
		invsheet:AddSheet( v.Name, tpanel, "icon16/tab.png" )
		]]
	end

	return invsheet
end

concommand.Add("PrintKnownInventories",function(ply,cmd,args)
	PrintTable(known_inventories)
end)

return q