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
|