1function OutputMessage:addData(data)
2 if type(data) == 'boolean' then
3 self:addU8(NetworkMessageTypes.Boolean)
4 self:addU8(booleantonumber(data))
5 elseif type(data) == 'number' then
6 if math.isu8(data) then
7 self:addU8(NetworkMessageTypes.U8)
8 self:addU8(data)
9 elseif math.isu16(data) then
10 self:addU8(NetworkMessageTypes.U16)
11 self:addU16(data)
12 elseif math.isu32(data) then
13 self:addU8(NetworkMessageTypes.U32)
14 self:addU32(data)
15 elseif math.isu64(data) then
16 self:addU8(NetworkMessageTypes.U64)
17 self:addU64(data)
18 else -- negative or non integer numbers
19 self:addU8(NetworkMessageTypes.NumberString)
20 self:addString(tostring(data))
21 end
22 elseif type(data) == 'string' then
23 self:addU8(NetworkMessageTypes.String)
24 self:addString(data)
25 elseif type(data) == 'table' then
26 self:addU8(NetworkMessageTypes.Table)
27 self:addTable(data)
28 else
29 perror('Invalid data type ' .. type(data))
30 end
31end
32
33function OutputMessage:addTable(data)
34 local size = 0
35
36 -- reserve for size (should be addData, find a way to use it further)
37 local sizePos = self:getWritePos()
38 self:addU16(size)
39 local sizeSize = self:getWritePos() - sizePos
40
41 -- add values
42 for key,value in pairs(data) do
43 self:addData(key)
44 self:addData(value)
45 size = size + 1
46 end
47
48 -- write size
49 local currentPos = self:getWritePos()
50 self:setWritePos(sizePos)
51 self:addU16(size)
52
53 -- fix msg size and go back to end
54 self:setMessageSize(self:getMessageSize() - sizeSize)
55 self:setWritePos(currentPos)
56end
57
58function OutputMessage:addColor(color)
59 self:addU8(color.r)
60 self:addU8(color.g)
61 self:addU8(color.b)
62 self:addU8(color.a)
63end
64
65function OutputMessage:addPosition(position)
66 self:addU16(position.x)
67 self:addU16(position.y)
68 self:addU8(position.z)
69end
70