-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathobject_manager.lua
138 lines (115 loc) · 2.72 KB
/
object_manager.lua
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
--[[
common object parameters:
oid
x
y
owner
rotation
receive = function(name, a, b, c, ...)
]]
local list = require 'list'
local vector = require 'vector'
local object_manager = {}
object_manager.objects = {}
function object_manager.visit (fun)
for oid,o in pairs(object_manager.objects) do
fun(oid,o)
end
end
function object_manager.count ()
local c = 0
for k,v in pairs(object_manager.objects) do c = c + 1 end
return c
end
-- returns the value stored in a objects (oid) field or defaultValue if the oid does not exist
function object_manager.get_field (oid, field, defaultValue)
local o = object_manager.objects[oid]
if o and o[field] then
return o[field]
else
return defaultValue or nil
end
end
function object_manager.get (oid)
oid = tonumber(oid)
if object_manager.objects[oid] then
return object_manager.objects[oid]
else
--~ print("OBJECTMANAGER", "there is no object with oid", oid, type(oid))
return nil
end
end
function object_manager.generate_free_oid ()
local oid = nil
repeat
oid = tonumber(math.random(1,1000000))
until not object_manager.objects[oid]
return oid
end
-- writes property oid, owner into o (o.oid) and returns the changed object
function object_manager.create (o)
if not o.oid then
o.oid = object_manager.generate_free_oid()
else
o.oid = tonumber(o.oid)
end
if not o.owner then
o.owner = network.client_id
end
if o.oid == 0 then
utils.vardump(o)
print(debug.traceback())
os.exit()
end
object_manager.objects[o.oid] = o
return o
end
function object_manager.delete (o)
o.oid = tonumber(o.oid)
if o.oid then
object_manager.objects[o.oid] = nil
else
for oid,oo in pairs(object_manager.objects) do
if oo == o then
object_manager.objects[oid] = nil
end
end
end
end
-- returns {oid0=o0, oid1=o1, ...}
function object_manager.find_by_owner (owner)
return object_manager.find_where(function (oid, o)
return o.owner == owner
end)
end
-- returns {oid0=o0, oid1=o1, ...}
function object_manager.find_in_sphere (x,y,r)
return object_manager.find_where(function (oid, o)
--print("stuff",vector.lenFromTo(x,y, o.x,o.y),x,y,o.x,o.y,r,oid,o.class)
return vector.lenFromTo(x,y, o.x,o.y) <= r
end)
end
-- returns {oid0=o0, oid1=o1, ...}
-- function filter(oid,o) -> bool (true is contained in result)
function object_manager.find_where (filter)
local l = {}
for oid,o in pairs(object_manager.objects) do
if filter(oid,o) then
l[oid] = o
end
end
return l
end
-- oids: oid or list or oids
function object_manager.send (oids, message_name, ...)
if type(oids) ~= "table" then
oids = {oids}
end
for k,oid in pairs(oids) do
local o = object_manager.get(oid)
if o and o.receive then
o:receive(message_name, ...)
end
end
end
return object_manager