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
146
147
|
--[[
An inventory, with a shape!
]]
local reg = nrequire("inventory/inventory.lua")
local itm = nrequire("item.lua")
local inv = {}
if CLIENT then inv = nrequire("cl_shaped.lua") end
inv.Name = "Shaped Inventory"
inv.tracker = {}
inv.dimx = 5
inv.dimy = 5
local function calcposition(dimx,dimy,x,y)
return ((x-1) * dimx) + y
end
local function canfitin(self,x,y,shape)
print("Checking canfitin, tracker was")
PrintTable(self.tracker)
for rn,row in ipairs(shape) do
for cn,col in ipairs(row) do
local absx,absy = x + rn - 1, y + cn - 1
local slot = calcposition(self.dimx,self.dimy,absx,absy)
print("Checking slot", slot)
if col and ((self.tracker[slot] ~= nil) or (slot > self.dimx * self.dimy)) then
return false
end
end
end
return true
end
function inv:FindPlaceFor(item)
for x = 1, self.dimx do
for y = 1, self.dimy do
if canfitin(self,x,y,item.Shape) then
return {x,y}
end
end
end
return nil
end
function inv:CanFitIn(tbl,item)
if canfitin(self,tbl[1],tbl[2],item.Shape) then
print("calculated, and can fit")
return true
else
print("calculated, could not fit")
return "Could not fit :("
end
end
function inv:Put(tbl,item)
print("Before putting ", item)
PrintTable(item)
print("tracker was")
PrintTable(self.tracker)
--Set the item's shape to true
for rn,row in ipairs(item.Shape) do
for cn,col in ipairs(row) do
if col then
local slot = calcposition(self.dimx,self.dimy,tbl[1] + rn - 1,tbl[2] + cn - 1)
self.tracker[slot] = 1
end
end
end
--Now set the item in the correct slot
local slot = calcposition(self.dimx,self.dimy,tbl[1],tbl[2])
self.tracker[slot] = item
print("After, tracker was ")
PrintTable(self.tracker)
end
function inv:Has(ptr)
local compare_func = ptr
if type(ptr) == "string" then
compare_func = function(t)
return t.Name == ptr
end
end
for k,v in pairs(self.tracker) do
if type(v) == "table" and compare_func(v) then
local x = math.floor(k / self.dimx)
local y = k % self.dimx
return {x,y}
end
end
return nil
end
function inv:Remove(tbl)
print("Removeing from",tbl[1],tbl[2])
local slot = calcposition(self.dimx,self.dimy,tbl[1],tbl[2])
print("Slot is",slot)
print("Tracking structure is:")
PrintTable(self.tracker)
local item = self.tracker[slot]
print("Removeing item",item)
PrintTable(item)
self.tracker[slot] = nil
for rn,row in ipairs(item.Shape) do
for cn,col in ipairs(row) do
if col then
slot = calcposition(self.dimx,self.dimy,tbl[1] + rn - 1,tbl[2] + cn - 1)
self.tracker[slot] = nil
end
end
end
print("After, tracker was")
PrintTable(self.tracker)
end
function inv:Get(tbl)
local slot = calcposition(self.dimx,self.dimy,tbl[1],tbl[2])
return self.tracker[slot]
end
function inv:Serialize()
--Turn it into a sparse table
local ret = {}
for k,v in pairs(self.tracker) do
if type(v) == "table" then
ret[v.Name] = {k,v:Serialize()}
end
end
return util.TableToJSON(ret)
end
function inv:DeSerialize(str)
print("Deserializeing from ", str)
--TODO:Implement
local tbl = util.JSONToTable(str)
for k,v in pairs(tbl) do
local name = k
local pos = v[1]
local data = v[2]
self.tracker[pos] = itm.GetItemFromData(name,data)
end
end
reg.RegisterInventory(inv)
|