summaryrefslogtreecommitdiff
path: root/data/luaobjects/test/server.lua
blob: e79d277acd0a403ad0dfcc4c147de01b0ecd7d28 (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
146
147
148
149
150
151
152
153
154
-- Server-side code of the test lua object

--
-- Some helper functions and classes
--

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

--
-- Actual code
--

counter = 0
counter2 = 0
counter3 = 0
counter4 = 0
death_counter = 0
-- This is got in initialization from object_get_base_position(self)
position = {X=0,Y=0,Z=0}
rotation = {X=0, Y=math.random(0,360), Z=0}
dir = 1
temp1 = 0

function on_step(self, dtime)
	--[[if position.Y > 9.5 then
		position.Y = 6
	end
	if position.Y < 5.5 then
		position.Y = 9]]
		
	-- Limit step to a sane value; it jumps a lot while the map generator
	-- is in action
	if dtime > 0.5 then
		dtime = 0.5
	end

	-- Returned value has these fields:
	-- * int content
	-- * int param1
	-- * int param2
	p = {X=position.X, Y=position.Y-0.35, Z=position.Z}
	n = object_get_node(self, p)
	f = get_content_features(n.content)
	if f.walkable then
		dir = 1
	else
		dir = -1
	end
	-- Keep the object approximately at ground level
	position.Y = position.Y + dtime * 2.0 * dir

	-- Move the object around
	position.X = position.X + math.cos(math.pi+rotation.Y/180*math.pi)
			* dtime * 2.0
	position.Z = position.Z + math.sin(math.pi+rotation.Y/180*math.pi)
			* dtime * 2.0

	-- This value has to be set; it determines to which player the
	-- object is near to and such
	object_set_base_position(self, position)

	counter4 = counter4 - dtime
	if counter4 < 0 then
		counter4 = counter4 + math.random(0.5,8)
		-- Mess around with the map
		np = vector_add(position, {X=0,Y=0,Z=0})
		object_place_node(self, np, {content=0})
		-- A node could be digged out with this:
		-- object_dig_node(self, np)
	end

	counter3 = counter3 - dtime
	if counter3 < 0 then
		counter3 = counter3 + math.random(1,4)
		rotation.Y = rotation.Y + math.random(-180, 180)
	end
	
	-- Send some custom messages at a custom interval
	
	counter = counter - dtime
	if counter < 0 then
		counter = counter + 0.25
		if counter < 0 then
			counter = 0
		end

		message = "pos " .. position.X .. " " .. position.Y .. " " .. position.Z
		object_add_message(self, message)

		message = "rot " .. rotation.X .. " " .. rotation.Y .. " " .. rotation.Z
		object_add_message(self, message)
	end

	-- Mess around with the map
	--[[counter2 = counter2 - dtime
	if counter2 < 0 then
		counter2 = counter2 + 3
		if temp1 == 0 then
			temp1 = 1
			object_dig_node(self, {X=0,Y=1,Z=0})
		else
			temp1 = 0
			n = {content=1}
			object_place_node(self, {X=0,Y=5,Z=0}, n)
		end
	end]]

	-- Remove the object after some time
	death_counter = death_counter + dtime
	if death_counter > 30 then
		object_remove(self)
	end

end

-- This stuff is passed to a newly created client-side counterpart of this object
function on_get_client_init_data(self)
	-- Just return some data for testing
	return "result of get_client_init_data"
end

-- This should return some data that mostly saves the state of this object
-- Not completely implemented yet
function on_get_server_init_data(self)
	-- Just return some data for testing
	return "result of get_server_init_data"
end

-- When the object is loaded from scratch, this is called before the first
-- on_step(). Data is an empty string or the output of an object spawner
-- hook, but such things are not yet implemented.
--
-- At reload time, the last output of get_server_init_data is passed as data.
--
-- This should initialize the position of the object to the value returned
--   by object_get_base_position(self)
--
-- Not completely implemented yet
--
function on_initialize(self, data)
	print("server object got initialization: " .. data)
	position = object_get_base_position(self)
end