aboutsummaryrefslogtreecommitdiff
path: root/data/scripts/objects/test/client.lua
blob: a685721a173ffa2df1dcbe98bc2ee8a34bae6c75 (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
-- Client-side code of the test lua object

--
-- Some helper functions and classes
--

function split(str, pat)
   local t = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
	 table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end

-- For debugging
function dump(o)
    if type(o) == 'table' then
        local s = '{ '
        for k,v in pairs(o) do
                if type(k) ~= 'number' then k = '"'..k..'"' end
                s = s .. '['..k..'] = ' .. dump(v) .. ','
        end
        return s .. '} '
    else
        return tostring(o)
    end
end

function vector_subtract(a, b)
	return {X=a.X-b.X, Y=a.Y-b.Y, Z=a.Z-b.Z}
end

function vector_add(a, b)
	return {X=a.X+b.X, Y=a.Y+b.Y, Z=a.Z+b.Z}
end

function vector_multiply(a, d)
	return {X=a.X*d, Y=a.Y*d, Z=a.Z*d}
end

SmoothTranslator = {}
SmoothTranslator.__index = SmoothTranslator

function SmoothTranslator.create()
	local obj = {}
	setmetatable(obj, SmoothTranslator)
	obj.vect_old = {X=0, Y=0, Z=0}
	obj.anim_counter = 0
	obj.anim_time = 0
	obj.anim_time_counter = 0
	obj.vect_show = {X=0, Y=0, Z=0}
	obj.vect_aim = {X=0, Y=0, Z=0}
	return obj
end

function SmoothTranslator:update(vect_new)
	self.vect_old = self.vect_show
	self.vect_aim = vect_new
	if self.anim_time < 0.001 or self.anim_time > 1.0 then
		self.anim_time = self.anim_time_counter
	else
		self.anim_time = self.anim_time * 0.9 + self.anim_time_counter * 0.1
	end
	self.anim_time_counter = 0
	self.anim_counter = 0
end

function SmoothTranslator:translate(dtime)
	self.anim_time_counter = self.anim_time_counter + dtime
	self.anim_counter = self.anim_counter + dtime
	vect_move = vector_subtract(self.vect_aim, self.vect_old)
	moveratio = 1.0
	if self.anim_time > 0.001 then
		moveratio = self.anim_time_counter / self.anim_time
	end
	-- Move a bit less than should, to avoid oscillation
	moveratio = moveratio * 0.8
	if moveratio > 1.5 then
		moveratio = 1.5
	end
	self.vect_show = vector_add(self.vect_old, vector_multiply(vect_move, moveratio))
end

--
-- Actual code
--

pos_trans = SmoothTranslator.create()
rot_trans = SmoothTranslator.create()

-- Callback functions

function on_step(self, dtime)
	pos_trans:translate(dtime)
	rot_trans:translate(dtime)
	object_set_position(self, pos_trans.vect_show)
	object_set_rotation(self, rot_trans.vect_show)
end

function on_process_message(self, data)
	--print("client got message: " .. data)

	-- Receive our custom messages

	sp = split(data, " ")
	if sp[1] == "pos" then
		pos_trans:update({X=sp[2], Y=sp[3], Z=sp[4]})
	end
	if sp[1] == "rot" then
		rot_trans:update({X=sp[2], Y=sp[3], Z=sp[4]})
	end
end

function on_initialize(self, data)
	print("client object got initialization: " .. data)

	corners = {
		{-1/2,-1/2, 0},
		{ 1/2,-1/2, 0},
		{ 1/2, 0, 0},
		{-1/2, 0, 0},
	}
	object_add_to_mesh(self, "rat.png", corners, false)

end